Mở rộng tốc ký tăng số nguyên


18

Đưa ra một đầu vào của một danh sách các số theo định dạng của một chuỗi số nguyên tăng tốc, xuất ra chuỗi đầy đủ.

Tốc độ tăng định dạng chuỗi số nguyên hoạt động bằng cách tìm mọi số n có ít chữ số hơn số trước nó, m . Với d là số chữ số trong n , chữ số d cuối cùng của m được thay thế bằng tất cả các chữ số của n . Đây là một ví dụ đầu vào:

123 45 6 7 89 200

Áp dụng quy tắc thay thế, trước tiên chúng ta biến 45 thành 145 vì 45 <123:

123 145 6 7 89 200

Liên tục áp dụng quy tắc tương tự, điều này trở thành:

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

Trình tự hiện được sắp xếp (không có số nào áp dụng quy tắc này), vì vậy đây là đầu ra cuối cùng.

Bạn có thể cho rằng

  • ký hiệu tốc ký luôn được sử dụng khi có thể. Ví dụ, đầu vào sẽ 12 3, không bao giờ 12 13.

  • số sẽ không bao giờ giảm trong khi vẫn giữ nguyên số chữ số. Ví dụ, đầu vào sẽ không bao giờ 333 222.

  • áp dụng quy tắc tốc ký sẽ không bao giờ dẫn đến một số vẫn nhỏ hơn số trước đó trong chuỗi. Ví dụ, đầu vào sẽ không bao giờ 123 12.

  • số sẽ luôn là số nguyên dương và không bao giờ chứa số 0 đứng đầu (nếu sử dụng định dạng chuỗi).

  • chuỗi đầy đủ, mở rộng sẽ không bao giờ chứa các số trùng lặp. (Tuy nhiên, trình tự tốc ký có thể; ví dụ 10 1 20 1-> 10 11 20 21.)

  • sẽ có ít nhất một số trong đầu vào.

Đầu vào và đầu ra có thể là danh sách / mảng số / chuỗi hoặc một chuỗi với các phần tử được phân tách bằng bất kỳ chữ số nào.

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Các trường hợp thử nghiệm, với đầu vào và đầu ra trên các dòng xen kẽ:

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

Thử thách khá cũ, nhưng a) đầu vào có trống không? b) đầu vào chỉ có thể chứa một số?
Erik các Outgolfer

@EriktheOutgolfer Tôi sẽ tiếp tục và nói rằng sẽ có ≥1 số trong đầu vào.
Doorknob

Câu trả lời:


7

Thạch, 7 byte

DUṛ"\UḌ

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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.

5

Javascript, 45 42 byte

Tắt 3 byte cảm ơn @Neil .

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

Hàm trên mong đợi một chuỗi các chuỗi.


1
Lưu 4 byte bằng cách sử dụng z=z.slice(0,-x.length)+x,z=''(hoặc tên biến của sự lựa chọn của bạn).
Neil

@Neil. Đẹp quá Tôi biết nên có cách để làm điều đó
đã xóa

(Xin lỗi vì đã tiết kiệm sai.) Ngoài ra, phiên bản chuỗi là không cần thiết vì hóa ra s=>s.split` `.map(là 2 byte (lần này tôi đã kiểm tra lại lần này) ngắn hơn s=>s.replace(/\d+/g,.
Neil

@Neil. Điểm hợp lệ. Tôi chỉ nhảy nó ở đó vì đó là mục tiêu đầu tiên của tôi khi trả lời ... nhưng bạn đã đúng
đã xóa


0

Gema, 35 ký tự

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

Đầu vào: chuỗi với các số được phân tách bằng bất cứ thứ gì, chuỗi đầu ra.

Chạy mẫu:

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

0

Ruby, 39 ký tự

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

Đầu vào: mảng chuỗi, đầu ra: mảng chuỗi.

Chạy mẫu:

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"] 

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.