Rozwiń stenograficzne sekwencje liczb całkowitych

18

Biorąc pod uwagę listę liczb w formacie skróconej sekwencji liczb całkowitych, wypisz sekwencję w całości.

Skrócony format sekwencji liczb całkowitych działa poprzez znalezienie każdej liczby n mniejszej liczby cyfr niż liczba poprzedzająca, m . Gdy d jest liczbą cyfr w n , ostatnie d cyfry m są zastępowane wszystkimi cyframi n . Oto przykładowe dane wejściowe:

123 45 6 7 89 200

Stosując regułę wymiany, najpierw zamieniamy 45 na 145, ponieważ 45 <123:

123 145 6 7 89 200

Wielokrotnie stosując tę ​​samą regułę, staje się to:

123 145 146 7 89 200
123 145 146 147 89 200
123 145 146 147 189 200

Sekwencja jest teraz posortowana (nie ma liczb, których dotyczy reguła), więc jest to wynik końcowy.

Możesz to założyć

  • Skrótowa notacja jest zawsze używana, gdy jest to możliwe. Na przykład wejście będzie 12 3, nigdy12 13 .

  • liczby nigdy się nie zmniejszają, pozostając przy tej samej liczbie cyfr. Na przykład dane wejściowe nigdy nie będą 333 222.

  • zastosowanie reguły skróconej nigdy nie spowoduje, że liczba będzie nadal mniejsza niż poprzednia liczba w sekwencji. Na przykład dane wejściowe nigdy nie będą 123 12.

  • liczby zawsze będą dodatnimi liczbami całkowitymi i nigdy nie będą zawierać początkowych zer (w przypadku formatu ciągów).

  • pełna, rozszerzona sekwencja nigdy nie będzie zawierać duplikatów liczb. (Jednak sekwencja skrótów może; np. 10 1 20 1-> 10 11 20 21.)

  • na wejściu będzie co najmniej jedna liczba.

Dane wejściowe i wyjściowe mogą być listami / tablicami liczb / ciągów znaków lub pojedynczym ciągiem znaków z elementami oddzielonymi dowolnymi cyframi.

Ponieważ jest to , wygra najkrótszy kod w bajtach.

Przypadki testowe, z wejściem i wyjściem w liniach przemiennych:

1 2 3 10 1 2 20 5 100 200 10 3 5 26 9 99 999 9999
1 2 3 10 11 12 20 25 100 200 210 213 215 226 229 299 999 9999
223 1184 334 441 5 927 2073 589 3022 82 390 5 9
223 1184 1334 1441 1445 1927 2073 2589 3022 3082 3390 3395 3399
5 10 5 20 5 30 5 40 5 50 5
5 10 15 20 25 30 35 40 45 50 55
7 8 9 70 80 90 700 800 900 7000 8000 9000
7 8 9 70 80 90 700 800 900 7000 8000 9000
42
42
Klamka
źródło
Wyzwanie jest dość stare, ale a) czy dane wejściowe mogą być puste? b) czy dane wejściowe mogą zawierać tylko jedną liczbę?
Erik the Outgolfer,
@EriktheOutgolfer Pójdę naprzód i powiem, że na wejściu będzie ≥1 liczb.
Klamka

Odpowiedzi:

7

Galaretka, 7 bajtów

DUṛ"\UḌ

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

DUṛ"\UḌ  Main link. Input: A (list of integers)

D        Convert each integer to a list of its base 10 digits.
 U       Reverse each digit list.
    \    Do a cumulative reduce, applying the dyadic link to the left:
   "       For each pair of corresponding digits:
  ṛ          Select the right one.
           Vectorization leaves digits that do not have a counterpart untouched.
     U   Reverse the resulting digit arrays.
      Ḍ  Convert from base 10 to integer.
Dennis
źródło
5

JavaScript, 45 42 bajtów

3 bajty wyłączone dzięki @Neil .

a=>a.map(x=>z=z.slice(0,-x.length)+x,z='')

Powyższa funkcja oczekuje tablicy ciągów.

oddalony
źródło
1
Zaoszczędź 4 bajty, używając z=z.slice(0,-x.length)+x,z=''(lub wybranej nazwy zmiennej).
Neil
@Neil. Niezłe! Wiedziałem, że powinien być na to sposób
usunięto
(Przepraszam, że źle zapisałem zapisywanie.) Również wersja łańcucha jest niepotrzebna, ponieważ okazuje się, że s=>s.split` `.map(jest ona o 2 bajty (tym razem dwukrotnie sprawdziłem) krótsza niż s=>s.replace(/\d+/g,.
Neil,
@Neil. Ważny punkt Właśnie go zostawiłem, ponieważ był to mój pierwszy cel, gdy odpowiadałem ... ale masz rację
usunięto
1

Siatkówka, 45 bajtów

+`(?=(?<1>\d)+)(?<=(\d)(?(1)x)(?<-1>\d)+ )
$1

Używa grup bilansujących do liczenia cyfr, które dużo kosztują. Nie znalazłem jeszcze lepszego podejścia, ale interesuje mnie to.

Wypróbuj online tutaj.

randomra
źródło
0

Gema, 35 znaków

<D>=@set{p;@fill-right{${p;};$0}}$p

Dane wejściowe: ciąg znaków z liczbami oddzielonymi czymkolwiek, ciąg wyjściowy.

Przykładowy przebieg:

bash-4.3$ gema '<D>=@set{p;@fill-right{${p;};$0}}$p' <<< '123 45 6 7 89 200'
123 145 146 147 189 200
człowiek w pracy
źródło
0

Ruby, 39 znaków

->a{l='';a.map{|c|l=l[0..-c.size-1]+c}}

Dane wejściowe: tablica ciągów, dane wyjściowe: tablica ciągów.

Przykładowy przebieg:

2.1.5 :001 > ->a{l='';a.map{|c|l=l[0..-c.size-1]+c}}[%w{123 45 6 7 89 200}]
 => ["123", "145", "146", "147", "189", "200"] 
człowiek w pracy
źródło
0

Python 2 , 58 bajtów

s=''
for i in input():s=s[:max(len(s)-len(i),0)]+i;print s

Wypróbuj online!

Erik the Outgolfer
źródło