ความยาวของโปรแกรม Fibonacci


14

เขียนโปรแกรมที่มีความยาว n ซึ่งให้ผลลัพธ์โปรแกรมอื่นที่มีความยาวคือหมายเลขฟีโบนักชีถัดไปหลังจากนั้น โปรแกรมใหม่จะต้องทำสิ่งเดียวกัน - เอาท์พุทโปรแกรมอื่นที่มีความยาวคือหมายเลขฟีโบนักชีต่อไปและอื่น ๆ
เอง (ความยาวของโปรแกรมดั้งเดิม) ไม่จำเป็นต้องเป็นหมายเลขฟีโบนักชีถึงแม้ว่ามันจะดีถ้าเป็น

รหัสที่สั้นที่สุดชนะ

ไม่มีทรัพยากรภายนอก, ASCII เท่านั้น, คอมไพเลอร์ / ล่ามฟรี
หากผลลัพธ์ของคุณสิ้นสุดในบรรทัดใหม่ก็จะถูกนับด้วย


สิ่งนี้จำเป็นต้องดำเนินต่อไปตลอดไปหรือไม่? ( intหรือBigInteger)
Justin

1
@ ควิกนันซ์มันก็โอเคถ้ามันหยุดทำงานที่ขีด จำกัด ของ int หรือขีด จำกัด ของคอมไพเลอร์ / ล่ามแล้วแต่ว่าอย่างใดจะถึงก่อน ฉันคาดว่ามันจะถึง 10,000+
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

1
มีข้อ จำกัด ในการใช้ช่องว่างหรือความคิดเห็นหรือชื่อตัวแปร / ฟังก์ชั่น / คลาสที่มีความยาวโดยพลการในโปรแกรมดั้งเดิมหรือที่ผลิตในภายหลังหรือไม่?
Jonathan Pullano

1
โปรแกรมสามารถอ่านซอร์สโค้ดของตัวเองหรือคุณกำลังมองหา quasi-quine จริงหรือไม่?
ชำนาญวิชาประวัติศาสตร์

@JonathanPullano ไม่มีข้อ จำกัด พวกเขาเพียงแค่ต้องเป็นโปรแกรมที่ถูกต้อง
aditsu ออกเพราะ SE เป็นความชั่วร้าย

คำตอบ:


5

CJam, 26 23

ฉันเพิ่งลองภาษาของคุณ

