Số khởi đầu được xây dựng này là gì?


14

Một số ngôn ngữ lập trình xây dựng các số nguyên lớn thông qua 'nối' chữ số đến cuối số hiện có. Ví dụ: Labyrinth hoặc Thích ứng . Bằng cách ghép chữ số đến cuối, ý tôi là, nếu số hiện tại là và chữ số là , số kết quả là .457457(45×10+7)

Số được xây dựng là một số có thể được xây dựng theo cách này thông qua việc sử dụng bội số của các số có một chữ số: AKA một phần tử trong một trong 9 chuỗi sau:1,2,3,4,5,6,7,8,9

1,12,123,1234,12345,
2,24,246,2468,24690,
3,36,369,3702,37035,
4,48,492,4936,49380,
5,60,615,6170,61725,
6,72,738,7404,74070,
7,84,861,8638,86415,
8,96,984,9872,98760,
9,108,1107,11106,111105,

Để cung cấp một ví dụ về cách các chuỗi được xây dựng, đây là cách trình tự cho xây dựng:a=3

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×a=37260+99=37359u34=10×u33+34×a=37359+102=373692

bạn33bạn34 bao gồm để chứng minh khin×một100 . Rất nhiều chữ số rải rác cho không gian.

Có thể vẫn chưa rõ cách thức các chuỗi này được xây dựng, vì vậy đây là hai cách khác nhau để hiểu chúng:

  • Mỗi chuỗi bắt đầu từ một chữ số. Thuật ngữ tiếp theo được tìm thấy bằng cách lấy bội số tiếp theo của chữ số đó, nhân số hạng trước với 10 và thêm bội số. Theo trình tự:

    bạnn= =10×bạnn-1+n×một,bạn1= =một

    trong đó một là một chữ số đơn ( 1 đến 9 )


  • Mỗi trong số phần tử tại bất kỳ điểm nào trong chuỗi ( ví dụ ) là bội số của từ đến , trong đó được tạo bởi9n= =3123Giáo dục19123Giáo dụcbạnn+1= =10×bạnn+n (1,12,123,Giáo dục,123456789,1234567900,12345679011,Giáo dục)

    Vì vậy, các giá trị đầu tiên là , lần thứ hai là , lần thứ ba , v.v.1×1,2,3,Giáo dục,số 8,912×1,2,3,Giáo dục,số 8,9123×1,2,3,Giáo dục,số 8,9

Nhiệm vụ của bạn là lấy một số được xây dựng làm đầu vào và xuất ra chữ số ban đầu được sử dụng để xây dựng nó. Bạn có thể giả sử đầu vào sẽ luôn là một số được xây dựng và sẽ lớn hơn . Nó có thể là một chữ số duy nhất, ánh xạ trở lại chính nó.0

Bạn có thể lấy đầu vào theo bất kỳ cách hợp lý nào, bao gồm cả danh sách các chữ số, dưới dạng chuỗi, v.v. Có thể chấp nhận (mặc dù không được khuyến nghị) để lấy đầu vào một cách đơn nhất hoặc bất kỳ cơ sở nào khác bạn chọn.

Đây là một để mã ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

hoặc như hai danh sách:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

Khi tôi đăng thử thách này, tôi đã không nhận ra nó có thể được đơn giản hóa rất nhiều bằng phương pháp được sử dụng trong câu trả lời của Grimy , và do đó sẽ rất quan tâm đến các câu trả lời có cách tiếp cận toán học hơn để giải quyết vấn đề này, thay vì 'chữ số' lừa (Rõ ràng tất cả các câu trả lời hợp lệ đều có giá trị như nhau, chỉ là những gì tôi muốn thấy).


Sandbox bài . Tôi có một giải pháp 9 byte trong Jelly, nếu có ai muốn thách thức điều đó.
caird coinheringaahing

Câu trả lời:


26

05AB1E , 7 5 4 byte

>9*н

Hãy thử trực tuyến!

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
Hmm, điều đó không tốt cho thử thách này nếu nó có thể được đơn giản hóa một cách dễ dàng
caird coinheringaahing

9
Bạn có khoảng 1 byte mã cho 800 byte giải thích thách thức. : p
Arnauld

1
Làm thế nào để bạn đưa ra giải pháp và tại sao nó là chính xác?
Joel

7
@Joel số hạng (n-1) của chuỗi bắt đầu bằng a là a * (((10**n - 1) / 9 - n) / 9). Nhân số đó với 9 và thêm a*n, và bạn nhận được a * ((10**n - 1) / 9), còn gọi là chữ số n lặp lại. Hóa ra việc thêm 9 thay vì a*nlàm việc cho n = 1 và đối với n lớn hơn, sự khác biệt không đổi là không đáng kể bên cạnh sự tăng trưởng theo cấp số nhân.
Grimmy

3
@Grimy Cảm ơn rất nhiều vì lời giải thích. Có lẽ bạn có thể đặt nó vào bài viết của bạn.
Joel

