Оберніть зображення зображення ASCII


17

З усіх символів ASCII неважко сказати, що деякі з них утворюють групи, які є обертаннями того самого основного символу. Наприклад, V > ^ <. Це дає можливість побудувати мистецтво ASCII, яке можна обертати кратними на 90 градусів і все ще залишатись мистецтвом ASCII.

Змагання

Ваша мета - грати в програму, яка приймає ASCII мистецтво та кількість градусів, щоб повернути його від STDIN, і друкує обернене мистецтво ASCII на STDOUT.

У першому рядку введення ваша програма отримає число N. Це число представляє ширину та висоту мистецтва ASCII.

Потім ви отримаєте ще N рядків з рівно N символів (новий рядок не враховується в цьому числі). Розмір мистецтва завжди буде квадратним, хоча воно може мати прокладки у вигляді пробілів, щоб зробити його квадратом.

Потім ви отримаєте ще одне число на остаточному рядку: 90, 180 або 270. Це означає, на скільки градусів за годинниковою стрілкою слід обертати зображення.

Примітка. Введене зображення буде містити лише символи, які можна повернути на потрібну кількість. Якщо дані точно не відповідають цим вимогам, конкретної поведінки не потрібно.

Як вихід, ваша програма повинна надрукувати рівно N рядків з N символів, з новими рядками після кожного рядка. Зображення слід обертати таким чином, щоб кожен символ в оригіналі був замінений на обертану версію і переміщений у потрібне місце на зображенні.

Приклади (не дуже гарне мистецтво ASCII)

Вхідні дані

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 градусів може призвести до непередбаченого вихід; всі інші символи, які не є чітко перезаписаними, зберігаються незмінними.

Пс. Ось моє оригінальне 79-char рішення:

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 Вставка декількох рядків у поле сповіщення працює лише в Chrome, я щойно помітив уперше. Також переконайтеся, що ви не копіюєте остаточний новий рядок.
копія

4

Гольфскрипт ( 80 79 78 77 76 символів)

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

Примітка. Введення "невизначеної поведінки", дозволеного неправильним введенням, може дати дещо цікавий вихід, оскільки символи-заповнювачі (поза ASCII), які використовуються для певних символів, обертання яких на 90 градусів не визначено. Наприклад, (буде відображено в кодову точку 160, яка в ISO-8859-1 та Unicode є нерозривним простором.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.