(([{}](((()))<>))<>){<>({}({}({})))}{}{}
Wheat Wizard et moi avons eu un duel sur cette question. Lorsque nous avons décidé d’afficher nos solutions, nous étions à égalité à 42 octets, mais j’ai trouvé une solution à deux octets. Nous avons décidé que cela compterait comme égalité (ma solution est ci-dessous).
Essayez-le en ligne!
Explication:
# Set up the stacks like this: -input
1 -input
1 1
(([{}](((()))<>))<>) ^
# Output 1 for triangular and 0 for non-triangular
{<>({}({}({})))}{}{}
Pour une explication complète, veuillez consulter la réponse de Wheat Wizard .
(([({})])<>){(({}())<>{}({})){((<>))}{}{}}
Les sorties 0\n
(nouvelle ligne littérale) pour vérité et la chaîne vide pour fausseté.
L'idée est de soustraire 1, puis 2, puis 3, jusqu'à l'entrée. Si vous frappez 0, alors vous savez que c'est un nombre triangulaire, vous pouvez donc vous arrêter là.
Essayez-le en ligne! (vérité)
Essayez-le en ligne! (fausseté)
# 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
}
Voici une solution de 46 octets que j'ai trouvée intéressante.
{<>(({}())){({}[()]<>{(<({}[()])>)}{}<>)}{}<>}
Sorties 0\n
(nouvelle ligne littérale) pour vérité, la chaîne vide pour fausseté.
L'idée est de décompter d'une entrée à la fois par numéros consécutifs, un à la fois. Par exemple input - (1) - (1,1) - (1,1,1)
. Chaque fois que nous soustrayons, si nous ne sommes pas encore à 0, nous laissons une valeur supplémentaire sur la pile. De cette façon, si nous sommes à 0 et que nous soustrayons toujours lorsque nous sautons, nous retirons la dernière valeur de la pile. Si l'entrée était un nombre triangulaire, nous finirons exactement à 0 et ne verrons pas le 0.
Essayez-le en ligne! vérité
essayez-le en ligne! fausseté
# 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.
}