(([{}](((()))<>))<>){<>({}({}({})))}{}{}
Assistente de trigo e eu tivemos um duelo sobre esta questão. Quando decidimos postar nossas soluções, estávamos atados a 42 bytes, mas encontrei um golf de 2 bytes de sua solução. Decidimos que contaria como desempate (minha solução está abaixo).
Experimente online!
Explicação:
# Set up the stacks like this: -input
1 -input
1 1
(([{}](((()))<>))<>) ^
# Output 1 for triangular and 0 for non-triangular
{<>({}({}({})))}{}{}
Para uma explicação completa, consulte a resposta do Assistente de Trigo .
(([({})])<>){(({}())<>{}({})){((<>))}{}{}}
Saídas 0\n
(literal newline) para truthy e a string vazia para falsy.
A idéia é subtrair 1 e 2 e 3 até a entrada. Se você pressionar 0, sabe que este é um número triangular, para que você possa parar por aí.
Experimente online! (verdade)
Experimente online! (falso)
# 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
}
Aqui está uma solução de 46 bytes que eu achei interessante.
{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}
Saídas 0\n
(literal newline) para truthy, a string vazia para falsy.
A idéia é fazer a contagem regressiva da entrada por números consecutivos, 1 de cada vez. Por exemploinput - (1) - (1,1) - (1,1,1)
. Cada vez que subtraímos, se ainda não estamos em 0, deixamos um valor extra na pilha. Dessa forma, se estivermos em 0 e ainda subtrairmos quando aparecermos, removemos o último valor da pilha. Se a entrada for um número triangular, terminaremos exatamente em 0 e não exibiremos o 0.
Experimente online! truthy
Experimente online! falsear
# 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.
}