Urutan Digit Tertulis

17

Berikut urutan yang sepele yang tidak ada dalam Ensiklopedia Online Urutan Bilangan Bulat .

Mulailah dengan urutan kosong kemudian tentukan setiap istilah sebagai jumlah karakter yang diperlukan untuk menulis, dalam bahasa Inggris, semua digit dari urutan sejauh ini tanpa spasi. *

Untuk referensi jumlah karakter dari semua (basis sepuluh) digit dalam bahasa Inggris adalah:

zero   one    two    three  four   five   six    seven  eight  nine
4      3      3      5      4      4      3      5      5      4

(Yang merupakan awal dari A52360 dan A5589 .)

Ini membuat entri pertama a(0)=0 karena ada nol digit hadir dalam urutan kosong.

Ini membuat entri kedua a(1)=4 karena dibutuhkan empat karakter untuk menulis "nol", satu-satunya digit yang ada sejauh ini.

Ini membuat entri ketiga a(2)=8 karena dibutuhkan empat karakter lagi untuk menulis "empat" untuk total delapan untuk menulis "zerofour".

Ini membuat entri keempat a(3)=13 karena dibutuhkan lima karakter lagi untuk menulis "delapan" untuk total tiga belas untuk menulis "zerofoureight".

Ini membuat entri kelima a(4)=21 karena dibutuhkan delapan karakter lagi untuk menulis "onethree" dengan total dua puluh satu untuk menulis "zerofoureightonethree".

...dan seterusnya. Berikut adalah 100 entri pertama:

0, 4, 8, 13, 21, 27, 35, 44, 52, 59, 67, 75, 84, 93, 102, 112, 121, 130, 142, 152, 162, 171, 182, 193, 205, 216, 225, 235, 247, 259, 270, 282, 293, 305, 318, 331, 344, 357, 371, 384, 398, 412, 422, 432, 444, 456, 467, 479, 492, 503, 516, 526, 536, 548, 561, 571, 583, 597, 610, 620, 630, 642, 652, 662, 671, 682, 693, 705, 718, 731, 744, 757, 771, 784, 798, 812, 823, 836, 849, 862, 873, 888, 903, 916, 926, 936, 948, 961, 971, 983, 997, 1010, 1024, 1038, 1055, 1070, 1086, 1101, 1114, 1127

* Kita dapat mendefinisikannya untuk bahasa lain dan / atau pangkalan lain atau dengan spasi tentu saja

Tantangan

Diberikan n output, dalam sesedikit mungkin byte kode, salah satu dari:

  • n syarat pertama dari urutan (harus bekerja untuk bilangan bulat non-negatif)
  • Nilai a(n) (harus bekerja untuk bilangan bulat non-negatif)
  • The n th jangka urutan (harus bekerja untuk bilangan bulat positif - yaitu nilai a(n1) )

Ini adalah sehingga jawaban tersingkat dalam byte menang untuk setiap bahasa, dan jawaban tersingkat dalam byte menang. Jangan biarkan bahasa golf menghentikan Anda dari memasukkan bahasa favorit Anda baik itu yang praktis maupun yang esoteris!

Jonathan Allan
sumber
Dengan opsi pertama, apakah maksud Anda 1) 1harus output [0]dan 0harus output []atau 2) 0harus output [0](seperti pada jawaban saya sebelumnya)?
Erik the Outgolfer
@EriktheOutgolfer Maksudku (1) karena harus mengembalikan istilah n pertama. Yaitu, opsinya adalah "output urutan hingga tetapi tidak termasuk a (n)", "output a (n)", atau "output a (n-1)".
Jonathan Allan
Jadi, a (x) = a (x-1) + f (a (x-1)) di mana f (x) adalah jumlah karakter yang diperlukan untuk menulis x?
FireCubez
@FireCubez ya, jika a (0) = 0 dan f (x) adalah karakter non-spasi untuk menulis digit x
Jonathan Allan

Jawaban:

12

Perl 6 , 45 byte

{({[+] @_.join.uninames>>.comb X-6}...*)[$_]}

Cobalah online!

