Putar gambar seni ASCII

17

Dari semua karakter ASCII, mudah untuk mengatakan bahwa beberapa dari mereka membentuk grup yang merupakan rotasi dari karakter dasar yang sama. Misalnya V > ^ <,. Hal ini memungkinkan kemungkinan untuk membangun seni ASCII yang dapat diputar dengan kelipatan 90 derajat dan masih tetap seni ASCII.

Tantangan

Tujuan Anda adalah mengubah program yang menerima seni ASCII dan jumlah derajat untuk memutarnya dari STDIN, dan mencetak seni ASCII yang diputar ke STDOUT.

Pada baris input pertama, program Anda akan menerima angka N. Angka ini mewakili lebar dan tinggi dari seni ASCII.

Anda kemudian akan menerima N lebih banyak baris dengan karakter persis N masing-masing (baris baru tidak dihitung dalam angka ini). Ukuran karya seni akan selalu berupa bujur sangkar, meskipun mungkin memiliki bantalan dalam bentuk spasi untuk membuatnya menjadi bujur sangkar.

Anda kemudian akan menerima satu nomor lagi pada baris terakhir: 90, 180, atau 270. Ini mewakili berapa derajat searah jarum jam gambar harus diputar.

Catatan: Gambar yang dimasukkan hanya akan berisi karakter yang dapat diputar dengan jumlah yang benar. Jika input tidak sesuai dengan persyaratan ini dengan tepat, tidak ada perilaku spesifik yang diperlukan.

Sebagai output, program Anda harus mencetak persis N baris karakter N, dengan baris baru setelah setiap baris. Gambar harus diputar sehingga setiap karakter dalam aslinya telah diganti oleh versi yang diputar dan telah dipindahkan ke tempat yang benar dalam gambar.

Contoh (seni ASCII tidak terlalu indah)

Memasukkan

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

Keluaran

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

(Rotasi 90 dan 270 tidak akan terlihat sangat bagus karena karakternya bukan kotak)

Memasukkan

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

Keluaran

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

Diperlukan Karakter yang Didukung

Untuk semua rotasi (90, 180, dan 270), program harus dapat memutar:

  • Spasi, +, @, Xdan Oyang tidak pernah berubah
  • V > < ^
  • | -dan \ /(diputar 180 mereka tetap sama)

Untuk rotasi 180 derajat, karakter tambahan ini harus didukung

  • I N Z % : 0 = S ~ $ # yang tetap sama
  • P d, ( ), [ ], { }, M W, Dan9 6
PhiNotPi
sumber
Contoh pertama Anda berisi huruf kecil v, yang bukan karakter yang didukung. Saya menganggap itu dimaksudkan menjadi huruf besar V. Juga, baris terakhir di dalamnya tidak empuk menjadi 5 karakter.
Ilmari Karonen
@IlmariKaronen Tangkapan bagus. Sudah diperbaiki sekarang.
PhiNotPi
P d, ( ), [ ], { }, M W, and 9 6dapatkah diputar 90º atau 270º?
ajax333221
Tidak, karya seni hanya akan berisi karakter yang ditujukan untuk dapat memutar jumlah yang benar. Dua karakter daftar peluru terakhir hanya dapat diputar 180º. Program Anda tidak akan diminta untuk memutarnya dengan jumlah lain.
PhiNotPi

Jawaban:

4

GolfScript, 79 75 73 67 karakter

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

Sepertinya solusi saya dan Peter Taylor sedang mengalami sejumlah konvergensi. Ngomong-ngomong, sepertinya aku masih beberapa karakter di depan untuk saat ini. :-) Terima kasih (dan +1) untuk Peter dan salin untuk ide-ide yang telah saya curi tanpa malu-malu.

Kode ini sepenuhnya mengabaikan ukuran yang diberikan pada baris pertama, karena ini informasi yang berlebihan. Ia bahkan harus menangani input dengan dimensi non-kuadrat, tetapi sangat tergantung pada semua jalur input yang diisi dengan panjang yang sama. Mencoba untuk memutar karakter P, d, (, ), [, ], {, }, M, W, 9, atau 690 atau 270 derajat mungkin menghasilkan output yang tak terduga; semua karakter lain yang tidak dipetakan ulang secara eksplisit dipertahankan tidak berubah.

Ps. Inilah solusi 79-char asli saya:

n%(;)~90/:z{-1%zip}*n*z'V<^>/|-\V>^<'{:c;{{.c?~.c=@if}%}*}:s~2z='P([{M96W}])d's
Ilmari Karonen
sumber
Konvergensi? : PI menyukai trik Anda untuk melakukan pencarian tanpa mengulangi (banyak) karakter, tetapi tampaknya tidak kompatibel dengan trik saya untuk menghindari if.
Peter Taylor
5

C, 336 karakter

Saya yakin ada ruang untuk perbaikan.

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

javascript (181 karakter)

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)

Membutuhkan setiap baris untuk diisi dengan panjang yang diberikan.

salinan
sumber
dapatkah Anda memberi saya contoh tentang apa yang harus saya lakukan dengan cepat? Saya mencoba mengganti baris dengan \n, salin tempel normal dan menyeimbangkan spasi ke baris pertama / terakhir dan gagal membuatnya bekerja
ajax333221
@ ajax333221 Menempelkan beberapa baris ke kotak peringatan hanya berfungsi di Chrome, saya baru memperhatikan untuk pertama kalinya. Pastikan juga Anda tidak menyalin baris terakhir final.
salin
4

Golfscript ( 80 79 78 77 76 karakter)

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

NB Memasuki "perilaku tidak terdefinisi" yang diizinkan oleh input yang tidak valid dapat menghasilkan output yang agak aneh, karena karakter placeholder (di luar ASCII) digunakan untuk karakter tertentu yang rotasinya 90 derajat tidak ditentukan. Sebagai contoh, (akan dipetakan ke titik kode 160, yang dalam ISO-8859-1 dan Unicode adalah ruang non-breaking.

Peter Taylor
sumber