Xoay hình ảnh nghệ thuật ASCII


17

Trong số tất cả các ký tự ASCII, có thể dễ dàng nói rằng một số trong số chúng tạo thành các nhóm là các phép quay của cùng một ký tự cơ bản. Ví dụ , V > ^ <. Điều này cho phép khả năng xây dựng nghệ thuật ASCII có thể xoay theo bội số 90 độ và vẫn là nghệ thuật ASCII.

Các thách thức

Mục tiêu của bạn là chơi một chương trình chấp nhận nghệ thuật ASCII và số độ để xoay nó từ STDIN và in nghệ thuật ASCII đã xoay sang STDOUT.

Trên dòng đầu tiên, chương trình của bạn sẽ nhận được một số N. Số này biểu thị chiều rộng và chiều cao của nghệ thuật ASCII.

Sau đó, bạn sẽ nhận được thêm N dòng chính xác của N ký tự (dòng mới không được tính vào số này). Kích thước của nghệ thuật sẽ luôn là một hình vuông, mặc dù nó có thể có phần đệm ở dạng không gian để biến nó thành một hình vuông.

Sau đó, bạn sẽ nhận được thêm một số trên dòng cuối cùng: 90, 180 hoặc 270. Điều này thể hiện hình ảnh sẽ được xoay theo chiều kim đồng hồ bao nhiêu độ.

Lưu ý: Hình ảnh được nhập sẽ chỉ chứa các ký tự có thể được xoay theo số lượng chính xác. Nếu đầu vào không khớp chính xác với các yêu cầu này, không yêu cầu hành vi cụ thể nào.

Là đầu ra, chương trình của bạn sẽ in chính xác N dòng N ký tự, với dòng mới sau mỗi dòng. Hình ảnh phải được xoay sao cho mỗi ký tự trong bản gốc đã được thay thế bằng phiên bản xoay và đã được di chuyển đến đúng vị trí trong ảnh.

Ví dụ (nghệ thuật ASCII không đẹp lắm)

Đầu vào

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

Đầu ra

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

(Xoay theo 90 và 270 sẽ không trông rất tốt vì các ký tự không phải là hình vuông)

Đầu vào

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

Đầu ra

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

Nhân vật được hỗ trợ cần thiết

Đối với tất cả các phép quay (90, 180 và 270), chương trình sẽ có thể xoay:

  • Spaces, +, @, XOkhông bao giờ thay đổi
  • V > < ^
  • | -\ /(được quay bởi 180 chúng giữ nguyên)

Để xoay 180 độ, các ký tự bổ sung này phải được hỗ trợ

  • I N Z % : 0 = S ~ $ # vẫn giữ nguyên
  • P d, ( ), [ ], { }, M W, Và9 6

Ví dụ đầu tiên của bạn chứa chữ thường v, không phải là ký tự được hỗ trợ. Tôi cho rằng nó có nghĩa là một chữ hoa V. Ngoài ra, dòng cuối cùng trong nó không được đệm dài 5 ký tự.
Ilmari Karonen

@IlmariKaronen Bắt tốt. Bây giờ nó đã được sửa.
PhiNotPi

P d, ( ), [ ], { }, M W, and 9 6bao giờ có thể được quay 90 or hoặc 270º?
ajax333221

Không, nghệ thuật sẽ chỉ chứa các ký tự được chỉ định để có thể xoay đúng số lượng. Hai ký tự danh sách đạn cuối cùng chỉ có thể được xoay 180 độ. Chương trình của bạn sẽ không được yêu cầu xoay những thứ này bằng bất kỳ số tiền nào khác.
PhiNotPi

Câu trả lời:


4

GolfScript, 79 75 73 67 ký tự

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

Có vẻ như các giải pháp của tôi và Peter Taylor đang trải qua một sự hội tụ nhất định. Dù sao, có vẻ như bây giờ tôi vẫn còn một vài ký tự. :-) Cảm ơn (và +1) cho cả Peter và sao chép những ý tưởng mà tôi đã đánh cắp một cách đáng xấu hổ.

Mã này hoàn toàn bỏ qua kích thước được đưa ra trên dòng đầu tiên, vì đó là thông tin dư thừa. Nó thậm chí sẽ xử lý các đầu vào với kích thước không vuông, nhưng nó phụ thuộc rất nhiều vào tất cả các dòng đầu vào được đệm vào cùng một chiều dài. Đang cố gắng để xoay các nhân vật P, d, (, ), [, ], {, }, M, W, 9, hoặc 690 hoặc 270 độ có thể sản xuất ra bất ngờ; tất cả các ký tự khác không được ánh xạ lại rõ ràng được giữ nguyên.

Thi thiên Đây là giải pháp 79-char ban đầu của tôi:

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

Hội tụ? : PI thích thủ thuật của bạn để thực hiện tra cứu mà không lặp lại (nhiều) ký tự, nhưng dường như nó không tương thích với thủ thuật của tôi để tránh if.
Peter Taylor

5

C, 336 ký tự

Tôi chắc chắn có chỗ để cải thiện.

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 ký tự)

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)

Yêu cầu mỗi dòng được đệm theo chiều dài nhất định.


bạn có thể cho tôi một ví dụ về chính xác những gì tôi cần đưa vào dấu nhắc? Tôi đã thử thay thế các dòng bằng \n, sao chép bình thường và cân bằng các không gian thành các dòng đầu tiên / cuối cùng và không thể làm cho nó hoạt động
ajax333221

@ ajax333221 Dán nhiều dòng vào hộp cảnh báo chỉ hoạt động trong Chrome, tôi mới nhận thấy lần đầu tiên. Ngoài ra, hãy đảm bảo bạn không sao chép một dòng mới.
sao chép

4

Golfscript ( 80 79 78 77 76 ký tự)

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

NB Nhập "hành vi không xác định" được cho phép bởi đầu vào không hợp lệ có thể tạo ra đầu ra hơi tò mò, vì các ký tự giữ chỗ (bên ngoài ASCII) được sử dụng cho các ký tự nhất định có góc quay 90 độ không được xác định. Ví dụ: (sẽ được ánh xạ tới điểm mã 160, trong ISO-8859-1 và Unicode là không gian không phá vỡ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.