Ruota un'immagine d'arte ASCII


17

Di tutti i caratteri ASCII, è facile dire che alcuni di essi formano gruppi che sono rotazioni dello stesso carattere di base. Ad esempio V > ^ <,. Ciò consente la possibilità di costruire arte ASCII che può essere ruotata di multipli di 90 gradi e rimanere ancora arte ASCII.

La sfida

Il tuo obiettivo è giocare a golf un programma che accetta l'arte ASCII e il numero di gradi per ruotarlo da STDIN e stampa l'arte ASCII ruotata su STDOUT.

Sulla prima riga di input, il tuo programma riceverà un numero N. Questo numero rappresenta la larghezza e l'altezza dell'arte ASCII.

Riceverai quindi N più righe di esattamente N caratteri ciascuna (la nuova riga non viene conteggiata in questo numero). La dimensione dell'arte sarà sempre una piazza, sebbene possa avere un'imbottitura sotto forma di spazi per renderla una piazza.

Riceverai quindi un altro numero su una riga finale: 90, 180 o 270. Ciò rappresenta di quanti gradi in senso orario l'immagine deve essere ruotata.

Nota: l'immagine immessa conterrà solo caratteri che possono essere ruotati della quantità corretta. Se l'input non corrisponde esattamente a questi requisiti, non è richiesto alcun comportamento specifico.

Come output, il tuo programma dovrebbe stampare esattamente N righe di N caratteri, con nuove righe dopo ogni riga. L'immagine deve essere ruotata in modo tale che ogni personaggio nell'originale sia stato sostituito da una versione ruotata e sia stato spostato nella posizione corretta nell'immagine.

Esempi (arte ASCII non molto bella)

Ingresso

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

Produzione

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

(Le rotazioni di 90 e 270 non sembreranno molto buone perché i personaggi non sono quadrati)

Ingresso

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

Produzione

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

Personaggi supportati richiesti

Per tutte le rotazioni (90, 180 e 270), il programma dovrebbe essere in grado di ruotare:

  • Spaces, +, @, Xe Oche non è mai il cambiamento
  • V > < ^
  • | -e \ /(ruotati di 180 rimangono gli stessi)

Per una rotazione di 180 gradi, questi caratteri aggiuntivi devono essere supportati

  • I N Z % : 0 = S ~ $ # che rimangono gli stessi
  • P d, ( ), [ ], { }, M W, E9 6

Il tuo primo esempio contiene le lettere minuscole v, che non sono caratteri supportati. Suppongo che doveva essere in maiuscolo V. Inoltre, l'ultima riga al suo interno non è imbottita per essere lunga 5 caratteri.
Ilmari Karonen,

@IlmariKaronen Buona cattura. Ora è riparato.
PhiNotPi

P d, ( ), [ ], { }, M W, and 9 6può mai essere ruotato di 90º o 270º?
ajax333221

No, la grafica conterrà solo caratteri designati per poter ruotare la quantità corretta. Gli ultimi due elenchi di punti elenco possono essere ruotati solo di 180º. Al tuo programma non verrà chiesto di ruotarli di nessun altro importo.
PhiNotPi

Risposte:


4

GolfScript, 79 75 73 67 caratteri

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

Sembra che le mie soluzioni e quelle di Peter Taylor stiano sperimentando una certa convergenza. Ad ogni modo, sembra che io sia ancora qualche carattere avanti per ora. :-) Grazie (e +1) sia a Peter che alla copia per idee che ho spudoratamente rubato.

Questo codice ignora completamente le dimensioni fornite nella prima riga, poiché sono informazioni ridondanti. Dovrebbe anche gestire input con dimensioni non quadrate, ma dipende molto dal fatto che tutte le linee di input vengano riempite con la stessa lunghezza. Cercando di ruotare i caratteri P, d, (, ), [, ], {, }, M, W, 9, o 6da 90 o 270 gradi possono produrre un output inaspettato; tutti gli altri personaggi che non sono esplicitamente rimappati vengono mantenuti invariati.

Ps. Ecco la mia soluzione originale a 79 caratteri:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's

Convergenza? : A PI è piaciuto il tuo trucco per fare la ricerca senza ripetere (molti) caratteri, ma non sembra essere compatibile con il mio trucco per evitare l'if.
Peter Taylor,

5

C, 336 caratteri

Sono sicuro che c'è spazio per miglioramenti.

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));
}

4

javascript (181 caratteri)

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)

Richiede che ogni linea sia riempita per la lunghezza data.


puoi darmi un esempio di cosa devo esattamente mettere sul prompt? Ho provato a sostituire le righe con la \nnormale copia incolla e a bilanciare gli spazi con la prima / ultima riga e non sono riuscito a farlo funzionare
ajax333221

@ ajax333221 Incollare più righe in una casella di avviso funziona solo in Chrome, l'ho notato per la prima volta. Assicurati anche di non copiare una nuova riga finale.
copia il

4

Golfscript ( 80 79 78 77 76 caratteri)

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

NB L'inserimento del "comportamento indefinito" consentito da un input non valido può produrre un output un po 'curioso, a causa dei caratteri segnaposto (fuori ASCII) utilizzati per alcuni caratteri la cui rotazione di 90 gradi non è definita. Per esempio,( verrebbe mappato al punto di codice 160, che in ISO-8859-1 e Unicode è uno spazio non-break.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.