Поворот ASCII художественного изображения


17

Из всех символов ASCII легко сказать, что некоторые из них образуют группы, которые являются вращениями одного и того же основного символа. Например, V > ^ <. Это дает возможность создавать искусство ASCII, которое можно поворачивать на кратные 90 градусов и при этом оставаться искусством ASCII.

Соревнование

Ваша цель - сыграть в гольф программу, которая принимает искусство ASCII и количество градусов, чтобы повернуть его из STDIN, и распечатать повернутое искусство ASCII в STDOUT.

В первой строке ввода ваша программа получит число N. Это число представляет ширину и высоту рисунка ASCII.

Затем вы получите еще N строк ровно по N символов в каждой (новая строка не учитывается в этом числе). Размер искусства всегда будет квадратным, хотя он может иметь отступы в форме пробелов, чтобы сделать его квадратным.

Затем в последней строке вы получите еще одно число: 90, 180 или 270. Это показывает, на сколько градусов по часовой стрелке должно быть повернуто изображение.

Примечание. Введенное изображение будет содержать только символы, которые можно повернуть на правильную величину. Если входные данные не соответствуют этим требованиям точно, никакого конкретного поведения не требуется.

В качестве вывода ваша программа должна напечатать ровно N строк по N символов, с символами новой строки после каждой строки. Изображение должно быть повернуто так, чтобы каждый символ в оригинале был заменен повернутой версией и был перемещен в правильное место на изображении.

Примеры (не очень красивый ASCII art)

вход

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

Выход

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

(Повороты на 90 и 270 выглядят не очень хорошо, потому что символы не квадратные)

вход

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

Выход

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

Обязательные поддерживаемые символы

Для всех вращений (90, 180 и 270) программа должна иметь возможность вращаться:

  • Пробелы, +, @, Xи Oкоторые никогда не изменится
  • V > < ^
  • | -и \ /(повернутый на 180 они остаются прежними)

Для вращения на 180 градусов эти дополнительные символы должны поддерживаться

  • I N Z % : 0 = S ~ $ # которые остаются прежними
  • P d, ( ), [ ], { }, M W, И9 6

Ваш первый пример содержит строчные буквы v, которые не являются поддерживаемыми символами. Я предполагаю, что это должно было быть в верхнем регистре V. Кроме того, последняя строка в нем не дополняется до 5 символов.
Илмари Каронен

@IlmariKaronen Хороший улов. Это сейчас исправлено.
PhiNotPi

P d, ( ), [ ], { }, M W, and 9 6можно ли повернуть на 90º или 270º?
ajax333221

Нет, рисунок будет содержать только символы, предназначенные для поворота правильного количества. Последние два символа списка маркеров можно повернуть только на 180º. Ваша программа не будет просить изменить их на любую другую сумму.
PhiNotPi

Ответы:


4

GolfScript, 79 75 73 67 символов

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

Похоже, решения моего и Питера Тейлора испытывают определенную конвергенцию. Во всяком случае, похоже, у меня еще несколько символов впереди. :-) Спасибо (и +1) и Питеру, и копировать за идеи, которые я бессовестно украл.

Этот код полностью игнорирует размер, указанный в первой строке, поскольку это избыточная информация. Он должен даже обрабатывать вводы с неквадратными размерами, но это очень сильно зависит от того, все ли строки ввода дополняются до одинаковой длины. Попытка повернуть символы P, d, (, ), [, ], {, }, M, W, 9, или 6на 90 или 270 градусов может привести к непредвиденному выход; все остальные символы, которые не были явно переназначены, остаются без изменений.

Ps. Вот мое оригинальное решение на 79 символов:

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

Конвергенция? : PI понравился твой трюк для выполнения поиска без повторения (многих) символов, но он, похоже, не совместим с моим трюком для избежания if.
Питер Тейлор

5

C 336 символов

Я уверен, что есть место для улучшения.

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 символ)

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)

Требуется, чтобы каждая строка была дополнена до заданной длины.


Можете ли вы дать мне пример того, что именно мне нужно поставить на подсказку? Я попытался заменить строки \nобычным копированием, вставкой и балансировкой пробелов в первую / последнюю строки, но не смог заставить его работать
ajax333221

@ ajax333221 Вставка нескольких строк в окно предупреждения работает только в Chrome, я только что заметил это впервые. Также убедитесь, что вы не копируете последний перевод строки.
копия

4

Golfscript ( 80 79 78 77 76 символов)

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

NB. Ввод «неопределенного поведения», разрешенного неправильным вводом, может привести к несколько любопытным выводам из-за символов-заполнителей (вне ASCII), используемых для определенных символов, поворот которых на 90 градусов не определен. Например, (будет сопоставлен кодовой точке 160, которая в ISO-8859-1 и Unicode представляет собой неразрывный пробел.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.