Conseils pour jouer au golf dans les espaces blancs


14

Quels conseils généraux avez-vous pour jouer au golf dans l'espace blanc? Je recherche des idées qui peuvent être appliquées aux problèmes de code-golf et qui sont également au moins quelque peu spécifiques à Whitespace (par exemple, "supprimer les commentaires" n'est pas une réponse).

Veuillez poster un pourboire par réponse.


82
Supprimez les espaces inutiles.
KSFT

1
s / [^ [: space:]] // g
Digital Trauma

Réponses:


11

Je ne suis pas tout à fait sûr que ce soit une question de plaisanterie ou non, alors j'espère ne pas me moquer de la prendre au sérieux, mais ...

Astuce 1: ne mettez pas fin à votre programme

La spécification indique qu'un programme doit être terminé par trois sauts de ligne [LF][LF][LF], où le premier est le contrôle de flux IMP et les deux suivants sont la commande quit, mais de nombreux interprètes exécuteront simplement votre code sans la fin appropriée. Vous enregistre 3 caractères dans n'importe quel programme.


6

Astuce 2: utilisez le tas le moins possible

J'utilisais beaucoup le tas pour compter mes boucles et autres, mais j'ai réalisé qu'il était en fait extrêmement inefficace; pousser d'abord une adresse, obtenir le nombre actuel, prendre / ajouter une, repousser l'adresse, etc.

Maintenant, je pousse simplement une valeur sur la pile pour agir comme compteur de boucle, puis j'utilise la [Space][LF][Tab]commande swap pour y revenir quand j'en ai besoin. Cela prend beaucoup de travail dans / autour, mais quand vous l'obtenez, cela peut vraiment réduire votre nombre de caractères.


5

Utiliser des adresses de tas arbitraires

De nombreux interprètes vous permettent de lire / écrire sur des adresses de tas arbitraires au lieu de commencer à 0 ou 1 et de compter. Vous pouvez dupliquer une valeur de pile existante (3 octets) à utiliser comme adresse au lieu de pousser une nouvelle valeur (minimum 4 octets)


+1. Notez que cela ne s'applique qu'aux adresses de tas non négatives. Donc, si le haut de la pile est un entier négatif, vous ne pouvez pas l'utiliser comme adresse de tas.
Kevin Cruijssen


5

Diminuez tous les caractères d'un montant fixe et ajoutez-le juste avant d'imprimer en boucle

Crédit @LukStorms , qui utilise une approche similaire dans sa réponse au défi Bonjour tout le monde .

( STNutilisé pour Space, Tab et New-line respectivement.)

Pousser les valeurs des lettres est toujours de 11 octets (c'est-à-dire pousser la valeur 65 pour le caractère 'A' est SSSTSSSSSTN; pousser la valeur 122 pour le caractère 'z' est SSSTTTTSTSN). Lorsque vous souhaitez produire une grande quantité de texte, cela peut coûter cher. Au lieu de cela, vous pouvez réduire les valeurs de tous les caractères que vous souhaitez imprimer d'un montant fixe, puis dans la boucle pour les imprimer ajouter ce montant fixe.

Cela peut être fait avec le code suivant (supposons que la valeur fixe est 100 dans ce cas):

  1. Poussez toutes les valeurs des caractères (moins le montant fixe 100) dans l'ordre inverse
  2. NSSN (Créer un Label_0; en gros, démarrer la boucle)
    1. SSSTTSSTSSN (Poussez le montant fixe 100)
    2. TSSS (Ajoutez les deux premières valeurs de la pile ensemble)
    3. TNSS (Pop et imprimer la valeur maintenant correcte en tant que caractère)
    4. NSNN (Aller à Label_0; passer à la prochaine itération de la boucle)

Cela arrêtera le programme avec une erreur ( ce qui est autorisé selon la méta ) dès qu'il essaie de faire le Add ( TSSS) avec rien de plus sur la pile. Je l'ai utilisé pour jouer à ma réponse (voir les points 5 et 6 des choses que j'ai faites pour réduire le nombre d'octets ).

Le choix d'une quantité fixe de 100 dépend de ce que vous imprimez. @LukStorm, par exemple, a utilisé 107 dans sa réponse Hello World.

Notez que la copie de la valeur supérieure ( SNS) pour deux des mêmes caractères adjacents (comme ldans Hello), ou la copie de valeurs à partir d'une autre position peut toujours être utilisée en plus de cela pour jouer plus d'octets.


4

Passer à des étiquettes non définies met fin au programme (dans certains interprètes)

Cela commence à entrer dans le comportement spécifique à l'implémentation, mais je crois que cela est autorisé .

TIO (et peut-être d'autres interprètes? Ne fonctionne pas sur ideone au moins) arrêtera l'exécution lorsqu'une tentative est faite de passer à une étiquette qui n'existe pas. Si vous devez faire une comparaison pour sortir d'une boucle, cela vous permet d'économiser des octets en ne déclarant pas l'étiquette de rupture. (Voir mon commentaire sur Imprimer le texte invisible pour un exemple.)


4

La valeur 0 peut être déclarée comme un nombre sans chiffre binaire

Le didacticiel sur les espaces blancs mentionne que les nombres peuvent avoir n'importe quel nombre de bits / chiffres binaires. Cela signifie qu'un nombre sans bits (au-delà du bit de signe requis) est une représentation valide de la valeur 0. [Space][Space][Space][LF]et [Space][Space][Space][Space][LF]tous deux poussent la valeur 0 vers la pile mais le premier est un octet plus court.


0

La copie des entiers précédents peut être plus courte que la création de nouveaux

( STNutilisé pour Space, Tab et New-line respectivement.)

STSL'argument + Number peut être utilisé pour copier le n ième élément de la pile (donné par l'argument) en haut de la pile . Cela peut dans certains cas être utilisé pour économiser des octets.

Par exemple, dans ma réponse, j'ai expliqué dans le 4ème point que j'ai fait pour réduire le nombre d'octets, comment la copie de la première valeur (indexée sur 0) ( STSSTN) est plus courte que d'appuyer sur 12 pour créer le caractère `` p '' ( SSSTTSSN) dans la partie "pop"de la sortie. (REMARQUE: j'utilise la valeur 12 au lieu de 112 pour le caractère 'p', car j'ai appliqué cette autre astuce pour abaisser toutes les valeurs d'un montant fixe, que nous ajoutons avant d'imprimer les caractères dans la boucle .)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.