90 ° Kendiliğinden Dönen Program


20

Giriş

ASCII karakterlerden oluşan dikdörtgen bir bloğu saat yönünde 90 derece döndüren eksiksiz bir program yazın. Programın kendisi saat yönünde 90 derece döndürüldüğünde ASCII karakterlerden oluşan bir bloğu saat yönünün tersine 90 döndürür.

kurallar

  • Birçoğunuz matrisleri döndüren veya devreten yerleşik öğeler kullanmazsınız. Örneğin, MATLAB / Octave rot90ve devrik operatöre 'izin verilmez.
  • STDIN ve STDOUT veya en yakın eşdeğerini kullanan tam bir program yazmalısınız.
  • Programınız dikdörtgen şeklinde olmalı ve girdinin de dikdörtgen olduğunu varsayalım.
  • Girdi ve çıktı, yeni satırla ayrılmış bir dizedir ve sondaki satırlara sahip olmayacaktır.

Kaynak kodu giriş olarak çalıştırıldığında, programınız saat yönünde 90 derece dönmelidir. Çıktı, aynı dilde girişini saat yönünün tersine 90 derece döndüren ikinci bir program olmalıdır. Döndürülen programa kaynak kodu girdi olarak verildiğinde, orijinal programın kaynak kodunu çıkarmalıdır.

Not: Her iki program da yalnızca kendi kaynak kodları için değil, herhangi bir girdi için çalışmalıdır , bu nedenle tek karakterli bir soru işaretine izin verilmez.

Misal

Diyelim ki, girişini varsayımsal bir dilde ÖrnekLang 90 derece döndüren geçerli bir program.

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

Kendisi girdi olarak çalıştırıldığında, girdisini saat yönünün tersine döndüren geçerli başka bir program çıkarır:

D l^
8 kf

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

Bu ikinci program, kendisine girdi olarak verildiğinde, orijinal programı verir. Boş satırın dört boşluğa sahip olması ve ikinci ile son satır arasında, işaretlemede görüntülenemeyen bir boşluk olması gerektiğini unutmayın. Netleştirmek için:

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

En kısa program kazanır. Standart boşluklar yasaklanmıştır.

Yanıtlar:


17

CJam, 26 25 21 bayt

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

4 bayt golf için @ MartinBüttner teşekkürler!

CJam yorumlayıcısında çevrimiçi deneyin: orijinal program | döndürülmüş program

Bu döndürülmüş programdır:

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

Fikir

Girdiyi satır beslemelerinde bölerek, elde edilen satırların sırasını tersine çevirerek, satırları sütunlarla transpoze ederek ve son olarak satır beslemesiyle ayırarak satırları birleştirerek çeyrek tur döndürebiliriz.

Benzer şekilde, önce transpozisyon, sonra satırları ters çevirerek saat yönünün tersine dönebiliriz.

Yerleşik iç hukuka aktarma zyasak olduğundan, :.+aynı efekti elde etmek için kullanabiliriz (vectorized karakter veya string-karakter birleşimi ile azaltabiliriz).

:.+kaynak kodunun bölünemeyen tek parçasıdır. Dizeleri iteriz "W%"ve ":.+"ikinci dize bir satır beslemesi içeriyorsa koşullu olarak tersine çeviririz, birleştirir, tüm satır beslemelerini kaldırır ve sonucu değerlendiririz.

kod

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.

Bu nasıl bu kadar kısa? Cidden, neden :.+birkaç hatta kırılamıyor?
intrepidcoder

1
@intrepidcoder Sözdizimsel nedenlerden dolayı. Her ikisinin anlamı :ve onlardan sonraki. karaktere bağlıdır ve satır beslemeleri bunlardan birinden sonra geçerli değildir (ve öyle olsalar bile, programın anlamını değiştirir).
Martin Ender

6

C (gcc) , 1420 1399463 bayt

Ah ... belirsiz uzunlukta iplerin sevinci!

Varsayım sizeof(char*) == sizeof(int)ve sizeof(char**) <= 16.

Yeni yaklaşım

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

Çevrimiçi deneyin!

Yukarıdakilerin çıktısı

Çözüm sonunda utanç verici derecede kolaydı. İşleri saat yönünde döndüren bir A programı ve saat yönünün tersine dönen bir B programı yaparsınız:

bir

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

Makul oranlarda bir dikdörtgen yapın ve A'yı bununla sınırlayın ve etrafına yorum muhafızları koyun:

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 programını A artı iki ile aynı genişlikte bir kareyle sınırlayın (alt kenardaki ekstra yorum satırları için), CCW'yi döndürün ve A programının sağına tokatlayın ve yukarıdaki çözümü elde edin.

Eski yaklaşım

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

Çevrimiçi deneyin!

Yukarıdakilerin çıktısı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.