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!

Adam
quelle
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:

7

Python 2 , 132 115 Bytes

-17 Bytes dank Leaky Nun

x,n=input()
o=[]
i=1
while x:
 t=x[0]
 while[t+i]==x[i:i+1]:i+=1
 o+=[[t,'-',t+i-1],x[:i]][i<n];x=x[i:];i=1
print o

Probieren Sie es online!

Stange
quelle
115 Bytes
Undichte Nonne
Würde while t+i==x[i]:funktionieren Oder vermisse ich etwas?
Zacharý
@ Zacharý es würde brechen, wenn ihöher als die Größe desx
Rod
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
Jonathan Allan
quelle
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
Anders Kaseorg
quelle
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
ETHproductions
quelle
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!

J42161217
quelle
hier
Undichte Nonne
2

APL, 38 Bytes

{∊⍺{⍺>≢⍵:⍵⋄2⌽'-',2↑¯1⌽⍵}¨⍵⊂⍨1,1≠2-⍨/⍵}
Marinus
quelle
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
Titus
quelle
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.

Neil
quelle
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!

daniero
quelle
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
Meilen
quelle
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 .

Zacharý
quelle
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.

R. Kap
quelle
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!

Zacharý
quelle
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ý