ลำดับการบวกลบ


26

ลำดับการบวกลบ

ลำดับบวกลบเป็นหนึ่งที่เริ่มต้นด้วยสองเมล็ดและa(0) b(0)การวนซ้ำของลำดับนี้แต่ละครั้งเป็นการเพิ่มและลบสมาชิกสองคนก่อนหน้าของลำดับ นั่นคือและa(N) = a(N-1) + b(N-1)b(N) = a(N-1) - b(N-1)

วัตถุประสงค์ Produce ลำดับบวกลบในไม่มีที่สิ้นสุดหรือแรกขั้นตอนที่กำหนดK Kคุณสามารถทำได้โดยใช้โปรแกรมเอาต์พุตไม่ จำกัด ตัวสร้างหรือฟังก์ชัน / โปรแกรมที่ให้Kขั้นตอนแรก ลำดับผลลัพธ์ไม่สำคัญตราบใดที่มันสอดคล้องกัน (เช่นb(K) a(K)หรือa(K) b(K)ด้วยตัวคั่นที่ไม่ใช่ตัวเลขบางตัวไม่ใช่บรรทัดใหม่ในระหว่าง) เอาท์พุทจะต้องเริ่มต้นด้วยการป้อนข้อมูล

กรณีทดสอบ

สำหรับอินพุต10 2(จากa(0) b(0)นี่คือผลลัพธ์ที่เป็นไปได้สำหรับวิธี K แรก (หรือส่วนย่อยของวิธีที่ไม่มีที่สิ้นสุด):

10     2
12     8
20     4
24     16
40     8
48     32
80     16
96     64
160    32
192    128
320    64
384    256
640    128
768    512
1280   256
1536   1024
2560   512
3072   2048
5120   1024
6144   4096
10240  2048
12288  8192
20480  4096
24576  16384
40960  8192
49152  32768
81920  16384
98304  65536

สำหรับอินพุต2 20 10( a(0) b(0) k):

2     20
22   -18
4     40
44   -36
8     80
88   -72
16    160
176  -144
32    320
352  -288

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ


ฉันสังเกตเห็น a (2n) = a (0) ·2ⁿและ b (2n) = n (0) ·2ⁿ แต่นั่นอาจไม่มีประโยชน์ที่นี่
Neil

ตัวคั่นที่ไม่ใช่ตัวเลขสามารถอยู่ระหว่างaและbขึ้นบรรทัดใหม่ได้หรือไม่
Suever

@ ไม่ได้ใช้ไม่ได้
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณสำหรับการชี้แจง!
Suever

1
การส่งคืนลำดับเป็นสิ่งที่ดี @guifa
Conor O'Brien

คำตอบ:


13

เยลลี่ 5 ไบต์

ṄI;Sß

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

ลองออนไลน์!

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

ṄI;Sß  Main link. Argument: [b[n], a[n]] (n = 0 for original input)

Ṅ      Print [b[n], a[n]] to STDOUT.
 I     Compute the increments of the list, i.e., [a[n] - [b[n]].
   S   Compute the sum of the list, i.e., b[n] + a[n].
  ;    Concatenate the results to the left and to the right.
    ß  Recursively call the main link.

ว้าว. มันค่อนข้างน่าประทับใจ
Conor O'Brien

สิ่งที่ไม่Main linkจริงหมายถึงอะไร
แมว

4
@cat มันเหมือนกับฟังก์ชั่นหลักของ C ทุกบรรทัดจะกำหนดฟังก์ชั่น / ลิงค์ที่แตกต่างกัน แต่บรรทัดสุดท้ายจะถูกเรียกโดยอัตโนมัติเมื่อมีการเรียกใช้โปรแกรม
เดนนิส

> โปรแกรม Jelly ประกอบด้วยอักขระ Unicode ที่แตกต่างกันสูงสุดถึง 257 ตัว ไม่มี 256 บิตในหนึ่งไบต์?
thepiercingarrow

@ MarkWright และ linefeeds สามารถใช้แทนกันได้ คุณสามารถใช้ทั้งสองอย่างในโหมด UTF-8 แต่มีเพียง\x7fเพื่อแสดงในหน้ารหัสของ Jelly
Dennis

5

Python 2, 31 ไบต์

def f(a,b):print a,b;f(a+b,a-b)

พิมพ์ตลอดไป ในที่สุดคุณก็เกินขีด จำกัด การเรียกซ้ำ แต่นั่นเป็นข้อ จำกัด ของระบบ


คุณคิดว่าจะใช้เวลานานเท่าไรก่อนที่จะเกิดข้อผิดพลาดในการเรียกซ้ำ
R. Kap

@ R.Kap มันคือ ~ 1000 คุณสามารถตั้งค่าขีด จำกัด นี้เป็นสิ่งที่คุณต้องการผ่านsys.setrecursionlimit
Mathias711

@ R.Kap ใช้เวลาประมาณ 10 วินาทีกับเครื่องของฉัน
xnor

10 วินาทีก่อนที่จะเพิ่มข้อผิดพลาดในการเรียกซ้ำ? ว้าว. ใน Python 3 ฉันปล่อยให้ฉันดำเนินต่อไปเป็นเวลา 30 นาทีและไม่มีข้อผิดพลาดใด ๆ ฉันสามารถพิมพ์ได้มากกว่า 2,000 หลักสำหรับหนึ่งในตัวเลข! ฉันเดาว่าwhileลูปจะทำงานแตกต่างจากที่คุณทำ
R. Kap

ฉันลองใช้มันด้วยแลมบ์ดา แต่มันต้องใช้ไบต์มากขึ้น ( f=lambda a,b:print(a,b)or f(a+b,a-b))
MilkyWay90

5

MATL 10 ไบต์

`tDtswPdhT

รุ่นนี้จะแสดงผลจำนวนองค์ประกอบในลำดับบวกลบ

ลองออนไลน์! (หยุดมันหลังจากทำงานเนื่องจากการวนซ้ำไม่สิ้นสุด)

คำอธิบาย

    % Implicitly grab input as a two-element array [a,b]
`   % do...while loop
tD  % Duplicate and display the top of the stack
ts  % Duplicate [a,b] and add them together
w   % Swap the top two elements on the stack
P   % Swap the order of b and a in preparation for diff
d   % Compute the difference between b and a
h   % Horizontally concatenate [a+b, a-b]
T   % Explicit TRUE to make it an infinite loop
    % Implicit end of the do...while loop

สิ่งนี้แปลงจำนวนที่มีขนาดใหญ่มากโดยอัตโนมัติให้เป็นสัญลักษณ์ทางวิทยาศาสตร์หรือไม่
R. Kap

@ R.Kap ดูเหมือนว่ามันจะ ไม่ปรากฏว่าถูกห้ามอย่างชัดเจนในคำแถลงปัญหาเดิม
Suever

ว้าวมันค่อนข้างเท่ห์ ใน Python ถ้าคุณมีตัวเลขมากมันก็ยังพิมพ์ตัวเลขทั้งหมดทีละครั้งดังนั้นมันจึงดูน่าเบื่อนิดหน่อย ฉันแค่คิดว่าภาษาอื่นส่วนใหญ่ก็ทำเช่นกัน แต่ดูเหมือนว่า Python เป็นภาษาที่ไม่เหมือนใครในกรณีนี้
R. Kap

ดังนั้นใน MATLAB (ซึ่ง MATL ใช้ภายใต้ประทุน) คุณสามารถเปลี่ยนรูปแบบเอาต์พุตเป็นสิ่งที่คุณต้องการ ค่าเริ่มต้นของ MATL คือการแสดงตัวเลขสูงสุด 15 หมายเลขก่อนที่จะเปลี่ยนเป็นสัญลักษณ์ทางวิทยาศาสตร์
Suever

OOPS ของฉันเสียใจขอโทษลบ;)
thepiercingarrow

3

Haskell, 19 ไบต์

a#b=a:b:(a+b)#(a-b)

สร้างลำดับของตัวเลขที่ไม่สิ้นสุด ตัวอย่างการใช้งาน:

Prelude> take 20 $ 2#20

[2,20,22,-18,4,40,44,-36,8,80,88,-72,16,160,176,-144,32,320,352,-288]

3

Pyth, 10 9 ไบต์

ขอบคุณ @isaacg สำหรับ 1 ไบต์

#=Q,s
Q-F

พิมพ์ลำดับคู่ที่ไม่มีที่สิ้นสุด

$ pyth plusminus.p <<< "[10,2]" | head -n 15
[10, 2]
[12, 8]
[20, 4]
[24, 16]
[40, 8]
[48, 32]
[80, 16]
[96, 64]
[160, 32]
[192, 128]
[320, 64]
[384, 256]
[640, 128]
[768, 512]
[1280, 256]

1
Qสามารถลบได้ครั้งแรกและครั้งสุดท้าย- Pyth จะเติมเต็มโดยปริยาย
isaacg

@isaacg งั้นก็เอาไปใช้งั้นเหรอ? เย็น. ฉันลองลบอันแรกออก แต่นั่นไม่ได้ผล
PurkkaKoodari

มันแปลกที่การลบอันแรกทำงานบนเครื่องของฉัน
isaacg


3

05AB1E , 7 ไบต์

ใช้ครั้งแรก kวิธี ป้อนข้อมูลต่อไปนี้สำหรับ:

k
[a, b]

รหัส:

FD=OsƂ

คำอธิบาย:

F        # For N in range(0, k).
 D=      # Duplicate top of the stack and print without popping.
   O     # Sum up the array.
    sÆ   # Swap and perform a reduced subtraction.
      ‚  # Pair the top two elements. a, b --> [a, b]

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


1
รหัสรางที่ชวนให้นึกถึงชื่อภาษา ...
Conor โอไบรอัน

@ CᴏɴᴏʀO'Bʀɪᴇɴฮ่าฮ่าฮ่าทั้งสองอ่านไม่ได้
Adnan


3

APL, 37 ตัวอักษร

{⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z}

สามารถใช้เป็น

    {⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z} 10 2
10 2
12 8
20 4
24 16
40 8
48 32
80 16
[...]

หรือ

      {⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z} 10 2 6
10 2
12 8
20 4
24 16
40 8
48 32

3

MathGolf , 8 ไบต์

ô`αp‼+-∟

ลองออนไลน์!

ใช้อินพุตในลำดับย้อนกลับ แต่เป็นเพราะนั่นคือวิธีที่ถูกพุชลงบนสแต็ก มิเช่นนั้นจะยาวกว่า 1 ไบต์ 2-3 ไบต์มาจากเอาต์พุต โดยไม่จำเป็นต้องพิมพ์จริงหนึ่งคู่ต่อบรรทัดโปรแกรมอาจæ`‼+-∟(เติมสแต็กด้วยองค์ประกอบของลำดับอย่างไม่มีกำหนด) หรือÉ‼+-∟(พิมพ์องค์ประกอบทั้งหมดของลำดับยกเว้นลำดับแรกที่จะดีบั๊กตราบใดที่-dสถานะใช้งานอยู่) .

คำอธิบาย

ô      ∟   do-while-true
 `         duplicate the top two items
  αp       wrap last two elements in array and print
    ‼      apply next two operators to the top stack elements
     +     pop a, b : push(a+b)
      -    pop a, b : push(a-b)

สวัสดีครับ ไม่แน่ใจตั้งแต่เมื่อใด แต่ในปัจจุบัน MathGolf เวอร์ชันบน TIO ไม่ยอมรับการป้อนสตริงเลยอีกต่อไป .. ไม่สำคัญว่าฉันจะใช้บิวด์อินใดแม้ว่าจะไม่มีโค้ดสำหรับโปรแกรมเลยก็ตามหากมีการป้อนสตริงให้ ตัวอย่างที่ABCผมได้รับข้อผิดพลาดในบรรทัดstdin = StdIn(line)ในรหัสหลาม ..
เควิน Cruijssen

1
@KevinCruijssen สวัสดี! การป้อนข้อมูล String ควรจะให้เป็นหรือ'ABC' "ABC"ภายในast.literal_evalจะใช้ในการแยกวิเคราะห์อินพุต ยังมีนิสัยใจคอบางอย่างที่ต้องรีด แต่คุณควรทำเช่นนี้ได้
maxb

อาตกลงนั่นเหมาะสมแล้ว Btw มี builtin เพื่อแยกสตริง / หมายเลขเป็นส่วนหนึ่งของขนาดที่แน่นอนหรือบางส่วนของขนาดเท่ากันหรือไม่ คือABCDEFเพื่อ[AB, CD, EF]?
Kevin Cruijssen

Nvm เห็นได้ชัดว่าไม่มี แต่ฉันสามารถหาวิธีการทำเช่นนั้นได้: 2ô_2<\1>](ฮาร์ดโค้ดเพื่อความยาวอินพุต 6 และแยกออกเป็นส่วนของขนาด 2 เนื่องจากเป็นสิ่งที่ฉันต้องการ แต่น่าจะเป็น แก้ไขได้เพื่อให้ทำงานกับขนาดอินพุตทั่วไปและขนาดส่วนหนึ่ง)
Kevin Cruijssen

1
/n

2

Python 3.5, 55 43 ไบต์:

def q(a,b):
 while 1:print(a,b);a,b=a+b,a-b

พิมพ์ลำดับที่ถูกต้องดูเหมือนจะตลอดไป ฉันสามารถปล่อยให้เรื่องนี้ดำเนินต่อไปได้ประมาณ 30 นาทีโดยไม่มีข้อผิดพลาดใด ๆ ขึ้นและโปรแกรมก็พิมพ์ตัวเลข 2301 หลักสำหรับหมายเลขแรกและ 1,150 หลักในวินาที! จากนี้ผมคาดเดาว่าถูกให้ฮาร์ดแวร์เพียงพอที่จะทำงานบนนี้สามารถไปหาวิธีอีกต่อไปและพิมพ์ตัวเลข WAY มากขึ้นและนอกจากนี้ยังมีในทางทฤษฎีไม่ จำกัด recursion มารยาทของwhileห่วง!


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

@ Neil ขอบคุณสำหรับเคล็ดลับ :)
R. Kap

ฉันสับสน ตอนนี้คุณมีทั้ง a whileและโทรซ้ำแล้วซ้ำอีก ...
Neil

@ Neil ใช่ฉันไม่ได้สังเกตเห็นว่า ตอนนี้มันได้รับการแก้ไขและเพียงชั่วขณะหนึ่งโดยไม่มีข้อ จำกัด ทางทฤษฎีใด ๆ
R. Kap

2

Reng v.3.2, 9 ไบต์ (ตอบด้วยตนเอง, ไม่แข่งขัน)

ii¤ææö±2.

ใช้เวลาสองปัจจัยการผลิต ( a b) b aและเอาท์พุท ลองที่นี่!

iป้อนข้อมูลสองครั้ง¤ทำซ้ำสแต็คæพิมพ์ตัวเลขและช่องว่าง (และทำสองครั้งมีสองครั้ง) öพิมพ์บรรทัดใหม่±ทำในสิ่งที่คุณคาดหวังและ2.ข้ามอักขระสองตัวถัดไปล้อมรอบอินพุตอักขระที่ป้อนเข้า


2
อืมคุณจะช่วยอธิบายสิ่งที่อักษรอียิปต์โบราณทำกับ newb อย่างฉันได้ไหม :)
Kevin Cruijssen

@KevinCruijssen ฉันได้อธิบายเรื่องลึกลับแล้ว :)
Conor O'Brien

2

Python 2.7, 56 , 42 ไบต์:

a,b=input()
while 1:print a,b;a,b=a+b,a-b

วนรอบง่าย ๆ ที่พิมพ์ตลอดไป (ish)


คุณสามารถใช้พื้นที่เดียวสำหรับระดับการเยื้องเพื่อบันทึกไบต์ นอกจากนี้คุณไม่จำเป็นต้องทำทั้งสองวิธีเพียงวิธีเดียวดังนั้นคุณสามารถลบพารามิเตอร์เริ่มต้นได้
Conor O'Brien

โอ้ด่าไม่ได้สังเกตว่า Notepad ทำให้แท็บของฉันเป็น 4 ช่องว่างและแน่นอนว่าฉันจะ จำกัด ให้เป็นหนึ่งเดียวขอบคุณ
Serdalis

หากคุณทำโปรแกรมนี้โดยเปลี่ยนบรรทัดแรกเป็น a,b=input()คุณสามารถลบการเยื้อง
xnor

@xnor ขอบคุณเพียงบันทึก 1 ไบต์ แต่มันไม่น่าเกลียดอีกต่อไป!
Serdalis

2

แบตช์ 54 ไบต์

@echo %1 %2
@set/aa=%1+%2
@set/ab=%1-%2
@%0 %a% %b%

โปรดทราบว่า CMD.EXE ถูก จำกัด ไว้ที่จำนวนเต็ม 32 บิตที่ได้รับการรับรองดังนั้นมันจะล้นอย่างรวดเร็วและพิมพ์ขยะและข้อความแสดงข้อผิดพลาด


1
ชอบที่จะเห็นคำตอบแบบกลุ่มที่นี่เสมอ! : D
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴฉันเขียนมันเพื่อคุณโดยเฉพาะ
Neil

2

Julia, 25 ไบต์

a<|b=[a b]|>show<a+b<|a-b

การละเมิดไวยากรณ์สูงสุด จูเลียคือแปลก ลองออนไลน์!

รุ่นสำรอง 29 ไบต์

หมายเหตุว่าการส่งออกจะได้ล้นจนกว่าคุณจะเรียก<|ในbigint น่าเสียดายที่showจะนำหน้าแต่ละอาร์เรย์ด้วยBigIntในกรณีนี้ ด้วยค่าใช้จ่ายอีกสี่ไบต์เราสามารถสร้างเอาต์พุตที่คั่นด้วยช่องว่างสำหรับทุกประเภทตัวเลข

a<|b="$a $b
"|>print<a+b<|a-b

ลองออนไลน์!

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

เรากำหนดผู้ประกอบการไบนารี<|เพื่อวัตถุประสงค์ มันไม่ได้กำหนดไว้ใน Julia รุ่นล่าสุด แต่ยังคงได้รับการยอมรับว่าเป็นตัวดำเนินการโดย parser ในขณะที่\(ไม่ได้กำหนดอย่างชัดเจนสำหรับจำนวนเต็ม) จะสั้นกว่าหนึ่งไบต์ แต่ลำดับความสำคัญสูงนั้นจะต้องแทนที่a+b<|a-bด้วย(a+b)\(a-b)(+3 ไบต์) หรือ\(a+b,a-b)(+2 ไบต์)

เมื่อa<|bถูกดำเนินการมันจะเริ่มต้นด้วยการโทรshowพิมพ์[ab]ไปที่ STDOUT จากนั้นa+b<|a-bโทรซ้ำ<|บนผลรวมหรือความแตกต่าง

เนื่องจากการเรียกซ้ำ (ไม่มีที่สิ้นสุด) การเปรียบเทียบ<จึงไม่ถูกดำเนินการ มันมีวัตถุประสงค์เพียงอย่างเดียวคือการผูกมัดทั้งสองส่วนของรหัส ([a b]|>show;a+b<|a-b)นี้ช่วยประหยัดไบต์ที่สองมากกว่าทางเลือกที่ตรงไปตรงมามากขึ้น


2

Perl 6 , 23 ไบต์ (ไม่มีที่สิ้นสุด)

แก้ไข: ขอบคุณ JoKing ตอนนี้ลำดับที่สั้นที่สุด (ถูกลบ.sayต่อการชี้แจงจาก OP:

{@_,{.sum,[-] |$_}...*}

TIO: InfiniteSeq

คำตอบการทำงานเก่า

->\a,\b {(a,b).say;f(a+b,a -b)}

TIO: InfiniteFunc

โปรดทราบว่า Perl 6 ไม่มีขีด จำกัด การเรียกซ้ำตามความเป็นจริงโดยขึ้นอยู่กับหน่วยความจำที่มีอยู่ดังนั้นสิ่งนี้จะไปถึงผู้คนนับล้านก่อนที่จะระเบิด


23 ไบต์สำหรับอนันต์
โจคิง

@ ล้อเล่น: ดี! ฉันรู้สึกค่อนข้างโง่ที่ไม่คิดถึง ฉันคิดว่าข้อกำหนดบังคับให้ส่งออกในฟังก์ชัน (ฉันขอคำชี้แจง แต่คนอื่น ๆ ส่วนใหญ่ดูเหมือนจะมีสิ่งนั้นที่ให้ 28 ด้วยtio.run/##K0gtyjH7n1upoJamYPu/ … )
user0721090601

1

ตัวคูณ 62 ไบต์

:: f ( a b -- x ) a b "%s %s" printf a b + a b - f ; recursive

recursiveหรืออื่น callstack หมดเร็วเกินไป


1

ทับทิมขนาด 25 ไบต์

ขึ้นอยู่กับวิธีการแก้ปัญหาของงูหลาม XNOR บางทีฉันอาจจะสร้างเครื่องกำเนิดไฟฟ้าขึ้นมาในคำตอบอื่น แต่สิ่งนี้จะพิมพ์aจากbนั้นสร้างใหม่aจากนั้นจะเป็นbinfinitum โฆษณาใหม่

f=->a,b{p a,b;f[a+b,a-b]}

1

Python 3, 42 ไบต์

ฉันต้องการเขียนตัวกำเนิดสำหรับฟังก์ชันนี้และฉันก็ทำเช่นนั้น

def f(a,b):
 while 1:yield a,b;a,b=a+b,a-b

ใน Python 3 ลำดับจะถูกสร้างขึ้นด้วยวิธีนี้:

>>> gen = f(2, 20)
>>> next(gen)
(2, 20)
>>> next(gen)
(22, -18)
>>> next(gen)
(4, 40)
>>> next(gen)
(44, -36)
>>> next(gen)
(8, 80)

1

เสียงกระเพื่อมสามัญ, 57

(lambda(a b)(loop(print`(,a,b))(psetf a(+ a b)b(- a b))))

