Perluas urutan bilangan bulat yang meningkat

18

Diberikan input dari daftar angka dalam format urutan bilangan bulat meningkat, output urutan penuh.

Format urutan integer meningkat berfungsi dengan menemukan setiap angka n dengan digit lebih sedikit dari angka sebelumnya, m . Dengan d sebagai jumlah digit dalam n , d digit terakhir m diganti dengan semua digit n . Berikut ini contoh input:

123 45 6 7 89 200

Menerapkan aturan penggantian, pertama-tama kita mengubah 45 menjadi 145 karena 45 <123:

123 145 6 7 89 200

Berulang kali menerapkan aturan yang sama, ini menjadi:

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

Urutan sekarang diurutkan (tidak ada angka yang berlaku aturan), jadi ini adalah hasil akhir.

Anda mungkin menganggap itu

  • notasi steno selalu digunakan bila memungkinkan. Misalnya, input tidak akan 12 3pernah 12 13.

  • angka tidak akan pernah berkurang sambil tetap jumlah digit yang sama. Misalnya, input tidak akan pernah ada 333 222.

  • menerapkan aturan steno tidak akan pernah menghasilkan angka yang masih kurang dari angka sebelumnya dalam urutan. Misalnya, input tidak akan pernah ada 123 12.

  • angka akan selalu bilangan bulat positif dan tidak pernah mengandung 0s terkemuka (jika menggunakan format string).

  • urutan penuh yang diperluas tidak akan pernah berisi angka duplikat. (Namun, urutan steno mungkin; ex. 10 1 20 1-> 10 11 20 21.)

  • akan ada setidaknya satu nomor dalam input.

Input dan output dapat berupa daftar / array angka / string atau string tunggal dengan elemen yang dipisahkan oleh non-digit.

Karena ini adalah , kode terpendek dalam byte akan menang.

Test case, dengan input dan output pada jalur bolak-balik:

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
Gagang pintu
sumber
Tantangan sudah cukup tua, tetapi a) dapatkah inputnya kosong? b) dapatkah input hanya berisi satu angka?
Erik the Outgolfer
@EriktheOutgolfer Saya akan melanjutkan dan mengatakan akan ada ≥1 angka dalam input.
Gagang Pintu

Jawaban:

7

Jelly, 7 byte

DUṛ"\UḌ

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

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

Javascript, 45 42 byte

Off 3 byte terima kasih @Neil .

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

Fungsi di atas mengharapkan array string.

dihapus
sumber
1
Simpan 4 byte menggunakan z=z.slice(0,-x.length)+x,z=''(atau nama variabel pilihan Anda).
Neil
@Neil. Yang bagus! Saya tahu seharusnya ada cara untuk melakukan itu
dihapus
(Maaf karena salah menghitung penghematan.) Selain itu, versi string tidak diperlukan karena ternyata itu s=>s.split` `.map(2 byte (saya periksa ulang kali ini) lebih pendek dari s=>s.replace(/\d+/g,.
Neil
@Neil. Poin yang valid. Saya baru saja meninggalkannya di sana karena adalah tujuan pertama saya ketika menjawab ... tetapi Anda benar
dihapus
1

Retina, 45 byte

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

Menggunakan kelompok penyeimbang untuk menghitung angka yang membutuhkan biaya banyak. Belum menemukan pendekatan yang lebih baik tapi saya tertarik.

Cobalah online di sini.

randomra
sumber
0

Gema, 35 karakter

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

Input: string dengan angka yang dipisahkan oleh apa pun, string output.

Contoh dijalankan:

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

Ruby, 39 karakter

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

Input: array string, output: array string.

Contoh dijalankan:

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"] 
manatwork
sumber
0

Python 2 , 58 byte

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

Cobalah online!

Erik the Outgolfer
sumber