introduction
Écrivez un programme complet qui fait pivoter un bloc rectangulaire de caractères ASCII de 90 degrés dans le sens des aiguilles d'une montre. Lorsque le programme lui-même pivote de 90 degrés dans le sens horaire, il fait pivoter un bloc de caractères ASCII de 90 degrés dans le sens antihoraire.
Règles
- Vous n'utilisez pas de modules intégrés qui font pivoter ou transposer les matrices. Par exemple, dans MATLAB / Octave
rot90
et l'opérateur de transposition'
ne sont pas autorisés. - Vous devez écrire un programme complet qui utilise STDIN et STDOUT ou l'équivalent le plus proche.
- Votre programme doit être rectangulaire et supposer que l'entrée est également rectangulaire.
- L'entrée et la sortie sont des chaînes séparées par des sauts de ligne et n'auront pas de sauts de ligne de fin.
Lorsqu'il est exécuté avec son code source en entrée, votre programme doit se tourner de 90 degrés dans le sens des aiguilles d'une montre. La sortie doit être un deuxième programme dans la même langue qui tourne son entrée de 90 degrés dans le sens antihoraire. Lorsque le programme pivoté reçoit son code source en entrée, il doit sortir le code source du programme d'origine.
Remarque: Les deux programmes doivent fonctionner pour n'importe quelle entrée, pas seulement pour leur propre code source, donc une quine à un caractère n'est pas autorisée.
Exemple
Supposons que ce qui suit est un programme valide qui fait pivoter son entrée de 90 degrés dans un langage hypothétique ExampleLang.
^f a2% 3
lk (^_^&
v
D8 $4 /
Lorsqu'il est exécuté avec lui-même en entrée, il génère un autre programme valide qui tourne son entrée dans le sens antihoraire:
D l^
8 kf
$ (a
4 ^2
_%
^
/v&3
Ce deuxième programme, une fois donné à lui-même comme entrée, sort le programme d'origine. Notez que la ligne vierge doit avoir quatre espaces et il y a un espace de fin sur l'avant-dernière ligne qui ne peut pas être restituée dans la démarque. Clarifier:
$ examplelang program < program > rotProg
$ examplelang rotProg < rotProg > program1
$ diff -s program program1
Files program and program1 are identical
Le programme le plus court gagne. Les failles standard sont interdites.
:.+
être divisé en plusieurs lignes?:
et.
dépend du caractère après eux, et les sauts de ligne ne sont pas valides après l'un ou l'autre (et même s'ils l'étaient, cela changerait la signification du programme).C (gcc) ,
14201399463 octetsAh ... la joie des cordes de longueur indéterminée!
Suppose
sizeof(char*) == sizeof(int)
etsizeof(char**) <= 16
.La nouvelle approche
Essayez-le en ligne!
Sortie de ce qui précède
La solution a été embarrassante au final. Vous faites un programme A qui tourne les choses dans le sens horaire, et un programme B qui tourne dans le sens antihoraire:
UNE
B
Faites un rectangle de proportions raisonnables et limitez A à cela, et mettez des gardes de commentaires autour de lui:
Limitez le programme B à un carré de la même largeur que celui de A plus deux (pour les lignes de commentaires supplémentaires sur le bord inférieur), tournez-le CCW et giflez-le à droite du programme A et vous obtenez la solution ci-dessus.
L'ancienne approche
Essayez-le en ligne!
Sortie de ce qui précède
la source