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.
Réponses:
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.la source
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.la source
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)
la source
La séquence vide est une étiquette valide
[LF][Space][Space][LF]
(Contrôle de flux - Marquer avec l'étiquette '') crée une étiquette vide qui est une cible valide pour les sauts ou les appels de sous-programme. Cela enregistre un octet lors de la déclaration de l'étiquette et un octet à chaque appel.( Observé dans la réponse des espaces pour implémenter une machine de vérité )
la source
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 .
(
STN
utilisé 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' estSSSTTTTSTSN
). 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):
NSSN
(Créer un Label_0; en gros, démarrer la boucle)SSSTTSSTSSN
(Poussez le montant fixe 100)TSSS
(Ajoutez les deux premières valeurs de la pile ensemble)TNSS
(Pop et imprimer la valeur maintenant correcte en tant que caractère)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 (commel
dansHello
), ou la copie de valeurs à partir d'une autre position peut toujours être utilisée en plus de cela pour jouer plus d'octets.la source
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.)
la source
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.la source
La copie des entiers précédents peut être plus courte que la création de nouveaux
(
STN
utilisé pour Space, Tab et New-line respectivement.)STS
L'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 .)la source