ใช้psetfซึ่งมีผลต่อค่าตัวแปรในแบบคู่ขนานและloopไวยากรณ์อย่างง่าย



1

CP / M 8080, 47 ไบต์

ตัวช่วยจำ z80 แต่ไม่มีอะไรที่ไม่มี 8080 แหล่งที่มาให้ความเห็นเมื่อฉันตัดสินใจที่จะนับผลลัพธ์มากกว่าชื่ออินพุต แต่ชื่อฟังก์ชันตัวย่อคงไว้ด้วยมือที่ประกอบกันจึงให้อภัย 'xx ที่ฉันรู้จำนวนไบต์ แต่ยังไม่ได้ผล ที่อยู่เอาท์พุทหรือชดเชย:

# setup
ld c, 2     0e 02

# loop
.s

# update H (temporarily in B)
ld a, h     7c
add l       85
daa         27
ld b, a     46

# update L
ld a, h     7c
sub l       95
daa         27
ld l, a     6f

# copy B back to H, output H
ld h, b     60
call +o     cd xx xx

# output L
ld b, l     45
call +o     cd xx xx

# repeat
jr -s       18 xx

# output a two-digit BCD value followed by a space
.o

# output high digit
ld a, b     78
rra         1f
rra         1f
rra         1f
rra         1f
call +ob    cd xx xx

