Le titre dit tout. Votre objectif est d'écrire un programme qui forme un rectangle aw × h de caractères pouvant être pivotés et réexécutés pour générer le nombre de rotations à 90 ° effectuées dans le sens contraire des aiguilles d'une montre.
Par exemple, si le programme 3 × 2
abc
def
résolu le problème, il produirait initialement 0 et des rotations successives de 90 ° CCW
cf fed da
be cba eb
ad fc
afficherait 1, 2 et 3 respectivement.
L'utilisation de commentaires en fait une tâche triviale pour la plupart des langues. En Ruby par exemple, cela peut être fait dans un rectangle 7 × 7:
###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###
Le défi consiste à le faire sans aucune sorte de commentaire.
Notation
Votre score est w * h, la surface de votre rectangle. Les nouvelles lignes sont exclues. En d'autres termes, code-golf, les nouvelles lignes ne sont pas comptées.
Le score pour l'exemple Ruby est 49 (bien que, bien sûr, il ne soit pas valide car il contient des commentaires).
Remarques
- Votre code doit vraiment être rectangulaire, sans aucun caractère manquant à la fin des lignes.
- Si vous le souhaitez, vous pouvez générer d'autres valeurs légales "mod 90 °" au lieu de 0 1 2 3. Donc 8 va bien au lieu de 0, et -1 va bien au lieu de 3, etc.
- La sortie peut aller à la console ou dans un fichier.
- Les failles standard s'appliquent.
J'espère que ma première question intrigue vraiment certaines personnes. Prendre plaisir!
la source
echo 0;exit;e
dans bash est autorisé?Réponses:
APL (1x3 = 3)
Cette solution utilise la règle supplémentaire selon laquelle toute sortie correspondant au mod 4 correct fonctionne.
Dans APL,
x!y
est le nombre de façons de choisir desx
élémentsy
, communément appelébinom(y,x)
ouchoose(y,x)
. Vérifions que chaque rotation donne la bonne réponse.0 rotations
Il n'y a aucun moyen de choisir 5 éléments sur 3, nous obtenons donc 0, qui est automatiquement imprimé.
1 rotation CCW
APL évalue avec bonheur chaque ligne, en obtenant le numéro
3
, l'opérateur!
, puis le numéro5
, en n'imprimant que le dernier (5
), qui correspond à 1 mod 4.2 rotations CCW
Ceci est
binom(5,3)
, ce qui est(5*4*3*2*1)/(3*2*1)/(2*1) = 10
, qui est 2 mod 4.3 rotations CCW
Comme auparavant, seule la dernière valeur évaluée de
3
est imprimante.Je ne connais pas vraiment APL, alors dites-moi s'il vous plaît si l'une des explications est erronée. Je l'ai trouvé par essais et erreurs comme première langue de ce site :
Pour (5), j'ai descendu la liste des fonctions dyadiques APL . Ma première opération candidate était la division entière
/
de C et Python 2, mais la division APL÷
donne des flottants. L'exponentiation est tentante, mais échoue cara
eta^b
a la même parité mais est obtenue par rotations consécutives (sauf sib=0
, mais ensuiteb^a=0
). Les opérateurs booléens, tels que<
give0
et1
180 degrés, ne fonctionnent pas. Enfin, j’ai trouvé l’opérateur binomial!
et essayé des chiffres jusqu’à ce que j’en obtienne.Merci à Quincunx pour sa confiance qu’il existe une solution plus petite que 2x2.
la source
Rubis, 7 × 9 (63)
Un peu plus long que l'autre solution, mais au moins cette solution ne dépend d'aucune impression implicite ou d'abus de règles. Pour les quatre rotations, le code complet est analysé et, à l'exception d'un court-circuit, tout est exécuté. Étonnamment, il n'y a absolument aucune symétrie dans le code
Cette solution repose sur le fait qu'il est toujours possible d'appeler la
p
fonction (qui permet d'imprimer les nombres) même si une variable du même nom a déjà été définie. Par exemple, quelque chose commep p
appelle la fonctionp
avec la variablep
en argument (donc, en affichant la valeur dep
).Explication de certaines expressions courantes utilisées dans le code:
p
: Comme mentionné ci-dessus, il s’agit d’un appel de fonction ou d’une variable. Lorsque la variable n'est pas définie, la fonction estp
appelée sans arguments, ce qui ne fait rien et retournenil
.p p
: Imprime la variablep
.p|x
: Quandp
est la fonction, c'est identique ànil|x
, qui retourne vrai / faux en fonction de la valeur dex
. Sip
est un entier, c'est au niveau du bit ou. Quoi qu'il en soit, cette déclaration n'a aucun effet secondaire.p=p||x
: Effectivement identique àp||=x
(affectation conditionnelle) avec l'avantage d'être valide du point de vue syntaxique et de ne pas être opéré une fois inverséVersion symétrique (9 × 10 = 90)
Ceci est la solution la plus courte symétrique (C 2 en ignorant les chiffres à imprimer) Je pourrais trouver.
Script de test
Voici un script de test pour vérifier le code ci-dessus (les
#
fins de ligne ont été ajoutées pour que les espaces ne soient pas supprimés et soient supprimés avant l'exécution):la source
GolfScript, 4 (2x2)
Imprime
4312
ce qui est0
(mod 4). Les rotations sont imprimées3241
(1 mod 4),2134
(2 mod 4) et1423
(3 mod 4).Invité par:
Il existe en réalité de nombreux ensembles de nombres pour lesquels cela fonctionne. J'ai trouvé ceux-ci avec ce programme Python:
Bien que le programme génère
0
s (ce qui ne fonctionnerait probablement pas), les solutions valables sont les suivantes:Où
a∈{4,8}
,b∈{3,7}
,c∈{1,5,9}
,d∈{2,6}
. IE(a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}
qui est 24 solutions.la source
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
n
. En effet, la parité du nombre entier égale la parité du chiffre le plus à droite, mais les rotations à 90 degrés doivent générer des parités différentes. Donc,2*2
est le minimum pour cette approche.Python - 23 x 23 = 529
Ok, cette question a déjà un gagnant, mais il n’existe pas encore de solution Python. Alors j'y ai pensé - lourdement! - et a trouvé un moyen de faire fonctionner la
print
commande volumineuse dans n’importe quelle direction sans générer d’erreurs lorsqu’elle était analysée depuis l’une des autres directions.La percée était la ligne suivante:
Alors que le
forward_code
est exécuté, lebackward_code
fait partie d'une chaîne et n'est donc pas imprimé. C'est exactement l'inverse lorsque vous lisez à l'envers.Donc, combiné avec deux autres directions et ajusté pour obtenir toutes les citations correspondant correctement, je me retrouve avec la solution suivante:
Edit: J'ai trouvé un moyen de gérer tout cet espace. ;)
la source
p=print
dans le fichier, étant donné que vous avez actuellement beaucoup d’espace? (Python 3, bien sûr)p=print
est également longue. Et plus important encore: vous ne pouvez pas réutiliserp
après la rotation du code!BASIC, 64
Je ne gagnerai pas, mais le voici quand même. (Testé dans Chipmunk Basic )
Remarque:
?
est un raccourci pourPRINT
divers dialectes de BASIC. Bien qu'il y ait beaucoup d'erreurs de syntaxe dans le code, l'END
instruction de la première ligne empêche qu'elles soient vues par l'interpréteur.la source
END
bien :)Pyth , 9 caractères (3x3)
En pyth, tout est imprimé par défaut, sauf s'il est précédé d'un espace. Les lignes après la première ligne sont destinées à l'utilisateur et ne sont pas évaluées dans ce programme.
Une autre façon d’obtenir 9 caractères:
Pyth 1.0.5 , 4 caractères
Bien que les modifications récentes apportées à Pyth aient rendu la génération de nombres à 2 chiffres plus difficile (modification que j’envisage d’annuler), les anciennes versions de Pyth permettent de générer facilement des nombres à deux chiffres, qui, combinés à l’impression implicite et au fait que toutes les lignes, sauf la première, sont ignorés, donne la solution suivante:
Imprime 32,21,14,43.
la source
Befunge, 16 ans
Explanation: Chiffres de
0
pour9
insérer le nombre correspondant dans la pile,.
extraire une valeur de la pile et l'imprimer sous forme d'entier, puis@
terminer le programme.(testé ici )
la source
Piet, 49 ans
Je me suis contenté d'utiliser des couleurs jaune et rouge et d'essayer de le rendre plus ou moins symétrique. Lors de la rotation, il imprime 0, 1, 2 ou 3. Quitter le programme dans Piet est difficile et prend malheureusement environ la moitié de la surface de la photo.
la source
GNU dc , 6 (3x2)
Je pense que c'est la réponse la plus courte pour ne pas exiger l'assouplissement des règles "mod 90 °":
Sorties
0
,1
,2
ou3
pour chaque rotation.Pour les
0
,2
et les3
rotations, lesp
pops simplement et imprime le dernier littéral avoir été poussé à la pile. Pour la1
rotation,z
appuyez sur la profondeur actuelle de la pile (1) pour la placer sur la pile, puis sur pour la fairep
apparaître et l'imprimer.la source
311\n0p2
, où\n
est un caractère de nouvelle ligne. Sinon, cela n'aurait aucun sens dans le contexte de dc.GolfScript, 9 (3x3)
En quelque sorte d'abuser des règles. La
}
fin du programme s’il n’ya pas de correspondance{
et le contenu de la pile est imprimé à la fin du programme.la source
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
}
pouvait être déséquilibré. Joli tour.JavaScript, 4
Lorsque vous exécutez ce programme (ou une rotation de ce programme) dans une console javaScript, seule la dernière ligne est évaluée et répercutée dans la console.
Alors:
Voici tous les programmes 2x2 similaires qui fonctionnent aussi:
En d'autres termes,
où a est dans [0,4,8], b est dans [3,7], c est dans [1,5,9] et d est dans [2,6]
la source
CJam / GolfScript - 3 * 3
Le point-virgule fait apparaître le numéro précédent, seul le coin inférieur droit est imprimé.
la source
Aheui , 8 ans
Comme Aheui n’a pas de lettre qui pousse 1 sur la pile, j’ai décidé d’imprimer 0, 5, 2 et 3.
Explication: 바 et 반 poussent respectivement 0 et 2 sur la pile et déplace le curseur d'un caractère vers la droite. 뷸 et 뷷 poussent respectivement 5 et 3 dans la pile et déplace le curseur de deux caractères vers le bas. 몽 affiche et affiche le nombre dans la pile et déplace le curseur d'un caractère vers le haut. Termine le programme.
la source
JavaScript
(Entré dans la console du navigateur, shell ou un autre REPL, le résultat est imprimé)
Devrait fonctionner pour toute autre langue avec des expressions, des retours à la ligne non significatifs et l’impression automatique du résultat.
la source
'2,3\n,0,\n1,0'
.Matlab / Octave -
144100Golfé: 10 x 10 = 100
Solution alternative: 15 x 15 = 225
la source
...d....
...i....
...s2...
disp 1..
..3 psid
...4s...
....i...
....d...
..3 psid
. Vous avez besoin d'au moins trois points au début de chaque ligne pour indiquer un saut de ligne et pour ignorer les caractères restants.Perl 5x7 (35)
Un peu tard pour la fête. Le solitaire
-
détermine quel numéro est imprimé.la source
JavaScript, 3
Cela fonctionne ... en base 7.
Version base 9:
Explication
Lorsqu’il est exécuté de manière interactive, par exemple à partir d’une console de débogage, la valeur de la dernière instruction / expression est sortie.
4 7 = 4 10 ≣ 0 (mod 4 )
412 7 = 205 10 ≣ 1 (mod 4 )
2 7 = 2 10 ≣ 2 (mod 4 )
214 7 = 109 10 ≣ 3 (mod 4 )
Des solutions similaires pourraient être trouvées pour toute base impaire.
la source
Befunge, 12 (6x2)
J'ai réussi à apporter une légère amélioration à la réponse existante de Befunge en exploitant au mieux la nature bidimensionnelle de Befunge et en faisant en sorte que le chemin du code soit vertical dans deux des orientations.
Essayez-le en ligne: à partir de 0 , rotation 1 , rotation 2 , rotation 3 .
la source
Marbelous, 7 * 14 = 98
la source
Argh! / Aargh! (4 * 4 = 16)
En quoi consistait l'utilisation du bon outil pour le travail? Il n'y a pas de commentaires (dans la langue en général).
Toute la famille de programmes (générée en J:
((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'
ou((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'
)tourné une fois:
tourné deux fois:
tourné trois fois:
Pour expliquer cela, il pourrait être préférable de regarder une version "en retrait" (qui fonctionne également dans toutes les rotations):
Cette version montre que le programme comprend 4 parties distinctes, une pour chaque rotation individuelle.
h
- régler le flux de contrôle à gauchep
- imprimer un élément dans le raster de données / code en dessousq
- quitter le programmela source
Flotteur - 9 × 5 = 45
Imprime 4, 1, 2 ou 3 sur la console.
Notez que 'Black' est une instruction valide (NOP) et qu'elle est syntaxique. Sans cela, il ne peut pas trouver la position de départ. Ainsi, toutes les positions dans le rectangle sont occupées.
la source
Élément, 2x3 = 6
Il s’agit d’une amélioration par rapport à la solution naïve 3x3, qui se situe
`
au centre avec un chiffre de chaque côté. Le cas 0, présenté ci-dessus, est le plus intéressant, car il*
sert à multiplier les 3 par rien pour obtenir 0. À part cela, ce n'est pas si compliqué.Si vous trouvez cet espace inconfortable, vous pouvez le remplacer par n'importe quel autre personnage, à l'exception de
[]{}`_
.Pour référence, voici les trois autres rotations:
la source
Puce, (2x5) 10
*
active tous les éléments voisins: nord, est, sud et ouest (source)~
si elle n'est pas activée de l'ouest, active le voisin est (porte NON) (jamais activé ici)t
termine l'exécution après l'impression de l'octet actuela
définit le bit0x01
desb
ensembles de sortie le bit0x02
de la sortiee
définit le bit0x10
de la sortief
définit le bit0x20
de la sortie+
s'il est activé par un voisin, activez tous les autres voisins (fil)La puce nécessite soit le
-w
drapeau (pour permettre l'exécution sans entrée), soit une entrée pour s'exécuter.Estampes
0
,1
,2
ou3
en ASCII. Si0x00
vous0x03
souhaitez utiliser le code souhaité, supprimez les boutonse
andf
, puis déplacez l’espace vers le haut pour le combler.la source
Japt , 3 * 1 = 3 octets
Essayez-le en ligne: tel quel , pivoté une fois , deux fois , trois fois .
Sorties 0, 5, 2, 11 respectivement.
La variable
B
contient la valeur 11 etNumber.z(other)
est la division du plancher (tout le monde cherchait apparemment: p). Pour un code multiligne, la dernière ligne est transmise à la sortie, qui est simplement une constante ici.2 * 2 = 4 octets
Essayez-le en ligne: tel quel , pivoté une fois , deux fois , trois fois .
Sorties 0, 21, 2, -1 respectivement.
T
détient 0 etJ
détient -1.Le truc, c’est que, si deux littéraux ou deux variables sont mis côte à côte, une virgule est insérée et la sortie n’est que la dernière.
La solution 2 * 2 JS fonctionne également dans Japt.
la source