Obróć obraz artystyczny ASCII

17

Ze wszystkich znaków ASCII łatwo jest stwierdzić, że niektóre z nich tworzą grupy będące rotacjami tego samego podstawowego znaku. Na przykład V > ^ <. To pozwala na konstruowanie sztuki ASCII, która może być obracana o wielokrotności 90 stopni i nadal pozostaje sztuką ASCII.

Wyzwanie

Twoim celem jest zagranie w golfa w programie, który akceptuje grafikę ASCII i liczbę stopni, aby obrócić ją ze STDIN i drukuje obróconą grafikę ASCII do STDOUT.

W pierwszym wierszu wprowadzania program otrzyma numer N. Liczba ta reprezentuje szerokość i wysokość grafiki ASCII.

Otrzymasz następnie N kolejnych linii dokładnie N znaków (nowy wiersz nie jest liczony w tej liczbie). Wielkość sztuki zawsze będzie kwadratem, chociaż może mieć wypełnienie w postaci spacji, aby uczynić ją kwadratem.

Otrzymasz jeszcze jeden numer w ostatnim wierszu: 90, 180 lub 270. To pokazuje, o ile stopni należy obrócić zdjęcie w prawo.

Uwaga: Wprowadzony obraz będzie zawierał tylko znaki, które można obrócić o odpowiednią wartość. Jeśli dane wejściowe nie spełniają dokładnie tych wymagań, nie jest wymagane określone zachowanie.

Jako wynik program powinien wypisać dokładnie N linii N znaków, z nowymi liniami po każdej linii. Obraz należy obrócić, aby każdy znak w oryginale został zastąpiony wersją obróconą i został przeniesiony w odpowiednie miejsce na obrazie.

Przykłady (niezbyt piękna sztuka ASCII)

Wejście

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

Wynik

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

(Obroty o 90 i 270 nie będą wyglądać zbyt dobrze, ponieważ postacie nie są kwadratami)

Wejście

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

Wynik

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

Wymagane obsługiwane znaki

W przypadku wszystkich obrotów (90, 180 i 270) program powinien mieć możliwość obracania:

  • Przestrzenie, +, @, Xi Októra nigdy się nie zmieniają
  • V > < ^
  • | -i \ /(obrócone o 180 pozostają takie same)

W przypadku obrotu o 180 stopni te dodatkowe znaki muszą być obsługiwane

  • I N Z % : 0 = S ~ $ # które pozostają takie same
  • P d, ( ), [ ], { }, M W, I9 6
PhiNotPi
źródło
Twój pierwszy przykład zawiera małe litery v, które nie są obsługiwanymi postaciami. Zakładam, że miała to być wielka litera V. Ponadto ostatnia linia nie jest wypełniona długością 5 znaków.
Ilmari Karonen
@IlmariKaronen Dobry połów. Teraz jest naprawione.
PhiNotPi
P d, ( ), [ ], { }, M W, and 9 6czy kiedykolwiek można obrócić o 90º lub 270º?
ajax333221
Nie, grafika będzie zawierać tylko postacie, które są wyznaczone do obracania o odpowiednią liczbę. Ostatnie dwa znaki na liście punktorów można obracać tylko o 180º. Twój program nie zostanie poproszony o obrócenie ich o jakąkolwiek inną kwotę.
PhiNotPi

Odpowiedzi:

4

GolfScript, 79 75 73 67 znaków

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

Wygląda na to, że rozwiązania moje i Petera Taylora ulegają pewnej konwergencji. W każdym razie wygląda na to, że wciąż mam przed sobą kilka znaków. :-) Dziękuję (i +1) zarówno Peterowi, jak i kopiuję za pomysły, które bezwstydnie ukradłem.

Ten kod całkowicie ignoruje rozmiar podany w pierwszym wierszu, ponieważ jest to nadmiarowa informacja. Powinien nawet obsługiwać dane wejściowe o wymiarach innych niż kwadratowe, ale w dużym stopniu zależy to od wypełnienia wszystkich linii wejściowych na tej samej długości. Próbuje obrócić znaków P, d, (, ), [, ], {, }, M, W, 9, lub 690 lub 270 stopni mogą powodować nieoczekiwane wyjścia; wszystkie pozostałe znaki, które nie są jawnie odwzorowane, zostają zachowane bez zmian.

Ps. Oto moje oryginalne 79-znakowe rozwiązanie:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's
Ilmari Karonen
źródło
Konwergencja? : PI polubił twoją sztuczkę polegającą na wyszukiwaniu bez powtarzania (wielu) znaków, ale wydaje się, że nie jest kompatybilna z moją sztuczką polegającą na unikaniu if.
Peter Taylor
5

C, 336 znaków

Jestem pewien, że jest miejsce na ulepszenia.

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
źródło
4

javascript (181 znaków)

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)

Wymaga dopełnienia każdej linii do podanej długości.

Kopiuj
źródło
czy możesz podać mi przykład, co dokładnie muszę wprowadzić w trybie natychmiastowym? Próbowałem zastąpić wiersze \n, normalne kopiowanie wkleić i wyrównać spacje do pierwszych / ostatnich wierszy i nie udało mi się, aby działało
ajax333221,
@ ajax333221 Wklejanie wielu wierszy do pola alertu działa tylko w Chrome, właśnie zauważyłem po raz pierwszy. Upewnij się także, że nie kopiujesz ostatniego nowego wiersza.
skopiuj
4

Golfscript ( 80 79 78 77 76 znaków)

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

Uwaga: Wprowadzenie „nieokreślonego zachowania” dozwolonego przez nieprawidłowe dane wejściowe może wywołać nieco ciekawy wynik, ponieważ znaki zastępcze (poza ASCII) są używane dla niektórych znaków, których obrót o 90 stopni nie jest zdefiniowany. Na przykład (zostałby zmapowany do punktu kodowego 160, który w ISO-8859-1 i Unicode jest przestrzenią niezniszczalną.

Peter Taylor
źródło