# output low digit
ld a, b     78
call +ob    cd xx xx

# output a space
ld e, #$20  1e 20
call 5      cd 00 05

# return
ret         c9

# output a single BCD digit
.ob
and #$f     e6 0f
add #$30    c6 30
ld e, a     5f
call 5      cd 00 05
ret         c9

1

Clojure 44 ไบต์

#(iterate(fn[[a b]][(+ a b)(- a b)])[%1 %2])

ฟังก์ชั่นที่สร้างลำดับการขี้เกียจไม่สิ้นสุด


1

Perl 5, 40 ไบต์

ต้องการ-E(ฟรี)

sub a{say"@_";($c,$d)=@_;a($c+$d,$c-$d)}

หรือ (ความยาวเท่ากัน)

$_=<>;{say;/ /;$_=$`+$'.$".($`-$');redo}

(ฉันเข้ามาหลังเพราะมันควรจะมีข้อผิดพลาดในการปัดเศษซ้ำ)

หมวกปลาย

แต่ฉันสงสัยว่าจะต้องมีวิธีการแก้ปัญหา Perl 5 ที่สั้นกว่า


1
หากมีวิธีการแก้ปัญหาที่สั้นกว่า Ton Hospel จะค้นหามัน : P
Conor O'Brien

ใช้เวลาสักครู่ แต่ฉันพบวิธีที่สั้นกว่า:
Xcali

1

ผลตอบแทน 21 ไบต์

[¤.' ,$.'
,¤¤+2ª-F]=F

Try it here.

Recursive operator-lambda การใช้งาน:

[¤.' ,$.'
,¤¤+2ª-F]=F10 2F

คำอธิบาย

[                 ]=F  declare function F for recursion
 ¤.' ,$.'␊,            output top 2 stack items along with trailing newline
           ¤¤+2ª-      get plus and minus of top 2 stack items
                 F     recurse!

1

> <> , 26 ไบต์

:?!;1-r:n48*o:@@:nao:@+}-$

