อดทนหนุ่ม“ Padovan”


44

ทุกคนรู้ลำดับของฟีโบนักชี:
คุณเอารูปสี่เหลี่ยมมาแนบรูปสี่เหลี่ยมที่เท่ากันแล้วแนบรูปสี่เหลี่ยมซ้ำไปซ้ำมาโดยที่ความยาวด้านเท่ากับความยาวด้านที่ใหญ่ที่สุดของสี่เหลี่ยมที่เกิด
ผลลัพธ์คือเกลียวที่สวยงามของสี่เหลี่ยมที่มีลำดับของตัวเลขคือลำดับ Fibonacci :

แต่ถ้าเราไม่ต้องการใช้กำลังสองล่ะ?

หากเราใช้รูปสามเหลี่ยมด้านเท่า - แทนที่จะเป็นรูปสี่เหลี่ยม - ในรูปแบบที่คล้ายคลึงกันเราจะได้รูปสามเหลี่ยมที่สวยงามเท่า ๆ กันและลำดับใหม่: ลำดับของPadovanหรือที่รู้จักกันในชื่อA000931 :

งาน:

ได้รับจำนวนเต็มบวกNเอาท์พุทNที่ยังไม่มีคำ TH ในลำดับ Padovan หรือแรกไม่มีเงื่อนไขaNNN

สมมติว่าสามข้อแรกของลำดับที่มีทั้งหมด11ดังนั้นลำดับจะเริ่มต้นดังต่อไปนี้:

1,1,1,2,2,3,...

การป้อนข้อมูล:

  • จำนวนเต็มบวกใด ๆN0

  • ไม่จำเป็นต้องนำเข้าข้อมูลที่ไม่ถูกต้อง

เอาท์พุท:

  • คำที่Nในลำดับ Padovan หรือNคำแรกของลำดับ Padovan

  • ถ้าคนแรกNเงื่อนไขจะถูกพิมพ์ออกการส่งออกสามารถสิ่งที่เป็นความสะดวกสบาย (รายการ / อาร์เรย์สตริงหลายคู่สาย ฯลฯ )

  • สามารถเป็น0 -exexed หรือ1 -exexed

กรณีทดสอบ:
(ดัชนี 0, ระยะN )

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1 จัดทำดัชนีครั้งแรกNเงื่อนไข)

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

กฎ:


2
14(ดัชนี 0) แสดงเป็นเอาต์พุต28ในขณะที่ฉันเชื่อว่าควรให้ผล37
Jonathan Allan

@ โจนาธานใช่คุณถูกต้องแล้ว ฉันแก้ไขกรณีทดสอบสองกรณีสุดท้ายสำหรับคำศัพท์แต่ไม่ใช่กรณีนั้น โพสต์ได้รับการแก้ไข N
เอกภาพ

@ LuisMendo ฉันเชื่อเช่นนั้น ฉันจะแก้ไขโพสต์
เอกสิทธิ์

1
@sharur คำจำกัดความนี้สำหรับลำดับฟีโบนักชีคือนิยามภาพ แต่ละตารางต่อเนื่องที่เพิ่มเข้ามานั้นมีความยาวของคำนั้นตามลำดับ ลำดับที่คุณอธิบายคือการใช้เหตุผลเชิงตัวเลขด้านหลัง ทั้งสองซีเควนซ์ทำงานได้ดีเหมือนกัน
เอกสิทธิ์

1
โปรดทราบว่าลำดับ OEIS a_0=1, a_1=0, a_2=0คุณเชื่อมโยงแตกต่างกันเล็กน้อยเนื่องจากใช้ มันจบลงด้วยการขยับตัวเล็กน้อยเพราะตอนนั้นa_5=a_6=a_7=1
Carmeister

คำตอบ:


59

เยลลี่ 10 ไบต์

9s3’Ẓæ*³FṀ

ลองออนไลน์!

1 การจัดทำดัชนี คำนวณองค์ประกอบที่ใหญ่ที่สุดของ:

