Aufeinanderfolgende ganze Zahlen reduzieren


22

Verwandte: Sagen Sie mir, wie viele mathematische Probleme ich zu tun habe!

Herausforderung

Ersetzen Sie bei einer streng positiven, streng aufsteigenden Ganzzahlliste L und einer Ganzzahl 3 ≤ N ≤ Länge von L die mittleren Ganzzahlen der aufeinanderfolgenden Ganzzahlreihen von L mit einer Länge ≥ N durch einen einzelnen Strich -.

Regeln

  • Horizontale Leerzeichen spielen keine Rolle.
  • Optional können Sie die Einführungs-, Trenn- und Abschlusszeichen des Standardlistenformats Ihrer Sprache beibehalten. Siehe Formatbeispiele weiter unten.

Datenbeispiele

Alle diese Beispiele verwenden L = 3 5 6 7 8 10 11 12 14 16 17 18 19 20 21 22 24.

N = 33 5 - 8 10 - 12 14 16 - 22 24

N = 43 5 - 8 10 11 12 14 16 - 22 24

N = 53 5 6 7 8 10 11 12 14 16 - 22 24

N = 83 5 6 7 8 10 11 12 14 16 17 18 19 20 21 22 24

Formatbeispiele

Bei den Eingaben
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]und N = 3
allen folgenden Zeilen handelt es sich um Beispiele für gültige Antworten, sowohl als tatsächliche Listen als auch als Zeichenfolgen:

[3,5,"-",8,10,"-",12,14,16,"-",22,24]
[3,5,-,8,10,-,12,14,16,-,22,24]
[3,5-8,10-12,14,16-22,24]
3,5-8,10-12,14,16-22,24

Gleiches gilt für andere Listenformate, wie {1 2 3}und (1; 2; 3)etc. Im Zweifel? Fragen!


Müssen -wir ein anderes Symbol verwenden oder dürfen wir ein anderes verwenden?
Meilen

@miles Spart Ihnen ein anderes Symbol Bytes?
Adám

Ich denke darüber nach, Unendlich zu verwenden, _damit ich weiterhin mit numerischen Arrays in J.
miles

@miles Ah, yeah, warum machst du das nicht, machst aber nichts dagegen, und wenn es dich stört, schreibe die (ich nehme an, viel länger) Box-Lösung mit '-'. Möglicherweise können Sie auch alle Zeichenfolgen zusammenfassen, bevor Sie Bindestriche einfügen.
Adám

Ist das Folgende gültig? [3,5,-8,10,-12,14,16,-22,24](Dies scheint das Format zu sein, das in Bezug auf die Typen am sinnvollsten ist)
Leaky Nun

Antworten:



6

Gelee ,  26 25  23 Bytes

-2 Bytes dank Erik the Outgolfer (indem die if-Anweisung in den Hauptlink eingefügt wird)

Ḣ;Ṫj”-
IỊ¬1;œṗ⁸¹ÇL<¥?€F

Ein dyadischer Link, der eine Liste im [3,5,"-",8,10,"-",12,14,16,"-",22,24]Format zurückgibt.

Probieren Sie es online!(Fußzeile wird durch Leerzeichen getrennt, um das Datenbeispielformat zu drucken).

Wie?

Ḣ;Ṫj”- - Link 1, format a run: list R
Ḣ      -     head
  Ṫ    -     tail
 ;     -     concatenate
    ”- -     literal '-'
   j   -     join

IỊ¬1;œṗ⁸¹ÇL<¥?€F - Main link: list L, number N
I                - incremental differences
 Ị               - insignificant? (<=1)
  ¬              - not
   1;            - prepend a 1
       ⁸         - chain's left argument, L
     œṗ          - partition (L) at truthy indexes
              €  - for €ach row, R, in L:
             ?   -   if:
            ¥    -   condition: last two links as a dyad:
          L      -     length of R
           <     -     is less than N?
        ¹        -   then: identity - do nothing, yields R
         Ç       -   else: call the last link (1) as a monad with argument  R
               F - flatten into a single list

Eine monadische Verbindung?
Undichte Nonne

heh, und noch dazu eine "besondere".
Jonathan Allan

Ein bisschen Neuordnung hilft bei -2.
Erik der Outgolfer

Nettes Zeug, danke @EriktheOutgolfer!
Jonathan Allan

