90°自動回転プログラム


20

前書き

ASCII文字の長方形ブロックを時計回りに90度回転する完全なプログラムを作成します。プログラム自体が時計回りに90度回転すると、ASCII文字のブロックが反時計回りに90度回転します。

ルール

  • 多くの場合、行列を回転または転置する組み込み関数を使用しません。たとえば、MATLAB / Octave rot90および転置演算子'では許可されていません。
  • STDINとSTDOUTまたはそれに最も近いものを使用する完全なプログラムを作成する必要があります。
  • プログラムは長方形でなければならず、入力も長方形であると仮定する必要があります。
  • 入力と出力は改行で区切られた文字列であり、末尾の改行はありません。

ソースコードを入力として実行する場合、プログラムは時計回りに90度回転する必要があります。出力は、入力を反時計回りに90度回転させる同じ言語の2番目のプログラムでなければなりません。回転したプログラムに入力としてソースコードが与えられると、元のプログラムのソースコードが出力されます。

注:両方のプログラムは、独自のソースコードだけでなく、あらゆる入力に対して機能する必要があるため、1文字のクインは許可されません。

次の例は、仮想言語ExampleLangで入力を90度回転させる有効なプログラムです。

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

自分自身を入力として実行すると、入力を反時計回りに回転させる別の有効なプログラムを出力します。

D l^
8 kf

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

この2番目のプログラムは、入力として自分自身に与えられると、元のプログラムを出力します。空白行には4つのスペースが必要であり、2行目から最後の行にマークダウンでレンダリングできない後続スペースがあることに注意してください。明確にするために:

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

アイディア

入力を改行で分割し、結果の行の順序を逆にし、行を列で置き換え、最後に行を改行で区切って結合することにより、入力を時計回りに4分の1回転できます。

同様に、最初に転置してから行を反転することにより、反時計回りに回転できます。

組み込みの転置zは禁止:.+されているため、同じ効果を得るために(ベクトル化された文字または文字列と文字の連結による削減)を使用できます。

:.+ソースコードの分割できない唯一の部分です。私たちは、文字列をプッシュする"W%"":.+"、条件付きで2番目の文字列は、改行が含まれている場合は、それらを逆に、CONCATENATE、すべての改行を削除し、その結果を評価します。

コード

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

オンラインでお試しください!

上記の出力

解決策は最終的には驚くほど簡単でした。時計回りに回転する1つのプログラムAと、反時計回りに回転する1つのプログラム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]);}

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();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に1を加えたものと同じ幅の正方形に限定し(下端のコメントの追加行のために)、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.