Votre défi est de minimiser le code Brainfuck , selon ces règles:
- Retirez tout ce qui n'en fait pas partie
+-><[].,
. - Pour tout groupe de caractères consécutifs
+
ou-
, si le nombre de+
s et de-
s est le même, supprimez-les. - Faites de même que ci-dessus, mais avec
>
et<
. - Supprimez les séquences des
+-><
personnages s'ils ne font rien. Par exemple, vous devez supprimer+>-<->+<
. (Cela peut être le plus délicat et le plus difficile à implémenter.) Assurez-vous que vous n'obtenez aucun faux positif, comme+>-<+>-<
, qui ne devrait pas être supprimé.
Cas de test:
Contribution
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Sortie
++++++[->++++++<]>.[-],[>,]<[.<]
Contribution
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Sortie
+++>-<+>---<
Vous pouvez accepter l'entrée et la sortie comme vous le souhaitez - stdin / stdout, une fonction, etc., mais l'entrée peut ne pas être codée en dur.
C'est le code-golf , donc le code le plus court en nombre de caractères gagnera.
++>>++<<--
devrait sortir>>++<<
, et cela n'a pas été couvert. Veuillez ajouter d'autres cas de test.+++>-<+>---<
? Il peut être raccourci pour éviter un mouvement inutile du pointeur, mais la sortie attendue ne le modifie pas. Ma compréhension basée sur l'examen à la fois de la question et des réponses est que la poignée de porte est cool avec les spécifications prises de manière lâche; nous devons éliminer toutes les+-><
séquences contiguës sans opération comme indiqué explicitement, et au-delà, il est autorisé de faire une minification supplémentaire comme dans votre exemple++>>++<<--
, et nous pouvons également effectuer des réarrangements tant qu'ils ne modifient pas la fonctionnalité du code, par exemple>+<+
en+>+<
.+>-<->+<
. (Cela peut être le plus délicat et le plus difficile à implémenter.) Assurez-vous de ne pas obtenir de faux positifs, comme+>-<+>-<
, qui ne devraient pas être supprimés. " - c'est un peu vagueRéponses:
REBEL - 104
Usage:
Entrée: lit une ligne depuis stdin.
Sortie: imprime une ligne vers la sortie standard.
Anomalies *:
_
entraîne la lecture et l'utilisation d'une autre ligne, plutôt que la sortie de rien.++++>----<
au lieu de+++>-<+>---<
. Mais c'est OK, non? ;)>-<+
etc. sont remplacés par+>-<
etc.Becquet:
* Ce n'est pas un bug, c'est une fonctionnalité!
la source
Brainfuck, 579 octets
Avec mise en forme et quelques commentaires:
Cela utilise la même approche que la solution de Keith Randall, en minimisant toutes les séquences contiguës de
+-<>
manière optimale par simulation. Par exemple,+++>-<+>---<
devient++++>----<
et>+<+<<+>+<->>>>
devient+<+>>+>
.Essayez-le en ligne. (Si la valeur absolue d'une cellule simulée devient proche de 256, il y aura des problèmes de débordement.)
La structure globale est
La bande est divisée en nœuds à 7 cellules; au début de la boucle interne, la disposition de la mémoire est
0 s 0 c 0 a b
où
s
est un drapeau booléen pour la cellule de départ,c
est le caractère actuel,a
est la partie négative de la valeur de cellule simulée (plus un) etb
est la partie positive de la valeur de cellule simulée.Lorsque la séquence réduite est imprimée, la disposition de la mémoire est
d n e 0 0 a b
où
d
est un drapeau booléen pour la direction,a
etb
sont comme avant (mais deviennent un / zéro lors de l'impression), etn
ete
ne sont pas différents de zéro pour le nœud final;n
est lié au nombre de fois où le nœud a été vu, ete
est la valeur du caractère qui a interrompu la boucle interne (plus un).À l'origine, j'ai envisagé de conserver plus d'informations par nœud: le nœud le plus à gauche et le plus à droite en tant que drapeaux booléens, et la position du nœud par rapport aux nœuds de début et de fin. Mais nous pouvons éviter cela en regardant les cellules voisines lorsque cela est nécessaire, et en effectuant des analyses à gauche et à droite afin de trouver le nœud de départ.
Lorsque vous imprimez la séquence réduite et décidez comment déplacer le pointeur simulé, nous pouvons adopter une approche générale: commencer par s'éloigner du nœud final (dans une direction arbitraire si les nœuds de début et de fin sont identiques), faire demi-tour à gauche et à droite nœuds et s'arrête en fonction du nombre de fois où le nœud final a été vu: 3 fois si les nœuds de début et de fin sont identiques, sinon 2.
la source
Python, 404 caractères
Ce code optimise parfaitement toutes les sous-séquences de
+-<>
. Un peu plus que ce que vous aviez demandé, mais voilà.Il fonctionne en simulant les
+-<>
opérations sur la bandet
.s
est la position de départ sur la bande etp
la position actuelle. Après la simulation, il détermine l'étendue[a,b]
à opérer et effectue tous les +/- en un seul passage optimal.la source
CoffeeScript -
403397Démo (veuillez pardonner l'utilisation de bit.ly ici, l'URL entière casserait la démarque)
Version non compressée (avec code de débogage):
la source
>+.-<
, produisant la chaîne vide au lieu de la laisser inchangée.