ลำดับของตัวเลขที่เขียน


17

นี่คือลำดับที่น่ารำคาญพอสมควรซึ่งไม่ได้อยู่ในสารานุกรมออนไลน์ของจำนวนเต็มลำดับ

เริ่มต้นด้วยลำดับที่ว่างเปล่าจากนั้นกำหนดแต่ละคำเป็นจำนวนอักขระที่ต้องใช้ในการเขียนออกมาเป็นภาษาอังกฤษตัวเลขทั้งหมดของลำดับนั้นจนถึงขณะนี้โดยไม่มีช่องว่าง *

สำหรับการอ้างอิงจำนวนตัวอักษรของตัวเลขทั้งหมด (ฐานสิบ) ในภาษาอังกฤษคือ:

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

(ซึ่งเป็นจุดเริ่มต้นของทั้งA52360และA5589 )

สิ่งนี้ทำให้รายการแรกa(0)=0เนื่องจากไม่มีเลขศูนย์ในลำดับที่ว่าง

สิ่งนี้ทำให้รายการที่สองa(1)=4เนื่องจากมันใช้อักขระสี่ตัวในการเขียน "ศูนย์" ซึ่งเป็นตัวเลขหลักเดียวเท่านั้น

สิ่งนี้ทำให้รายการที่สามa(2)=8เนื่องจากใช้อักขระเพิ่มอีกสี่ตัวในการเขียน "สี่" เพื่อรวมแปดเพื่อเขียน "zerofour"

สิ่งนี้ทำให้รายการที่สี่a(3)=13เนื่องจากใช้อักขระเพิ่มอีกห้าตัวในการเขียน "แปด" สำหรับผลรวมสิบสามในการเขียน "zerofoureight"

นี่ทำให้รายการที่ห้าa(4)=21เนื่องจากใช้อักขระเพิ่มอีกแปดตัวในการเขียน "onethree" รวมยี่สิบเอ็ดในการเขียน "zerofoureightonethree"

... และต่อไป นี่คือ 100 รายการแรก:

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

* เราสามารถกำหนดมันสำหรับภาษาอื่นและ / หรือฐานอื่น ๆ หรือมีช่องว่างแน่นอน

ความท้าทาย

กำหนดเอาท์พุทnในรหัสน้อยที่สุดเท่าที่เป็นไปได้ใด ๆ ของ:

  • nคำแรกของลำดับ (ควรทำงานสำหรับจำนวนเต็มไม่เป็นลบ)
  • ค่าของa(n) (ควรใช้กับจำนวนเต็มแบบไม่ลบ)
  • n THระยะของลำดับ (ควรจะทำงานสำหรับจำนวนเต็มบวก - ค่าเช่นของ( n - 1 ) )a(n1)

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะสำหรับแต่ละภาษาและคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ อย่าปล่อยให้ภาษากอล์ฟหยุดคุณไม่ให้เข้าในภาษาที่คุณชื่นชอบไม่ว่าจะเป็นภาษาที่ใช้งานได้จริงหรือภาษาที่ลึกลับ!


โดยตัวเลือกแรกคุณหมายความว่า 1) 1ควรส่งออก[0]และ0ควรส่งออก[]หรือ 2) 0ควรส่งออก[0](เช่นในคำตอบเดิมของฉัน)?
Erik the Outgolfer

@EriktheOutgolfer ฉันหมายถึง (1) เนื่องจากควรส่งคืนคำศัพท์แรก นั่นคือตัวเลือกคือ "ส่งออกลำดับถึง แต่ไม่รวมถึง (n)", "เอาท์พุท a (n)" หรือ "เอาท์พุท a (n-1)"
Jonathan Allan

ดังนั้น a (x) = a (x-1) + f (a (x-1)) โดยที่ f (x) คือจำนวนอักขระที่จำเป็นในการเขียน x?
FireCubez

@FireCubez ใช่ถ้า (0) = 0 และ f (x) เป็นอักขระที่ไม่ใช่ช่องว่างเพื่อเขียนตัวเลขของ x
Jonathan Allan

คำตอบ:


12

Perl 6 , 45 ไบต์

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

ลองออนไลน์!