Tidak perlu moduloing mewah ketika Anda bisa mendapatkan nama digit secara langsung! Blok kode anonim yang mengembalikan nilai ke-n dari urutan, atau Anda bisa meneruskan dalam kisaran untuk mendapatkan daftar nilai

Penjelasan:

{(                                     )[$_]}  # Index input into:
  {                               }...*        # An infinite sequence
                                               # Where each element is
   [+]   # The sum of
       @_.join  # All previous elements joined together
              .uninames  # The unicode names for each character
                         # These are names in the form "DIGIT ONE"
                       >>.comb  # Split each to lists of characters
                               X-6  # Subtract 6 from each
Jo King
sumber
@ Jonathan Allan Ah, saya berasumsi Anda telah mengizinkan urutan yang tak terbatas sebagai pengembalian, maaf. Saya akan memperbaikinya
Jo King
Bagus, itu bagus :)
Jonathan Allan
Bagus! »adalah satu byte, kan? Juga, [+]mungkin lebih manis dan memberi petunjuk bagaimana operasi biner dapat menjadi reduksi tetapi sumjuga tiga byte dan sesuai dengan sisa solusi yang mungkin bukan yang terpendek tapi pasti adalah imo golf paling elegan .
raiph
@raiph »adalah dua byte sehingga dapat dipertukarkan.
Jo King
Mungkin ini curang tetapi tidakkah Rakudo menangani kode sumber Latin1 dengan benar? Jika demikian, perhatikan yang say '»'.encode('latin1').bytes menampilkan 1. :)
raiph
8

JavaScript (ES6), 69 68 61 58 byte

Mengembalikan a(n) .

f=(n,s=0)=>n?f(n-1,[...s+''].map(d=>s+=(d+10)%23%3+3)|s):s

Cobalah online!

Bagaimana?

Digit d dikonversi ke sejumlah n huruf dengan:

n=(((d×100+10)mod23)mod3)+3

 d | *100 | +10 | MOD 23 | MOD 3 | +3 | word
---+------+-----+--------+-------+----+-------
 0 |    0 |  10 |   10   |   1   |  4 | zero
 1 |  100 | 110 |   18   |   0   |  3 | one
 2 |  200 | 210 |    3   |   0   |  3 | two
 3 |  300 | 310 |   11   |   2   |  5 | three
 4 |  400 | 410 |   19   |   1   |  4 | four
 5 |  500 | 510 |    4   |   1   |  4 | five
 6 |  600 | 610 |   12   |   0   |  3 | six
 7 |  700 | 710 |   20   |   2   |  5 | seven
 8 |  800 | 810 |    5   |   2   |  5 | eight
 9 |  900 | 910 |   13   |   1   |  4 | nine

Karena angka dipecah menjadi karakter digit, kita dapat memproses d×100+10 hanya dengan menambahkan 10 (sebagai penggabungan string).

Arnauld
sumber
7

Stax , 14 13 byte