7{9\@5mq)2/*')*\"_~"}_~

(22*0.618 + 0.5 - 1)/1.618 + 19

มันคำนวณความยาวของตัวเอง*1.618แทนที่จะเพิ่มตัวเลขสองตัวซ้ำ ๆ ในเวอร์ชั่นแรกมันจะเติมเอาท์พุทให้{เหมือนก่อน1)))))))))ซึ่งนับจำนวนตัวละครเหล่านั้นด้วยตนเอง nกล่าวว่าผลที่ตามมา ความยาวทั้งหมดคือn+22และความยาวใหม่ก่อน{ควรจะถูก(n+22)*1.618-22ปัดเศษ ลดโดยหนึ่งในการนับจำนวนของ)'s (n+8)*1.618แล้วมันจะเป็นประมาณเท่ากับ

รุ่นเก่ากว่า:

-3{1\@5mq)2/*E+')*\"_~"}_~

หมายเลข 14 24*0.618 + 0.5 - 1คือ


ที่น่าประทับใจมาก!
Dennis

ฉันคิดว่าเรามีผู้ชนะคนใหม่ :)
aditsu ออกเพราะ SE นั้นชั่วร้าย

7

Python 2, 160 ไบต์

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1'
c=s
l=len(s%c)+4
a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1)
print s%`c`

นี่เป็นเสมือนจริงจริง มันไม่ได้อ่านซอร์สของมันเอง แต่มันสร้างมันขึ้นมา เอาต์พุตแรก (มีการขึ้นบรรทัดใหม่):

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=1

ประการที่สอง:

s='s=%s;c=s;l=len(s%%c)+4;a,b=1,1\nwhile b<l:a,b=b,a+b\nc+="1"*(b-l-1);print s%%`c`;a=1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111';c=s;l=len(s%c)+4;a,b=1,1
while b<l:a,b=b,a+b
c+="1"*(b-l-1);print s%`c`;a=111111111111111111111111111111111111111111111111111111111111111111111

แก้ไข: โอ๊ะโอ ลืมเปลี่ยนสตริงเมื่อฉันเปลี่ยนจาก;s เป็น1s ดังนั้นเอาต์พุตที่สองคือเอาต์พุตเซมิโคลอนพิเศษ (ซึ่ง Python ไม่สนับสนุน) แก้ไขแล้ว


ฉันกลัวว่ามันจะหยุดทำงานหลังจากทำซ้ำประมาณ 3 ครั้ง ...
aditsu ออกเพราะ SE นั้นชั่วร้าย

@aditsu คืออะไร Python มีข้อ จำกัด เกี่ยวกับขนาดของจำนวนเต็ม?! (หรือว่าการนับไม่ใช่ fibonacci / skips / อย่างอื่นใช่ไหม) โอ้รอ ดุจ ฉันลืมเปลี่ยนสตริง XD
Justin

7

CJam, 41 31 ไบต์

{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~

ลองออนไลน์

เอาท์พุต

$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'); echo
{1$+S@]_1=4+1$`,-S*"2$~"}34 21 2$~
$ cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~') | wc -c
34
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')); echo
{1$+S@]_1=4+1$`,-S*"2$~"}55 34                      2$~
$ cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~')) | wc -c
55
$ cjam (cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
bash: syntax error near unexpected token `cjam'
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))); echo
{1$+S@]_1=4+1$`,-S*"2$~"}89 55                                                        2$~
$ cjam <(cjam <(cjam <(echo '{1$+S@]_1=4+1$`,-S*"2$~"}21D2$~'))) | wc -c
89

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

{       "                                                   {…} 21 13                     ";
  1$+   " Duplicate the higher number and add.              {…} 21 34                     ";
  S@    " Push a space and rotate the lower number on top.  {…} 34 ' ' 21                 ";
  ]     " Wrap the stack into an array.                     [ {…} 34 ' ' 21 ]             ";
  _1=   " Push the second element of the array.             [ {…} 34 ' ' 21 ] 34          ";
  4+    " Add 4 to it.                                      [ {…} 34 ' ' 21 ] 38          ";
  1$`,  " Push the length of the stringified array.         [ {…} 34 ' ' 21 ] 38 37       ";
  -S*   " Subtract and push that many spaces.               [ {…} 34 ' ' 21 ] ' '         ";
  "2$~" " Push the string '2$~'.                            [ {…} 34 ' ' 21 ] ' ' '2$~'   ";
}       "                                                   {…}                           ";

21D     " Push 21 and 13.                                   {…} 21 13                     ";
2$~     " Copy the code block an evaluate.                  [ {…} 34 ' ' 21 ] ' ' '2$~'   ";

2
ดีมากยืนยันได้ถึง 1 ล้าน :) ฉันคิดว่ามันเป็น 37 แทนที่จะเป็น 39 แต่ในคำอธิบาย
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

@aditsu: ไม่ได้สังเกตว่าคุณได้แก้ไขความคิดเห็นของคุณจนถึงตอนนี้ มันควรจะเป็น 37 แน่นอนขอบคุณ
Dennis

6

Python - 89

g="%(s,b,a+b);print o.ljust(b-1)";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)#####

นับจำนวนตัวอักษรของฉันที่สมบูรณ์แบบเป็นหายไป ; _; ขอบคุณ TheRare สำหรับการชี้ให้เห็นถึงสิ่งที่ขึ้นบรรทัดใหม่และ Quincunx สำหรับการแนะนำให้ใช้ Python 2 ทำให้โกนได้ 2 ตัวอักษร

แก้ไข : ตอนนี้เพียงใช้มากกว่า#s แทน1; สั้นลง 12 ตัวอักษร

แก้ไข 2 : 94 ตัวอักษร! กำจัดการซ้ำซ้อน >: 3

แก้ไข 3 : ทางเลือกที่สั้นกว่าสำหรับการตอบกลับ Python 2

แก้ไข 4 : ผลลัพธ์เป็นอักขระที่สั้นลงในขณะนี้

แก้ไข 5 : การใช้%rเพื่อย่อให้สั้นลงนั้นถูกนำมาจากคำตอบของคำถามอื่นโดย @primo

แก้ไข 6 : สั้นลง : D

นี่เป็นเวอร์ชั่น Python 3:

g="%(s,b,a+b);print(o.ljust(b-1))";s,a,b="s,a,b=%r,%i,%i;o=s%"+g,89,144;exec("o=s"+g)####

คำตอบนี้คล้ายกับคำตอบโดย @Quincunx


printเพิ่มบรรทัดใหม่เสมอเว้นแต่คุณจะระบุend=''อาร์กิวเมนต์
Seequ

ทำไมไม่ใช้งูหลาม 2 ?:s,a,b="s,a,b=%s,%i,%i;o=s%%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'",89,144;o=s%(`s`,b,a+b)+'#';print o+(b-len(o)-1)*'1'
จัสติน

@Quincunx ฉันจะ! ขอบคุณ: D
cjfaure

โปรแกรม 90 char ของคุณใช้ไม่ได้กับ python 3 และมีเอาต์พุต 145-char (ไม่ใช่หมายเลขฟีโบนักชี)
aditsu ออกเนื่องจาก SE คือ

@aditsu แก้ไขแล้ว : 3
cjfaure

2

JavaScript, 94

(function q(w,e){return ('('+q+')('+e+','+(s=w+e)+')'+Array(s).join('/')).substr(0,s)})(55,89)

จากJavaScript Quine ที่เป็นที่รู้จักกันดีฟังก์ชันนี้จะส่งคืนฟังก์ชันเดียวกันเกือบจะตามมาด้วยจำนวนสแลชซึ่งจะรวมกันได้มากถึง 144 ซึ่งเป็นจำนวนฟีโบนักชีต่อไปหลังจาก N. และอื่น ๆ ...

N ไม่ใช่หมายเลขฟีโบนักชี แต่เป็นเพียง "มีความสุข"


ดูเหมือนว่าจะทำงานไม่ถูกต้องเมื่อผ่าน 1,000
aditsu ออกเนื่องจาก SE เป็นความชั่วร้าย

1,000 อะไร ซ้ำ?
Jacob

ไม่ความยาวของโปรแกรม
aditsu ออกเนื่องจาก SE อยู่ระหว่าง

อืม ... ฉันกำลังทดสอบมันในคอนโซลของ Chrome โดยใช้p = (my answer)แล้วp = eval(p)สองสามครั้งและได้มาจนถึงปี196418 ... หลังจากเวลาการประมวลผลคือ> 1 วินาทีดังนั้นฉันจึงออกจากการทดสอบ: P แต่ฉันคิดว่ามันจะดำเนินต่อไปได้อีก
Jacob

คุณไม่เข้าใจ .. ฉันไม่ได้บอกว่ามันหยุดทำงานหรือช้าเกินไป ฉันบอกว่ามันทำงานไม่ถูกต้อง ไม่เพียงแค่ทำยังตรวจสอบp=eval(p) p.lengthหลังจากได้รับถึง 987 ฉันจะได้ความยาว 1598 ไม่ใช่หมายเลขฟีโบนักชี
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

0

มาติกา

({0};
 With[{n = Ceiling[ InverseFunction[Fibonacci]@LeafCount@#0 ], l = Length[#0[[1, 1]]]},
    #0 /. {0..} -> ConstantArray[0, Fibonacci[n+1] - LeafCount[#0] + l]
 ]) &

นี่คือการดำเนินการที่ตรงไปตรงมามาก (เช่นไม่มีการทำให้งงงวยที่นี่) มันเป็นฟังก์ชั่นนิรนามที่ส่งคืนตัวเองด้วยการเติมเล็กน้อยเพื่อให้ได้ความยาวที่ถูกต้อง Mathematica เป็น homoiconic: รหัสและข้อมูลถูกแทนด้วยการแสดงออกทาง Mathematica ซึ่งทำให้ง่ายต่อการแก้ไข / สร้างโค้ดทันที นี่ก็หมายความว่าการนับตัวละครนั้นไม่ได้วัดความยาวของรหัสโดยธรรมชาติ ขนาด epxression ( "นับใบไม้" ) คือ รุ่นนี้มีพื้นฐานมาจากการนับใบไม้เป็นการวัดความยาวโค้ด

ถ้าเรากำหนดฟังก์ชั่นที่ไม่ระบุชื่อนี้ให้กับตัวแปร f (เพื่อให้ฉันสามารถแสดงสิ่งที่เกิดขึ้นในลักษณะที่อ่านได้) และเรียกมันว่า 1, 2, 3, ... ครั้งทุกครั้งที่วัดความยาวของค่าส่งคืนนี่คือสิ่งที่ เราได้รับ:

In[]:= f // LeafCount
Out[]= 42

In[]:= f[] // LeafCount
Out[]= 89

In[]:= f[][] // LeafCount
Out[]= 144

In[]:= f[][][] // LeafCount
Out[]= 233

เกี่ยวกับข้อกำหนดล่ามฟรี: Mathematica ให้บริการฟรีสำหรับ Raspberry Pi มิฉะนั้นรหัสนี้ควรจะตรงไปตรงมาพอร์ตMathics (ที่มาเปิด) สิ่งเดียวที่ขาดหายไปจากวิชาคณิตศาสตร์คือInverseFunctionซึ่งสามารถแทนที่ได้ที่นี่ (แต่ฉันขี้เกียจ :)


ว้าวฉันไม่รู้ว่า Mathematica นั้นฟรีสำหรับ Pi ฉันควรตรวจสอบมัน อย่างไรก็ตามโปรแกรมควรพิมพ์อักขระไปยังเอาต์พุตมาตรฐานและนั่นคือสิ่งที่ควรนับ
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

@aditsu ที่จริงแล้วฉันทำเพื่อความสนุกมากกว่าที่จะแข่งขันในความท้าทายและการใช้งานLeafCountดูน่าสนใจกว่าการใช้จำนวนตัวอักษร :-) ฉันจะไม่เปลี่ยนมันเพื่อใช้การนับตัวละคร แต่ฉันสามารถลบมันได้โดยไม่รู้สึกผิดถ้าคุณต้องการ
Szabolcs

อ้อเข้าใจแล้ว. เพียงปล่อยไว้แล้วไม่จำเป็นต้องลบ
aditsu ออกจากเพราะ SE นั้นชั่วร้าย

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