Erweitern Sie die Kurzform mit zunehmender Ganzzahl

18

Bei einer Eingabe einer Liste von Zahlen im Format einer aufsteigenden Ganzzahl mit Kurzschreibweise geben Sie die Sequenz vollständig aus.

Das aufsteigende Ganzzahlsequenzformat mit Kurzschreibweise ermittelt jede Zahl n mit weniger Ziffern als die Zahl davor, m . Mit d als Anzahl der Stellen in n werden die letzten d Stellen von m durch alle Stellen von n ersetzt . Hier ist eine Beispieleingabe:

123 45 6 7 89 200

Unter Anwendung der Ersetzungsregel machen wir zuerst 45 zu 145, weil 45 <123:

123 145 6 7 89 200

Wenn dieselbe Regel wiederholt angewendet wird, wird dies zu:

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

Die Sequenz ist jetzt sortiert (es gibt keine Nummern, für die die Regel gilt), daher ist dies die endgültige Ausgabe.

Sie können das annehmen

  • Kurzschreibweise wird immer verwendet, wenn dies möglich ist. Zum Beispiel wird die Eingabe 12 3niemals sein 12 13.

  • Zahlen werden niemals kleiner, während die Anzahl der Ziffern gleich bleibt. Zum Beispiel wird die Eingabe niemals sein 333 222.

  • Das Anwenden der Kurzschriftregel führt niemals zu einer Zahl, die immer noch kleiner als die vorherige Zahl in der Sequenz ist. Zum Beispiel wird die Eingabe niemals sein 123 12.

  • Zahlen sind immer positive Ganzzahlen und enthalten keine führenden Nullen (wenn Sie ein Zeichenfolgenformat verwenden).

  • Die vollständige, erweiterte Sequenz enthält niemals doppelte Zahlen. (Die Abkürzung könnte jedoch sein, zB 10 1 20 1-> 10 11 20 21.)

  • Die Eingabe enthält mindestens eine Zahl.

Eingabe und Ausgabe können entweder Listen / Arrays von Zahlen / Zeichenfolgen oder eine einzelne Zeichenfolge mit Elementen sein, die durch keine Ziffern getrennt sind.

Da es sich um , wird der kürzeste Code in Bytes gewinnen.

Testfälle mit Ein- und Ausgabe in wechselnden Zeilen:

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
Türknauf
quelle
Die Herausforderung ist ziemlich alt, aber a) Kann die Eingabe leer sein? b) Kann die Eingabe nur eine Zahl enthalten?
Erik der Outgolfer
@EriktheOutgolfer Ich werde weitermachen und sagen, dass die Eingabe ≥1 Zahlen enthält.
Türknauf

Antworten:

7

Gelee, 7 Bytes

DUṛ"\UḌ

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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
quelle
5

Javascript, 45 42 Bytes

3 Bytes weg danke @Neil .

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

Die obige Funktion erwartet ein Array von Zeichenfolgen.

entfernt
quelle
1
Speichern Sie 4 Bytes mit z=z.slice(0,-x.length)+x,z=''(oder einem Variablennamen Ihrer Wahl).
Neil
@Neil. Schön! Ich wusste , es sollte eine Art und Weise zu tun , dass
entfernt
(Entschuldigen Sie, dass Sie die Speicherung falsch gezählt haben.) Außerdem ist die String-Version nicht erforderlich, da sich herausstellt, dass s=>s.split` `.map(2 Bytes (ich habe diesmal doppelt geprüft) kürzer sind als s=>s.replace(/\d+/g,.
Neil
@Neil. Gutes Argument. Ich habe es gerade dort gelassen, weil es mein erstes Ziel bei der Beantwortung war ... aber Sie haben Recht
entfernt
1

Netzhaut, 45 Bytes

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

Verwendet Bilanzkreise, um die Ziffern zu zählen, die viel kosten. Noch keinen besseren Ansatz gefunden, aber ich bin daran interessiert.

Probieren Sie es hier online aus.

randomra
quelle
0

Gema, 35 Zeichen

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

Eingabe: String mit durch irgendetwas getrennten Zahlen, Ausgabe-String.

Probelauf:

bash-4.3$ gema '<D>=@set{p;@fill-right{${p;};$0}}$p' <<< '123 45 6 7 89 200'
123 145 146 147 189 200
Mann bei der Arbeit
quelle
0

Ruby, 39 Zeichen

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

Eingabe: Array von Zeichenfolgen, Ausgabe: Array von Zeichenfolgen.

Probelauf:

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"] 
Mann bei der Arbeit
quelle