Програма самообертання на 90 °


20

Вступ

Напишіть повну програму, яка обертає прямокутний блок символів ASCII на 90 градусів за годинниковою стрілкою. Коли сама програма повертається на 90 градусів за годинниковою стрілкою, вона обертає блок символів ASCII на 90 проти годинникової стрілки.

Правила

  • Ви багато хто не використовуєте вбудовані модулі, які обертають або переміщують матриці. Наприклад, у MATLAB / Octave rot90та операторі транспонування 'заборонено.
  • Ви повинні написати повну програму, яка використовує STDIN і STDOUT або найближчий еквівалент.
  • Ваша програма повинна бути прямокутною, і припустимо, що вхід також прямокутний.
  • Вхід і вихід є рядками, розділеними на новий рядок, і не матимуть останніх рядків.

Коли ви працюєте зі своїм вихідним кодом як вхідним, ваша програма повинна обертатися на 90 градусів за годинниковою стрілкою. Вихід повинен бути другою програмою на тій же мові, яка обертає свій вхід на 90 градусів проти годинникової стрілки. Коли поверненій програмі надається вихідний код у якості вхідного сигналу, вона повинна виводити вихідний код вихідної програми.

Примітка. Обидві програми повинні працювати для будь-якого вводу, а не лише для власного вихідного коду, тому односимвольна квітка заборонена.

Приклад

Скажіть наступне - це дійсна програма, яка обертає свій вхід на 90 градусів гіпотетичною мовою ExampleLang.

