ตัวเลขที่เชื่อถือได้


14

ตัวเลขที่เชื่อถือได้

อนุญาตxเป็นจำนวนเต็มของฐานโดยพลการเช่นนั้นDคืออาร์เรย์ของตัวเลข xเป็นหมายเลขที่ไว้วางใจถ้าสำหรับทั้งหมดnระหว่าง1และความยาวของD:

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

ยกตัวอย่างเช่นตัวเลข349ในฐาน 10 หากเราติดป้ายดัชนีสำหรับหมายเลขนี้เรามีดังต่อไปนี้

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

เริ่มจากหลักแรกเรามี1 + 3 = 4ซึ่งให้หลักถัดไป จากนั้นด้วยตัวเลขที่สองเรามี3 + 4 + 2 = 9ซึ่งอีกครั้งให้ผลหลักถัดไป ดังนั้นหมายเลขนี้คือหมายเลขที่ไว้วางใจ


กำหนดจำนวนเต็มด้วยฐานระหว่าง 1 ถึง 62 คำนวณตัวเลข Confidant ทั้งหมดสำหรับฐานนั้นและส่งออกรายการของพวกเขาคั่นด้วยบรรทัดใหม่ คุณสามารถสันนิษฐานได้ว่ามีหมายเลข Confidant Number ที่แน่นอนสำหรับฐานที่กำหนด

สำหรับตัวเลขมากขึ้นกว่า 9 ให้ใช้ตัวอักษรอัลฟาA-Zและสำหรับตัวเลขที่สูงกว่าการใช้ตัวอักษรอัลฟาZ คุณจะไม่ต้องกังวลเกี่ยวกับตัวเลขเกินa-zz

ไม่จำเป็นต้องส่งออกตามลำดับใด ๆ


ตัวอย่างอินพุต:

16

ตัวอย่างผลลัพธ์:

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

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ โชคดี!

(ขอบคุณ Zach ที่ช่วยจัดรูปแบบและชี้ปัญหาบางอย่าง)


ขออภัยความสับสนเล็กน้อยระหว่างฉันกับซัคกับคำถาม ทุกอย่างควรจัดรูปแบบในขณะนี้
สปาเก็ตตี้

การสังเกตที่มีประโยชน์: ในตัวเลขที่ไว้วางใจแต่ละหลักคือหนึ่งบวกสองหลักก่อนหน้ายกเว้นตัวเลขที่สองแทนหนึ่งบวกหลักแรก
xnor

การไปตามแนวคอลัมน์เผยให้เห็นรูปแบบที่เป็นประโยชน์อีกอัน (อาจเป็นไปได้;)
Geobits

1
ในตัวอย่างเหตุใดจึงCDไม่อยู่ในรายการ เนื่องจากชุดค่าผสมอื่น ๆ ทั้งหมดที่มีตัวเลขสองหลักมากกว่าหนึ่งหลักอยู่ในรายการฉันไม่เข้าใจว่าทำไมจึงCDไม่มีสิทธิ์
Reto Koradi

นั่นเป็นอุบัติเหตุ: P แก้ไขขอบคุณที่ชี้ให้เห็น
สปาเก็ตตี้

คำตอบ:


2

Pyth, 38 ไบต์

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

ลองใช้งานออนไลน์: การสาธิต

คำอธิบาย:

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 ไบต์

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จะถูกตามด้วย2*i+1ยกเว้นมันi+1ตัวเลขที่สองแทน โดยการลองตัวเลขแรกที่เป็นไปได้ทั้งหมดและเพิ่มตัวเลขเพิ่มเติมจนกว่าจะมีขนาดใหญ่เกินไปเราสามารถสร้างตัวเลขที่ไว้ใจได้ทั้งหมด

เราคำนวณอักขระที่สอดคล้องกับตัวเลข iเป็นchr(48+i+(i>9)*7+i/36*6)ซึ่งกะมันลงไปในจำนวนอักษรตัวพิมพ์ใหญ่หรือช่วงอักษรตัวพิมพ์ใหญ่สำหรับช่วงเวลา0-9, 10-35, 36-61ซึ่งกะมันลงไปในจำนวนอักษรตัวพิมพ์ใหญ่หรือช่วงอักษรตัวพิมพ์ใหญ่สำหรับช่วงเวลา

