90°自转程序


20

介绍

编写一个完整的程序,该程序将ASCII字符的矩形块顺时针旋转90度。当程序本身顺时针旋转90度时,它将ASCII字符块逆时针旋转90。

规则

  • 许多人不使用旋转或转置矩阵的内置函数。例如,在MATLAB / Octave中rot90'不允许使用转置运算符。
  • 您必须编写一个使用STDIN和STDOUT或最接近的等效语言的完整程序。
  • 您的程序必须为矩形,并假定输入也是矩形。
  • 输入和输出是用换行符分隔的字符串,并且没有尾随的换行符。

当将其源代码作为输入运行时,您的程序必须将自身顺时针旋转90度。输出必须是使用相同语言的第二个程序,该程序将其输入逆时针旋转90度。当旋转的程序被提供其源代码作为输入时,它应输出原始程序的源代码。

注意:这两个程序都必须能用于任何输入,而不仅仅是它们自己的源代码,因此不允许一个字符的quine。

说下面是一个有效的程序,它以一种假设的语言ExampleLang将输入旋转90度。

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

当以自身作为输入运行时,它将输出另一个有效程序,该程序将其输入逆时针旋转:

D l^
8 kf

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

当第二个程序作为输入提供给自己时,输出原始程序。请注意,空白行应有四个空格,倒数第二行上有一个尾随空格,不能在markdown中呈现。澄清:

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

最短的程序获胜。禁止出现标准漏洞。

Answers:


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的宽度相同,再加上两个(底部边缘的多余注释行),逆时针旋转并将其拍打到程序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////      /    

在线尝试!

上面的输出

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.