Программа с поворотом на 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, которая вращается против часовой стрелки:

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,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]);}

Сделайте прямоугольник разумных пропорций и ограничьте его этим, а вокруг него разместите защитники комментариев:

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 плюс два (для дополнительных строк комментариев у нижнего края), поверните ее против часовой стрелки и шлепните ее вправо от программы 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.