จากนั้นเราจะเพิ่มขึ้นiผ่านทางi+=i+1ที่มีสองการปรับ หากต้องการทำสิ่งนี้แทนi+=1ตัวเลขหลักแรกเราจะเพิ่มiเงื่อนไขในsการมีมากกว่า1ตัวอักษร นอกจากนี้เราต้องหลีกเลี่ยงหมายเลขขึ้นต้นด้วย 0 0จากการถูกตีพิมพ์ในขณะที่ในเวลาเดียวกันช่วยให้ ในการทำเช่นนี้เราทำการแฮกที่ทำให้เกิดความi=0ล้มเหลวของเงื่อนไขi<nในลูปถัดไปโดยการเพิ่มnเข้าไป นี้จะกระทำโดยการแทนที่1ด้วยn**0**iซึ่งขวาให้พนักงานn**(0**i)ซึ่งเท่ากับหรือn**(i==0)n if i==0 else 1


ว้าวแดง เกือบครึ่งหนึ่งของขนาดเมื่อเทียบกับ Python 3! อืมมม ฉันสงสัยว่าฉันสามารถบันทึกได้กี่ไบต์ถ้าฉันใช้กลอุบายของคุณ ...
El'endia Starman

4

Python 3, 201 200 ไบต์

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

คำอธิบาย

ความเข้าใจที่สำคัญที่นี่คือที่ได้รับลำดับx(เช่นพูดว่า[1,2,5]) คุณสามารถได้รับคำต่อไปในลำดับที่มีsum(x)+len(x)ซึ่งให้11ในกรณีนี้ ( B) ตรวจสอบเพื่อดูว่านี่น้อยกว่าnหรือไม่และถ้าเป็นไปได้ให้เพิ่มลำดับเพิ่มเติมลงในรายการลำดับดังกล่าวทั้งหมด (seeded ตามหลักเดียวทั้งหมด)

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

นี่คือวิธีที่ฉันแมปรายการลำดับกับตัวละคร สิ่งเหล่านี้ถูก''.joinรวมเข้าด้วยกันแล้วพิมพ์โดยคั่นด้วยบรรทัดใหม่


print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))คุณสามารถบันทึกหนึ่งไบต์โดยการเปลี่ยนบรรทัดสุดท้ายของคุณเพื่อ นอกจากนี้ปัจจุบันมีขนาด 201 ไบต์; ไม่ใช่ 200
Zach Gates

@ ZachGates: ฉันคิดอย่างนั้น แต่ไม่ได้ตระหนักว่าฉันสามารถละทิ้งวงเล็บไว้ได้ ขอบคุณ!
El'endia Starman

4

GS2, 44 ไบต์

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

มันสร้างตัวเลขในลำดับที่แตกต่างกัน แต่คำอธิบายปัญหาไม่ได้ระบุดังนั้นฉันจะไปหามัน! นี่คือเอาต์พุตสำหรับอินพุต 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

นี่คือ mnemonic สมมูลสำหรับ bytes:

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

โอ้ชายคนนี้ยอดเยี่ยม ฉันพยายามเรียนรู้ GS2 แต่ฉันมีเวลาที่ยากลำบากกับมัน: P
สปาเก็ตตี้

3

CJam, 46 42 40 ไบต์

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

ลองใช้ออนไลน์ในล่าม CJamล่าม

มันทำงานอย่างไร

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#

ในตอนท้าย0และอาร์เรย์ว่างสองสามอันจะถูกทิ้งไว้บนสแต็กดังนั้นล่ามจะพิมพ์0ออกมา


1

เหยี่ยว, 111 ไบต์

{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"

สำหรับทุกตัวเลขเริ่มต้นจาก1ถึงbase-1จะคำนวณตัวเลขถัดไปและในขณะที่ตัวเลขเหล่านี้ต่ำกว่าฐานเรายังคงมีหมายเลขที่ไว้วางใจ การคำนวณตัวเลขถัดไปในขณะที่พิมพ์ 0สุดท้ายพิมพ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.