Quels conseils généraux avez-vous pour jouer au golf à INTERCAL ? Je recherche des idées qui peuvent être appliquées aux défis de golf de code et qui sont également au moins quelque peu spécifiques à INTERCAL (c'est-à-dire que "supprimer les commentaires" n'est pas une réponse utile).
Je sais que les langues exotiques peuvent être vraiment utiles pour gagner des concours de golf, mais je ne vois pas beaucoup de code INTERCAL ici. Avez-vous des conseils qui peuvent aider les gens à obtenir des tailles de code compétitives avec INTERCAL? Cette langue pourrait-elle jamais être compétitive?
INTERCAL est tellement sous-utilisé qu'il n'a même pas de balise. Si triste...
Despite the language's intentionally obtuse and wordy syntax,
Réponses:
La suppression des espaces / du "bruit" peut aller plus loin que vous ne le pensez
INTERCAL est un langage insensible aux espaces. Contrairement à la plupart des langages insensibles aux espaces, l'insensibilité va beaucoup plus loin que vous ne le pensez.
Par exemple, il
DO NOT
s'agit de deux jetons, mais il peut être écritDONOT
sans que l'analyseur se plaint (dans pratiquement toutes les implémentations largement utilisées). (Bien sûr, vous pouvez également écrireDON'T
, mais ce n'est pas plus tordu. Cela pourrait être plus facile à lire, cependant.PLEASEN'T
Est probablement plus difficile à lire quePLEASE NOT
, cependant.) En fait, il y a un débat quant à savoir si les espaces blancs font quelque chose; au moins un analyseur INTERCAL le permet même à l'intérieur des constantes numériques (pas que ce soit très utile lors du golf). Une chose à garder à l' esprit est que la suppression des espaces deDO READ OUT
donne qui peut confondre certains parseurs anciens INTERCAL en raison de l'embarquéDOREADOUT
DO
(bien que leurs auteurs considèrent généralement cela comme un bogue, et donc de nos jours cela fonctionne généralement dans un programme valide, il n'est pas conseillé de mettre un code comme celui-ci au voisinage d'une erreur de syntaxe, car il peut être beaucoup plus difficile de lever l'ambiguïté alors).N'oubliez pas non plus que vous pouvez surcharger les caractères pour économiser de l'espace. En ASCII, vous ne pouvez vraiment retirer cela qu'avec
'.
→!
, mais c'est une astuce très utile en soi. (Lorsque vous n'utilisez pas de tableaux, il n'y a aucune possibilité d'ambiguïté de sparkears même lorsque tous vos caractères de regroupement sont les mêmes, donc pour les entrées de golf, il est recommandé de s'en tenir à'
moins qu'un indice de tableau ne nécessite vraiment un"
.) Un rat de bibliothèque peut être représenté dans un octet en utilisant l'?
abréviation (C-INTERCAL) ou Latin-1 pour¥
(CLC-INTERCAL), plutôt que les trois dont INTERCAL-72 a besoin.la source
Concentrez-vous sur le plus de travail possible en une seule déclaration
Les identificateurs de déclaration d'INTERCAL sont assez verbeux;
DO
est deux caractères de bruit sur chaque déclaration, le nom de la déclaration lui-même a également tendance à être assez long, et vous devez ajouter un dePLEASE
temps en temps pour garder l'analyseur heureux. (Le mieux que vous puissiez faire est un rapport de quatreDO
pour unPLEASE
, ce qui signifie que vous utilisez 14 caractères dans les identificateurs pour 5 commandes.) D'un autre côté, la syntaxe de l'expression est assez concise (ridicule, mais concise). Cela signifie qu'il est souvent utile d'intégrer une partie de votre programme dans une seule expression, même si l'utilisation de plusieurs instructions serait une manière plus «naturelle» de faire les choses.Par exemple, si vous souhaitez attribuer
#1
à.1
et#2
à.2
, au lieu de le faire de la manière évidente INTERCAL-72:il vaut vraiment la peine d'envisager de surcharger une variable aléatoire pour vous permettre d'affecter les deux à la fois:
(avec
:1/!1$.2'
jeté quelque part plus tôt dans le programme; notez que cette notation est postérieure à INTERCAL-72 d'une certaine manière, vous devrez donc utiliser un INTERCAL moderne pour que cela fonctionne). Cela n'est que légèrement plus long, même si vous tenez compte de la configuration, et devient plus court si vous en avez besoin ou si vous pouvez vous en occuper simultanément.1
et à.2
plusieurs reprises.Il ne s'agit pas seulement de calculer les commandes où cette astuce fonctionne. Si vous devez cacher une variable deux fois, ne le faites pas comme ceci:
mais comme ça:
(La
+
notation fonctionne pour la plupart des commandes où elle pourrait avoir un sens conceptuel.)la source
Utilisez un seul CV pour tous les modèles INTERCAL-72 en cas de restructuration
Si vous devez écrire l'équivalent d'une instruction "if", la méthode normale utilisant le code INTERCAL-72 est de faire
NEXT
deux fois, puis de faire un calculRESUME
. (Dans le code moderne, souvent un calculCOME FROM
sera meilleur, mais cette astuce suppose que votre code préfèreNEXT
.) Vous devez presque certainement payer les octets pour le premierNEXT
, car il saute d'une branche du "si" à l'autre. Partager le secondNEXT
n'est pas non plus trivial, sauf si vous avez beaucoup de déclarations «si» qui vont au même endroit en voyant a#1
. Cependant, leRESUME
peut être n'importe où dans le programme (car le contrôle va le laisser instantanément n'importe où).Il y a deux façons de gérer cela. Si vous avez beaucoup d'instructions "si", alors le
RESUME
garantit probablement un numéro de ligne à un chiffre, de sorte que votre deuxièmeNEXT
instruction puisse être aussi courte que possible. Si possible, essayez d'en faire un calculRESUME
qui se produirait naturellement dans votre code (certes, c'est difficile, car il est rare que ceux-ci apparaissent dans le "flux normal" de code plutôt que d'êtreNEXT
édités); alors, le seul coût est le numéro de ligne. Vous devrez utiliser une seule variable booléenne pour tous cesNEXT
s; le consensus universel ici est d'utiliser.5
, principalement parce que c'est la variable que la bibliothèque standard utilise pour les valeurs de retour booléennes.Alternativement, il est possible d'utiliser une fonctionnalité non documentée (techniquement sous-documentée, car j'ai glissé un indice dans la documentation INTERCAL lorsque j'ai remarqué) de la bibliothèque standard. Parce qu'un emplacement central pour a
RESUME
est si utile, la bibliothèque standard en utilise un en interne. Les numéros de ligne dans INTERCAL sont globaux (avec des conventions d'espacement de noms, mais qui peuvent être rompus si vous savez ce que vous faites), vous pouvez donc accéderNEXT
directement aux internes de la bibliothèque standard si vous le souhaitez, et en particulier,NEXT
à son emplacement central de CV . Ceci est suffisamment populaire dans le code INTERCAL existant pour que les remplacements de bibliothèque standard aient tendance à l'implémenter pour éviter de casser les programmes existants.La ligne en question est (littéralement ou efficacement, selon la mise en œuvre):
La principale raison de ne pas l'utiliser est son numéro de ligne longue; si vous avez besoin de faire beaucoup de constructions if de style INTERCAL-72, il sera préférable d'utiliser la vôtre pour lui donner un nombre plus court.
Bien sûr, vous pouvez combiner les techniques en écrivant quelque chose comme
qui n'est que légèrement plus longue que
et a l'avantage que les booléens deviennent
#2
et#3
(ce qui est plus difficile à lire, mais normalement plus facile à générer). En fait, cela pourrait même valoir la peine de mettre du code supplémentaire à gérer#0
et#1
si vous allez beaucoup différer (mais le calculCOME FROM
fonctionnera probablement mieux dans ce cas, sauf si vos exigences sont très étranges).la source
INTERCAL ne spécifie pas de priorité, mais il ne fait pas non plus d' erreur sur la priorité ambiguë
Une expression comme
est ambigu et pourrait signifier
ou
La spécification INTERCAL ne permet pas de savoir ce qui est voulu, et en général il n'y a pas de norme (bien que C-INTERCAL et CLC-INTERCAL s'efforcent de se faire correspondre dans les cas les plus simples). Cela dit, l'original n'est pas incorrect ; c'est ambigu et je ne conseillerais pas de l'utiliser dans le code de production (mais alors, je ne conseillerais pas d'utiliser INTERCAL lui-même dans le code de production), mais cela aura un certain sens dans la majorité des compilateurs.
En d'autres termes, il peut être utile de simplement supprimer les caractères de regroupement et d'espérer que votre programme fonctionne toujours. La plupart des interprètes analysent systématiquement toute expression ambiguë donnée, donc pour chaque paire de caractères de regroupement, il y a 1 chance sur 2 que ce n'est pas nécessaire; cela peut représenter pas mal d'économies. (Malheureusement, parseurs INTERCAL ont tendance à être assez déroutant que personne est tout à fait sûr de ce que les règles en fait sont , mais il peut normalement être déterminées par l' expérience. Dans les cas les plus simples, les opérateurs ont tendance à tous ont la même priorité et d'avoir une associativité cohérente.)
la source
Dans C-INTERCAL, envisagez d'abréger le code à l'aide de
CREATE
L'
CREATE
instruction vous permet de créer une nouvelle syntaxe. Ceci est particulièrement utile dans le golf car il vous permet de donner des noms plus courts aux déclarations. Vous pouvez également l'utiliser pour "définir une fonction" de manière efficace en créant un nouvel opérateur (ce qui a l'énorme avantage qu'il vous permet d'appeler la fonction au milieu d'une expression).Le coût de configuration ici est assez élevé, mais s'il existe une construction que vous utilisez beaucoup, inventer une syntaxe plus courte sera probablement une bonne idée.
la source