Trình tự cộng trừ


26

Trình tự cộng trừ

Chuỗi cộng trừ là một chuỗi bắt đầu bằng hai hạt a(0)b(0). Mỗi lần lặp của chuỗi này là phép cộng và phép trừ của hai thành viên trước đó của chuỗi. Đó là, a(N) = a(N-1) + b(N-1)b(N) = a(N-1) - b(N-1).

Mục tiêu Tạo ra chuỗi cộng trừ, ở mức vô hạn hoặc các Kbước đầu tiên được đưa ra K. Bạn có thể thực hiện việc này bằng cách sử dụng chương trình đầu ra vô hạn, trình tạo hoặc chức năng / chương trình đưa ra các Kbước đầu tiên . Thứ tự đầu ra không quan trọng, miễn là nó phù hợp. (Tức là, b(K) a(K)hoặc a(K) b(K), với một số dấu phân cách không phải là số, không phải dòng mới ở giữa.) Đầu ra phải bắt đầu bằng đầu vào.

Các trường hợp thử nghiệm

Đối với đầu vào 10 2(của a(0) b(0), đây là đầu ra có thể cho phương pháp K đầu tiên (hoặc phần phụ của phương pháp vô hạn):

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

Đối với đầu vào 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

Đây là một , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.


Tôi nhận thấy a (2n) = a (0) · 2ⁿ và b (2n) = n (0) · 2ⁿ, nhưng điều đó có lẽ không hữu ích ở đây.
Neil

Dấu phân cách không phải là số giữa ablà một dòng mới?
Suever

@Suever Không, nó không thể.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Cảm ơn đã làm rõ!
Suever

1
Trả lại một chuỗi là tốt @guifa
Conor O'Brien

Câu trả lời:


13

Thạch , 5 byte

ṄI;Sß

Đây là một cách tiếp cận đệ quy. Do tối ưu hóa cuộc gọi đuôi, giới hạn duy nhất là khả năng phù hợp với cả hai số nguyên vào bộ nhớ. Đầu ra là một danh sách trên mỗi dòng.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ṅ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.

Ồ Điều đó khá ấn tượng.
Conor O'Brien

Điều đó Main linkthực sự có nghĩa là gì?
con mèo

4
@cat Nó giống như chức năng chính của C. Mỗi dòng định nghĩa một chức năng / liên kết khác nhau, nhưng dòng cuối cùng được gọi tự động khi chương trình được thực thi.
Dennis

> Các chương trình Jelly bao gồm tối đa 257 ký tự Unicode khác nhau. Không có 256 bit trong một byte?
thepiercingarrow

@MarkWright và linefeed có thể được sử dụng thay thế cho nhau. Bạn có thể sử dụng cả hai trong chế độ UTF-8, nhưng chỉ \x7fđể thể hiện chúng trong trang mã của Jelly.
Dennis

5

Python 2, 31 byte

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

In mãi mãi. Chà, cuối cùng bạn vượt quá giới hạn đệ quy, nhưng đó là giới hạn hệ thống.


Bạn nghĩ điều này có thể diễn ra trong bao lâu trước khi một lỗi đệ quy được nêu ra?
R. Kap

@ R.Kap nó là ~ 1000. Bạn có thể đặt giới hạn này thành bất cứ điều gì bạn muốn thông quasys.setrecursionlimit
Mathias711

@ R.Kap Mất khoảng 10 giây trên máy của tôi.
xnor

10 giây trước khi tăng lỗi đệ quy? Ồ Trong Python 3, tôi để tôi tiếp tục trong 30 phút và không có lỗi nào được nêu ra. Tôi đã có thể in hơn 2000 chữ số cho một trong những số! Tôi đoán một whilevòng lặp hành xử khác với những gì bạn đang làm.
R. Kap

Tôi đã thử sử dụng cái này với lambda nhưng phải mất nhiều byte hơn ( f=lambda a,b:print(a,b)or f(a+b,a-b))
MilkyWay90

5

MATL , 10 byte

`tDtswPdhT

Phiên bản này sẽ xuất ra vô số phần tử trong chuỗi cộng trừ.

Hãy thử trực tuyến! (dừng nó sau khi chạy do vòng lặp vô hạn)

Giải trình

    % 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

Điều này có tự động chuyển đổi tất cả số lượng rất lớn thành ký hiệu khoa học?
R. Kap

@ R.Kap Có vẻ như nó làm. Điều đó dường như không bị cấm rõ ràng trong tuyên bố vấn đề ban đầu.
Suever

Wow, thật tuyệt. Trong Python, nếu bạn có số rất lớn, nó vẫn in ra tất cả các chữ số, từng chữ số một, vì vậy nó có một chút tẻ nhạt khi nhìn vào tất cả. Tôi chỉ nghĩ rằng hầu hết các ngôn ngữ khác cũng làm điều đó, nhưng có vẻ như Python là ngôn ngữ duy nhất trong trường hợp này.
R. Kap

Vâng, trong MATLAB (MATL sử dụng dưới mui xe), bạn có thể thay đổi định dạng đầu ra thành bất cứ điều gì bạn muốn. Mặc định của MATL là hiển thị tối đa 15 số trước khi chuyển sang ký hiệu khoa học.
Suever

OOPS xấu của tôi, xin lỗi, đã xóa;)
thepiercingarrow

3

Haskell, 19 byte

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

Tạo ra một chuỗi số vô hạn. Ví dụ sử dụng:

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

Bình thường, 10 9 byte

Cảm ơn @isaacg cho 1 byte.

#=Q,s
Q-F

In một chuỗi vô hạn của các cặp.

$ 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
QS đầu tiên và cuối cùng có thể được gỡ bỏ - Pyth sẽ điền chúng vào hoàn toàn.
isaacg

@isaacg Vậy là đã thực hiện rồi sao? Mát mẻ. Tôi đã thử loại bỏ cái đầu tiên, nhưng nó không hoạt động.
PurkkaKoodari

Điều đó thật lạ, loại bỏ cái đầu tiên hoạt động trên máy của tôi.
isaacg

3

C, 81 byte

a,b;main(c){for(scanf("%d%d%d",&a,&b,&c);c--;a+=b,b=a-b-b)printf("%d %d\n",a,b);}

3

05AB1E , 7 byte

Sử dụng phương pháp k đầu tiên . Đầu vào sau đây cho:

k
[a, b]

Mã số:

FD=OsƂ

Giải trình:

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]

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


1
Mã này gợi nhớ một cách mơ hồ tên ngôn ngữ ...
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Hahaha, cả hai đều không thể đọc được
Adnan

3

k, 12

{(+;-).\:x}\

.

k){(+;-).\:x}\[10;10 2]
10  2
12  8
20  4
24  16
40  8
48  32
80  16
96  64
160 32
192 128
320 64

Cũng có thể được gọi dưới dạng

k)10{(+;-).\:x}\10 2


3

APL, 37 ký tự

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

Có thể được sử dụng như

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

hoặc là

      {⍺←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 byte

ô`αp‼+-∟

Hãy thử trực tuyến!

Đưa đầu vào theo thứ tự ngược lại, nhưng đó đơn giản là vì đó là cách chúng được đẩy lên ngăn xếp. Nếu không, nó sẽ dài hơn 1 byte. 2-3 byte đến từ đầu ra. Không cần thực sự in một cặp trên mỗi dòng, chương trình có thể æ`‼+-∟(lấp đầy ngăn xếp với các phần tử của chuỗi vô thời hạn) hoặc É‼+-∟(in tất cả các phần tử của chuỗi trừ phần đầu tiên để gỡ lỗi, miễn là-d cờ được kích hoạt) .

Giải trình

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

Xin chào Max. Không chắc chắn từ khi nào, nhưng hiện tại phiên bản MathGolf trên TIO không chấp nhận đầu vào chuỗi nữa .. Không quan trọng tôi sử dụng nội dung nào, ngay cả khi không có bất kỳ mã nào cho chương trình, nếu đầu vào chuỗi được đưa ra như thế nào cho ví dụ: ABCtôi gặp lỗi trên dòng stdin = StdIn(line)mã Python ..
Kevin Cruijssen

1
@KevinCruijssen Xin chào! Đầu vào chuỗi nên được đưa ra là 'ABC'hoặc "ABC". Trong nội bộ, ast.literal_evalđược sử dụng để phân tích đầu vào. Vẫn còn một số điều kỳ quặc cần được giải quyết, nhưng bạn sẽ có thể làm điều này .
maxb

Ah ok, điều đó có ý nghĩa. Btw, có một dựng sẵn để chia một chuỗi / số thành các phần có kích thước nhất định hoặc một số lượng các phần có kích thước bằng nhau? Tức ABCDEF[AB, CD, EF]?
Kevin Cruijssen

Nvm, rõ ràng là không có, nhưng tôi đã có thể tìm ra cách để làm như vậy: 2ô_2<\1>](được mã hóa cứng cho chiều dài đầu vào 6 và chia thành các phần của kích thước 2, vì đó là điều tôi cần, nhưng có lẽ nên có thể sửa đổi để làm việc cho kích thước đầu vào chung và kích thước bộ phận).
Kevin Cruijssen

1
/n

2

Python 3.5, 55 43 byte:

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

In ra trình tự chính xác dường như mãi mãi. Tôi đã có thể để điều này diễn ra trong khoảng 30 phút mà không có lỗi nào được nêu ra và chương trình đã in ra 2301 chữ số cho số đầu tiên và 1150 chữ số cho lần thứ hai! Dựa trên điều này, tôi đoán rằng, được cung cấp đủ phần cứng để chạy, điều này có thể tiếp tục CÁCH lâu hơn và in ra CÁCH nhiều chữ số hơn, và về mặt lý thuyết không có giới hạn đệ quy, lịch sự của whilevòng lặp!


Tôi nghĩ rằng bạn nên in ra các giá trị hiện tại ở đầu vòng lặp, để đầu ra đầu tiên giống với đầu vào. Ngoài ra, vì đây là mã golf, bạn nên tối ưu hóa các dấu ngoặc đơn và các biến trung gian. Cuối cùng, là một kiểu nit, tôi nghĩ bạn nên xem xét việc đặt tên cho các biến abđể phù hợp với câu hỏi.
Neil

@Neil Cảm ơn lời khuyên. :)
R. Kap

Tôi bối rối; bạn đã có cả whilecuộc gọi và cuộc gọi đệ quy ngay bây giờ ...
Neil

@Neil Vâng, tôi đã không nhận thấy điều đó. Bây giờ nó đã được sửa, và chỉ là một vòng lặp, với lý thuyết không có giới hạn nào.
R. Kap

2

Reng v.3.2, 9 byte (tự trả lời, không cạnh tranh)

ii¤ææö±2.

Có hai đầu vào ( a b) và đầu rab a . Hãy thử nó ở đây!

inhận đầu vào hai lần, ¤sao chép ngăn xếp, æin một số và khoảng trắng (và thực hiện hai lần, có hai), öin một dòng mới, ±làm những gì bạn có thể mong đợi và 2.bỏ qua hai ký tự tiếp theo, bao quanh các ký tự nhận đầu vào.


2
Hmm, bạn có phiền giải thích những gì mỗi chữ tượng hình đó làm với một người mới như tôi không? :)
Kevin Cruijssen

@KevinCruijssen Tôi đã giải thích bí ẩn. :)
Conor O'Brien

2

Python 2.7, 56 , 42 byte:

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

Vòng lặp đơn giản hoặc in mãi mãi (ish).


Bạn có thể sử dụng một khoảng trống cho mức thụt lề để lưu byte. Ngoài ra, bạn không phải thực hiện cả hai phương pháp, chỉ một hoặc hai phương pháp, vì vậy bạn có thể xóa tham số mặc định.
Conor O'Brien

Ôi chết tiệt, đã không nhận thấy notepad đã biến tab của tôi thành 4 khoảng trắng, và chắc chắn rằng tôi sẽ giới hạn nó ở một, Cảm ơn.
Serdalis

Nếu bạn thực hiện chương trình này bằng cách thay đổi dòng đầu tiên thành a,b=input(), bạn có thể xóa thụt lề.
xnor

@xnor Cảm ơn, chỉ tiết kiệm 1 byte nhưng nó không còn xấu nữa!
Serdalis

2

Mẻ, 54 byte

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

Lưu ý rằng CMD.EXE bị giới hạn ở các số nguyên có chữ ký 32 bit, do đó, nó sẽ nhanh chóng tràn và in các thông báo lỗi và rác.


1
Luôn luôn thích để xem một câu trả lời hàng loạt ở đây! : D
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tôi đã viết nó đặc biệt cho bạn.
Neil

2

Julia, 25 byte

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

Lạm dụng cú pháp tối đa. Julia thật kỳ lạ . Hãy thử trực tuyến!

Phiên bản thay thế, 29 byte

Lưu ý rằng kết quả cuối cùng sẽ tràn trừ khi bạn gọi <|trên một bigint . Thật không may, showsẽ tiền tố từng mảng với BigInttrong trường hợp này. Với chi phí thêm bốn byte, chúng ta có thể tạo đầu ra được phân tách bằng khoảng trắng cho tất cả các loại số.

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Chúng tôi xác định toán tử nhị phân <|cho các mục đích ra. Nó không được xác định trong các phiên bản gần đây của Julia, nhưng vẫn được trình phân tích cú pháp công nhận. Mặc dù \(không được xác định rõ ràng cho số nguyên) ngắn hơn một byte, nhưng mức độ ưu tiên cao của nó sẽ yêu cầu thay thế a+b<|a-bbằng (a+b)\(a-b)(+3 byte) hoặc \(a+b,a-b)(+2 byte).

Khi a<|bđược thực thi, nó bắt đầu bằng cách gọi showđể in [ab] sang STDOUT. Sau đó, a+b<|a-bgọi đệ quy <|trên tổng hoặc chênh lệch.

Vì đệ quy là (được cho là) ​​vô hạn, nên việc so sánh <không bao giờ được thực hiện; mục đích duy nhất của nó là xâu chuỗi hai phần của mã. Điều này tiết kiệm hai byte trên thay thế đơn giản hơn ([a b]|>show;a+b<|a-b).


2

Perl 6 , 23 byte (vô hạn)

Chỉnh sửa: nhờ JoKing, phiên bản trình tự hiện là ngắn nhất (cũng bị xóa .saytheo mỗi lần làm rõ từ OP:

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

TIO: InfiniteSeq

Câu trả lời chức năng cũ

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

TIO: InfiniteFunc

Lưu ý rằng Perl 6 không có giới hạn đệ quy mỗi lần, nó hoàn toàn dựa trên bộ nhớ khả dụng, do đó, điều này sẽ đạt tới hàng triệu trước khi ném bom.


23 byte cho vô hạn
Jo King

@ Đùa: Đẹp quá! Tôi cảm thấy khá ngớ ngẩn vì không nghĩ đến .sum. Tôi nghĩ rằng các yêu cầu bắt buộc outputing trong hàm (tôi đã đề nghị làm rõ, nhưng hầu hết những người khác dường như có điều đó, cung cấp cho 28 với tio.run/##K0gtyjH7n1upoJamYPu/... )
user0721090601

1

Yếu tố, 62 byte

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

recursivehoặc nếu không thì callstack hết quá nhanh.


1

Ruby, 25 byte

Dựa trên giải pháp Python của xnor . Có lẽ tôi sẽ tạo một máy phát điện trong câu trả lời khác, nhưng điều này sẽ in a, sau đób , sau đó là mới a, sau đó là bquảng cáo mới .

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

1

Python 3, 42 byte

Tôi muốn viết một trình tạo cho chức năng này, và vì vậy tôi đã làm.

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

Trong Python 3, chuỗi được tạo theo cách này:

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

Lisp thường gặp, 57

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

Sử dụng psetf, điều này ảnh hưởng đến các giá trị đến các biến song song và loopcú pháp đơn giản .


1

bash + GNU coreutils, 75 byte

a=$1
b=$2
for i in `seq $3`;{ echo -e "$a\t$b";c=$a;a=$((c+b));b=$((c-b));}

Cầu nguyện:

./codegolf.sh 2 10 5

1

CP / M 8080, 47 byte

z80 mnemonics nhưng 8080 không có gì, nguồn nhận xét một khi tôi quyết định đếm đầu ra thay vì đầu vào nhưng tên hàm terse được giữ lại, được lắp ráp bằng tay để tha thứ cho 'xx' nơi tôi biết số byte nhưng không hoạt động các địa chỉ đầu ra hoặc offset:

# 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 byte

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

Chức năng tạo ra một chuỗi lười biếng vô hạn.


1

Perl 5, 40 byte

yêu cầu -E(miễn phí)

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

hoặc (cùng chiều dài)

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

(Tôi đã vượt qua cái thứ hai vì nó sẽ có lỗi làm tròn cho một số lần lặp.)

Đầu mũ.

Nhưng tôi nghi ngờ phải có một giải pháp Perl 5 ngắn hơn.


1
Nếu có một giải pháp ngắn hơn, TonMedel sẽ tìm thấy nó. : P
Conor O'Brien

Mất một lúc, nhưng tôi tìm thấy một cách ngắn hơn:
Xcali

1

TRẢ LẠI , 21 byte

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

Try it here.

Toán tử đệ quy-lambda. Sử dụng:

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

Giải trình

[                 ]=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 byte

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

Gọi với a, b, ntrên stack, nơi nlà số lượt hoặc một giá trị âm cho đầu ra vô hạn. Đầu ra abcách nhau bởi một khoảng trắng.

Như một lời giải thích, đây là cách ngăn xếp phát triển trong thời gian chạy:

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

Bạn có thể thử nó trên trình thông dịch trực tuyến với số lượt quay tích cực nhưng bạn sẽ cần sử dụng trình thông dịch python chính thức để kiểm tra chế độ vô hạ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 byte

(không cạnh tranh, sử dụng các tính năng muộn hơn so với thử thách)

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

Điều này rất khó thực hiện, do lỗi phía máy khách. Nhưng tôi đã nhận nó!

Hướng dẫn:

^^                # 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.

Tôi không biết rõ về FOG, nhưng bạn không thể di chuyển :đến đầu vòng lặp và loại bỏ nhu cầu in hai lần?
Conor O'Brien

oooooh @ CᴏɴᴏʀO'Bʀɪᴇɴ cảm ơn.
Rɪᴋᴇʀ

Đừng quên cập nhật lời giải thích;)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ whadda ya nghĩa là gì? : P
Rɪᴋᴇʀ

1

Nghiêm túc, 12 byte

,,1WX■@│+)-1

Đầu ra một luồng vô hạn, định dạng là b(n) a(n), một cặp đầu ra trên mỗi dòng.

Không có liên kết trực tuyến vì TryItOnline không hoạt động tốt với các vòng lặp vô hạn.

Giải trình:

,,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 byte

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

Chỉ tạo ra các giá trị k đầu tiên cho chuỗi dựa trên các hạt đã cho.

Đã lưu 4 byte bằng thủ thuật (hoặc đường cú pháp) được hiển thị bởi @randomra trong bình luận này .

Sử dụng

   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 byte

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

Nguồn đầy đủ, bao gồm cả trường hợp thử nghiệm:

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

Kiểu dữ liệu BigInteger được sử dụng để các số không tràn và trở thành 0. Tuy nhiên, vì đây là một giải pháp đệ quy, hãy mong đợi một tràn ngăn xếp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.