(([{}](((()))<>))<>){<>({}({}({})))}{}{}
小麦ウィザードと私は決闘しましたこの質問についてしました。ソリューションの投稿を決めたとき、42バイトに縛られていましたが、彼のソリューションの2バイトのゴルフを見つけました。タイブレーカーとしてカウントすることにしました(私の解決策は以下です)。
オンラインでお試しください!
説明:
# Set up the stacks like this: -input
1 -input
1 1
(([{}](((()))<>))<>) ^
# Output 1 for triangular and 0 for non-triangular
{<>({}({}({})))}{}{}
詳細な説明については、ウィートウィザードの回答を参照してください。
(([({})])<>){(({}())<>{}({})){((<>))}{}{}}
0\n
真偽の場合は出力(リテラル改行)、偽の場合は空の文字列。
アイデアは、入力を1から2、次に3を差し引くことです。0をヒットした場合、これは三角の数字であることがわかるので、そこで停止できます。
オンラインでお試しください!(真実)
オンラインで試してみてください!(偽)
# Push -input on both stacks. One is a counter and the other is a running total
(([({})])<>)
# Count up from -input to 0
{
# Push the new total which is: (counter += 1) + total (popped) + input (not popped)
# This effectively adds 1, then 2, then 3 and so on to the running total
(({}())<>{}({}))
# If not 0
{
# Push to 0s and switch stacks to "protect" the other values
((<>))
# End if
}
# Pop the two 0s, or empty the stack if we hit 0
{}{}
# End loop
}
ここに、私が面白いと思った46バイトのソリューションがあります。
{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}
出力 0\n
truthyの(リテラル改行)、falsyの空の文字列。
アイデアは、入力から連続して1つずつカウントダウンすることです。例えばinput - (1) - (1,1) - (1,1,1)
。減算するたびに、まだ0になっていない場合は、スタックに追加の値を残します。そのようにして、0にあり、ポップしたときにまだ減算している場合、スタックの最後の値を削除します。入力が三角形の数であった場合、正確に0で終了し、0をポップしません。
オンラインでお試しください!真実
オンラインで試してみてください!偽物
# Implicit input (call it I)
# Until we reach 0, or the stack is empty
{
# Add 1 to the other stack and push it twice. This is our counter.
<>(({}()))
# While counter != 0
{
# counter -= 1
({}[()]
# if I != 0
<>{
# I -= 1, and push 0 to escape the if
(<({}[()])>)
# End if
}
# Pop from the stack with I. This is either the 0 from the if, or I
{}
# Get ready for next loop End while
<>)
# End While
}
# Pop the counter that we were subtracting from
{}<>
# End Until we reach 0, or the stack is empty.
}