Quels conseils généraux avez-vous pour jouer au golf à Befunge? Je cherche des idées qui peuvent être appliquées aux problèmes de golf de code en général qui sont au moins quelque peu spécifiques à Befunge (par exemple, "supprimer les commentaires" n'est pas une réponse). Veuillez poster un pourboire par réponse.
12
Réponses:
Lorsque vous utilisez une boucle multi-lignes, essayez d'en utiliser autant que possible:
contre
la source
Besoin de supprimer une valeur après un conditionnel (par exemple parce que l'autre chemin dépend de la valeur, mais pas celui-ci)? Au lieu d'utiliser
>$
ou$<
, profitez du fait que vous connaissez la valeur de vérité de la variable et utilisez à la_
place pour changer à la fois la direction et la pile de pop.Exemple
se transforme en
la source
N'oubliez pas que
0
c'est toujours sur la pile. Par exemple, cela signifie que, avec une pile vide,g
est équivalent à00g
etp
est équivalent à000p
.la source
Si vous devez pousser un nombre supérieur à 15, utilisez
'
pour récupérer la valeur ASCII du caractère suivant:pousser 42 plutôt que:
la source
67*
'
instruction.Au lieu d'utiliser
|
, nécessitant une autre ligne (souvent avec de nombreux espaces supplémentaires), essayez d'utiliserj
. Par exemple:s'arrêterait si le nombre en haut de la pile était négatif et continuerait dans le cas contraire. Si vous avez besoin de plusieurs caractères, utilisez
n*j
oùn
est le nombre de caractères dont vous avez besoin lorsque la valeur transmisej
est0
. Exemple:ce qui annulerait un nombre négatif.
la source
j
instruction.Dans Befunge-93, si la première chose que vous poussez sur la pile est une chaîne, vous pouvez souvent vous en sortir en supprimant la citation d'ouverture. Par exemple ceci:
pourrait être simplifié à ceci:
Essayez-le en ligne!
Ce qui se passe, c'est que l'interpréteur essaie d'abord d'exécuter les caractères de la chaîne non citée. Le
!
exécute une action non inoffensive et les instructionsi
etH
ne sont pas valides, elles sont donc ignorées (bien que sur certaines implémentations, un avertissement puisse s'afficher).Lorsque le
"
est rencontré, cela est considéré comme le début de la chaîne, mais comme il n'y a pas de guillemet de fermeture, il s'enroule tout autour du champ de jeu jusqu'à ce que le"
soit rencontré une deuxième fois. Ce qui finit par être poussé sur la pile est alors le suivant:Puisque nous ne nous soucions que des derniers personnages, cependant, aucune de ces autres choses n'a d'importance. Donc, après le devis, nous arrivons enfin à exécuter les trois
,
commandes, en écrivant le message et la@
commande, qui se termine.Notez que cela ne fonctionnera généralement pas dans Befunge-98, car une instruction non reconnue entraînera la réflexion de l'interpréteur au lieu de l'ignorer.
la source
",,,@!iH
. Notez que Pyfunge ajoute un espace supplémentaire, contrairement à FBBI.Dans Befunge-93, il peut souvent être avantageux d'aplatir une boucle en une seule ligne, la section de boucle du code étant exécutée dans les deux sens.
Par exemple, considérez le code ci-dessous, qui génère la lettre
a
huit fois:Cela peut s'aplatir être aplati en une seule ligne en intercalant la séquence de boucle avec des instructions de pont (
#
):Essayez-le en ligne!
Si vous regardez simplement les caractères non blancs, vous pouvez avoir l'impression que c'est plus long que l'original. Mais une fois que vous prenez en compte le saut de ligne et le remplissage supplémentaire requis dans la version à deux lignes, vous finissez par économiser quatre octets.
Dans ce cas particulier, le code doit être encore plus compressé en notant que cette séquence
:#:
peut simplement être remplacée par:
.Essayez-le en ligne!
En fait, chaque fois que vous répétez la même instruction de chaque côté d'une
#
commande, vous pouvez simplifier celle-ci en une seule instruction, c'est donc quelque chose que vous devriez toujours rechercher lorsque vous aplatissez une boucle.Pour comprendre comment cela fonctionne, il peut être utile d'écrire la séquence de boucle deux fois, une fois avec tous les caractères suivant la
#
suppression (ie ce qui se passe lors de l'exécution de gauche à droite), et une fois avec les caractères précédant la#
suppression (ie exécution de droite à gauche ).Vous pouvez maintenant voir clairement comment cela correspond à la version originale à deux lignes du code.
la source
Sortie par code de sortie, où il s'agit d'un formulaire de sortie autorisé. Si le défi vous demande d'imprimer un numéro, vous pouvez enregistrer un octet en terminant le programme avec
q
au lieu de.@
la source
q
instruction avait une fonction différente (mode file d'attente) ou n'était pas prise en charge.Dans Befunge-93, la commande de saisie de caractères (
~
) peut souvent être utilisée comme raccourci pour -1, car c'est la valeur qu'elle renvoie sur EOF.Par exemple, le code ci-dessous affichera -1:
Essayez-le en ligne!
Ceci n'est pas recommandé dans le code de production, car lorsqu'il est exécuté dans un environnement interactif, le programme s'arrête et attend l'entrée utilisateur. Et évidemment, si l'utilisateur devait saisir quelque chose, le résultat ne serait plus -1.
Cela dit, la règle sur PPCG est qu'un programme peut supposer un flux d'entrée vide , et c'est ainsi qu'il serait généralement exécuté sur TIO .
Notez également que vous n'êtes pas nécessairement empêché d'utiliser cette astuce simplement parce que votre programme doit lire quelque chose dans le flux d'entrée. Vous devez juste vous assurer de traiter vos entrées à l'avance, après quoi toutes les utilisations futures de
~
devraient retourner -1.la source
Utilisez la direction de l'IP lorsque vous traitez avec
_
ou|
, plutôt que d'utiliser un caractère supplémentaire pour!
.Exemple réel (de ce post ):
Peut être changé en
la source
N'oubliez pas que
0k
cela n'exécute pas l'instruction suivante. Cela signifie qu'au lieu de faire:Vous pouvez enregistrer un personnage en faisant
la source
k
instruction.N'oubliez pas l'
k
opérateur. Au lieu de"!dlroW olleH",,,,,,,,,,,,@
, faites"!dlroW olleH"bk,@
. Notez quek
fait l'opération sur la cellule qu'il est à donc9k,
imprimerait pas 9 fois mais 10; 9 fois avec lek
, et une fois avec,
.la source
k
instruction.Lorsque vous poussez de petits nombres sur la pile, vous pouvez probablement trouver assez facilement ce
45*
qui vous obtiendra20
et67*
vous obtiendra42
. En ce qui concerne les nombres plus importants, cependant, vous avez vraiment besoin d'un programme qui peut calculer la représentation la plus efficace pour vous.L'option la plus simple pour cela est l' interface en ligne de Mike Schwörer pour BefunRep . Vous tapez simplement un nombre et il crachera une représentation Befunge équivalente. Ce n'est pas toujours le plus optimal, mais il est assez proche et il est presque certain d'être meilleur que tout ce que vous pourriez trouver à la main.
Le système en ligne est limité aux nombres compris entre 0 et 16777215, donc si vous avez besoin de quelque chose de plus grand que cela, vous voudrez télécharger l' utilitaire BefunRep autonome et exécuter les calculs vous-même.
Si vous programmez en Befunge-98, une autre option à considérer est Fungify . En général, il n'est pas aussi optimal que BefunRep, mais pour certains des nombres inférieurs, où les chiffres hexadécimaux et les guillemets simples sont les plus efficaces, il peut parfois produire de meilleurs résultats.
la source
'
. Par exemple pour42
:'*