Considérons un bloc de texte carré, N caractères de large par N de haut, pour un entier impair N supérieur à 1.
À titre d'exemple, soit N = 5 et le texte soit:
MLKJI
NWVUH
OXYTG
PQRSF
ABCDE
Notez que c'est l'alphabet (en plus de Z) en spirale dans le sens antihoraire à partir du coin inférieur gauche. C'est un peu comme un tapis enroulé.
"Dérouler" le texte d'un quart de tour dans le sens des aiguilles d'une montre est donc FGHI
au même niveau que les ABCDE
résultats dans:
PONM
QXWL
RYVK
STUJ
ABCDEFGHI
Ce déroulement peut être effectué 7 fois de plus jusqu'à ce que le texte soit sur une seule ligne:
SRQP
TYXO
UVWN
ABCDEFGHIJKLM
UTS
VYR
WXQ
ABCDEFGHIJKLMNOP
WVU
XYT
ABCDEFGHIJKLMNOPQRS
XW
YV
ABCDEFGHIJKLMNOPQRSTU
YX
ABCDEFGHIJKLMNOPQRSTUVW
Y
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVWXY
Défi
Le défi consiste à écrire un programme qui est un bloc de texte N × N qui génère le nombre de fois qu'il s'est "déroulé" d'un quart de tour lorsqu'il est réorganisé dans les modèles de déroulement et exécuté.
Il y a vraiment deux concours ici: (j'espère que ce ne sera pas trop compliqué)
- Pour ce faire, avec le plus petit N. (jusqu'à une limite de N = 3)
- Faites-le avec le plus grand N. (pas de limite)
Il n'y aura pas de réponse acceptée, mais le gagnant dans chacune de ces catégories recevra au moins 50 représentants de primes de ma part. En cas d'égalité, les réponses les plus anciennes l'emportent.
Exemple
Si votre bloc de code est
MyP
rog
ram
l'exécuter tel quel devrait produire 0.
Fonctionnement
rM
oy
ramgP
devrait produire 1.
Fonctionnement
or
ramgPyM
devrait sortir 2.
Fonctionnement
o
ramgPyMr
devrait produire 3.
Enfin, l'exécution ramgPyMro
devrait produire 4.
Détails
- La sortie doit être imprimée sur stdout (ou l'alternative la plus proche) par elle-même. Il n'y a aucune entrée.
- Vous ne pouvez utiliser que de l' ASCII imprimable (codes hexadécimaux 20 à 7E, y compris l'espace) dans votre code.
- Des espaces remplissent l'espace vide dans les dispositions de déroulement. (Sauf si vous vous déroulez vers la gauche.)
- Seuls les arrangements de complètement carré à complètement plat doivent avoir une sortie valide. Aucun autre arrangement ne sera exécuté.
- Vous ne pouvez pas lire votre propre source.
- Vous pouvez utiliser des commentaires.
- N = 1 est exclu car dans de nombreuses langues, le programme
0
fonctionnerait. Si vous le souhaitez, vous pouvez dérouler vers la gauche plutôt que vers la droite. Donc par exemple
MyP rog ram
devient
Pg yo Mrram
etc. Aucun espace supplémentaire n'est ajouté lors du roulement de cette façon. Les lignes se terminent
(Connexes: écrire un programme rectangulaire qui génère le nombre de fois qu'il a été tourné )
la source
Réponses:
Golfscript, N <- [5,7 ..]
Entièrement déroulé:
Explication:
.
(plusieurs fois) - dupliquer l'entrée]
- collecter la pile dans un seul tableau,
- prendre sa longueur9\-
- le soustraire de 9#
- commentaire de ligneL'espace est un NOP, mais tout autre NOP aurait tout aussi bien fonctionné.
Complètement enroulé, il utilise neuf copies de l'entrée (contenu ignoré) comme pile; 9 - 9 = 0; il n'a pas été déroulé.
Chaque déroulement déroule un point de plus (doublon) derrière le commentaire, réduisant la pile une fois, incrémentant la sortie.
Entièrement déroulé, il utilise uniquement l'entrée (contenu ignoré) comme pile; 9 - 1 = 8; il a été déroulé 8 fois.
La même approche fonctionne pour tout N> 4: passez
9
à la valeur appropriée de 2 * N + 1, puis étendez le motif de points (en double) en utilisant le même motif en spirale qui garantit qu'un seul point se déroule à chaque déroulement.la source
GolfScript, N = 4
Celui-ci roule à droite comme spécifications d'origine.
Voici les déroulements:
Essayez-le ici
la source
.
s et#
s?~
. Peut-être que je peux le voler pour N = 3?APL, N = 3
Déroulé:
Essayez-le en ligne.
Il calcule le reste de ce nombre divisé par 5. Seul le résultat de la dernière ligne est imprimé.
APL, N = 2
Déroulé:
Essayez-le en ligne.
≡
renvoie la profondeur (à ne pas confondre avec la dimension ou la longueur) d'un tableau:0
n'est pas un tableau. La profondeur est donc 0.0∞
est un tableau avec deux éléments0
et∞
(infini). Il a la profondeur 1.0∞⍬
a un autre élément⍬
, qui est un tableau vide de profondeur 1. Il en0∞⍬
est de même pour la profondeur 2.Ces deux programmes fonctionnent également dans l'interpréteur en ligne. Je ne sais pas si la dernière est syntaxiquement correcte.
APL, pour tout N> = 4
Pour N = 4:
Entièrement déroulé:
Pour N = 5:
Entièrement déroulé:
1↓
supprime un élément du tableau. Il renvoie également le tableau vide si l'argument est scalaire.⍴
obtient la longueur du tableau.la source
()[]
ils apparaîtront à un endroit indésirable.