โทรหาa, b, nในกองที่nเป็นจำนวนรอบหรือเป็นค่าลบสำหรับการส่งออกที่ไม่มีที่สิ้นสุด ส่งออกaและbคั่นด้วยช่องว่าง

ตามคำอธิบายต่อไปนี้เป็นวิธีที่สแต็ควิวัฒนาการระหว่างรันไทม์

abn
nba
nbaa
naab
naabb
nabab
nab+
+nab
+n-
+-n

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

$ python fish.py -c ':?!;1-r:n48*o:@@:nao:@+}-$' -t 0.01 -v 10 2 -1
10 2
12 8
20 4
24 16
40 8
48 32
80 16
96 64
160 32
192 128
320 64
384 256
640 128
768 512
1280 256
1536 1024
2560 512
3072 2048
5120 1024
6144 4096
10240 2048
12288 8192
20480 4096
24576 16384
40960 8192
49152 32768
81920 16384
98304 65536
163840 32768
196608 131072
327680 65536
393216 262144
655360 131072
786432 524288
1310720 262144
[...]

1

Fuzzy Octo Guacamole , 17 16 ไบต์

(ไม่ใช่การแข่งขันใช้ฟีเจอร์ที่ช้ากว่าความท้าทาย)

^^(:C.Zs.aZ.s.-)

