Drehen Sie ein ASCII-Bild

17

Aus allen ASCII-Zeichen ist leicht zu ersehen, dass einige von ihnen Gruppen bilden, bei denen es sich um Rotationen desselben Grundzeichens handelt. Zum Beispiel V > ^ <. Dies ermöglicht die Erstellung von ASCII-Grafiken, die um ein Vielfaches von 90 Grad gedreht werden können und dennoch ASCII-Grafiken bleiben.

Die Herausforderung

Ihr Ziel ist es, ein Programm zu entwickeln, das ASCII-Grafiken und die Anzahl der Grad akzeptiert, um diese von STDIN zu drehen, und die gedrehten ASCII-Grafiken an STDOUT zu drucken.

In der ersten Eingabezeile erhält Ihr Programm die Nummer N. Diese Nummer steht für die Breite und Höhe der ASCII-Grafik.

Sie erhalten dann N weitere Zeilen mit jeweils genau N Zeichen (die neue Zeile wird bei dieser Nummer nicht mitgezählt). Die Größe der Kunst wird immer ein Quadrat sein, obwohl sie möglicherweise ein Auffüllen in Form von Leerzeichen aufweist, um ein Quadrat zu bilden.

Sie erhalten dann eine weitere Zahl in einer letzten Zeile: 90, 180 oder 270. Dies gibt an, um wie viel Grad das Bild im Uhrzeigersinn gedreht werden soll.

Hinweis: Das eingegebene Bild enthält nur Zeichen, die um den richtigen Betrag gedreht werden können. Wenn die Eingabe nicht genau diesen Anforderungen entspricht, ist kein bestimmtes Verhalten erforderlich.

Als Ausgabe sollte Ihr Programm genau N Zeilen mit N Zeichen mit Zeilenumbrüchen nach jeder Zeile ausgeben. Das Bild sollte gedreht werden, damit jedes Zeichen im Original durch eine gedrehte Version ersetzt und an die richtige Stelle im Bild verschoben wird.

Beispiele (nicht sehr schöne ASCII-Kunst)

Eingang

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

Ausgabe

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

(Drehungen um 90 und 270 sehen nicht besonders gut aus, da die Zeichen keine Quadrate sind.)

Eingang

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

Ausgabe

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

Erforderliche unterstützte Zeichen

Für alle Umdrehungen (90, 180 und 270) sollte das Programm in der Lage sein, sich zu drehen:

  • Spaces, +, @, Xund Odie nie ändern
  • V > < ^
  • | -und \ /(um 180 gedreht bleiben sie gleich)

Für eine 180-Grad-Drehung müssen diese zusätzlichen Zeichen unterstützt werden

  • I N Z % : 0 = S ~ $ # die gleich bleiben
  • P d, ( ), [ ], { }, M W, Und9 6
PhiNotPi
quelle
Ihr erstes Beispiel enthält den Kleinbuchstaben v, bei dem es sich nicht um ein unterstütztes Zeichen handelt. Ich nehme an, es sollte ein Großbuchstabe sein V. Außerdem ist die letzte Zeile nicht mit 5 Zeichen aufgefüllt.
Ilmari Karonen
@IlmariKaronen Guter Fang. Es ist jetzt behoben.
PhiNotPi
P d, ( ), [ ], { }, M W, and 9 6kann jemals um 90º oder 270º gedreht werden?
Ajax333221
Nein, die Grafik enthält nur Zeichen, die dazu bestimmt sind, den richtigen Betrag zu drehen. Die letzten beiden Zeichen der Aufzählungsliste können nur um 180 ° gedreht werden. Ihr Programm wird nicht aufgefordert, diese um einen anderen Betrag zu drehen.
PhiNotPi

Antworten:

4

GolfScript, 79 75 73 67 Zeichen

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

Meine und Peter Taylors Lösungen scheinen eine gewisse Konvergenz zu erfahren. Wie auch immer, es sieht so aus, als ob ich noch ein paar Zeichen voraus bin. :-) Danke (und +1) an Peter und copy für die Ideen, die ich schamlos gestohlen habe.

Dieser Code ignoriert die in der ersten Zeile angegebene Größe vollständig, da es sich um redundante Informationen handelt. Es sollte sogar Eingaben mit nicht quadratischen Dimensionen verarbeiten, aber es hängt sehr stark davon ab, dass alle Eingabezeilen auf die gleiche Länge aufgefüllt werden. Der Versuch , die Zeichen zu drehen P, d, (, ), [, ], {, }, M, W,9 , oder 6um 90 oder 270 Grad können unerwartete Ausgabe zu erzeugen; Alle anderen Zeichen, die nicht explizit neu zugeordnet werden, bleiben unverändert.

Ps. Hier ist meine ursprüngliche 79-Zeichen-Lösung:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's
Ilmari Karonen
quelle
Konvergenz? : PI mochte Ihren Trick, um die Suche durchzuführen, ohne (viele) Zeichen zu wiederholen, aber er scheint nicht mit meinem Trick zum Vermeiden des Wenn kompatibel zu sein.
Peter Taylor
5

C 336 Zeichen

Ich bin sicher, es gibt Raum für Verbesserungen.

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

Javascript (181 Zeichen)

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)

Erfordert, dass jede Zeile auf die angegebene Länge aufgefüllt wird.

Kopieren
quelle
Kannst du mir ein Beispiel geben, was genau ich brauche, um prompt anzulegen? Ich habe versucht, Zeilen durch \n, normales Kopieren, Einfügen und Ausgleichen von Leerzeichen in die erste / letzte Zeile zu
ersetzen
@ ajax333221 Das Einfügen mehrerer Zeilen in ein Benachrichtigungsfeld funktioniert nur in Chrome. Dies ist mir gerade zum ersten Mal aufgefallen. Stellen Sie außerdem sicher, dass Sie keine letzte Zeile kopieren.
Kopieren
4

Golfscript ( 80 79 78 77 76 Zeichen)

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

NB Die Eingabe des "undefinierten Verhaltens", das bei ungültiger Eingabe zulässig ist, kann zu merkwürdigen Ergebnissen führen, da für bestimmte Zeichen, deren Drehung um 90 Grad nicht definiert ist, Platzhalterzeichen (außerhalb von ASCII) verwendet werden. Beispiel: (Wird dem Codepunkt 160 zugeordnet, der in ISO-8859-1 und Unicode ein nicht unterbrechender Bereich ist.

Peter Taylor
quelle