[001101010]n
โดยที่เมทริกซ์ไบนารีถูกคำนวณอย่างสะดวกดังนี้:
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(นี่เป็นเรื่องบังเอิญทั้งหมด)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
เห็นได้ชัดว่าเป็นประเภทของวูดู
Pureferret

7
สิ่งนี้ควรได้รับการเผยแพร่
YSC

6
@YSC จะได้รับการตีพิมพ์แล้วในA000931 ผมไม่เคยได้คาดเดาเฉพาะเคล็ดลับ :)
flawr

1
... ทำอย่างนั้น "ถ้าไม่มีใครสามารถตีสองไบต์ได้": :) (ตอนนี้ฉันมี9 byter )
Jonathan Allan

1
ฉันเคยเห็นคำตอบเล็ก ๆ อย่างไร้เหตุผลที่นี่ฉันคิดว่าเครื่องหมายจุลภาคหลังจาก 'Jelly' เป็นความจริงแล้วรหัสสำหรับปัญหานี้
Tasos Papastylianou


26

เยลลี่ ,  10 9  8 ไบต์

ŻṚm2Jc$S

การเชื่อมโยงเอกยอมรับn(0 จัดทำดัชนี) P(n)ซึ่งอัตราผลตอบแทน

ลองออนไลน์!

อย่างไร?

P(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

และนี่คือ "twofer"
... วิธีที่แตกต่างอย่างสิ้นเชิงเช่นกันสำหรับ8 ไบต์ (อันนี้เป็น 1 ดัชนี แต่ช้ากว่ามาก):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell , 26 ไบต์

(l!!)
l=1:1:1:2:scanl(+)2l

ลองออนไลน์! แสดงผลลัพธ์คำที่เป็นศูนย์ที่จัดทำดัชนี

ฉันคิดว่าโซลูชันแบบเรียกซ้ำ "ชัดเจน" ด้านล่างจะไม่สามารถเอาชนะได้ แต่จากนั้นฉันก็พบสิ่งนี้ มันคล้ายกับการแสดงออกของนักกอล์ฟคลาสสิกl=1:scanl(+)1lสำหรับรายการฟีโบนักชี แต่ที่นี่ความแตกต่างระหว่างองค์ประกอบที่อยู่ติดกันคือเทอม 4 ตำแหน่ง เราสามารถเขียนได้โดยตรงl=1:1:zipWith(+)l(0:l)แต่นั่นก็นานกว่า

หากความท้าทายนี้อนุญาตให้มีรายการที่ไม่สิ้นสุดเราสามารถตัดบรรทัดแรกและมี 20 ไบต์

27 ไบต์

f n|n<3=1|1>0=f(n-2)+f(n-3)

ลองออนไลน์!




6

ระดับแปดเสียง / MATLAB, 35 33 ไบต์

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

ขาออกแรกnแง่

ลองออนไลน์!

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

ฟังก์ชั่นที่ไม่ระบุชื่อที่ดำเนินกรอง recursive

'cbaa'-98[1 0 -1 -1]เป็นรูปแบบที่สั้นลงในการผลิต

2:n<5เป็นรูปแบบที่สั้นกว่าในการผลิต[1 1 1 0 0 ··· 0]( n −1 ข้อกำหนด)

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])ส่งผ่านอินพุต[1 1 1 0 0 ··· 0]ผ่านตัวกรองแบบไม่ต่อเนื่องที่กำหนดโดยฟังก์ชั่นการถ่ายโอนที่มีค่าสัมประสิทธิ์เศษ1และค่าสัมประสิทธิ์[1 0 -1 -1]ส่วน


6

J , 22 ไบต์

-2 ไบต์ต้องขอบคุณ ngn และ Galen

แบบฟอร์มปิด 26 ไบต์

0.5<.@+1.04535%~1.32472^<:

ลองออนไลน์!

วนซ้ำ 22 ไบต์

(],1#._2 _3{ ::1])^:[#

