Nomor kepercayaan

14

Nomor kepercayaan

Membiarkan xmenjadi bilangan bulat dari basis sewenang-wenang, sedemikian rupa sehingga Dmerupakan array dari digit-digitnya. xadalah Nomor Percaya jika, untuk semua nantara 1dan panjang D:

D[n+1] = D[n] + D[n-1] + ... + D[1] + n

Ambil, misalnya, nomor 349dalam basis 10. Jika kita memberi label indeks untuk nomor ini, kita memiliki yang berikut ini.

Index    Digit
-----    -----
1        3
2        4
3        9

Mulai dari digit pertama, kita miliki 1 + 3 = 4, yang menghasilkan digit berikutnya. Kemudian dengan digit kedua yang kita miliki 3 + 4 + 2 = 9, yang, sekali lagi, menghasilkan digit berikutnya. Dengan demikian, nomor ini adalah Nomor Percaya.


Diberi bilangan bulat dengan basis antara 1 dan 62, hitung semua Nomor Percaya untuk basis itu, dan buat daftar, dipisahkan oleh baris baru. Anda dapat mengasumsikan bahwa ada jumlah terbatas dari Nomor Percaya untuk basis tertentu.

Untuk digit lebih besar dari 9, gunakan karakter alfa A-Z, dan untuk digit lebih besar dari Zgunakan karakter alfa a-z. Anda tidak perlu khawatir tentang angka di luar z.

Mereka tidak harus menjadi output dalam urutan tertentu.


Input sampel:

16

Output sampel:

0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F

Ini kode golf, jadi kode terpendek menang. Semoga berhasil!

(Terima kasih kepada Zach karena telah membantu memformat dan menunjukkan beberapa masalah.)

sebuah spaghetto
sumber
Maaf, sedikit kebingungan antara saya dan Zach tentang pertanyaan itu. Semuanya harus diformat sekarang.
spaghetto
Pengamatan yang berguna: dalam angka kepercayaan, setiap digit adalah satu ditambah dua kali lipat dari digit sebelumnya, kecuali digit kedua sebaliknya satu ditambah digit pertama.
xnor
Pergi secara kolom mengungkapkan pola (mungkin) berguna lainnya;)
Geobits
1
Dalam contoh, mengapa CDtidak ada dalam daftar? Karena semua kombinasi lain dengan digit kedua lebih dari digit pertama terdaftar, saya tidak mengerti mengapa CDtidak memenuhi syarat.
Reto Koradi
Itu kecelakaan: P Fixed, terima kasih sudah menunjukkannya.
spaghetto

Jawaban:

2

Pyth, 38 byte

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ

Cobalah online: Peragaan