นี่เป็นเรื่องยากที่จะทำเนื่องจากข้อผิดพลาดฝั่งไคลเอ็นต์ แต่ฉันเข้าใจแล้ว!

เกมส์:

^^                # Get input twice, pushes it to the stack.
  (               # Start a infinite loop.
   :              # Prints the stack, and since it has [a,b] is just the output.
    C             # Copy the active stack to the inactive stack.
     .            # Shift the active stack.
      Z           # Reverse the stack.
       s          # Move the top item on the active stack to the top of the inactive.
        .         # Switch stacks again.
         a        # Add the top 2 items, giving the first new item.
          Z       # Reverse the stack, so we keep the 'a' safe and prepare for the 'b'.
           .      # Switch stacks.
            s     # Move the top item on the active stack to the top of the inactive stack.
             .    # Switch stacks.
              -   # Minus the top 2 items, giving 'b'.
               )  # End infinite loop.

ฉันไม่รู้จัก FOG ทั้งหมด แต่คุณไม่สามารถเลื่อน:ไปยังจุดเริ่มต้นของลูปและกำจัดความต้องการในการพิมพ์สองครั้งใช่ไหม
Conor O'Brien

oooooh @ CᴏɴᴏʀO'Bʀɪᴇɴขอบคุณ
Rɪᴋᴇʀ