4

Pyth, 23 Bytes

sm?<ldvzd[hd\-ed).ga=hZ

Probieren Sie es online aus

Wie es funktioniert

sm?<ldvzd[hd\-ed).ga=hZkQ

                        Q    autoinitialized to eval(input())
                 .g          group by k ↦
                    =hZ          Z += 1, returning new value (Z is autoinitialized to 0)
                   a   k         absolute difference with k
 m                           map d ↦
  ?                              if
    ld                               length of d
   <  vz                             less than eval(z) (z is autoinitialized to input())
        d                        then d
         [hd\-ed)                else [d[0], '-', d[-1]]
s                            concatenate

3

Japt , 24 Bytes

óÈÄ¥Yîl ¨V?Zv +'-+Zo :Z

Probieren Sie es online!

Erläuterung

óÈ   Ä ¥ YÃ ®   l ¨ V?Zv +'-+Zo :Z
óXY{X+1==Y} mZ{Zl >=V?Zv +'-+Zo :Z}   Ungolfed
                                      Implicit: U = input array, V = input integer
óXY{      }                           Group U into runs such that for each pair X, Y:
    X+1==Y                              Y is exactly 1 more than X.
            mZ{                   }   Map each run Z to:
               Zl >=V?                  If Z has at least V items:
                      Zv     Zo           Z.unshift() and Z.pop() (the first and last items)
                         +'-+             joined with a hyphen.
                                :       Otherwise:
                                 Z        just Z.
                                      Implicit: output result of last expression

2

Mathematica, 128 Bytes

(s=#2;t=r=1;While[t<Length@s,If[s[[t+1]]-s[[t]]==1,r++,r=1];If[r==#,s[[t-#+3;;t]]="-";r--];t++];s//.{b___,a_,a_,c___}:>{b,a,c})&


Eingang

[3, {3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24}]

Ausgabe

{3, 5, "-", 8, 10, "-", 12, 14, 16, "-", 22, 24}

Probieren Sie es online!



2

APL, 38 Bytes

{∊⍺{⍺>≢⍵:⍵⋄2⌽'-',2↑¯1⌽⍵}¨⍵⊂⍨1,1≠2-⍨/⍵}

1

PHP 7, 137 136 134 117 110 108 Bytes

for($a=$argv,$i=2;$n=$a[$i++];$k<$a[1]||array_splice($a,$i,$k-2,"-"))for($k=print"$n ";$a[$i+$k]-++$k==$n;);

Entnimmt sich Ldem ersten Argument und listet die Elemente danach auf. Laufen Sie mit -nroder versuchen Sie es online .

Ersetzen Sie $L=($a=$argv)mit $a=$argv,$L=(+1 Byte) für PHP <7.

Nervenzusammenbruch

for($a=$argv,$i=2;              # import input
    $n=$a[$i++];                # loop $n through list elements
    $k<$a[1]||                      # 3. if streak length ($k) is >=L ($a[1])
        array_splice($a,$i,$k-2,"-")    # then replace with "-"
)
for($k=print"$n ";                  # 1. print element and space
    $a[$i+$k]-++$k==$n;);           # 2. find consecutive numbers

1

Netzhaut , 101 Bytes

\d+
$*
\b(1+) (?=1\1\b)
$1X
T`X` `\b((X)|1)+\b(?=.*¶(?<-2>1)+(?(2)(?!))11)
T`X`-
-1+(?=-)|¶1+

1+
$.&

Probieren Sie es online! Nimmt die durch Leerzeichen getrennte Liste Lin der ersten Zeile und die Ganzzahl Nin der zweiten Zeile. Erläuterung: In der ersten Stufe wird die Eingabe in eine unäre konvertiert. Die zweite Stufe ändert den Abstand zwischen aufeinanderfolgenden ganzen Zahlen in ein X. Die dritte Stufe sucht nach Läufen von aufeinanderfolgenden ganzen Zahlen, deren Länge kleiner als ist, Nund ändert ihre Xs zurück in Leerzeichen. Die vierte Stufe ändert das Xs in -(dies war 3 Bytes kürzer als die Verwendung von -s an erster Stelle.) Die fünfte Stufe löscht alle noch in der Mitte eines Durchlaufs verbleibenden ganzen Zahlen sowieN , während die letzte Stufe zurück in dezimal konvertiert wird.


1

Ruby, 68 Bytes

->n,l{l.slice_when{|x,y|x<y-1}.map{|x|x[n-1]?x.minmax.uniq*?-:x}*?,}

Liefert einen String wie zum Beispiel 3,5-8,10-12,14,16-22,24 .

Probieren Sie es online!


1

J , 40 Bytes

;@((](,_,{:)/)^:(<:#)&.>]<;.1~1,1<}.-}:)

Probieren Sie es online!

Verwendet _ anstelle von- .

Erläuterung

;@((](,_,{:)/)^:(<:#)&.>]<;.1~1,1<}.-}:)  Input: integer N (LHS), array L (RHS)
                                  }.      Behead L
                                     }:   Curtail L
                                    -     Subtract elementwise to get the increments
                                1<        Test if greater than 1
                              1,          Prepend a 1
                        ]                 Get L
                         <;.1~            Partition L into boxes using the previous array
                     & >                  Operate on each box (partition) with N
              ^:                            If
                   #                          The length of the partition
                 <:                           Is greater than or equal to N
   (](     )/)                                Reduce (right-to-left) it using
         {:                                     Tail
       _,                                       Prepend _
      ,                                         Append to LHS
                     &.>                    Box the result
;@                                        Raze - join the contents in each box

0

Jelly, 39 37 36 Bytes

IỊṣ0;€1ṁ@
ÇL€<Ɠ¬TịÇḊ€Ṗ€F;€”-FyµŒgQ€F

Probieren Sie es online aus

Übernimmt das Array über Argumente und die Ganzzahl über STDIN. Der TIO-Link verwendet die FußzeileÇG sodass die Ausgabe durch Leerzeichen getrennt ist.

Wie? (Array: a, Integer: n)

(`f`)
IỊṣ0;€1ṁ@
I          Deltas of `a`
 Ị         Insignificant (x -> abs(x)<=1) applied to each element
  ṣ0       Split at occurrences of `0`.
    ;€1    Append `1` to each element
       ṁ@  `a` shaped like that
ÇL€<Ɠ¬TịÇḊ€Ṗ€F;€”-FyµŒgQ€F
Ç                            `f`
 L€                          Length of each element
   <Ɠ                        x -> x < n applied to each element
     ¬                       Logical not of each element (because Jelly doesn't have <= nor >= atoms)
      T                      Nonzero indexes
       ịÇ                    Index `f` at those indexes
         Ḋ€Ṗ€                x -> x[1:-1] applied to each element
             F               Flatten
              ;€”-           Append a hyphen to each element
                  F          Flatten
                   y         Translate (replaces all elements to be deleted with a hyphen)
                    µ        Start a new monadic link
                     Œg      Group runs of equal elements
                       Q€    Uniquify each element (make runs of hyphens one hypen)
                         F   Flatten, yet again.

Ich schätze, ich bin ... platt auf diesen gefallen .


0

JavaScript (ES6), 126 119 Bytes

(e,c)=>{for(i=0,R='';i<e.length;R+=(R&&',')+(u-m>=c?m+'-'+--u:e.slice(z,i))){m=u=e[i],z=i;while(e[++i]==++u);}return R}

Eine anonyme Funktion. Übernimmt die Eingabe in der Reihenfolge Array L, Integer Nund gibt das Ergebnis als durch Kommas getrennte Zeichenfolge zurück.


Verwenden Sie currying, um ein Byte zu speichern e=>c=>.
TheLethalCoder

0

Dyalog APL v16.0, 82 80 78 76 75 65 62 Bytes

{S/⍨1,⍨2≠/S←'-'@(⍸⊃∨/(-0,⍳⍺-3)⌽¨⊂(⍴⍵)↑∧/¨(⍺-1),/¯1⌽1=-2-/⍵)⊢⍵}

Wow, das ist ... schlimm. Es gibt wahrscheinlich eine viel viel kürzere Lösung mit Schablone.

Probieren Sie es online!

Golfvorschläge willkommen!


Ja, was ist damit?
Zacharý

Entschuldigung, falscher Ort.
Adám

^ Was meinst du?
Zacharý

Mein Kommentar basierte auf einer anderen Herausforderung.
Adám

Ich gehe davon aus, dass, wenn Sie eine Lösung haben, Adám, diese v16-Builtins verwendet?
Zacharý
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.