La langue anglaise et la plupart des langages de programmation sont écrits et lus de gauche à droite, de haut en bas, mais ce n'est pas nécessairement le cas .
En fait pour le bloc de texte
ABC
DEF
Je peux penser à huit manières connexes de le lire:
- De gauche à droite, de haut en bas (LTR-TTB):
ABCDEF
- De haut en bas, de gauche à droite (TTB-LTR):
ADBECF
- De gauche à droite, de bas en haut (LTR-BTT):
DEFABC
- De bas en haut, de gauche à droite (BTT-LTR):
DAEBFC
- De droite à gauche, de haut en bas (RTL-TTB):
CBAFED
- De haut en bas, de droite à gauche (TTB-RTL):
CFBEAD
- De droite à gauche, de bas en haut (RTL-BTT):
FEDCBA
- De bas en haut, de droite à gauche (BTT-RTL):
FCEBDA
Défi
Écrivez un bloc de texte rectangulaire qui peut être lu dans chacune des huit façons ci-dessus comme huit programmes à ligne unique dans la langue de votre choix. Chacun de ces programmes doit produire un entier différent de un à huit.
Peu importe le sens de lecture qui sort quel numéro, ils n'ont pas à correspondre aux chiffres ci-dessus. Par exemple, si votre bloc de texte était encore
ABC
DEF
puis le programme de ABCDEF
sortie de puissance 5
et de FEDCBA
sortie de puissance 2
, et les six autres programmes génèrerait 1
, 3
, 4
, 6
, 7
et 8
dans un certain ordre.
Le bloc de texte peut contenir n'importe quel caractère à l'exception des terminateurs de ligne .
La sortie devrait aller vers stdout ou une alternative similaire si votre langue n'a pas de stdout appropriée. Il n'y a aucune entrée. Vous pouvez supposer que les programmes sont exécutés dans un environnement REPL.
Pietu1998 a charitablement écrit un JSFiddle qui donne aux 8 programmes différents sur une seule ligne lorsqu'ils reçoivent un bloc de texte. Je l'ai transformé en extrait de pile:
<script>function f(n){n=n.split("\n");var e=n.map(function(n){return n.length}).sort()[n.length-1];n=n.map(function(n){return(n+Array(e+1).join(" ")).substring(0,e)});var t=n[0].split("").map(function(e,t){return n.map(function(n){return n[t]}).join("")});n=[n.join(""),n.reverse().join(""),t.join(""),t.reverse().join("")],n=n.concat(n.map(function(n){return n.split("").reverse().join("")})),document.getElementById("a").innerHTML=n.map(function(n,e){return document.getElementById("b").checked?n+" "+"LLTTRRBB"[e]+"T"+"RRBBLLTT"[e]+"-"+"TBLRBTRL"[e]+"T"+"BTRLTBLR"[e]:n}).join("\n")}</script><textarea onkeyup="f(this.value)" id="c" placeholder="Code"></textarea><br/><input type="checkbox" id="b" onchange="f(document.getElementById('c').value)" checked/> <label for="b">Show directions</label><br/><pre id="a"></pre>
Vous pouvez toujours trouver la version CJam de Martin ici .
Notation
Votre score est la zone de votre bloc de texte (la largeur multipliée par la hauteur). La soumission avec le score le plus bas gagne. (Essentiellement, le plus petit code gagne, d'où la balise code-golf .) Tiebreaker revient à la soumission publiée précédemment.
L'exemple est 2 par 3, donc son score est 6. Un score inférieur à 4 (2 par 2) est impossible car alors certains des 8 programmes seraient identiques et ne pourraient pas produire deux valeurs différentes.
la source
String.prototype.repeat()
soit encore un peu nouveau. A également confirmé de travailler dans IE maintenant. nouveau violonRéponses:
J, 3 * 3 = 9
Exécuter toutes les directions:
Explication:
[
(left
) prend le côté gauche de ses deux opérandes, donc il annule essentiellement tout le côté droit de notre expression, par exemple1+2[2+2+2
devient1+2[6
et puis1+2
.n
expressions-opérande, une avec le nombre1
et une avec seulement2
s. Les ajouts avec1
génèrent les nombres impairs et les autres génèrent les nombres pairs.la source
[
par;
et cela devrait fonctionner dans l'environnement REPL de la plupart des langues.Befunge-98 ,
5x5 = 255x3 = 15J'ai écrit un petit script qui a trouvé les bons chiffres pour moi. Cela a pris du temps, mais bon, je viens de battre GolfScript! :RÉ
Les scripts que j'ai utilisés sont ici et ici , mais je ne suggère pas de les regarder car le style de code est extrêmement cancérigène.
Sous-programmes
Ancienne version
Sous-programmes
Sortez les nombres 1-8 respectivement.
la source
Brainfuck $ , 4x3 = 12
Brainfuck $ est très similaire à Brainfuck , mais a quelques commandes supplémentaires, y compris une commande pour sortir la valeur actuelle de la cellule sous forme de sortie numérique, ce qui était très utile pour ce défi.
Commandes sur une ligne:
la source
TECO, 3 * 5 = 15
=
imprime la valeur de la dernière expression numérique.\
est utilisé pour lire ou écrire des nombres à partir de chaînes, mais je ne l'utilise que comme défausse ici.+4 5+2=4 +1 \
7+ +2+4=1 4 5 \
6+ +2+1=4 4 \ 5
3+1 \+2=4 +4 5
2\ 1+ 4=2+5 4+
5\ 5 4 1=4+2+ +
15 \ 4 4=1+2+ +
45 4+ 4=2+\ 1+
8la source
piet - 12x12 = 144
Puisqu'un programme d'une ligne ne peut jamais se terminer, supposez qu'il se termine après la première sortie.
8 sous-programmes dans une seule image:
la source
GolfScript, 4x4 = 16
Utilise le bon vieux "super commentaire": un inégalé
}
ignore le reste du code (en fait, dans ce cas, un commentaire normal#
aurait tout aussi bien fonctionné, puisque tout le code est exécuté sur une seule ligne). Donc, de chaque coin, il n'y a qu'un seul numéro ou (dans l'autre sens) ce nombre incrémenté de 1, car l'exécution se termine et le contenu de la pile est imprimé. Les 8 programmes sontla source
Haskell, 26x26 = 676
Utilise les commentaires (
--
) pour masquer les bits arrière et latéral. Cela le rend terriblement longla source
Prélude , 5x3 = 15
Cela suppose l' interpréteur Python , qui imprime les valeurs sous forme de nombres au lieu de codes de caractères.
Cela ne bat pas Befunge $, mais il bat ma soumission GolfScript, et j'aime sa simplicité. Notez également qu'il n'utilise que 9 caractères non-espace,
ce qui est inférieur à toute autre soumission jusqu'à présent(J frappe à nouveau :)). Dans Prelude, chaque chiffre est poussé sur la pile individuellement, et selon le chemin, il y a un chiffre différent juste avant le!
, qui imprime simplement l'élément supérieur de la pile. Les 8 programmes sont:Alternativement, il y a aussi
Ce qui pousse les nombres impairs sur les chemins verticaux, et les incrémente de
1
sur les chemins horizontaux:la source
CJam - 7 × 7
Pas impressionnant, mais il n'y a pas eu de réponse CJam et j'aime son apparence :)
Il utilise principalement le fait qui
];
efface la pile.Essayez-le en ligne
la source
Rubis - 7x7
Pas impressionnant non plus, même tactique que la réponse de Haskell.
la source
R, 9x9
Pas d'espace blanc, pas de commentaires.
Je suppose que cela pourrait être étendu à la taille que vous souhaitez. Je pensais que l'opérateur modulo était le plus flexible des opérateurs disponibles, car il empêche les valeurs d'être trop grandes quelle que soit la taille des données, et il n'y a aucun effet d'avoir de très grands nombres entre les deux.
la source
Ce langage de programmation, 5 * 9 = 45
Ce qui se traduit par ceci:
Depuis la
;
fin du programme, ce qui précède se traduit par ceci:Explication: n'importe quel nombre de
0
à9
pousse le chiffre correspondant sur la pile.+
saute les deux premières valeursx
ety
hors de la pile et poussex + y
sur la pile.i
renvoie la pile sous forme d'entier.la source