Apa starter angka yang dikonstruksi ini?

14

Sejumlah bahasa pemrograman membangun bilangan bulat besar melalui 'menyatukan' digit ke akhir angka yang ada. Misalnya, Labirin , atau Beradaptasi . Dengan menyatukan angka sampai akhir, maksud saya, jika angka yang ada adalah 45 , dan angka itu adalah 7 , angka hasilnya adalah 457(45×10+7) .

Angka yang dikonstruksi adalah angka yang dapat dibangun dengan cara ini melalui penggunaan kelipatan angka satu digit: 1,2,3,4,5,6,7,8,9 AKA merupakan elemen dalam salah satu dari 9 sekuens ini:

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,

Untuk memberikan contoh bagaimana urutan dibangun, berikut adalah cara urutan untuk a=3 dibangun:

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

kamu33 dankamu34 dimasukkan untuk menunjukkan kapann×Sebuah100 . Sebuahbanyakdari angka putus-putus untuk ruang.

Mungkin masih belum jelas bagaimana urutan ini dibangun, jadi inilah dua cara berbeda untuk memahaminya:

  • Setiap urutan dimulai dari satu digit. Istilah berikutnya ditemukan dengan mengambil kelipatan berikutnya dari digit itu, mengalikan istilah sebelumnya dengan 10 dan menambahkan kelipatan tersebut. Secara urutan:

    un=10×un1+n×a,u1=a

    di mana Sebuah adalah satu digit ( 1 hingga 9 )


  • Masing-masing dari 9 elemen pada setiap titik dalam urutan (mengambil n=3 misalnya) adalah kelipatan 123... dari 1 ke 9 , di mana 123... dibangun oleh kamun+1=10×kamun+n (1,12,123,...,123456789,1234567900,12345679011,...)

    Jadi nilai pertama adalah 1×1,2,3,...,8,9 , yang kedua adalah 12×1,2,3,...,8,9 , yang ketiga 123×1,2,3,,8,9 , dll.

Tugas Anda adalah untuk mengambil nomor yang dibangun sebagai input dan untuk menghasilkan angka awal yang digunakan untuk membangunnya. Anda dapat berasumsi bahwa input akan selalu berupa angka yang dikonstruksi, dan akan lebih besar dari 0 . Mungkin satu digit, yang memetakan kembali ke dirinya sendiri.

Anda dapat mengambil input dengan cara apa pun yang masuk akal, termasuk sebagai daftar digit, sebagai string, dll. Dapat diterima (meskipun tidak disarankan) untuk mengambil input secara unary, atau pangkalan lain yang Anda pilih.

Ini adalah sehingga kode terpendek menang!

Uji kasus

       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

atau sebagai dua daftar:

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

Ketika saya memposting tantangan ini, saya tidak menyadari itu bisa disederhanakan begitu banyak dengan metode yang digunakan dalam jawaban Grimy , dan karena itu akan sangat tertarik pada jawaban yang mengambil pendekatan yang lebih matematis untuk menyelesaikan ini, daripada 'digit' trick (Jelas semua jawaban yang valid sama-sama valid, hanya apa yang saya tertarik melihatnya).

caird coinheringaahing
sumber
Posting kotak pasir . Saya punya solusi 9 byte di Jelly, kalau ada yang mau menantang itu.
caird coinheringaahing

Jawaban:

26

05AB1E , 7 5 4 byte

>9*н

Cobalah online!

>            # input + 1
 9*          # * 9
   н         # take the first digit
Grimmy
sumber
6
Hmm, itu bukan pertanda baik untuk tantangan ini jika dapat disederhanakan dengan mudah
caird coinheringaahing
9
Anda memiliki sekitar 1 byte kode untuk 800 byte penjelasan tantangan. : p
Arnauld
1
Bagaimana Anda menemukan solusinya dan mengapa itu benar?
Joel
7
@ Joel the (n-1) istilah urutan yang dimulai dengan a a * (((10**n - 1) / 9 - n) / 9). Kalikan dengan 9 dan tambahkan a*n, dan Anda dapatkan a * ((10**n - 1) / 9), alias digit yang diulang n kali. Ternyata menambahkan 9 alih-alih a*nbekerja untuk n = 1, dan untuk lebih besar n perbedaan konstan diabaikan di samping pertumbuhan eksponensial.
Grimmy
3
@Grimy Terima kasih banyak untuk penjelasannya. Mungkin Anda bisa memasukkannya ke dalam posting Anda.
Joel
3

MathGolf , 6 byte

)9*▒├Þ

Cobalah online!

