Program Putar-Sendiri 90 °

20

pengantar

Tulis program lengkap yang memutar blok persegi panjang karakter ASCII 90 derajat searah jarum jam. Ketika program itu sendiri diputar 90 derajat searah jarum jam, ia memutar blok karakter ASCII 90 berlawanan arah jarum jam.

Aturan

  • Anda banyak yang tidak menggunakan built-in yang memutar atau mengubah posisi matriks. Misalnya, dalam MATLAB / Oktaf rot90dan operator transpos 'tidak diperbolehkan.
  • Anda harus menulis program lengkap yang menggunakan STDIN dan STDOUT atau yang setara terdekat.
  • Program Anda harus persegi panjang dan menganggap inputnya juga persegi panjang.
  • Input dan output adalah string yang dipisahkan baris baru dan tidak akan memiliki baris baru.

Ketika dijalankan dengan kode sumbernya sebagai input, program Anda harus memutar sendiri 90 derajat searah jarum jam. Output harus berupa program kedua dalam bahasa yang sama yang memutar inputnya 90 derajat berlawanan arah jarum jam. Ketika program yang diputar diberi kode sumbernya sebagai input, itu harus menampilkan kode sumber dari program asli.

Catatan: Kedua program harus bekerja untuk input apa pun , bukan hanya kode sumbernya sendiri, sehingga quine satu karakter tidak diperbolehkan.

Contoh

Katakanlah berikut ini adalah program yang valid yang memutar inputnya 90 derajat dalam bahasa hipotetis ExampleLang.

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

Ketika dijalankan dengan sendirinya sebagai input, output program lain yang valid yang memutar inputnya berlawanan arah jarum jam:

D l^
8 kf

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

Program kedua ini, ketika diberikan kepada dirinya sendiri sebagai input, output program asli. Perhatikan bahwa baris kosong harus memiliki empat spasi dan ada spasi tambahan di baris kedua hingga terakhir yang tidak dapat dirender dalam penurunan harga. Untuk memperjelas:

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

Kemenangan program terpendek. Celah standar dilarang.

intrepidcoder
sumber

Jawaban:

17

CJam, 26 25 21 byte

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

Terima kasih kepada @ MartinBüttner untuk bermain golf 4 byte!

Cobalah online di interpreter CJam: program asli | program yang diputar

Ini adalah program yang diputar:

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

Ide

Kita dapat memutar input seperempat putaran searah jarum jam dengan memecahnya pada feed line, membalikkan urutan baris yang dihasilkan, transpos baris dengan kolom, dan akhirnya bergabung dengan baris, dipisahkan oleh feed line.

Demikian juga, kita dapat memutar berlawanan arah jarum jam dengan mentransposkan terlebih dahulu, lalu membalikkan baris.

Karena transposisi bawaan ztidak diperbolehkan, kita dapat menggunakan :.+(mengurangi dengan karakter vektor atau penggabungan karakter string) untuk mencapai efek yang sama.

:.+adalah satu-satunya bagian dari kode sumber yang tidak dapat dipecah. Kami mendorong string "W%"dan ":.+"membalikkannya secara kondisional jika string kedua berisi umpan baris, menyatukan, menghapus semua umpan baris, dan mengevaluasi hasilnya.

Kode

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.
Dennis
sumber
Bagaimana ini sangat singkat? Serius, mengapa tidak :.+dapat dipecah beberapa baris?
intrepidcoder
1
@intrepidcoder Untuk alasan sintaksis. Arti keduanya :dan .tergantung pada karakter setelah mereka, dan umpan garis tidak valid setelah salah satu dari mereka (dan bahkan jika mereka, itu akan mengubah arti dari program).
Martin Ender
6

C (gcc) , 1420 1399 463 byte

Ah ... kegembiraan senar yang tak ditentukan panjangnya!

Asumsi sizeof(char*) == sizeof(int)dan sizeof(char**) <= 16.

Pendekatan baru

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

Cobalah online!

Output di atas

Solusinya pada akhirnya mudah. Anda membuat satu program A yang memutar hal-hal searah jarum jam, dan satu program B yang berputar berlawanan arah jarum jam:

SEBUAH

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

Buatlah persegi panjang dengan proporsi yang masuk akal dan batasi A untuk itu, dan letakkan penjaga komentar di sekitarnya:

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

Batasi program B ke bujur sangkar dengan lebar yang sama dengan satu untuk A ditambah dua (untuk garis komentar tambahan di tepi bawah), putar CCW dan tampar ke kanan program A dan Anda mendapatkan solusi di atas.

Pendekatan lama

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

Cobalah online!

Output di atas

gastropner
sumber