プラスマイナスシーケンス


26

プラスマイナスシーケンス

プラスマイナスシーケンスは、2シードで始まるものです、a(0)b(0)。このシーケンスの各反復は、シーケンスの前の2つのメンバーの加算と減算です。つまり、a(N) = a(N-1) + b(N-1)そしてb(N) = a(N-1) - b(N-1)

目的無限大または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 10a(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ⁿに気付きますが、ここではおそらく役に立たないでしょう。
ニール

aとの間の非数値区切り文字をb改行にすることはできますか?
-Suever

@Sueverいいえ、できません。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ説明をありがとう!
-Suever

1
シーケンスを返すことは問題ありません@guifa
Conor O'Brien

回答:


13

ゼリー、5 バイト

ṄI;Sß

これは再帰的なアプローチです。末尾呼び出しの最適化のため、唯一の制限は両方の整数をメモリに適合させる能力です。出力は1行に1つのリストです。

オンラインでお試しください!

使い方

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

ワオ。それは非常に印象的です。
コナーオブライエン

何をないMain link、実際に意味ですか?

4
@cat Cのメイン関数のようなものです。各行は異なる関数/リンクを定義しますが、最後の行はプログラムの実行時に自動的に呼び出されます。
デニス

>ゼリープログラムは、最大257種類のUnicode文字で構成されています。1バイトに256ビットはありませんか?
thepiercingarrow 16

@MarkWright と改行は同じ意味で使用できます。UTF-8モードで両方を使用できますが、\x7fそれらを表すのはJellyのコードページのみです。
デニス

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 16

再帰エラーが発生する10秒前?ワオ。Python 3では、30分間そのまま続けましたが、エラーはまったく発生しませんでした。数字の1つに2000桁を超える数字を印刷することができました!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.ガプス

@ R.Kapどうやらそうです。それは、元の問題ステートメントで明示的に禁止されているようには見えません。
Suever

うわー、それはかなりクールです。Pythonでは、非常に大きな数字がある場合でも、一度に1桁ずつすべての数字が出力されるため、それを見ると少し面倒です。他のほとんどの言語も同じことをしていると思ったのですが、この場合はPythonがユニークなようです。
R. Kap

さて、MATLAB(MATLが内部で使用している)では、出力形式を自由に変更できます。MATLのデフォルトでは、科学表記法に切り替える前に最大15個の数字が表示されます。
Suever

申し訳ありませんが、削除されました;)
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バイト

1バイトの@isaacgに感謝します。

#=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のsは削除できます-Pythは暗黙的にそれらを埋めます。
isaacg

@isaacgそれで実装されましたか?クール。最初のものを削除しようとしましたが、うまくいきませんでした。
PurkkaKoodari

それは奇妙です、私のマシンで働いていた最初のものを削除します。
isaacg 16

3

C、81バイト

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バイト