ลองออนไลน์!


1
อีกโซลูชัน 24 ไบต์ (น่าเบื่อ): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) ลองออนไลน์!
Galen Ivanov

23 ไบต์ด้วย ngn 1:-> #: ลองออนไลน์!
Galen Ivanov

@ GalenIvanov tyvm นั่นเป็นเคล็ดลับที่ยอดเยี่ยม
โจนาห์

2
1:1-> "ไม่พึงประสงค์" ใช้ได้กับคำนามทางด้านขวา
ngn

@ngn TIL ... อีกครั้ง!
โยนาห์

5

เรติน่า47 47ไบต์

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

ลองออนไลน์! เอาต์พุตnคำแรกบนบรรทัดที่แยกกัน คำอธิบาย:

K`0¶1¶0

แทนที่การป้อนข้อมูลที่มีข้อกำหนดสำหรับ-2, และ-10

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

สร้างnคำถัดไปโดยใช้ความสัมพันธ์ที่เกิดซ้ำ *_นี่คือสั้น$&*_ที่แปลงหมายเลข (แรก) ในการจับคู่เป็นเอกในขณะที่$1*สั้น$1*_ที่แปลงหมายเลขกลางเป็นเอก $.(ผลตอบแทนรวมของการขัดแย้งทศนิยมเอกของมันคือผลรวมของตัวเลขแรกและกลาง

6,G`

ทิ้งอักขระหกตัวแรกนั่นคือสามบรรทัดแรก


5

Cubix , 20 ไบต์

นี้เป็น 0 จัดทำดัชนีและออกผลลัพธ์เป็นNระยะ TH

;@UOI010+p?/sqq;W.\(

ลองออนไลน์!

ห่อก้อนหนึ่งด้วยความยาวด้าน 2

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

ดูมันทำงาน

  • I010 - เริ่มต้นสแต็ก
  • +p? - เพิ่มด้านบนของสแต็กดึงตัวนับจากด้านล่างของสแต็กและการทดสอบ
  • /;UO@ - หากตัวนับเป็น 0 ให้สะท้อนไปที่ใบหน้าด้านบนเอา TOS กลับรถส่งออกและหยุด
  • \(sqq;W - หากตัวนับเป็นค่าบวกสะท้อนลดระดับตัวนับสลับ TOS กดด้านบนลงล่างสองครั้งลบ TOS และเปลี่ยนเลนกลับเข้าไปในลูปหลัก


4

Perl 6 , 24 ไบต์

{(1,1,1,*+*+!*...*)[$_]}

ลองออนไลน์!

* + * + !*ลำดับที่สร้างมาตรฐานสวยด้วยองค์ประกอบใหม่ในแต่ละที่สร้างขึ้นโดยการแสดงออก ที่เพิ่มองค์ประกอบที่สามก่อนหน้าองค์ประกอบที่สองก่อนหน้านี้และการปฏิเสธเชิงตรรกะขององค์ประกอบก่อนหน้าซึ่งเป็นเสมอFalseซึ่งเป็นศูนย์ตัวเลข


เหตุใดชุมชนนี้จึงมีวิกิ
Jo King

@ โจกิ้งเอาชนะฉัน ถ้าฉันทำมันอย่างใดมันไม่ได้ตั้งใจ
ฌอน

4

05AB1E , 8 ไบต์

1Ð)λ£₂₃+

ลองออนไลน์!

1Ð)1D)3Å1n£

อย่างไร?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

ฉันไม่คิดว่า1Ð)สามารถเป็น 2 ไบต์ tbh ฉันสามารถคิดถึงทางเลือก 3 ไบต์ที่ต่างกันหกแบบแต่ไม่มีทางเลือก 2 ไบต์
Kevin Cruijssen

4

APL (Dyalog Unicode) , 20 18 17 ไบต์SBCS