ไม่จำเป็นต้องมี moduloing แฟนซีเมื่อคุณสามารถรับชื่อของตัวเลขโดยตรง! บล็อกโค้ดแบบไม่ระบุชื่อที่ส่งคืนค่าลำดับที่ n ของลำดับหรือคุณสามารถผ่านในช่วงเพื่อรับรายการค่า

คำอธิบาย:

{(                                     )[$_]}  # 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

@JanathanAllan อ่าฉันคิดว่าคุณอนุญาตให้ลำดับที่ไม่มีที่สิ้นสุดเป็นการกลับมาขอโทษ ฉันจะแก้ไขปัญหานี้
Jo King

ดีแล้วก็ดี :)
Jonathan Allan

ดี! »หนึ่งไบต์ใช่ไหม นอกจากนี้[+]อาจจะน่ารักกว่าและบอกใบ้ว่า ops แบบไบนารีสามารถกลายเป็น reducers ได้อย่างไร แต่sumก็มีสามไบต์และสอดคล้องกับส่วนที่เหลือของโซลูชันซึ่งอาจไม่ใช่สั้นที่สุด แต่แน่ใจว่าเป็นimo กอล์ฟที่หรูหราที่สุด
raiph

@raiph »เป็นสองไบต์จึงเปลี่ยนได้
โจคิง

บางทีนี่อาจจะเป็นการโกง แต่ Rakudo ไม่จัดการกับซอร์สโค้ด Latin1 อย่างถูกต้องใช่ไหม ถ้าเป็นเช่นนั้นโปรดทราบว่าsay '»'.encode('latin1').bytes จะปรากฏ1ขึ้น :)
raiph

8

JavaScript (ES6) 69 68 61 58 ไบต์

ส่งคืนa(n))

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

ลองออนไลน์!

อย่างไร?

ตัวเลขdถูกแปลงเป็นตัวเลขnของตัวอักษรด้วย:

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

เนื่องจากตัวเลขถูกแบ่งออกเป็นอักขระตัวเลขเราจึงสามารถประมวลผลd×100+10โดยเพิ่ม10 (เป็นการเชื่อมต่อสตริง)


7

Stax , 14 13 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

