Quelques conseils ici:
Constantes:
La page des constantes des Esolangs contient une liste extrêmement utile des moyens les plus courts de créer des valeurs spécifiques. Je me retrouve à consulter cette page au moins deux fois par programme.
Le début de tout:
+++[[<+>>++<-]>]
Cela configure la bande au format 3 * n ^ 2, qui ressemble à
3 6 12 24 48 96192128 0 0 »
Pourquoi est-ce si important?
Descendons la liste:
- 3 et 6 sont ennuyeux
- 12: Près de 10 (nouvelle ligne) ou 13 (retour chariot). Peut également être utilisé pour le compteur pour 0-9
- 24: Près de 26, le nombre de lettres de l'alphabet
- 48: ASCII pour
0
- 96: près de 97, ASCII pour
a
- 196 et 128: 196-128 = 64, près de 65, l'ASCII pour
A
.
À partir de cet algorithme, nous sommes au début de pratiquement toutes les séquences de la plage ASCII, avec un compteur pour chacune et une nouvelle ligne à portée de main.
Un exemple pratique:
Impression de toutes les lettres et chiffres majuscules et minuscules.
Avec algorithme:
+++[[<+>>++<-]>]<<[-<->]<<<<++[->>+.>+.<<<]<--[>>.+<<-]
Sans pour autant:
+++++++++++++[->+++++++>++>+++++>++++>+<<<<<]>+++++>[-<+.>>.+<]>>---->---[-<.+>]
Nous passons la plupart des octets à initialiser la bande dans le deuxième exemple. Elle est en partie compensée par les mouvements supplémentaires dans le premier exemple, mais cette méthode a clairement l'avantage.
Quelques autres algorithmes intéressants dans la même veine:
3 * 2 ^ n + 1:
+++[[<+>>++<-]+>]
Tape: 4 7 13 25 49 65 197 129 1 0'
Cela compense les valeurs de 1, ce qui accomplit quelques choses. Cela rend le 12 un retour chariot, le 64 le début réel de l'alphabet majuscule et le 24 plus proche de 26.
2 ^ n:
+[[<+>>++<-]>]
Tape: 1 2 4 8 16 32 64 128
Parce que 64 est bon pour les lettres majuscules, 32 est l'ASCII pour l'espace et 128 peut être utilisé comme compteur pour 26 (130/5 = 26). Cela peut économiser des octets dans certaines situations où les chiffres et les lettres minuscules ne sont pas nécessaires.
Choisissez l'implémentation qui convient à la question:
- Les cellules négatives sont presque toujours utiles, et il n'y a aucune raison de les éviter (à moins que cela ne change pas votre bytecount)
- Presque exactement la même chose avec les cellules d'habillage, d'autant plus que de nombreuses constantes utilisent l'habillage.
- Les tailles de cellules arbitraires sont utiles pour des séquences mathématiques infinies, telles que le calcul de la séquence de Fibonacci à l'infini (
+[[-<+>>+>+<<]>]
) ou le traitement de nombres plus grands / négatifs. L'inconvénient est que certaines méthodes courantes, telles que [-]
et [->+<]
ne peuvent pas être invoquées, juste au cas où le nombre serait négatif.
- EOF comme 0, -1 ou aucun changement. 0 est généralement préférable, car vous pouvez boucler sur une entrée entière sans vérifications supplémentaires. -1 est utile lors du bouclage sur des structures de tableau. Je n'ai pas encore trouvé d'utilisation pour aucun changement :(.
Gardez une trace de ce qui se passe:
À tout moment, vous devez avoir des commentaires sur l'emplacement du pointeur par rapport aux données qui l'entourent et vous assurer que vous connaissez la plage de valeurs possibles de chaque cellule. C’est surtout important lorsque vous avez divisé le pointeur avant une boucle, car vous souhaiterez ensuite réunir les deux possibilités.
À tout moment, mon code est jonché de commentaires sur toutes les autres lignes qui ressemblent à ceci:
*0 *dat a_1 ? 0' !0 0*
or
*0 *dat 0' ap1 0 !0 0*
Un conseil supplémentaire consiste à attribuer aux symboles des significations spéciales. Dans l'exemple ci-dessus, '
est l'endroit où se trouve le pointeur, *
signifie la répétition dans cette direction, ?
signifie une cellule avec une valeur inconnue, !0
signifie une cellule non nulle, _
est un substitut -
et p
est un substitut de +
.or
implique que la bande pourrait ressembler à l'une ou l'autre des représentations et doit être traitée comme telle.
Votre schéma de symboles ne doit pas nécessairement être le même que le mien (qui a quelques défauts), il doit simplement être cohérent. Ceci est également extrêmement utile lors du débogage, car vous pouvez l'exécuter jusqu'à ce point et comparer la bande réelle à ce que vous devriez avoir, ce qui peut signaler des failles potentielles dans votre code.