รหัสนี้มีการจัดทำดัชนี 1 จำนวนไบต์เท่ากันในการรับnไอเท็มตามลำดับของ Padovan เนื่องจากคุณต้องเลื่อนสมาชิกพิเศษไม่กี่คนสุดท้าย นอกจากนี้ยังมีจำนวนไบต์เดียวกันเพื่อรับการจัดทำดัชนี 0

แก้ไข: -2 ไบต์ขอบคุณ ngn -1 ไบต์ขอบคุณ ngn

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

ลองออนไลน์!

คำอธิบาย

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K (ngn / k) , 24 20 ไบต์

-4 ไบต์ต้องขอบคุณ ngn!

{$[x<3;1;+/o'x-2 3]}

ลองออนไลน์!

จัดทำดัชนีคำศัพท์ N คำแรก


1
f[x-2]+f[x-3]-> +/o'x-2 3( oคือ "กำเริบ")
ก.ย.

@ngn ขอบคุณ! ฉันลองมัน (ไม่สำเร็จ) ใน J; มันสง่าที่นี่
Galen Ivanov

@ngn อันที่จริงนี่เป็นความเป็นไปได้อย่างหนึ่งที่ดูใน J: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Galen Ivanov

อาถูกต้องการถอดรหัสฐาน 1 เป็นวิธีที่เป็นมิตรกับการรถไฟ :)
ngn

2
1:-> #ในโซลูชัน j
ngn

4

x86 รหัสเครื่อง 32 บิต 17 ไบต์

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

ถอดชิ้นส่วน:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

มันเป็นดัชนี 0 การเริ่มต้นทำได้อย่างสะดวกโดยการคำนวณ eax * 0 ผลลัพธ์ 128- บิตคือ 0 และไปใน edx: eax

ที่จุดเริ่มต้นของการทำซ้ำแต่ละคำสั่งของการลงทะเบียนคือ ebx, eax, edx ฉันต้องเลือกลำดับที่ถูกต้องเพื่อใช้ประโยชน์จากการเข้ารหัสสำหรับxchg eaxคำสั่ง - 1 ไบต์

ฉันต้องเพิ่ม 4 ลงในตัวนับลูปเพื่อให้เอาต์พุตเข้าถึงeaxซึ่งเก็บค่าส่งคืนของฟังก์ชันในการfastcallประชุม

ฉันสามารถใช้การประชุมอื่น ๆ ที่ไม่ต้องการการบันทึกและการกู้คืนebxแต่fastcallก็สนุกดี :)


2
ฉันชอบที่จะเห็นคำตอบของรหัสเครื่องใน PP&CG! +1
เอกสิทธิ์


3

ลัวะ 5.3,49 48 ไบต์

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

ลองออนไลน์!

วานิลลา Lua ไม่มีการบีบบังคับให้กับสตริง (แม้จะtonumber(true)ส่งคืนnil) ดังนั้นคุณต้องใช้ผู้ประกอบการปลอม รุ่นนี้มีการจัดทำดัชนี 1 เช่นเดียวกับ Lua ทั้งหมด 1orส่วนหนึ่งจะต้องมีการเปลี่ยนแปลงไป1 orใน Lua 5.1 ซึ่งมีวิธีการที่แตกต่างกันของ lexing หมายเลข



3

JavaScript (ES6), 23 ไบต์

a(0)=a(1)=a(2)=1

N

f=n=>n<3||f(n-2)+f(n-3)

ลองออนไลน์!


ฉันไม่คิดว่ามันสมเหตุสมผลที่จะบอกว่าการกลับมาtrueนั้นเหมือนกับการส่งคืน1หากส่วนที่เหลือของผลลัพธ์เป็นตัวเลข
นิตย์

2
@Nit โพสต์เมตาที่เกี่ยวข้อง
Arnauld

ผมคิดว่าคุณจะหายไปความต้องการบางอย่างมีลักษณะที่การปรับเปลี่ยนของฉัน (รุ่นใน Java) ที่นี่
Shaq

