(([{}](((()))<>))<>){<>({}({}({})))}{}{}
Wheat Wizard e io abbiamo avuto un duello su questa domanda. Quando decidemmo di pubblicare le nostre soluzioni eravamo legati a 42 byte, ma trovai un golf a 2 byte della sua soluzione. Abbiamo deciso che contava come un pareggio (la mia soluzione è sotto).
Provalo online!
Spiegazione:
# Set up the stacks like this: -input
1 -input
1 1
(([{}](((()))<>))<>) ^
# Output 1 for triangular and 0 for non-triangular
{<>({}({}({})))}{}{}
Per una spiegazione completa, consultare la risposta del Mago del grano .
(([({})])<>){(({}())<>{}({})){((<>))}{}{}}
Uscite 0\n
(letterale newline) per verità e stringa vuota per falsità.
L'idea è di sottrarre 1, poi 2 e 3 fino all'input. Se premi 0, sai che si tratta di un numero triangolare, quindi puoi fermarti qui.
Provalo online! (verità)
Provalo 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
}
Ecco una soluzione a 46 byte che ho trovato interessante.
{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}
Uscite 0\n
(letterale newline) per verità, la stringa vuota per falsità.
L'idea è di fare il conto alla rovescia dall'input in base a numeri consecutivi, 1 alla volta. Es input - (1) - (1,1) - (1,1,1)
. Ogni volta che sottraggiamo, se non siamo ancora a 0, lasciamo un valore extra nello stack. In questo modo, se siamo a 0 e stiamo ancora sottraendo quando pop, rimuoviamo l'ultimo valore nello stack. Se l'input era un numero triangolare, finiremo esattamente a 0 e non faremo apparire lo 0.
Provalo online! verità
Provalo online! falsy
# 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.
}