定義
- a(1)= 1
- a(2)= 1
- a(n)= a(na(n-1))+ a(na(n-2))n> 2の場合(nは整数)
仕事
正の整数を指定するとn
、が生成されa(n)
ます。
テストケース
n a(n)
1 1
2 1
3 2
4 3
5 3
6 4
7 5
8 5
9 6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12
正の整数を指定するとn
、が生成されa(n)
ます。
n a(n)
1 1
2 1
3 2
4 3
5 3
6 4
7 5
8 5
9 6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12
回答:
バイトカウントはISO 8859-1エンコードを前提としています。
.+
$*;1¶1¶
+`;(?=(1)+¶(1)+)(?=(?<-1>(1+)¶)+)(?=(?<-2>(1+)¶)+)
$3$4¶
G3=`
1
オンラインでお試しください!(最初の行は、改行で区切られたテストスイートを有効にします。)
あとでゴルフをする必要があります。
a n|n<3=1|b<-a.(-)n=b(b 1)+b(b 2)
関数を定義しますa
。
(b.b)1+(b.b)2
合計よりも短いものはありませんか?
!n=n<3||!(n-!~-n)+!(n-!~-~-n)
単項演算子!
を目的に合わせて再定義します。
nが1または2の場合、trueをn<3
返し、これが戻り値になります。
場合はNより大きい2、n<3
返し偽と|| ブランチが実行されます。これは定義の単純な実装で~-n
収率1 - N及び~-~-n
収率N - 2。
0000000: eefb5b 04f83a a75dc2 36f8d7 cf6dd0 af7b3b 3ef8d7 ..[..:.].6...m..{;>..
0000015: cfed12 f661f0 ae9d83 ee63e6 065df7 ce6183 af7383 ....a.....c..]..a..s.
000002a: 76ef3c 3f6383 7eff9c b9e37f v.<?c.~.....
set numin
set numout
add 1
fwd 1
add 1
fwd 6
get
sub 1
jmp
jmp
sub 1
fwd 1
add 1
rwd 1
jnz
fwd 1
sub 1
rwd 2
add 2
jmp
rwd 4
jmp
sub 1
fwd 3
add 1
rwd 3
jnz
fwd 4
jmp
sub 1
rwd 3
add 1
rwd 1
add 1
fwd 4
jnz
rwd 3
jmp
sub 1
fwd 3
add 1
rwd 3
jnz
fwd 4
add 2
jmp
rwd 5
jmp
rwd 1
jmp
sub 1
fwd 2
add 1
rwd 2
jnz
fwd 1
jmp
sub 1
rwd 1
add 1
fwd 1
jnz
rwd 1
sub 1
jnz
fwd 2
jmp
sub 1
rwd 1
add 1
rwd 1
add 1
fwd 2
jnz
fwd 1
jmp
rwd 2
jmp
sub 1
fwd 1
add 1
rwd 1
jnz
fwd 2
jmp
sub 1
rwd 2
add 1
fwd 2
jnz
fwd 1
jnz
fwd 3
sub 1
jnz
rwd 2
jmp
sub 1
rwd 3
add 1
fwd 3
jnz
fwd 1
sub 1
jnz
fwd 2
jnz
rwd 7
put
またはBrainfuck表記で:
+>+>>>>>>,-[[->+<]>-<<++[<<<<[->>>+<<<]>>>>[-<<<+<+>>>>]<<<[->>>+<<<]>>>>++[<<<<<[<
[->>+<<]>[-<+>]<-]>>[-<+<+>>]>[<<[->+<]>>[-<<+>>]>]>>>-]<<[-<<<+>>>]>-]>>]<<<<<<<.
@Dennisのおかげで1バイト節約
すべての答えは同じです、私は何か違うことをしなければなりません!
a(n){return n<3?:a(n-a(n-2))+a(n---a(n));}
説明:それは基本的にですa(n-a(n-2))+a(n-a(n-1))
が、動作が未定義である(私の電話(gcc)およびideoneで動作します)。
1
間?
とを:
。
$b+=$b[$_-$b[$_-2]]+$b[$_---$b[$_]]
バイトカウントは、ISO 8859-1エンコーディングとMathematicaの$CharacterEncoding
設定WindowsANSI
(Windowsのデフォルト。他の設定でも同様に機能する可能性がありますが、UTF-8
そうでないものもあります)を前提としています。
±1=±2=1
±n_:=±(n-±(n-1))+±(n-±(n-2))
±
単項演算子として定義します。
私は重複を取り除こうとしましたが、同じバイト数で終わりました:
±1=±2=1
±n_:=Tr[±(n-±(n-#))&/@{1,2}]
2Rạ⁸߀$⁺Sµ1>?2
オンラインでお試しください!または、すべてのテストケースを確認します(数秒かかります)。
2Rạ⁸߀$⁺Sµ1>?2 Main link. Argument: n (integer)
2R Yield [1, 2].
$ Combine the previous three links into a monadic chain.
⁸ Yield n.
ạ Take the absolute difference of the return value and n.
߀ Recursively call the main link on each result.
⁺ Duplicate the chain.
The first copy maps [1, 2] to [a(n - 1), a(n - 2)].
The second copy maps [a(n - 1), a(n - 2)] to
[a(n - a(n - 1)), a(n - a(n - 2))].
S Take the sum.
µ Combine all links to the left into a chain.
? If...
> 2 n is greater than 2, call the chain.
1 Else, return 1.
ịḣ2S;
1Ç⁸¡2ị
これは反復的なアプローチです。
オンラインでお試しください!または、すべてのテストケースを確認します。
1Ç¡2ị Main link. Argument: n
1 Set the return value to 1.
Ç¡ Call the helper link n times, updating the return value after each call.
2ị Extract the second element of the resulting array.
ịḣ2S; Helper link. Argument: A (array)
ị At-index; retrieve the elements of A at the values of A.
ḣ2 Head 2; extract the first two results.
S Take the sum of the result.
; Prepend the sum to A.
h n|n<3=1|n>2=h(n-h(n-1))+h(n-h(n-2))
チャレンジで説明したとおり、ガードを使用
n<3
ためh 2
であることを1
。
int a(int n)=>n<3?1:a(n-a(n-1))+a(n-a(n-2));
これを匿名にすることで短縮できるのではないかと思います
pinkfloydx33!
int a(int n)=>n<3?1:a(n-a(n-a))+a(n-a(n-2));
-a
最初の括弧のセットの最も内側は-1
ES6の再帰的なソリューション。ゴルフのヒントは大歓迎です。
a=n=>n>2?a(n-a(n-1))+a(n-a(n-2)):1
さらに短縮してくれた/ u / ismilloに感謝します。
非再帰的、これをn = 100000で動作させたいので、次のように言います:
Function A(N):ReDim B(N):For i=3 To N:B(i)=B(i-B(i-1)-1)+B(i-B(i-2)-1)+1:Next:A=B(N)+1
...そしてreturn
、行末で(バイト#87)を押してEnd Function
、「無料」のステートメントを取得します。B値は、n = 1および2の初期化を避けるために-1だけオフセットされることに注意してください。
スプレッドシートで通常どおりに呼び出し=A(100000)
ます(取得するなど)48157
再帰バージョン、61バイト、
Function Y(N):If N<3 Then Y=1 Else Y=Y(N-Y(N-1))+Y(N-Y(N-2))
n> 30では不当に遅くなり始め、n> 40ではまったく機能するとは言えません。
Leaky Nunのおかげで17人が助かりました。
int a(int n){return n<3?1:a(n-a(n-1))+a(n-a(n-2));}
int a(int n){return n<3?1:a(n-a(n-2))+a(n---a(n));}
が、残念ながら、既にある回答と同じバイト数を使用します。また、Java 8の回答は短いため、回答がJava 7であることを指定します。n->return n<3?1:a(n-a(n-1))+a(n-a(n-2))
(39 bytes) 。
言語が課題をポストデートするため、非競合。4バイトを節約してくれたKenny Lauに感謝します。コード:
ece+V
拡張フォーム(のV
略11
):
a(n) = ece+
a(0) = 1
a(1) = 1
コード:
e # Stack is empty, so a(n - 1) is used, and it calculates a(n - a(n - 1))
c # Calculate a(n - 2)
e # Calculate a(n - a(n - 2))
+ # Add up
オンラインでお試しください!。0.1秒でn = 1000を計算します。
param($n)$b=1,1;2..$n|%{$b+=$b[$_-$b[$_-1]]+$b[$_-$b[$_-2]]};$b[$n-1]
入力を受け取り$n
、$b
の配列に設定し、@(1, 1)
からループに入ります2 .. $n
。反復のたび$b
に、シーケンスの単純な+=
定義を使用して、シーケンスの最新の計算に取り組みます。次に、適切な数値を出力します$b
(-1
PowerShellの配列にはゼロインデックスが付けられているため)。これが動作するかどうか$n
である1
か、2
それらの値の両方がより低いインデックスにあらかじめ入力されているので$b
、最初から、でもジャンク上のループタック場合ので、それはとにかく無視されます。
$a={param($k)if($k-lt3){1}else{(&$a($k-(&$a($k-1))))+(&$a($k-(&$a($k-2))))}}
通常、反復ソリューションの方が短いため(ネストされたすべてのかっこからわかるように)、ラムダに相当するものを回答として使用しました。ただし、この場合、ネストされた括弧は、ネストされた配列呼び出しを使用した反復ソリューションでほぼ複製されるため、再帰的ソリューションは短くなります。いや、反復解法は実際にはもっと短い(上記参照)。
のように、実行演算子を介して呼び出し&$a 20
ます。まっすぐな再帰呼び出し。
L|<b3smy-bytdtBb
L def y(b):
|<b3 b < 3 or …
m tBb map for d in [b - 1, b]:
y-bytd y(b - y(d - 1))
s sum
関数を定義しますy
。
オンラインで試す
(yMS20
最初の20個の値を印刷するために追加)
ようやく機能しました!
: Q recursive dup dup 3 < if - 1+ else 2dup 2 - Q - Q -rot 1- Q - Q + then ;
説明:
: Q recursive \ Define a recursive function Q
dup dup 3 < \ I moved a dup here to golf 2 bytes
if \ If n < 3, return 1
- 1 \ Golf: n-n is zero, add one. Same as 2drop 1+
else
2dup 2 - Q - Q \ Copy n until 4 on stack, find Q(n-Q(n-2))
-rot \ Move the result below 2 copies of n
1- Q - Q + \ Find Q(n-Q(n-2)), then add to previous ^
then ;
オンラインで試してみてください(上から少しゴルフをしていません)
a:=n->`if`(n>2,a(n-a(n-1))+a(n-a(n-2)),1)
使用法:
> a(1);
1
> a(20);
12
この問題は確かにメモ化の良い候補です。オプションキャッシュを使用すると、実行時間が大幅に短縮されます。
aC := proc(n)
option cache;
ifelse( n > 2, aC( n - aC(n-1) ) + aC( n - aC(n-2) ), 1 );
end proc:
これは次を使用して確認できます。
CodeTools:-Usage( aC(50) );
1:`(+&$:/@:-$:@-&1 2)@.(2&<)
再帰的な定義を使用します。
追加のコマンドは、複数の入出力をフォーマットするために使用されます。
f =: 1:`(+&$:/@:-$:@-&1 2)@.(2&<)
(,:f"0) >: i. 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 1 2 3 3 4 5 5 6 6 6 8 8 8 10 9 10 11 11 12
1:`(+&$:/@:-$:@-&1 2)@.(2&<) Input: n
2&< If n < 2
1: Return 1
Else
-&1 2 Subtract [1, 2] from n to get [n-1, n-2]
$:@ Call recursively on n-1 and n-2
- Subtract each of the results from n
/@: Reduce using
$: A recursive call on each
+& Then summation
Return that value as the result
?si2sa1dd2:a:a[la1+dsadd1-;a-;alad2-;a-;a+r:ali;a0=A]dsAxli;af
このソリューションは、配列と再帰を利用します。
?si # Take input from stdin and store it in register `i'
2sa # Initialise register `a' with 2, since we'll be putting in the first
# two values in the sequence
1dd2 # Stack contents, top-down: 2 1 1 1
:a # Pop index, then pop value: Store 1 in a[2]
:a # Ditto: Store 1 in a[1]
[ # Open macro definition
la 1+ dsa # Simple counter mechanism: Increment a and keep a copy on stack
# The STACK-TRACKER(tm): Top of stack will be at top of each column, under the
# dashed line. Read commands from left to right, wrapping around to next line.
# This will be iteration number n.
dd 1- ;a - ;a la d
#-----------------------------------------------------------------------
# n n-1 a[n-1] n-a[n-1] a[n-a[n-1]] n n
# n n n n n a[n-a[n-1]] n
# n n n n a[n-a[n-1]]
# n
#
2- ;a - ;a + r :a
#-----------------------------------------------------------------------
# n-2 a[n-2] n-a[n-2] a[n-a[n-2]] a[n] n
# n n a[n-a[n-1]] a[n-a[n-1]] n a[n]
# a[n-a[n-1]] a[n-a[n-1]] n n
# n n
li;a # Load index of target element, and fetch that element's current value
# Uninitialised values are zero
0=A # If a[i]==0, execute A to compute next term
]dsAx # Close macro definition, store on `A' and execute
li;a # When we've got enough terms, load target index and push value
f # Dump stack (a[i]) to stdout
dc
にIDEを構築しているなら、私に知らせてください!