^f a2% 3
lk (^_^&
       v
D8 $4  /

Запускаючи з собою як вхід, він виводить іншу дійсну програму, яка обертає свій вхід проти годинникової стрілки:

D l^
8 kf

$ (a
4 ^2
  _%
  ^ 
/v&3

Ця друга програма, якщо дана сама як вхідна, виводить оригінальну програму. Зауважте, що в порожньому рядку повинно бути чотири пробіли, а в другому та останньому рядку є пробіл, який не може бути відображений у розмітці. Для уточнення:

$ examplelang program < program > rotProg
$ examplelang rotProg < rotProg > program1
$ diff -s program program1
Files program and program1 are identical

Найкоротша програма виграє. Стандартні лазівки заборонені.

Відповіді:


17

CJam, 26 25 21 байт

WqN/":.+""\%"(~+N-~N*

Дякуємо @ MartinBüttner за те, що виграли 4 байти!

Спробуйте в Інтернеті в інтерпретаторі CJam: оригінальна програма | поворотна програма

Це поворотна програма:

W
q
N
/
"
:
.
+
"
"
\
%
"
(
~
+
N
-
~
N
*

Ідея

Ми можемо обертати вхід на чверть обороту за годинниковою стрілкою, розділивши його на стрічкових каналах, змінивши порядок отриманих рядків, перенісши рядки з стовпцями і, нарешті, з'єднавши рядки, розділені рядками каналів.

Так само ми можемо обертати проти годинникової стрілки, перенісши спочатку, а потім перевернувши рядки.

Оскільки вбудована транспозиція zзаборонена, ми можемо використовувати :.+(зменшити за допомогою векторного символу або конкатенації рядкових символів) для досягнення того ж ефекту.

:.+є єдиною частиною вихідного коду, яку неможливо розбити. Ми висуваємо рядки "W%"і ":.+", умовно, повертаємо їх, якщо другий рядок містить передачу рядків, з'єднує, видаляємо всі канали рядків і оцінюємо результат.

Код

W     e# Push -1.
qN/   e# Read all input at split it at linefeeds.
":.+" e# Push a string that, when evaluated, transposes rows and columns.
      e# As explained in the previous section, this does NOT use a built-in
      e# for matrix transposition.
"\%"  e# Push a string that, when evaluated, reverses the rows.
(~    e# Shift out the first character and evaluate it.
      e# For the original code, this evaluates '\', swapping the strings on
      e# the stack. For the rotated code, this evaluates `\n', doing nothing.
+N-   e# Concatenate and remove linefeeds.
      e# The stack now contains:   -1 input "%:.+"   or   -1 input ":.+\%"
~     e# Evaluate the string on top of the stack.
N*    e# Join the resulting array, separating by linefeeds.

Як це так коротко? Однак якщо серйозно, чому не :.+можна розбити кілька рядків?
intrepidcoder

1
@intrepidcoder З синтаксичних причин. Сенс обох :і .залежить від символу після них, а рядкові канали не є дійсними ні за одним із них (і навіть якби вони були, що змінило б значення програми).
Мартін Ендер

6

C (gcc) , 1420 1399 463 байт

Ах ... радість струн невизначеної довжини!

Припускає sizeof(char*) == sizeof(int)і sizeof(char**) <= 16.

Новий підхід

char**L,*r;n,i//j=>]l n}q(( 
,j,q;R(l){for(//,l)l, +;;rr 
r=l=0;(j=     //i=)[r +))oa 
getchar())>10;//,r(r( *l(fh}
r[l++]=j,r[l]=//n(r,c=6=R)c;
0)r=realloc(r,//;rajoL1q()t)
l+2);l&&R((L= //roh=l(,,r"u)
realloc(L,++n*//*fc]l(Lro"p]
16))[n-1]=r,q=//,{t+aR(=f(;q
l);}main(){for//L)e+e&c]{sn[
(R();i<q;i++, //*lglr&o1)t<]
puts(""))for(j//*(=[=ll-(uj+
=n;j--;putchar//rRjrr;lnnp;+
(L[j][i]));}  //a;(;))a[i;0j
////////////////hq;002e)a-=[
////////////////c,01=+r)m-jL

Спробуйте в Інтернеті!

Результат вищезазначеного

Рішення було збентежено легким у підсумку. Ви робите одну програму A, яка обертає речі за годинниковою стрілкою, і одну програму B, яка обертається проти годинникової стрілки:

А

char**L,*r;n,i,j,q;R(l){for(r=l=0;(j=getchar())>10;r[l++]=j,r[l]=0)r=realloc(r,l+2);l&&R((L=realloc(L,16*++n))[n-1]=r,q=l);}main(){for(R();i<q;i++,puts(""))for(j=n;j--;)putchar(L[j][i]);}

Б

char**L,*r;n,i,j,q;R(l){for(r=l=0;(j=getchar())>10;r[l++]=j,r[l]=0)r=realloc(r,l+2);l&&R((L=realloc(L,16*++n))[n-1]=r,q=l);}main(){for(R();q--;puts(""))for(j=0;j<n;j++)putchar(L[j][q]);}

Складіть прямокутник у розумних розмірах і обмежте A до цього, а навколо нього поставте охоронці коментарів:

char**L,*r;n,i//
,j,q;R(l){for(//
r=l=0;(j=     //
getchar())>10;//
r[l++]=j,r[l]=//
0)r=realloc(r,//
l+2);l&&R((L= //
realloc(L,++n*//
16))[n-1]=r,q=//
l);}main(){for//
(R();i<q;i++, //
puts(""))for(j//
=n;j--;putchar//
(L[j][i]));}  //
////////////////
////////////////

Обмежте програму B на квадрат, який має ту саму ширину, як площину для A плюс два (для додаткових рядків коментарів у нижньому краї), оберніть її CCW і ляпніть її праворуч від програми A, і ви отримаєте рішення вище.

Старий підхід

 /*                                       r                               c                                                         c                                                  r               
r                                         a                               o                         n                               o                          s                       a               
a                          r              h                               l                         i       r                       l             r      -     t        r  =    +      h         q     
h                          o              c        0     +                l                         a       o             +         l       6     o      -     u    "   o  j<   +      c  */           
char**L,*s,*r;n,i,q;R(l,c){for(r=l=0;(c=getchar())>10;r[l++]=c,r[l]=0)r=realloc(r,l+2);q=l?l:q;l=r;}main(j){for(;s=R();L[n++]=s)L=realloc(L,16*n);for(;i<q;i++,puts(""))for(j=n;j--;)putchar(L[j][i]);}
 ///                        //          //e////     /     /             //e////                      ///     //            /      //e////    /     //  //  //// ///  /   // ;/   /// //u////      /    
 ///                        //          //g////     /     /             //r////                      ///     //            /      //r////    /     //  //  //// ///  /   // 0/   /// //p////      /    

Спробуйте в Інтернеті!

Результат вищезазначеного

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