Zwiń kolejne liczby całkowite

22

Powiązane: Powiedz mi, ile problemów matematycznych muszę zrobić!

Wyzwanie

Biorąc pod uwagę ściśle dodatnią, ściśle rosnącą listę liczb całkowitych L i liczbę całkowitą 3 ≤ N ≤ długość L, zamień środkowe liczby całkowite kolejnych liczb całkowitych L o długości ≥ N pojedynczym myślnikiem -.

Zasady

  • Poziome białe znaki nie mają znaczenia.
  • Opcjonalnie możesz zachować znaki wprowadzające, separatory i terminatory w domyślnym formacie listy w swoim języku. Zobacz przykłady formatowania poniżej.

Przykłady danych

Wszystkie te przykłady wykorzystują 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

Przykłady formatowania

Dla danych wejściowych
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]i N = 3
wszystkich poniższych wierszy znajdują się przykłady prawidłowych odpowiedzi, zarówno jako rzeczywistych list, jak i ciągów:

[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

To samo odnosi się do innych formatów lista, jak {1 2 3}i (1; 2; 3)itd. W razie wątpliwości? Zapytać!

Adám
źródło
Czy konieczne jest użycie, -czy wolno nam użyć innego symbolu?
mile
@miles Czy inny symbol pozwoli Ci zaoszczędzić bajty?
Adám
Zastanawiam się nad użyciem nieskończoności, _aby móc nadal działać na tablicach numerycznych w J.
mile
@miles Ach, tak, czemu nie idź i nie rób tego, ale nie rób tego, a jeśli możesz się niepokoić, napisz (zakładam, że znacznie dłużej) rozwiązanie w pudełku '-'. Być może uda Ci się również wszystko sprecyzować przed wstawieniem myślników, prawda?
Adám
Czy poniższe informacje są prawidłowe? [3,5,-8,10,-12,14,16,-22,24](wydaje się, że jest to format, który ma największy sens pod względem typów)
Leaky Nun

Odpowiedzi:

7

Python 2 , 132 115 bajtów

-17 bajtów dzięki 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

Wypróbuj online!

Pręt
źródło
115 bajtów
Leaky Nun
Czy while t+i==x[i]:zadziała? A może coś mi brakuje?
Zacharý
@ Zacharý pękłby, gdyby był iwyższy niż rozmiarx
Rod
6

Galaretka ,  26 25  23 bajtów

-2 bajty dzięki Erikowi Outgolferowi (wprowadzając instrukcję if do głównego linku)

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

Dyadyczny link zwracający listę w [3,5,"-",8,10,"-",12,14,16,"-",22,24]formacie.

Wypróbuj online! (stopka rozdziela się spacjami, aby wydrukować przykładowy format danych).

W jaki sposób?

Ḣ;Ṫ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
źródło
Link monadyczny?
Leaky Nun
heh, i „specjalny” w tym.
Jonathan Allan
Ułożenie trochę rzeczy pomaga -2.
Erik the Outgolfer,
Ładne rzeczy, dzięki @EriktheOutgolfer!
Jonathan Allan
4

Pyth, 23 bajty

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

Wypróbuj online

Jak to działa

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
źródło
3

Japt , 24 bajty

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

Wypróbuj online!

Wyjaśnienie

óÈ   Ä ¥ 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
ETHprodukcje
źródło
2

Mathematica, 128 bajtów

(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})&


wkład

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

wydajność

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

Wypróbuj online!

J42161217
źródło
tutaj
Leaky Nun
2

APL, 38 bajtów

{∊⍺{⍺>≢⍵:⍵⋄2⌽'-',2↑¯1⌽⍵}¨⍵⊂⍨1,1≠2-⍨/⍵}
marinus
źródło
1

PHP 7, 137 136 134 117 110 108 bajtów

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;);

Bierze się Lz pierwszego argumentu, po czym wypisuje elementy. Uruchom -nrlub wypróbuj online .

Wymienić $L=($a=$argv)z $a=$argv,$L=(+ 1) bajtów do PHP <7.

awaria

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
Tytus
źródło
1

Siatkówka , 101 bajtów

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

1+
$.&

Wypróbuj online! Pobiera listę rozdzieloną spacjami Lw pierwszym wierszu i liczbę całkowitą Nw drugim wierszu. Objaśnienie: Pierwszy stopień przekształca dane wejściowe na jednoargumentowy. Drugi etap zmienia odstęp między kolejnymi liczbami całkowitymi na X. Trzeci etap szuka ciągów kolejnych liczb całkowitych, których długość jest mniejsza niż, Ni zmienia ich Xpowrót do spacji. Czwarty etap zmienia Xs na -(było to o 3 bajty krótsze niż użycie -s na pierwszym miejscu). Piąty etap usuwa wszystkie liczby całkowite pozostające w środku przebiegu, a także N, podczas gdy ostatni etap konwertuje z powrotem na dziesiętne.

Neil
źródło
1

Rubinowy, 68 bajtów

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

Zwraca ciąg znaków jak na przykład 3,5-8,10-12,14,16-22,24.

Wypróbuj online!

daniero
źródło
1

J , 40 bajtów

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

Wypróbuj online!

Używa _zamiast -.

Wyjaśnienie

;@((](,_,{:)/)^:(<:#)&.>]<;.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
mile
źródło
0

Galaretka, 39 37 36 bajtów

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

Wypróbuj online

Bierze tablicę za pomocą argumentów, a liczbę całkowitą przez STDIN. Łącze TIO używa stopkiÇG więc dane wyjściowe są oddzielone spacją.

W jaki sposób? (Tablica: a, całkowita: 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.

Zgaduję, upadłem ... mieszkanie na ten jeden.

Zacharý
źródło
0

JavaScript (ES6), 126 119 bajtów

(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}

Anonimowa funkcja. Pobiera dane wejściowe w kolejności Array L, Integer Ni zwraca wynik jako ciąg rozdzielany przecinkami.

R. Kap
źródło
Użyj curry, aby zapisać bajt e=>c=>.
TheLethalCoder
0

Dyalog APL v16.0, 82 80 78 76 75 65 62 bajtów

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

Wow, to jest ... złe. Prawdopodobnie istnieje znacznie krótsze rozwiązanie z szablonem.

Wypróbuj online!

Zapraszamy do gry w golfa!

Zacharý
źródło
Tak, a co z tym?
Zacharý
Przepraszam, złe miejsce.
Adám
^ Co masz na myśli?
Zacharý
Mój komentarz opierał się na innym wyzwaniu.
Adám
Zakładam, że jeśli masz rozwiązanie, Adám, to wykorzystuje ono wbudowane v16?
Zacharý