90 ° 자체 회전 프로그램


20

소개

ASCII 문자의 사각형 블록을 시계 방향으로 90도 회전시키는 완전한 프로그램을 작성하십시오. 프로그램 자체가 시계 방향으로 90도 회전하면 ASCII 문자 블록이 시계 반대 방향으로 90도 회전합니다.

규칙

  • 행렬을 회전 시키거나 조바꿈하는 내장 기능을 사용하지 않는 경우가 많습니다. 예를 들어 MATLAB / Octave rot90및 조옮김 연산자에서' 를 사용할 수 없습니다.
  • STDIN 및 STDOUT 또는 가장 유사한 항목을 사용하는 완전한 프로그램을 작성해야합니다.
  • 프로그램은 직사각형이어야하며 입력도 직사각형이라고 가정하십시오.
  • 입력과 출력은 줄 바꿈으로 구분 된 문자열이며 후행 줄 바꿈이 없습니다.

소스 코드를 입력으로 실행하면 프로그램이 시계 방향으로 90도 회전해야합니다. 출력은 시계 반대 방향으로 90도 회전하는 동일한 언어의 두 번째 프로그램이어야합니다. 회전 된 프로그램에 소스 코드가 입력되면 원래 프로그램의 소스 코드를 출력해야합니다.

참고 : 두 프로그램을 위해 일해야 어떤 자체 소스 코드뿐만 아니라 입력에 하므로 한 문자 퀴네는 허용되지 않습니다.

다음은 가상 언어 ExampleLang에서 입력을 90도 회전시키는 유효한 프로그램이라고 가정하십시오.

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

자신을 입력으로 실행하면 입력을 시계 반대 방향으로 회전시키는 다른 유효한 프로그램을 출력합니다.

D l^
8 kf

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

이 두 번째 프로그램은 입력으로 제공 될 때 원래 프로그램을 출력합니다. 빈 줄은 4 개의 공백을 가져야하며 마지막 줄부터 마지막 ​​줄에는 마크 다운으로 렌더링 할 수 없습니다. 명확히하기 위해 :

$ 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*

4 바이트를 골라 낸 @ MartinBüttner에게 감사드립니다!

CJam 인터프리터에서 온라인으로 사용해보십시오 : 독창적 인 프로그램 | 회전 된 프로그램

이것은 회전 된 프로그램입니다.

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

생각

입력을 줄 바꿈에서 나누고 결과 행의 순서를 반대로하고 행을 열로 바꾸고 마지막으로 줄을 줄 바꿈하여 줄 바꿈으로써 입력을 시계 방향으로 1/4 바퀴 회전 할 수 있습니다.

마찬가지로, 먼저 조옮김 한 다음 행을 반대로하여 시계 반대 방향으로 회전 할 수 있습니다.

전치사 내장 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 구문상의 이유로. 모두의 의미 :와는 .성격에 따라 달라집니다 그들과 줄 바꿈이 그 중 하나 후 유효하지 않은 (그들은하더라도, 그 프로그램의 의미를 바꿀 것).
Martin Ender

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 + 2에 대한 너비 (하단 모서리에있는 추가 주석의 경우)와 동일한 너비로 정사각형으로 제한하고 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////      /    

온라인으로 사용해보십시오!

위의 출력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.