Penjelasan:

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ  implicit: Q = input base
0                                       print 0
                       m            SQ  map each d of [1, 2, ..., Q] to:
                        .u       Q]d      start with N=[d], apply v Q times
                          +N+lNsN           add (len(N) + sum(N)) to N
                                          gives all intermediate results
                      s                 join to one list of candidates
                 f<eTQ                  filter those, where every digit < Q
  ms@L+s`MT+rG1Gd                       convert numbers to letters 0-9A-Za-z
 j                                      print each on separate line
Jakube
sumber
9

Python 2, 104 byte

n=input()
for i in range(n):
 s=''
 while i<n:s+=chr(48+i+(i>9)*7+i/36*6);print s;i+=n**0**i+i*(s>s[:1])

Ini menggunakan pengamatan berikut: dalam angka kepercayaan, digit idiikuti oleh 2*i+1, kecuali i+1untuk digit kedua. Dengan mencoba semua digit pertama yang mungkin dan menambahkan lebih banyak digit hingga terlalu besar, kita dapat menghasilkan semua angka kepercayaan.

Kami menghitung karakter yang sesuai dengan angka isebagai chr(48+i+(i>9)*7+i/36*6), yang menggesernya ke dalam angka, huruf besar, atau rentang huruf besar untuk interval 0-9, 10-35, 36-61.

Kemudian, kami meningkat imelalui i+=i+1dengan dua penyesuaian. Untuk membuatnya i+=1setelah digit pertama, kami menambahkan isyarat smemiliki lebih dari 1karakter. Juga, kita perlu menghindari angka yang dimulai dengan 0 dari yang dicetak, sementara pada saat yang sama memungkinkan 0. Untuk melakukan ini, kami melakukan peretasan yang menyebabkan i=0kegagalan kondisi i<npada loop berikutnya dengan menambahkannya n. Hal ini dilakukan dengan mengganti 1dengan n**0**i, yang dikaitkan dengan hak n**(0**i), yang sama dengan n**(i==0)atau n if i==0 else 1.

Tidak
sumber
Wow, sial. Hampir setengah ukuran dibandingkan dengan Python 3! Hmm. Saya ingin tahu berapa banyak byte yang dapat saya simpan jika saya menggunakan beberapa trik Anda ...
El'endia Starman
4

Python 3, 201 200 byte

n=int(input())
X=[[i]for i in range(1,n)]
for x in X:
 y=sum(x)+len(x)
 if y<n:X.append(x+[y])
X=[[0]]+X
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))

Penjelasan

Wawasan kunci di sini adalah bahwa dengan diberi urutan x(seperti, katakanlah [1,2,5]), Anda bisa mendapatkan istilah berikutnya dalam urutan dengan sum(x)+len(x), yang memberi 11dalam kasus ini ( B). Periksa untuk melihat apakah ini kurang darin , dan jika ya, tambahkan urutan yang diperluas ke daftar semua urutan tersebut (diunggulkan oleh semua digit tunggal).

[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)]

Ini adalah bagaimana saya memetakan item urutan ke karakter. Ini ''.joindiedit bersama dan kemudian dicetak, dipisahkan oleh baris baru.

El'endia Starman
sumber
Anda dapat menyimpan satu byte dengan mengubah baris terakhir Anda menjadi print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X)). Juga, saat ini 201 byte; bukan 200.
Zach Gates
@ZachGates: Saya memang memikirkan hal itu, tetapi tidak menyadari saya bisa meninggalkan tanda kurung. Terima kasih!
El'endia Starman
4

GS2, 44 byte

26 c8 2f 08 4d 08 40 64 45 2e 30 42 67 40 24 d0
75 d3 20 e1 35 09 cb 20 23 78 22 09 34 30 e0 32
08 86 84 30 85 30 92 58 09 34 10

Ini menghasilkan angka dalam urutan yang berbeda, tetapi deskripsi masalah tidak menentukan, jadi saya akan melakukannya! Inilah output untuk input 16.

1
12
125
125B
2
23
237
237F
3
34
349
4
45
45B
5
56
56D
6
67
67F
7
78
8
89
9
9A
A
AB
B
BC
C
CD
D
DE
E
EF
F
0

Berikut ini adalah ekuivalen mnemonik untuk byte:

read-num dec save-a
range1
{
    itemize
    {
        dup 
        sum
        over length
        add

        swap right-cons

        dup last push-a le

            push-d eval
        block2 when
    }
    save-d eval
    init inits tail
} map

+ ' fold 

{
    ascii-digits
    uppercase-alphabet catenate
    lowercase-alphabet catenate
    select 
    show-line
} map

0
rekursif
sumber
Oh man, ini luar biasa. Saya sudah mencoba untuk belajar GS2 tapi saya mengalami masa-masa sulit dengan itu: P
a spaghetto
3

CJam, 46 42 40 byte

ri:R,{Q{+_A,s'[,_el^+f=oNo__,+:+_R<}g&}*

Cobalah online di penerjemah CJam .

Bagaimana itu bekerja

ri:R            e# Read an integer from STDIN and save it in R.
,               e# Push [0 ... R-1].
{               e# Fold; For each element but the first:
                e#   Push the element.
  Q             e#   Push an empty array (accumulator for base-R digits).
  {             e#   Do:
    +           e#     Concatenate the integer and the array on the stack.
    _           e#     Push a copy of the result.
    A,s'[,_el^+ e#     Push "0...0A...Za...z".
                e#     See: http://codegolf.stackexchange.com/a/54348
    f=          e#     Replace each base-R digit with the corresponding character.
    oNo         e#     Print the resulting string and a linefeed.
    _           e#     Push another copy of the accumulator.
    _,+         e#     Append its length to it.
    :+          e#     Add all digits (including the length).
    _R<         e#     Push a copy of the result and compare it with R.
  }g            e#   If the sum is less than R, it is a valid base-R digit,
                e#   the comparison pushes 1, and the loop is repeated.
  &             e#   Intersect the accumulator with an integer that is greater
                e#   or equal to R. This pushes an empty array.
}*              e#

Pada akhir 0 dan beberapa array kosong dibiarkan di tumpukan, sehingga juru cetak mencetak 0.

Dennis
sumber
1

gawk, 111 byte

{for(n=$0;n>c=++i;)for(j=0;n>$++j=c+=j;print"")for(c=k=0;k++<j;c+=$k)printf"%c",$k+($k>9?$k>35?61:55:48)}$0="0"

Untuk setiap digit mulai dari 1untuk base-1menghitung angka berikutnya, dan sementara ini lebih rendah dari dasar kita masih memiliki sejumlah kepercayaan. Menghitung digit berikutnya saat mencetak. Akhirnya dicetak 0.

Cabbie407
sumber