Số tự tin


14

Số tự tin

Hãy xlà một số nguyên của một cơ sở tùy ý, đó Dlà một mảng các chữ số của nó. xlà Số tự tin nếu, cho tất cả ngiữa 1và độ dài của D:

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

Lấy ví dụ, số 349trong cơ sở 10. Nếu chúng tôi dán nhãn các chỉ số cho số này, chúng tôi có các mục sau.

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

Bắt đầu từ chữ số đầu tiên, chúng ta có 1 + 3 = 4, tạo ra chữ số tiếp theo. Sau đó, với chữ số thứ hai chúng ta có 3 + 4 + 2 = 9, một lần nữa, mang lại chữ số tiếp theo. Do đó, con số này là một số tự tin.


Cho một số nguyên có cơ sở từ 1 đến 62, tính toán tất cả các số tự tin cho cơ sở đó và đưa ra một danh sách của chúng, cách nhau bởi các dòng mới. Bạn có thể giả định rằng có một số lượng hữu hạn Số lượng tín nhiệm cho một cơ sở nhất định.

Đối với các chữ số lớn hơn 9, sử dụng các ký tự alpha A-Zvà cho các chữ số lớn hơn Zsử dụng các ký tự alpha a-z. Bạn sẽ không phải lo lắng về các chữ số ngoài z.

Họ không phải là đầu ra theo bất kỳ thứ tự cụ thể.


Đầu vào mẫu:

16

Đầu ra mẫu:

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

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng. Chúc may mắn!

(Cảm ơn Zach vì đã giúp định dạng và chỉ ra một vài vấn đề.)


Xin lỗi, có chút nhầm lẫn giữa tôi và Zach về câu hỏi. Tất cả mọi thứ nên được định dạng ngay bây giờ.
một spaghetto

Một quan sát hữu ích: trong một số tự tin, mỗi chữ số là một cộng với gấp đôi chữ số trước đó, ngoại trừ chữ số thứ hai thay vì một chữ số cộng với chữ số thứ nhất.
xnor

Đi theo chiều dọc cho thấy một mẫu khác (có thể) hữu ích;)
Geobits

1
Trong ví dụ, tại sao CDkhông có trong danh sách? Vì tất cả các kết hợp khác trong đó chữ số thứ hai nhiều hơn một chữ số đầu tiên được liệt kê, tôi không hiểu tại sao CDkhông đủ điều kiện.
Reto Koradi

Đó là một tai nạn: P Đã sửa, cảm ơn vì đã chỉ ra.
một spaghetto

Câu trả lời:


2

Bình thường, 38 byte

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

Dùng thử trực tuyến: Trình diễn

Giải trình:

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

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

Điều này sử dụng quan sát sau đây: trong một số tâm sự, chữ số i được theo sau 2*i+1, ngoại trừ nó i+1thay cho chữ số thứ hai. Bằng cách thử tất cả các chữ số đầu tiên có thể và thêm nhiều chữ số cho đến khi chúng quá lớn, chúng tôi có thể tạo ra tất cả các số tự tin.

Chúng tôi tính toán ký tự tương ứng với số i như chr(48+i+(i>9)*7+i/36*6), nó chuyển nó thành số, chữ hoa hoặc phạm vi chữ in hoa cho các khoảng 0-9, 10-35, 36-61.

Sau đó, chúng tôi tăng ithông qua i+=i+1với hai điều chỉnh. Để thực hiện điều này thay vì i+=1sau chữ số đầu tiên, chúng tôi thêm iđiều kiện vào sviệc có nhiều hơn 1ký tự. Ngoài ra, chúng ta cần tránh các số bắt đầu bằng 0 được in, đồng thời cho phép 0. Để làm điều này, chúng tôi thực hiện một hack gây ra i=0lỗi điều kiện i<ntrên vòng lặp tiếp theo bằng cách thêm nvào nó. Điều này được thực hiện bằng cách thay thế 1bằng n**0**i, liên kết đúng n**(0**i), bằng n**(i==0)hoặc n if i==0 else 1.


Wow, dang. Gần một nửa kích thước so với Python 3! Hừm. Tôi tự hỏi tôi có thể tiết kiệm được bao nhiêu byte nếu tôi sử dụng một số mánh khóe của bạn ...
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))

Giải trình

Cái nhìn sâu sắc quan trọng ở đây là đưa ra một chuỗi x(như, giả sử, [1,2,5]), bạn có thể nhận được thuật ngữ tiếp theo trong chuỗi với sum(x)+len(x), điều này đưa ra 11trong trường hợp này ( B). Kiểm tra xem nếu số này nhỏ hơn nvà nếu có, hãy thêm chuỗi mở rộng vào danh sách tất cả các chuỗi như vậy (được gieo bằng tất cả các chữ số đơn).

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

Đây là cách tôi ánh xạ các mục trình tự thành các ký tự. Chúng được ''.joined với nhau và sau đó được in, phân tách bằng dòng mới.


Bạn có thể lưu một byte bằng cách thay đổi dòng cuối cùng của bạn thành print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X)). Ngoài ra, hiện tại là 201 byte; không phải 200.
Zach Gates

@ZachGates: Tôi đã nghĩ về điều đó, nhưng tôi không nhận ra mình có thể bỏ dấu ngoặc. Cảm ơn!
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

Nó tạo ra các số theo một thứ tự khác, nhưng mô tả vấn đề không chỉ định, vì vậy tôi sẽ tìm nó! Đây là đầu ra cho đầu vào của 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

Dưới đây là các tương đương ghi nhớ cho các 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

Người đàn ông, điều này là tuyệt vời. Tôi đã cố gắng học GS2 nhưng tôi đã có một khoảng thời gian thực sự khó khăn với nó: P
một spaghetto

3

CJam, 46 42 40 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

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

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#

Ở cuối 0 và một vài mảng trống được để lại trên ngăn xếp, do đó trình thông dịch sẽ in ra 0.


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"

Đối với mỗi chữ số bắt đầu từ 1để base-1nó tính toán các chữ số tiếp theo, và trong khi đây là những thấp hơn so với cơ sở chúng tôi vẫn có một số thân tín. Tính chữ số tiếp theo trong khi in. Cuối cùng in 0.

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.