3

MathGolf , 6 byte

)9*▒├Þ

Hãy thử trực tuyến!

Thật không may, headMathGolf không có hoạt động nào, vì vậy tôi phải thực hiện ▒├Þđể chuyển đổi thành chuỗi, bật từ bên trái và loại bỏ tất cả trừ phần trên cùng của ngăn xếp.





2

Than , 7 byte

§I×⁹⊕N⁰

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. @ Phương pháp của Grim dĩ nhiên. Đây là một cách tiếp cận toán học 27 byte:

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Sự cố trên đầu vào không hợp lệ. Giải trình:

Nθ

Nhập số lượng xây dựng.

W¬№Eχ×κ↨υχθ

Giải thích danh sách dưới dạng một số trong cơ sở 10, nhân với tất cả các số từ 0đến 9và xem liệu số được xây dựng có xuất hiện không.

⊞υLυ

Đẩy chiều dài của danh sách lên chính nó. Danh sách do đó trở thành hình thức [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Tạo lại các số được xây dựng nhưng lần này tìm và xuất chỉ mục mà tại đó số đầu vào xuất hiện.



2

Khoảng trắng , 108 byte

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

Chữ cái S(dấu cách), T(tab) và N(dòng mới) được thêm vào dưới dạng chỉ tô sáng.
[..._some_action]chỉ thêm vào giải thích.

Cảng @Grimy 05AB1E câu trả lời 's , ngoại trừ việc tôi không có một dựng sẵn để có được chữ số đầu tiên. ;)

Dùng thử trực tuyến (chỉ có không gian thô, tab và dòng mới).

Giải thích bằng mã giả:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT

2

Python 3 , 22 byte

lambda i:str(-~i*9)[0]

Hãy thử trực tuyến!

Cảng cáu bẩn 's 05AB1E câu trả lời


Python 3 , 74 byte

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

Hãy thử trực tuyến!

Giải trình

Hàm đệ quy. Lặp lại qua chuỗi cho mỗi chữ số l, bắt đầu từ 1. Nếu đầu vào ibằng với lần lặp hiện tại j, chữ số tương ứng lđược trả về. Khác, nếu giá trị hiện tại jtrong chuỗi vượt quá giá trị đầu vào i, nó sẽ tăng chữ số lvà bắt đầu lại. Đối số kđược sử dụng để tăng hệ số nhân.


1

JavaScript (ES6),  16  15 byte

Cảm ơn @Grimy vì đã gỡ bỏ ràng buộc 32 bit mà tôi có với phiên bản trước.

Sử dụng câu thần chú của Grimy . Đưa đầu vào dưới dạng một chuỗi.

n=>(n*9+9+n)[0]

Hãy thử trực tuyến!


JavaScript (ES6), 53 byte

Phương pháp vũ phu ngây thơ.

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

Hãy thử trực tuyến!


-~n*9có thể n*9+9, đó là cùng một bytecount nhưng nên thoát khỏi giới hạn 32 bit nếu tôi hiểu đúng.
Grimmy

lực lượng vũ phu hoạt động cho a> = 10, như14808
Nahuel Fouilleul

1
@NahuelFouilleul nếu chúng tôi xem xét a> = 10, câu trả lời không còn là duy nhất (14808 có thể là thuật ngữ thứ 4 của a = 12 hoặc thuật ngữ đầu tiên của a = 14808). Nếu đầu ra bất kỳ cái nào được cho phép, sẽ n=>nhoạt động cho tất cả các đầu vào.
Grimmy

1

Java 8, 23 byte

n->(n*9+9+"").charAt(0)

Cảng @Grimy 's 05AB1E câu trả lời , vì vậy hãy chắc chắn để upvote anh ta!

Hãy thử trực tuyến.

Nhưng vì tôi cảm thấy tệ cho @cairdCoinheringaahing , nên đây là một cách tiếp cận mạnh mẽ với khả năng chi trả hơn một chút ( 83 byte ):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

Hãy thử trực tuyến.

Giải trình:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result


0

Thạch , 8 byte

RRḌ÷@fⱮ9

Hãy thử trực tuyến!

Một chương trình đầy đủ lấy một số nguyên và in chữ số khởi động. Không sử dụng phương pháp thông minh của Grimy! Không hiệu quả khủng khiếp cho đầu vào lớn hơn. Phiên bản sau xử lý tất cả các trường hợp thử nghiệm nhưng dài hơn một byte:

Thạch , 9 byte

DJRḌ÷@fⱮ9

Hãy thử trực tuyến!



0

Keg -rr , 4 byte

⑨9*÷

Hãy thử trực tuyến!

Tất nhiên, sử dụng cách tiếp cận tương tự như câu trả lời 05AB1E. Cũng sử dụng -rrcờ mới (đảo ngược và in thô).

Dịch chuyển đến:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)

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.