first-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
コード...漠然と言語名を彷彿とさせる
コナー・オブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴハハハ、読めない
アドナン


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バイトは出力から取得されます。実際に行ごとに1つのペアを印刷する必要なしに、プログラムはæ`‼+-∟(スタックを無期限にシーケンスの要素で満たす)、またはÉ‼+-∟-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)

こんにちはマックス。いつからかはわかりませんが、現在、TIOのMathGolfバージョンは文字列入力をまったく受け入れません。.プログラムのコードがなくても、文字列入力がたとえばABC、私はライン上のエラーを取得するstdin = StdIn(line)Pythonのコードで
ケビンCruijssen

1
@KevinCruijssenこんにちは!文字列入力は'ABC'またはとして指定する必要があります"ABC"。内部的にast.literal_evalは、入力を解析するために使用されます。そこにアイロンがけする必要があるいくつかの癖が残っているが、あなたは行うことができるはずこれを
maxb

ああ、それは理にかなっています。ところで、文字列/数値を特定のサイズの部分に分割するための組み込み機能や、同じサイズの部分に分割するための組み込み機能はありますか?すなわちABCDEF[AB, CD, EF]
ケビンクルイッセン

Nvm、どうやらありませんが、そうする方法を見つけることができました:(2ô_2<\1>]入力長6にハードコードされ、サイズ2の部分に分割されました。汎用入力サイズおよび部分サイズで機能するように変更可能)。
ケビンクルイッセン

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桁、2番目に1150桁を出力しました!これに基づいて、実行するのに十分なハードウェアが提供されているため、これはずっと長く継続し、より多くの数字を出力でき、理論的にはwhileループのおかげで再帰制限はありません!


最初の出力が入力と同じになるように、ループの開始時に現在の値を出力することになっていると思います。また、これはコードゴルフであるため、括弧と中間変数を最適化する必要があります。最後に、スタイルNITとして、私はあなたが変数の命名を検討すべきだと思うaし、b質問を一致させます。
ニール

@Neilヒントをありがとう。:)
R. Kap

よくわかりません; あなたはAの両方持っているwhile...今と再帰呼び出しを
ニール

@ニールうん、私はそれに気づかなかった。現在は修正されており、whileループが理論的にはまったく制限されていません。
R. Kap

2

Reng v.3.2、9バイト(自己回答、非競合)

ii¤ææö±2.

2つの入力(a b)と出力を取りますb aここで試してみてください!

i入力を2回受け取り¤、スタックを複製しæ、数字とスペースを出力し(2回ある場合は2回ö出力します)、改行を出力し、±期待どおりに処理2.し、次の2文字をスキップして、入力文字を取得します。


2
うーん、これらの象形文字のそれぞれが私のような初心者に何をするのか説明してもらえますか?:)
ケビンクルーッセン16

@KevinCruijssen私は謎を説明しました。:)
コナーオブライエン

2

パイソン2.7、56、42バイト:

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

永久に(ish)を出力する単純なループ。


インデントレベルに1つのスペースを使用して、バイトを節約できます。また、両方のメソッドを実行する必要はなく、どちらか一方のみを実行する必要があるため、デフォルトのパラメーターを削除できます。
コナーオブライエン

ああ、メモ帳がタブを4つのスペースに分けていることに気づかなかった。
Serdalis 16

最初の行をに変更してこれをプログラムにa,b=input()すると、インデントを削除できます。
XNOR

@xnorありがとう、1バイトしか保存しませんが、もうくないです!
Serdalis 16

2

バッチ、54バイト

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

CMD.EXEは32ビットの符号付き整数に制限されているため、すぐにオーバーフローし、ゴミやエラーメッセージが出力されることに注意してください。


1
この辺りでバッチアンサーを見るのが大好きです!:D
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴ私は特にあなたのためにそれを書きました。
ニール

2

ジュリア、25バイト

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

最大の構文乱用。ジュリアは変だオンラインでお試しください!

代替バージョン、29バイト

出力は、最終的にオーバーフローあなたが呼び出す場合を除きという注意<|の上のBigInt。残念ながら、この場合はshow各配列の前にプレフィックスが付きBigIntます。さらに4バイトのコストで、すべての数値型に対して空白で区切られた出力を生成できます。

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

オンラインでお試しください!

使い方

<|out目的で二項演算子を定義します。Juliaの最近のバージョンでは未定義ですが、パーサーによって演算子としてまだ認識されています。一方で\(明示的に整数に対して定義されていないが)1バイト短くなり、その高い優先順位は交換が必要となるa+b<|a-b(a+b)\(a-b)(3バイト)または\(a+b,a-b)(2バイト)。

ときにa<|b実行され、それが呼び出すことによって開始しshow印刷する[AB]を STDOUTに。次に、合計または差をa+b<|a-b再帰的に呼び出します<|

再帰は無限であると想定されるため、比較<は実行されません。唯一の目的は、コードの2つの部分を連鎖させることです。これにより、より単純な代替手段よりも2バイト節約できます([a b]|>show;a+b<|a-b)


2

Perl 6、23バイト(無限)

編集:JoKingのおかげで、シーケンスバージョンが最短になりました(.sayOPからの説明ごとに削除されました:

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

TIO:InfiniteSeq

古い機能的な答え

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

TIO:InfiniteFunc

Perl 6にはそれ自体再帰の制限がないことに注意してください。それは純粋に利用可能なメモリに基づいているため、爆撃する前に数百万に達します。



@ジョーク:いいね!.sumを考えていないのはかなりばかげています。私は、関数内の要件絶対outputing(と28を与えることを、私は明確化を求めてきましたが、ほとんど他の人がそれを持っているように見えると思いますtio.run/##K0gtyjH7n1upoJamYPu/...
user0721090601

1

ファクター、62バイト

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

recursiveまたは、コールスタックの実行が速すぎます。



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

Common Lisp、57

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

を使用します。psetfこれは、変数の値に並行して影響を与え、単純なloop構文を使用します。


1

bash + GNU coreutils、75バイト

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

呼び出し:

./codegolf.sh 2 10 5

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

Perl 5、40バイト

必要-E(無料)

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

または(同じ長さ)

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

(いくつかの反復で丸め誤差があるはずなので、後者を突き止めました。)

ハットチップ。

しかし、もっと短いPerl 5ソリューションがあるに違いないと思います。


1
より短い解決策がある場合、Ton Hospelはそれを見つけます。:P
コナーオブライエン

しばらく
かかり

1

RETURN、21バイト

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

Try it here.

再帰的な演算子ラムダ。使用法:

[¤.' ,$.'
,¤¤+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:@+}-$

通話abnスタック上のn巻き数または無限出力のために負の値です。出力abスペースで区切られています。

説明として、実行時にスタックがどのように進化するかを以下に示します。

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

オンラインインタープリターで正のターン数で試すことができますが、無限モードをテストするには公式のPythonインタープリターを使用する必要があります。

$ 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

ファジーオクトワカモレ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のことはよくわかりません:が、ループの先頭に移動して、2回印刷する必要をなくすことはできませんか?
コナーオブライエン

ああああ@CᴏɴᴏʀO'Bʀɪᴇɴありがとう。
Rɪᴋᴇʀ

説明を更新することを忘れないでください;)
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴなんでやなの?:P
Rɪᴋᴇʀ

1

真剣に、12バイト

,,1WX■@│+)-1

無限ストリームを出力します。形式はb(n) a(n)、1行に1組の出力です。

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値のみを生成します。

このコメントで @randomraが示すトリック(または構文糖)を使用して4バイトを保存しました。

使用法

   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.