อย่าลืมอัปเดตคำอธิบาย;)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ whadda ya หมายถึงอะไร : P
Rɪᴋᴇʀ

1

จริงจัง 12 ไบต์

,,1WX■@│+)-1

เอาต์พุตสตรีมไม่สิ้นสุดรูปแบบคือb(n) a(n)เอาต์พุตหนึ่งคู่ต่อบรรทัด

ไม่มีลิงก์ออนไลน์เพราะ TryItOnline ใช้งานไม่ได้กับลูปไม่มีที่สิ้นสุด

คำอธิบาย:

,,1WX■@│+)-1
,,1           push a(0), push b(0), push 1
   W          while loop:
    X           discard the 1 (only used to make sure the while loop always runs)
     ■          print all stack elements, separated by spaces, without popping
      @│        swap, duplicate entire stack
        +)      push a(n) + b(n) (a(n+1)) and move it to the bottom of the stack
          -     push a(n) - b(n) (b(n+1))
           1    push 1 to make sure the loop continues

1

J, 16 12 ไบต์

0&(]+/,-/)~<

สร้างเฉพาะค่าkแรกสำหรับลำดับตามเมล็ดที่กำหนด

บันทึกแล้ว 4 ไบต์โดยใช้ลูกเล่น (หรือน้ำตาลประโยค) ที่แสดงโดย @randomra ในความคิดเห็นนี้

การใช้

   f =: 0&(]+/,-/)~<
   2 20 f 10
  2   20
 22  _18
  4   40
 44  _36
  8   80
 88  _72
 16  160
176 _144
 32  320
352 _288

1

C #, 50 ไบต์

f=(a,b)=>{Console.WriteLine(a+" "+b);f(a+b,a-b);};

แหล่งที่มาเต็มรูปแบบรวมถึงกรณีทดสอบ:

using System;
using System.Numerics;

namespace PlusMinusSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<BigInteger,BigInteger>f=null;
            f=(a,b)=>{Console.WriteLine(a+" "+b);f(a+b,a-b);};
            BigInteger x=10, y=2;
            f(x,y);
        }
    }
}

มีการใช้ชนิดข้อมูล BigInteger เพื่อให้ตัวเลขไม่ล้นและกลายเป็น 0 อย่างไรก็ตามเนื่องจากเป็นโซลูชันแบบเรียกซ้ำ

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