Faire pivoter une image d'art ASCII

17

De tous les caractères ASCII, il est facile de dire que certains d'entre eux forment des groupes qui sont des rotations du même caractère de base. Par exemple V > ^ <,. Cela permet la possibilité de construire de l'art ASCII qui peut être tourné par multiples de 90 degrés et qui reste toujours de l'art ASCII.

Le défi

Votre objectif est de jouer à un programme qui accepte l'art ASCII et le nombre de degrés pour le faire pivoter depuis STDIN, et imprime l'art ASCII tourné vers STDOUT.

Sur la première ligne de saisie, votre programme recevra un numéro N. Ce nombre représente la largeur et la hauteur de l'art ASCII.

Vous recevrez alors N lignes supplémentaires d'exactement N caractères chacune (la nouvelle ligne n'est pas comptée dans ce nombre). La taille de l'art sera toujours un carré, bien qu'elle puisse avoir un rembourrage sous forme d'espaces pour en faire un carré.

Vous recevrez alors un autre numéro sur une dernière ligne: 90, 180 ou 270. Cela représente le nombre de degrés dans le sens horaire que l'image doit pivoter.

Remarque: L'image entrée ne contiendra que des caractères pouvant être tournés de la bonne quantité. Si l'entrée ne correspond pas exactement à ces exigences, aucun comportement spécifique n'est requis.

En sortie, votre programme doit imprimer exactement N lignes de N caractères, avec des retours à la ligne après chaque ligne. L'image doit être pivotée de sorte que chaque caractère de l'original ait été remplacé par une version pivotée et a été déplacé au bon endroit dans l'image.

Exemples (pas très beau art ASCII)

Contribution

5
<- ||
|  |V
+->+ 
   |O
<--+ 
90

Production

^ +-^
| | |
| V  
+-+--
 O <-

(Les rotations de 90 et 270 ne seront pas très bonnes car les personnages ne sont pas des carrés)

Contribution

6
+ /\ +
| \ \|
(  \/|
 \   )
I \ / 
:) V $
180

Production

$ ^ (:
 / \ I
(   \ 
|/\  )
|\ \ |
+ \/ +

Caractères pris en charge requis

Pour toutes les rotations (90, 180 et 270), le programme doit pouvoir tourner:

  • Espaces, +, @, Xet Oqui ne changera jamais
  • V > < ^
  • | -et \ /(tourné de 180, ils restent les mêmes)

Pour une rotation à 180 degrés, ces caractères supplémentaires doivent être pris en charge

  • I N Z % : 0 = S ~ $ # qui restent les mêmes
  • P d, ( ), [ ], { }, M WEt9 6
PhiNotPi
la source
Votre premier exemple contient le minuscule v, qui n'est pas un caractère pris en charge. Je suppose que c'était censé être une majuscule V. De plus, la dernière ligne ne contient pas 5 caractères.
Ilmari Karonen
@IlmariKaronen Bonne prise. C'est réparé maintenant.
PhiNotPi
P d, ( ), [ ], { }, M W, and 9 6peut jamais être tourné à 90º ou 270º?
ajax333221
Non, l'art ne contiendra que des personnages désignés pour pouvoir faire pivoter le montant correct. Les deux derniers caractères de la liste à puces ne peuvent être tournés que de 180 °. Votre programme ne sera pas invité à les faire pivoter d'un autre montant.
PhiNotPi

Réponses:

4

GolfScript, 79 75 73 67 caractères

n%(;)~90/{-1%zip{{.'V<^>P(d)[{]}M9W6/\/\|-|'4/\+{.}%n+.@?)=}%}%}*n*

Il semble que mes solutions et celles de Peter Taylor connaissent une certaine convergence. Quoi qu'il en soit, on dirait que j'ai encore quelques caractères devant pour le moment. :-) Merci (et +1) à Peter et à la copie pour les idées que j'ai volées sans vergogne.

Ce code ignore complètement la taille indiquée sur la première ligne, car il s'agit d'informations redondantes. Il devrait même gérer les entrées avec des dimensions non carrées, mais cela dépend beaucoup de toutes les lignes d'entrée remplies à la même longueur. En essayant de faire tourner les caractères P, d, (, ), [, ], {, }, M, W, 9, ou 6de 90 ou 270 degrés peuvent produire des résultats inattendus; tous les autres caractères qui ne sont pas explicitement remappés sont conservés inchangés.

Ps. Voici ma solution originale de 79 caractères:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's
Ilmari Karonen
la source
Convergence? : PI a aimé votre astuce pour faire la recherche sans répéter (beaucoup) de caractères, mais il ne semble pas compatible avec mon astuce pour éviter le if.
Peter Taylor
5

C, 336 caractères

Je suis sûr qu'il y a place à amélioration.

char*a="<^>V|-|-/\\/\\ppdd(())[[]]{{}}MMWW9966",*p,*q;
n,x,y,r;
z(c){
    return(q=strchr(a,c))?a[(q-a&-4)+(q-a+r&3)]:c;
}
#define A(r)(r&3^3?1-r%4:0)*
f(r){
    return A(r)x+A(~-r)y+(r&2)/2*~-n;
}
main(){
    scanf("%d\n",&n);
    p=q=malloc(n*n+1);
    for(y=n;y--;q+=n)gets(q);
    scanf("%d",&r);
    for(r/=90;++y<n;puts(""))for(x=0;x<n;x++)putchar(z(p[f(r)+n*f(r+1)],r));
}
ugoren
la source
4

javascript (181 caractères)

a=prompt(f="V<^>V|-|/\\/P(d)P([{]}[}M9W6M9").split(n="\n");c=a.pop()/90;for(
b=a[0];c--;a=d.split(n))for(e=d=n;e<b*b;++e%b||(d+=n))d+=f[f.indexOf(g=a[b-e
%b][e/b|0])+1||a]||g;alert(d)

Nécessite que chaque ligne soit rembourrée à la longueur donnée.

copie
la source
pouvez-vous me donner un exemple de ce que je dois exactement mettre sur invite? J'ai essayé de remplacer les lignes par \n, copier-coller normal et équilibrer les espaces sur les premières / dernières lignes et je n'ai pas réussi à le faire fonctionner
ajax333221
@ ajax333221 Coller plusieurs lignes dans une boîte d'alerte ne fonctionne que dans Chrome, je viens de le remarquer pour la première fois. Assurez-vous également que vous ne copiez pas une nouvelle ligne finale.
copie du
4

Golfscript ( 80 79 78 77 76 caractères)

n%(;)~90/{zip{-1%{'V<^>V|-|/\/''Pd()[]{}MW96'{.4*}%4/128,+{.}%+.@?)=}%}%}*n*

NB La saisie du "comportement indéfini" autorisé par une entrée non valide peut produire une sortie quelque peu curieuse, en raison des caractères d'espace réservé (en dehors de l'ASCII) utilisés pour certains caractères dont la rotation de 90 degrés n'est pas définie. Par exemple, (serait mappé au point de code 160, qui dans ISO-8859-1 et Unicode est un espace insécable.

Peter Taylor
la source