ความเข้าใจที่สำคัญที่นี่คือตัวเลขที่dต้องใช้((4 - 2 * d) // 3) % 3 + 3ตัวอักษรในการสะกด (นั่นคือการหารจำนวนเต็มของไพ ธ อนและโมดูลัสแบบไม่เป็นลบของไพ ธ อน)


5

Pip , 21 ไบต์

Lai+:$+4335443554@^Pi

จะเข้าnเป็นอาร์กิวเมนต์บรรทัดคำสั่งและผลแรกnแง่ ลองออนไลน์!

คำอธิบาย

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

2
ฉันอ่านสิ่งนี้large constant to the power of piและรู้สึกประทับใจอย่างมาก (มันยังคงน่าประทับใจ แต่การตีความครั้งแรกของฉันเป็นเพียงแค่ .. more)
Octurous

4

ภาษา Wolfram (Mathematica) , 57 ไบต์

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

ลองออนไลน์!

Tr@StringLength@IntegerName@IntegerDigits@#& แสดงรายการตัวเลขของ #แปลงแต่ละส่วนให้เป็นชื่อภาษาอังกฤษนับความยาวและสรุปผลลัพธ์ มีหลายสิ่งหลายอย่างที่ข้ามรายการมันน่าตื่นเต้นมาก จากนั้นเราก็ใช้คำนิยามซ้ำ ๆ

TIO บ่นว่าไม่มีการเชื่อมต่ออินเทอร์เน็ต แต่ฉันไม่แน่ใจว่าเพราะอะไรเพราะมันเป็นคำตอบที่ถูกต้อง อาจตรวจสอบการอัปเดตชื่อของจำนวนเต็มหรือไม่

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




4

APL (Dyalog Unicode) , 29 28 ไบต์

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

ลองออนไลน์!

f(input)

ขอบคุณพวก @ @ APL Orchard ที่ช่วยเหลือสิ่งนี้:

@ngn สำหรับ 2 ไบต์; @ H.PWiz เป็นเวลา3 4 ไบต์

ตอนนี้ใช้สูตรของ @ recursive

วิธี:

{{⍵++/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.

3

Python 2 , 61 ไบต์

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

ลองออนไลน์!

ใช้recursive ทำแผนที่บาทนับ


Python 2 , 63 ไบต์

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

ลองออนไลน์!

รุ่นฟังก์ชั่นวนซ้ำ ใช้เวลาในการชี้แจงแทนเนื่องจากมีการเรียกซ้ำสองf(n-1)ครั้ง


ดี! ฉันอยากรู้ถ้าสคริปต์แสดงออกหาคุณได้กล่าวถึงการใช้ก่อนที่จะพบการแสดงออกนี้ (หรืออาจจะเป็นหนึ่งที่แม้สั้น?)
ลินน์

@ ลินน์ฉันใช้งานสคริปต์ แต่ไม่พบสิ่งที่ดีกว่า 13 ตัวอักษรมีจำนวนมากเกินไปสำหรับการค้นหาแบบเต็มและไม่พบสิ่งใดที่มีความยาวไม่เกิน 9 ตัวอักษร เมื่อฉันตัด+3และ จำกัด ให้กับตัวดำเนินการทางคณิตศาสตร์ (ไม่ใช้บิต) และหมายเลข <= 4 ฉันพบวิธีแก้ปัญหานี้ แต่ไม่มีอะไรที่สั้นกว่าหรือมีความยาวเท่ากันยกเว้นการเทียบเท่า
xnor

3

Python 2 , 71 ไบต์

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

ลองออนไลน์!


f=lambda n,k=0:n and f(n-1,k+sum(632179420>>3*int(d)&7for d in`k`))or kเป็นจำนวนเดียวกัน แต่หลีกเลี่ยงการแสดงรายการสิ่งที่แนบ
Jonathan Allan

ดูเหมือนว่าอัลกอริทึมของ recursive จากคำตอบ staxx จะช่วยประหยัด 2 ไบต์ ฉันทำเช่นนี้แม้ว่า!
Jonathan Allan

3

MathGolf , 17 ไบต์

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

ลองออนไลน์!

นี้จะใช้วิธีการ Arnauld ของ ส่งออกองค์ประกอบที่ n ของลำดับ .. หากสตริงว่างก็โอเคa(0)แล้วเราสามารถลบ0\ที่จุดเริ่มต้น

คำอธิบาย:

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

3

Pyth , 21 ไบต์

u+Gs@L+L3jC\᯻3jGTQ0

ลองออนไลน์ได้ที่นี่

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

น่าจะไม่ใช่ไบต์เดียวในเพจเพจของ Pyth (ฉันคิดว่ามันใช้ UTF-8 ซึ่งในกรณีนี้คือ 3 ไบต์และj7163 3มีความยาวเท่ากัน แต่ tio.run บอกว่า Pyth มี SBCS เป็นเรื่องลึกลับ!)
Lynn

@ ลินน์คุณพูดถูกต้องฉันลืมเรื่องจำนวนนับไม่ดี ฉันจะปล่อยให้รหัสเป็นสำหรับตอนนี้และอัปเดตการนับไบต์
Sok






1

J , 37 ไบต์

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

ลองออนไลน์!

ใช้วิธีการของ Arnauld

คำอธิบาย:

ข้อโต้แย้งคือ 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

1

แก้ไขหลังจากความคิดเห็นที่ 1

พิมพ์เงื่อนไขทั้งหมด

สกาลา, 76 ไบต์

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

ลองออนไลน์!

พิมพ์ n THระยะ

สกาลา, 72 ไบต์

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

สกาลา, 69 ไบต์

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

สกาลา 67 ไบต์

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

สกาลา 67 ไบต์

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

ลองออนไลน์!


1
ฉันไม่รู้ Scala แต่ฉันคิดว่านี่ไม่ใช่โปรแกรมหรือฟังก์ชั่น แต่เป็นข้อมูลโค้ด (นั่นคือมันทำงานบน REPL เมื่อnถูกกำหนด) ถ้าคุณรู้จักสกาล่ามันคงง่ายที่จะแก้ไข โปรดทราบว่ามีเคล็ดลับสำหรับการเล่นกอล์ฟในคำถามสกาล่าซึ่งอาจช่วยได้ สุดท้ายมันก็ดีที่โพสต์ลิงค์ไปยังล่ามออนไลน์TIOมี Scala และสมาชิก PPCG จำนวนมากใช้
Jonathan Allan

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