Girar una imagen de arte ASCII

17

De todos los caracteres ASCII, es fácil decir que algunos de ellos forman grupos que son rotaciones del mismo carácter básico. Por ejemplo, V > ^ <. Esto permite la posibilidad de construir arte ASCII que puede rotarse por múltiplos de 90 grados y seguir siendo arte ASCII.

El reto

Su objetivo es jugar al golf un programa que acepte el arte ASCII y la cantidad de grados para rotarlo desde STDIN, e imprima el arte ASCII rotado en STDOUT.

En la primera línea de entrada, su programa recibirá un número N. Este número representa el ancho y la altura del arte ASCII.

Luego recibirá N más líneas de exactamente N caracteres cada una (la nueva línea no se cuenta en este número). El tamaño del arte siempre será un cuadrado, aunque puede tener relleno en forma de espacios para hacerlo cuadrado.

Luego recibirá un número más en una línea final: 90, 180 o 270. Esto representa cuántos grados en el sentido de las agujas del reloj se debe girar la imagen.

Nota: La imagen ingresada solo contendrá caracteres que pueden rotarse en la cantidad correcta. Si la entrada no coincide exactamente con estos requisitos, no se requiere un comportamiento específico.

Como salida, su programa debe imprimir exactamente N líneas de N caracteres, con nuevas líneas después de cada línea. La imagen debe girarse para que cada carácter del original haya sido reemplazado por una versión girada y haya sido movido al lugar correcto en la imagen.

Ejemplos (arte ASCII no muy bonito)

Entrada

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

Salida

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

(Las rotaciones de 90 y 270 no se verán muy bien porque los personajes no son cuadrados)

Entrada

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

Salida

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

Caracteres admitidos requeridos

Para todas las rotaciones (90, 180 y 270), el programa debe poder rotar:

  • Espacios, +, @, Xy Olos que nunca cambian
  • V > < ^
  • | -y \ /(rotados por 180 permanecen igual)

Para una rotación de 180 grados, estos caracteres adicionales deben ser compatibles

  • I N Z % : 0 = S ~ $ # que permanecen igual
  • P d, ( ), [ ], { }, M W, Y9 6
PhiNotPi
fuente
Su primer ejemplo contiene minúsculas v, que no es un carácter compatible. Supongo que estaba destinado a ser mayúscula V. Además, la última línea no está acolchada para tener 5 caracteres de largo.
Ilmari Karonen
@IlmariKaronen Buena captura. Ya está arreglado.
PhiNotPi
P d, ( ), [ ], { }, M W, and 9 6¿Se puede girar 90º o 270º?
ajax333221
No, el arte solo contendrá caracteres designados para poder rotar la cantidad correcta. Los últimos dos caracteres de la lista de viñetas se pueden rotar 180º solamente. No se le pedirá a su programa que los rote por ningún otro monto.
PhiNotPi

Respuestas:

4

GolfScript, 79 75 73 67 caracteres

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

Parece que mis soluciones y las de Peter Taylor están experimentando cierta convergencia. De todos modos, parece que todavía tengo algunos caracteres por delante. :-) Gracias (y +1) tanto a Peter como a la copia por ideas que robé descaradamente.

Este código ignora completamente el tamaño dado en la primera línea, ya que es información redundante. Incluso debería manejar entradas con dimensiones no cuadradas, pero depende mucho de que todas las líneas de entrada se rellenen a la misma longitud. Tratando de rotar los caracteres P, d, (, ), [, ], {, }, M, W, 9, o 6por 90 o 270 grados pueden producir una salida inesperada; todos los demás caracteres que no se reasignan explícitamente se conservan sin cambios.

PD. Aquí está mi solución original de 79 caracteres:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's
Ilmari Karonen
fuente
¿Convergencia? : A PI le gustó tu truco para hacer la búsqueda sin repetir (muchos) caracteres, pero no parece ser compatible con mi truco para evitar el if.
Peter Taylor
5

C, 336 caracteres

Estoy seguro de que hay margen de mejora.

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
fuente
4

javascript (181 caracteres)

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)

Requiere que cada línea se rellene a la longitud dada.

Copiar
fuente
¿Me puede dar un ejemplo de lo que necesito poner en el aviso? Intenté reemplazar líneas con \ncopia normal, pegar y equilibrar espacios en la primera / última línea y no
pude
@ ajax333221 Pegar varias líneas en un cuadro de alerta solo funciona en Chrome, me acabo de dar cuenta por primera vez. También asegúrese de no copiar una nueva línea final.
copiar
4

Golfscript ( 80 79 78 77 76 caracteres)

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

NB Introducir el "comportamiento indefinido" permitido por una entrada no válida puede producir resultados algo curiosos, debido a los caracteres de marcador de posición (fuera de ASCII) utilizados para ciertos caracteres cuya rotación de 90 grados no está definida. Por ejemplo, (se asignaría al punto de código 160, que en ISO-8859-1 y Unicode es un espacio sin interrupciones.

Peter Taylor
fuente