Sayangnya, tidak ada headoperasi di MathGolf, jadi saya harus puas dengan ▒├Þmengonversi ke string, muncul dari kiri dan buang semua kecuali bagian atas tumpukan.

Jo King
sumber
2

Arang , 7 byte

§I×⁹⊕N⁰

Cobalah online! Tautan adalah untuk mengucapkan versi kode. @ Metode Grimy tentu saja. Berikut ini adalah pendekatan matematika 27 byte:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Gangguan pada input yang tidak valid. Penjelasan:

Nθ

Masukkan nomor yang dibangun.

W¬№Eχ×κ↨υχθ

Menafsirkan daftar sebagai angka dalam basis 10, kalikan dengan semua angka dari 0ke 9, dan lihat apakah nomor yang dikonstruksi muncul.

⊞υLυ

Dorong panjang daftar ke dirinya sendiri. Oleh karena itu daftar menjadi bentuk [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Buat kembali angka-angka yang dikonstruksi tetapi kali ini temukan dan keluarkan indeks tempat nomor input muncul.

Neil
sumber
2

Labyrinth ,  28 22  20 byte

9 10/;!@
? _ :
)*"""

Menerapkan metode berbasis digit yang dijelaskan oleh Grimy dengan pembagian bilangan bulat berulang sepuluh hingga nol ditemukan.

Cobalah online!

Jonathan Allan
sumber
2

Spasi , 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]

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

Jawaban Port @Grimy pada 05AB1E , kecuali bahwa saya tidak memiliki builtin untuk mendapatkan angka pertama. ;)

Cobalah online (dengan spasi, tab, dan hanya baris baru).

Penjelasan dalam pseudo-code:

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
Kevin Cruijssen
sumber
2

Python 3 , 22 byte

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

Cobalah online!

Pelabuhan Kotor 's jawaban 05AB1E


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

Cobalah online!

Penjelasan

Fungsi rekursif. Ulangi urutan untuk setiap digit l, mulai dari 1. Jika input isama dengan iterasi saat ini j, digit yang sesuai ldikembalikan. Lain, jika nilai saat ini jdalam urutan melebihi nilai input i, itu akan menambah digit ldan memulai dari awal. Argumen kdigunakan untuk meningkatkan faktor multiplikasi.

Jitse
sumber
1

JavaScript (ES6),  16  15 byte

Terima kasih kepada @Grimy karena telah mengangkat kendala 32-bit yang saya miliki dengan versi sebelumnya.

Menggunakan mantra magis Grimy . Mengambil input sebagai string.

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

Cobalah online!


JavaScript (ES6), 53 byte

Pendekatan brute force naif.

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

Cobalah online!

Arnauld
sumber
-~n*9bisa n*9+9, yang merupakan bytecount yang sama tetapi harus menyingkirkan batasan 32-bit jika saya mengerti dengan benar.
Grimmy
brute force bekerja untuk> = 10, seperti14808
Nahuel Fouilleul
1
@NahuelFouilleul jika kita menganggap a> = 10, jawabannya tidak lagi unik (14808 bisa berupa suku ke-4 dari a = 12, atau suku pertama dari a = 14808). Jika mengeluarkan salah satu dari itu diperbolehkan, n=>nbekerja untuk semua input.
Grimmy
1

Java 8, 23 byte

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

Jawaban Port dari @Grimy 's 05AB1E , jadi pastikan untuk membesarkan hatinya!

Cobalah online.

Tetapi karena saya agak merasa tidak enak untuk @cairdCoinheringaahing , berikut ini pendekatan brute-force dengan sedikit lebih banyak kemampuan ( 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;}

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
0

Jelly , 8 byte

RRḌ÷@fⱮ9

Cobalah online!

Program lengkap yang mengambil integer dan mencetak digit starter. Tidak menggunakan metode cerdik Grimy! Sangat tidak efisien untuk input yang lebih besar. Versi berikut menangani semua kasus uji tetapi satu byte lebih lama:

Jelly , 9 byte

DJRḌ÷@fⱮ9

Cobalah online!

Nick Kennedy
sumber
0

Hy , 44 byte

(defn a[p](print(get(str(*(+(int p)1)9))0)))

Menggunakan metode Grimy

Cobalah online!

girobuz
sumber
0

Tong -rr , 4 byte

⑨9*÷

Cobalah online!

Tentu saja, gunakan pendekatan yang sama dengan jawaban 05AB1E. Juga menggunakan yang baru-rr bendera (terbalik dan cetak mentah).

Transpile ke:

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)
Laksal
sumber
0

Gelisah , 30 byte

Hanya sebagian besar jawaban.

Fn.new{|i|(i*9+9).toString[0]}

Cobalah online!

Sebuah'_'
sumber