(([{}](((()))<>))<>){<>({}({}({})))}{}{}
Wheat Wizard und ich hatten ein Duell um diese Frage. Als wir beschlossen, unsere Lösungen zu veröffentlichen, waren wir mit 42 Bytes gebunden, aber ich fand einen 2-Byte-Golf seiner Lösung. Wir haben uns entschieden, dass dies als Gleichstand gelten würde (meine Lösung ist unten).
Probieren Sie es online!
Erläuterung:
# Set up the stacks like this: -input
1 -input
1 1
(([{}](((()))<>))<>) ^
# Output 1 for triangular and 0 for non-triangular
{<>({}({}({})))}{}{}
Eine vollständige Erklärung finden Sie in der Antwort von Wheat Wizard .
(([({})])<>){(({}())<>{}({})){((<>))}{}{}}
Ausgaben 0\n
(Literal Newline) für Truthy und die leere Zeichenfolge für Falsy.
Die Idee ist, 1, 2 und 3 bis zum Eingang zu subtrahieren. Wenn Sie 0 drücken, wissen Sie, dass dies eine dreieckige Zahl ist, sodass Sie dort anhalten können.
Probieren Sie es online! (ehrlich)
Probieren Sie es online! (falsch)
# 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
}
Hier ist eine 46-Byte-Lösung, die ich interessant fand.
{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}
Ausgaben 0\n
(Literal Newline) für Truthy, die leere Zeichenfolge für Falsy.
Die Idee ist, von der Eingabe durch aufeinanderfolgende Zahlen jeweils 1 abwärts zu zählen. Eg input - (1) - (1,1) - (1,1,1)
. Jedes Mal, wenn wir subtrahieren, wenn wir noch nicht bei 0 sind, belassen wir einen zusätzlichen Wert auf dem Stapel. Auf diese Weise entfernen wir den letzten Wert auf dem Stapel, wenn wir bei 0 sind und immer noch subtrahieren, wenn wir Pop ausführen. Wenn die Eingabe eine Dreieckszahl war, werden wir genau bei 0 enden und die 0 nicht einfügen.
Probieren Sie es online! truthy
Online ausprobieren! falsch
# 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.
}