Conseils pour jouer au golf en langues 2D

18

Quels conseils généraux avez-vous pour jouer au golf dans des langages de programmation en 2 dimensions? Je suis à la recherche de conseils qui peuvent être appliqués aux problèmes de code-golf et qui sont spécifiques aux langages de programmation 2D, mais qui ne sont spécifiques à aucun langage (les réponses comme "supprimer les commentaires" et "utiliser l' Mopération" ne sont pas des réponses).

Veuillez poster un pourboire par réponse.

Post Rock Garf Hunter
la source
Cette question ne devrait-elle pas concerner Meta?
M. Lister
2
Il y a une méta-question connexe ici: quelle est la taille d'un programme 2D? Surface couverte? Aire de la coque convexe? Aire du rectangle contenant l'axe aligné? Tous pourraient être de meilleures mesures qu'une certaine forme de taille ASCII.
MSalters
Les questions @MrLister Tips sont sur le sujet du site principal. Si vous regardez, vous pouvez voir que nous avons déjà beaucoup de questions sous l'étiquette de conseils.
Post Rock Garf Hunter
@MSalters Comme tous les autres langages de programmation, la longueur est mesurée en octets. Certains concepteurs de langage permettent à ces langages 2D d'être organisés de différentes manières, comme Hexagony ou Cubix, et c'est à eux.
Post Rock Garf Hunter

Réponses:

19

Évitez les espaces horizontaux

Souvent, le code laissera de grands espaces vides sur le côté gauche du programme, ainsi.

abc
  d
  e

Cela ajoute 4 octets, lorsque cela pourrait être évité en alignant à gauche.

cde
b
a

Si vous devez utiliser de grands espaces vides, essayez de les rendre verticaux plutôt qu'horizontaux.

########
#      #
#      #
#      #

contre

####
#
#
#
#
#
#
####
ATaco
la source
11

Utilisez une dimension si possible

En règle générale, des programmes plus simples peuvent être écrits sur une seule ligne. Par exemple, le programme chat classique pourrait être:

>iv
^o<

Mais on pourrait abuser du comportement d'emballage et faire ceci:

io

Ou, dans les langues sans un tel comportement d'habillage:

> ?oi<

(En supposant que ?cela ne saute pas.) Dans le cas d'un langage sans habillage, une boucle explicite est souvent meilleure.

Avec des commandes de saut

Dans les langages 2D avec des commandes de saut et de saut conditionnel, un programme pourrait ressembler à ceci:

abc >de?v;
    ^hgf<

Cela pourrait également être:

abc de?!;hgf04&

(si !est un trampoline et &saute en position)

Conor O'Brien
la source
Votre troisième exemple ne fait-il pas ioiioiioietc.?
ASCII uniquement
@ ASCII uniquement. Oups.
Conor O'Brien
1
Vous devriez probablement indiquer ce que font certaines des commandes les moins régulières. Par exemple, je ne sais pas quoi io;faire, et tout ce que je sais, c'est que ?ça ne saute pas. Il semble que ce soient des commandes de poissons, mais je ne pense pas qu'elles soient très standard.
Post Rock Garf Hunter
2
Dans certains langages 2D sans commandes de saut conditionnel (comme Labyrinth), vous pouvez également souvent écrire des programmes en boucle sur une seule ligne en mettant fin conditionnellement au programme avec une division par zéro.
Martin Ender
10

Les retours chariot sont trop d'octets

Moins vous pouvez faire de 2D, mieux c'est. Un retour chariot est un autre no-op. Sans ignorer les conseils de @ATaco et @ ASCII uniquement, essayez de conserver la dimension Y aussi petite que possible.

Cette

###
####
########

est mieux que

###
###
###
##
#
#
#
#
MickyT
la source
Les retours chariot ne sont pas toujours des octets. \n(saut de ligne) est une fin de ligne régulièrement utilisée dans le texte aligné à gauche sur les systèmes POSIX, bien que Windows et Mac OS (pré-macOS) utilisent des combinaisons de \n( saut de ligne) et \r(retour chariot).
wizzwizz4
9

SEC (ne vous répétez pas)

Bien que l'abstrait avec des fonctions soit généralement plus long dans Code Golf, il peut vraiment aider pour les langages 2D. Essayez de retravailler votre code pour qu'il puisse réutiliser le même extrait, en le saisissant / en le sortant avec deux branches d'exécution différentes.

Cyoce
la source
8

Chemins d'entrelacement

Habituellement, dans un langage 2D, il existe une IP qui se déplace selon les commandes de direction. Étant donné que les espaces sont des octets gaspillés, il est presque toujours plus efficace de réorganiser le programme afin qu'il se rapproche le plus souvent possible de la gauche, ce qui évite d'avoir besoin d'espaces de remplissage inutiles.

ASCII uniquement
la source
2

Utilisez des miroirs

Les miroirs peuvent parfois être utilisés dans deux chemins en même temps (chaque chemin rebondit sur un côté du miroir). Cela peut ne pas sembler utile, mais cela peut vous permettre de réorganiser votre programme, ou si vous en avez beaucoup si les changements de direction peuvent être remplacés par moins de miroirs.

ASCII uniquement
la source
2

Mémorisez les idiomes

Voici quelques "idiomes" qui font certaines choses, selon la nature de la langue.

Code pseudo-linéaire

Si la génération de code dynamique est nécessaire, il peut être utile d'utiliser le modèle de code pseudo-linéaire:

v
\"line 1"
\"line 2"
.
.
\"line N"

En supposant \et en vpensant à ce qu'ils font habituellement.

Boucle infinie

Dans presque tous les langages 2D, ><est une boucle infinie et incassable. Si, pour une raison quelconque, vous devez le faire, c'est la meilleure façon, malgré la beauté de cela:

>v
^<

En fait, si vous faites de votre code une ligne , vous pouvez simplement utiliser ^ou v, en tant que tel:

i?vo;

Cela venverra l'IP à lui-même, s'enroulant autour. Vous pouvez toujours être en mesure d'utiliser cette approche dans tous les cas où une commande directionnelle pointe vers une série de non-opérations (relatives).

Cadre Quine

Habituellement, les langages avec un framework chaîne / guillemet peuvent avoir une quine comme celle-ci:

<quote><generate "><output stack><terminate>

Pour> <>, cela ressemblerait à:

":1-r>o<#

Sauf que celui-ci se termine avec une erreur de terminaison. C'est probablement le plus court > <> quine , ou, du moins, le plus court que j'ai trouvé.

Conor O'Brien
la source
Cela ne semble pas vraiment être une astuce.
Post Rock Garf Hunter
@WheatWizard Je les ai gardés ensemble parce que les séparer avait moins de sens pour moi, étant tous des idiomes courants de mise en page de programme.
Conor O'Brien
Pourquoi avez-vous le <dans la quine> <>?
Jo King
@JoKing Je ne suis pas particulièrement sûr lol
Conor O'Brien
En outre, les "extrémités se retrouvent du mauvais côté. L'astuce est bonne sinon, j'ai utilisé ce cadre général dans beaucoup de mes réponses
Jo King