┴♥7[╘⌂←─üTJ‼√

Jalankan dan debug itu

Wawasan utama di sini adalah angka yang dmembutuhkan ((4 - 2 * d) // 3) % 3 + 3ejaan huruf. (Itu pembagian integer python, dan modulus non-negatif gaya python)

rekursif
sumber
5

Pip , 21 byte

Lai+:$+4335443554@^Pi

nn

Penjelasan

Lai+:$+4335443554@^Pi
                       a is 1st cmdline arg; i is 0 (implicit)
La                     Loop (a) times:
                   Pi   Print i
                  ^     Split it into a list of characters (i.e. digits)
       4335443554@      Use each digit to index into this number, giving the length of the
                        name of the digit (0 -> 4, 1 -> 3, etc.)
     $+                 Sum the results
  i+:                   Increment i by that amount
DLosc
sumber
2
Saya membaca ini sebagai large constant to the power of pidan terkesan monumental. (Ini masih mengesankan, tetapi interpretasi awal saya hanya .. lebih)
Οurous
4

Bahasa Wolfram (Mathematica) , 57 byte

Nest[#+Tr@StringLength@IntegerName@IntegerDigits@#&,0,#]&

Cobalah online!

Tr@StringLength@IntegerName@IntegerDigits@#& daftar digit dari # , mengonversikan masing-masing ke nama bahasa Inggris, menghitung panjangnya, dan menjumlahkan hasilnya. Banyak hal yang termasuk daftar, sangat menarik. Maka kita hanya menerapkan definisi iteratif.

TIO mengeluh bahwa itu tidak memiliki koneksi Internet, tetapi saya tidak yakin mengapa, karena bagaimanapun mencari jawaban yang tepat. Mungkin sedang memeriksa pembaruan untuk nama bilangan bulat?

a(n)a(0),a(1),,a(n)NestNestList

Misha Lavrov
sumber
4

Bersihkan , 82 byte

import StdEnv,Text
$a=iter a(\n=n+sum[3+indexOf{c}" 9810324765"rem 3\\c<-:""<+n])0

Cobalah online!

Suram
sumber
4

05AB1E , 15 14 byte

ÎFD•16\|/•sSèOO

Cobalah online!

Penjelasan

Î                # initialize stack with 0 and input
 F               # input times do:
  D              # duplicate the current number
         sSè     # and use one copy to index into
   •Qb₁ñ•        # 433544355
            OO   # sum digits and sum the stack
Emigna
sumber
4

APL (Dyalog Unicode) , 29 28 byte

{{⍵++/3+3|⌊3÷⍨4-2×⍎¨⍕⍵}⍣⍵⊢0}

Cobalah online!

Dfn. Cetakanf(sayanhalkamut)

Terima kasih kepada teman-teman @The APL Orchard untuk membantu yang satu ini:

@ ngn untuk 2 byte; @ H.PWiz selama 3 4 byte.

Sekarang menggunakan rumus @ rekursif.

Bagaimana:

{{⍵++/3+3|⌊3÷⍨4-2×⍎¨⍕⍵}⍣⍵⊢0}  Main fn

 {                     }⍣⍵⊢0  Starting with 0, repeat (⍣) the inner fn input times
      3+3|⌊3÷⍨4-2×⍎¨⍕⍵       @recursive's formula
  ⍵++/                       ⍝ Sum with the input.
J. Sallé
sumber
3

Python 2 , 61 byte

n=0
exec"for c in`n`:n+=(4-2*int(c))/3%3+3\n"*input()
print n

Cobalah online!

Menggunakan pemetaan jumlah digit rekursif .


Python 2 , 63 byte

f=lambda n:n and f(n-1)+sum((4-2*int(c))/3%3+3for c in`f(n-1)`)

Cobalah online!

Versi fungsi rekursif. Dibutuhkan waktu yang eksponensial untuk dijalankan karena memiliki dua panggilan rekursif f(n-1).

Tidak
sumber
Bagus! Saya ingin tahu apakah naskah penemuan ekspresi yang Anda sebutkan menggunakan sebelum menemukan ungkapan ini (atau mungkin yang lebih pendek?)
Lynn
@ Lynn saya telah menjalankan skrip tetapi tidak menemukan yang lebih baik. 13 karakter terlalu banyak untuk pencarian penuh, dan tidak menemukan apa-apa paling lama 9 karakter. Ketika saya memotong +3dan membatasi ke operator aritmatika (tidak ada bitwise) dan angka <= 4, saya menemukan solusi ini tetapi tidak ada yang lebih pendek atau bahkan panjang yang sama kecuali yang setara.
xnor
3

Python 2 , 71 byte

f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or k

Cobalah online!

ovs
sumber
f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or kadalah jumlah yang sama tetapi menghindari mengeluarkan daftar terlampir.
Jonathan Allan
Sepertinya algoritma rekursif dari jawaban staxx mereka akan menghemat 2 byte. Saya suka ini!
Jonathan Allan
3

MathGolf , 17 byte

0\{_▒♀*♂+L%3%3+Σ+

Cobalah online!

Ini menggunakan metode Arnauld . Menghasilkan elemen ke-n dari urutan .. Jika string kosong tidak apa-apa a(0), maka kita bisa menghapusnya 0\di awal.

Penjelasan:

0\                 Setup 0 as the counter
  {                Loop input times
   _▒              Duplicate counter and split to list of digits
     ♀*            Multiply each element by 100
       ♂+          Add 10
         L%        Modulo by 23
           3%      Modulo by 3
             3+    Add 3
               Σ   Sum list
                +  And add to counter
Jo King
sumber
3

Pyth , 21 byte

u+Gs@L+L3jC\᯻3jGTQ0

Cobalah online di sini .

u+Gs@L+L3jC\᯻3jGTQ0   Implicit: Q=eval(input()), T=10

u                Q0   Starting at 0, repeat the following Q times, with current value as G:
          C\᯻           Get character code 7163
         j   3          Convert the above to base 3, yields [1, 0, 0, 2, 1, 1, 0, 2, 2]
      +L3               Add 3 to each to generate digit length dictionary
              jGT       Get digits of G (convert to base 10)
    @L                  Lookup each value in the above in the dictionary, modular indexing
   s                    Take the sum
 +G                     Add G to the above
Sok
sumber
sangat mungkin bukan satu byte dalam codepage Pyth. (Saya pikir itu menggunakan UTF-8, dalam hal ini adalah 3 byte, dan j7163 3memiliki panjang yang sama; tetapi tio.run mengatakan Pyth memiliki SBCS. Misterius!)
Lynn
@ Lynn Anda benar sekali, saya lupa tentang jumlah byte, salah saya. Saya akan meninggalkan kode seperti sekarang dan memperbarui jumlah byte
Sok
2

Java (JDK) , 95 byte

n->{int l=0;while(n-->0)l+=(""+l).chars().map(x->"4335443554".charAt(x-48)-48).sum();return l;}

Cobalah online!

Olivier Grégoire
sumber
1

Jelly , 13 byte

ṃ“vẋç’ḃ5¤S+Ɗ¡

Cobalah online!

Diindeks 0.

Program lengkap; menerima input dari STDIN.

Erik the Outgolfer
sumber
1

Merah , 99 95 byte

func[n][d:"4335443554"s: 0 repeat i n[print s foreach c form s[s: s - 48 + do d/(-47 + do c)]]]

Cobalah online!

Hanya solusi sederhana.

Galen Ivanov
sumber
1

J , 37 byte

(+1#.|(3+3|23|10+100*]),.&.":)@]^:[&0

Cobalah online!

Menggunakan metode Arnauld

Penjelasan:

Argumennya adalah n

                                 ^:    - apply the verb on the left hand site
                                   [   - n times
                                    &0 - to a starting value 0
 (                             )@]     - calculate for the current value of the argument
                         ,.&.":        - convert to string and then each char to digit
        (3+3|23|10+100*])              - map each digit to its word length
       |                               - a filler for the fork
    1#.                                - sum the lengths 
   +                                   - add them to the current value
Galen Ivanov
sumber
1

Diedit setelah komentar pertama.

Mencetak semua istilah

Scala, 76 byte

def^(n:Int)=(1 to n).scanLeft(0)((y,_)=>y+(y+"").map(x=>(x*9+1)%13%3+3).sum)

Cobalah online!

Cetakan n th jangka

Scala, 72 byte

def^(n:Int)=Stream.iterate(0)(x=>x+(x+"").map(x=>(x*9+1)%13%3+3).sum)(n)

Scala, 69 byte

def^(n:Int)=(0/:(1 to n))((y,_)=>y+(y+"").map(x=>(x*9+1)%13%3+3).sum)

Scala, 67 byte

def s(b:Int):Stream[Int]=b#::s(b+(b+"").map(x=>(x*9+1)%13%3+3).sum)

Scala, 67 byte

val s:Stream[Int]=0#::s.map(x=>x+(x+"").map(x=>(x*9+1)%13%3+3).sum)

Cobalah online!

Dr Y Wit
sumber
1
Saya tidak tahu Scala, tapi saya pikir ini bukan program atau fungsi melainkan potongan (yaitu berjalan di REPL setelah ndidefinisikan). Jika Anda tahu Scala, mungkin mudah diperbaiki. Perhatikan juga bahwa ada tips untuk bermain golf di pertanyaan Scala yang mungkin membantu. Terakhir bagus untuk mengirim tautan ke juru bahasa online, TIO memiliki Scala dan digunakan oleh banyak anggota PPCG.
Jonathan Allan
1
@ JonathanAllan, terima kasih, itu sangat membantu.
Dr Y Wit