@Shaq ความท้าทายที่ระบุอย่างชัดเจนว่าทั้งสามข้อตกลงครั้งแรกของลำดับที่มีทั้งหมด 1 ดังนั้นไม่ใช่ลำดับที่กำหนดไว้ใน A000931 (แต่สูตรเหมือนกัน)
Arnauld

@Arnauld ใช่ฉันเห็นตอนนี้แล้ว ขออภัย!
Shaq


2

TI-BASIC (TI-84), 34 ไบต์

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

Ansการป้อนข้อมูลที่อยู่ใน
เอาต์พุตอยู่ในAnsและพิมพ์ออกมาโดยอัตโนมัติ

ฉันคิดว่ามีเวลามากพอที่จะผ่านไปรวมถึงคำตอบมากมายที่โพสต์ซึ่งมีหลายคำตอบที่ตีกอล์ฟครั้งนี้

ตัวอย่าง:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

คำอธิบาย:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth, 16 ไบต์

L?<b3!b+y-b2y-b3

yนี้กำหนดฟังก์ชั่น ลองที่นี่!

นี่เป็นวิธีแก้ปัญหาที่สนุกกว่า แต่ก็ยาวกว่า 9 ไบต์ ไบต์สามารถโกนได้

+l{sa.pMf.Am&>d2%d2T./QY!

สิ่งนี้ใช้คำจำกัดความที่กำหนดโดย David Callan ในหน้า OEIS: "a (n) = จำนวนการเรียงองค์ประกอบของ n เป็นส่วนที่แปลกและ> = 3" ลองที่นี่! ใช้อินพุตโดยตรงแทนการกำหนดฟังก์ชัน


y-b2y-b3อาจจะถูก refactored กับทั้งสองแยกไปสองทางหรือL? แม้ว่าการประกาศอาร์เรย์ 2 องค์ประกอบนั้นมีค่าใช้จ่ายสูง yL-Lb2,3มีความยาว :(
Ven

@Ven ฉันสามารถแทนที่+y-b2y-b3ด้วยsmy-bdhB2จำนวนไบต์เดียวกัน hB2ผลลัพธ์ในอาร์เรย์[2, 3]
RK

ทำได้ดีhB2มาก น่าเสียดายที่มันเป็นจำนวนไบต์เดียวกัน
Ven

ใช่แม้ว่าฉันสงสัยว่ามีวิธีการกำจัดdในแผนที่
RK

2

Java, 41 ไบต์

ไม่สามารถใช้แลมบ์ดา (ข้อผิดพลาดรันไทม์) พอร์ตของคำตอบ Javascript นี้

int f(int n){return n<3?1:f(n-2)+f(n-3);}

TIO


ผมคิดว่าคุณจะหายไปความต้องการบางอย่างมีลักษณะที่การปรับเปลี่ยนของฉันที่นี่
Shaq

โปรดละเว้นความคิดเห็นของ Shaq: คำตอบของคุณถูกต้องและเป็นคำตอบ Java ที่สั้นที่สุดเท่าที่จะเป็นไปได้ (ณ วันที่ 12 ของ Java)
Olivier Grégoire

โอเคถ้าอย่างนั้น. ฉันไม่แน่ใจว่าฉัน "พลาด" แต่โอเค แก้ไข: nvm ฉันอ่านคำตอบของ JS
Benjamin Urquhart

2

R + pryr , 38 36 ไบต์

ฟังก์ชันเรียกซ้ำที่ไม่มีดัชนี

f=pryr::f(`if`(n<3,1,f(n-2)+f(n-3)))

ลองออนไลน์!

ขอบคุณ@Giuseppeสำหรับการชี้ให้เห็นว่ามีสองไบต์ที่ไม่จำเป็น


2
หากคุณกำลังจะต้องใช้pryrภาษาที่ควรจะเป็นR + pryrและนี้สามารถเป็น36 ไบต์
จูเซปเป้

@iuseppe ขอบคุณ! อัปเดตทันที
rturnbull





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