(([{}](((()))<>))<>){<>({}({}({})))}{}{}
Wheat Wizard i ja mieliśmy pojedynek na to pytanie. Kiedy zdecydowaliśmy się opublikować nasze rozwiązania, byliśmy związani 42 bajtami, ale znalazłem 2-bajtowy golf jego rozwiązania. Zdecydowaliśmy, że będzie się liczyć jako remis (moje rozwiązanie jest poniżej).
Wypróbuj online!
Wyjaśnienie:
# Set up the stacks like this: -input
1 -input
1 1
(([{}](((()))<>))<>) ^
# Output 1 for triangular and 0 for non-triangular
{<>({}({}({})))}{}{}
Aby uzyskać pełne wyjaśnienie, zobacz odpowiedź Kreatora pszenicy .
(([({})])<>){(({}())<>{}({})){((<>))}{}{}}
Wyjścia 0\n
(dosłowna nowa linia) dla prawdy, a pusty ciąg dla fałszu.
Chodzi o to, aby odjąć 1, a następnie 2, a następnie 3 aż do wejścia. Jeśli trafisz 0, to wiesz, że jest to trójkątna liczba, więc możesz się tam zatrzymać.
Wypróbuj online! (prawda)
Wypróbuj online! (falsy)
# 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
}
Oto 46 bajtowe rozwiązanie, które uznałem za interesujące.
{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}
Wyjścia 0\n
(dosłowna nowa linia) dla prawdy, pusty ciąg dla fałszu.
Chodzi o to, aby odliczać od danych wejściowych kolejne liczby, po jednym na raz. Np input - (1) - (1,1) - (1,1,1)
. Za każdym razem, gdy odejmujemy, jeśli nie mamy jeszcze 0, zostawiamy dodatkową wartość na stosie. W ten sposób, jeśli mamy 0 i nadal odejmujemy, kiedy pop, usuwamy ostatnią wartość ze stosu. Jeśli dane wejściowe były liczbą trójkątną, zakończymy dokładnie na 0 i nie wstawimy 0.
Wypróbuj online! truey
Wypróbuj online! fałsz
# 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.
}