オニオンプログラミング


22

印刷可能なASCII(16進コード20から7E)のみを使用して、4つのレイヤーに囲まれたコメントなしの正方形のN×N コアプログラム記述し、(N + 8)×(N + 8)正方形プログラムを作成します(N> 0) 。N = 3の場合、レイアウト(実際のコードに置き換えられる)は次のようになります。

44444444444
43333333334
43222222234
43211111234
4321CCC1234
4321CCC1234
4321CCC1234
43211111234
43222222234
43333333334
44444444444
  • Cはコア3×3プログラムを表します。
  • 1は1番目のレイヤーを表し、2は2番目のレイヤーを表します。

プログラムは常に、0 -1 31 -1 2 2 2stdin などのようなスペースで区切られた整数の文字列を使用します(単なる数字で、引用符や角かっこなどは使用できません)。出力は、レイアウトのどの部分が実行されたかによって異なります。

プログラムを実行するには5つの方法があります(実行には改行が含まれます)。それぞれがリストとは異なることを行います:

  1. コアのみを実行します。

    CCC
    CCC
    CCC
    

    これにより、入力リスト要素の絶対値の最大値が計算さCOREれ、何度も新しい行に出力されます。最大値が0の場合、何も出力されません(改行で問題ありません)。

    • 以下のための出力0 -1 31 -1 2 2 2になります

      CORE
      CORE
      ...
      

      31回。

  2. レイヤー1でコアを実行します。

    11111
    1CCC1
    1CCC1
    1CCC1
    11111
    

    これにより、リスト値の平均(算術平均)が標準の浮動小数点精度で出力されます。

    • の出力は35/7 0 -1 31 -1 2 2 2= 5(問題5.0ありません)になります。
  3. レイヤー1および2でコアを実行します。

    2222222
    2111112
    21CCC12
    21CCC12
    21CCC12
    2111112
    2222222
    

    これは、入力リストのスペース区切りリストを逆順に出力します。

    • の出力はに0 -1 31 -1 2 2 2なります2 2 2 -1 31 -1 0
  4. レイヤー1、2、および3でコアを実行します(パターンは明らかなはずです)。
    これにより、ソートされた入力リストのスペース区切りリストが出力されます。

    • の出力はに0 -1 31 -1 2 2 2なります-1 -1 0 2 2 2 31
  5. レイヤー1、2、3、および4でコアを実行します。
    これにより、重複が削除された入力リストのスペース区切りリストが出力されます。順序は関係ありません。

    • の出力はになる0 -1 31 -1 2 2 2可能性があります-1 0 2 31

すべての出力は、標準出力または同様の代替です。

これら5つのレイアウトの組み合わせのみが指定された動作をします。

ノート

  • コア、レイヤー、またはそれらの組み合わせにコメントを含めることはできません。無操作のコードまたは建設的なコードは、コメントとしてカウントされません。
  • コアは任意の(正の)N×N次元を持つことができますが、レイヤーは1文字の厚さしかないことに注意してください。
  • 入力の先頭または末尾にスペースがなく、数字の間にスペースが1つだけあると想定できます。常に少なくとも1つの数字が含まれます。(出力リストもこのようにフォーマットする必要があります。)
  • 出力に必要なリストと計算には、整数がオーバーフロー(またはアンダーフロー)する値がないと仮定できます(最大値が2 16のような妥当な値である限り)。

得点

通常、このプログラムを書くのは簡単です。小さなコアで書くのは難しいです。

最小のコアサイズ(最小のN)のプログラムが勝ちます。同数の場合、勝者は最小の個別の文字(改行を含まない)を持つ完全なプログラム((N + 8)×(N + 8)正方形)です。

回答の上部でN値を報告してください。


1
これは、これらの新しいタイプの別の1つでもあると思いました
オプティマイザー14年

改行の後、すべてを無視する言語を使用できますか?
isaacg 14年

1
@isaacgはい(改行がコメント文字とみなされない限り、これは奇妙です)。
カルビンの趣味14年

3
@Optimizer私を誘惑しないでください... " 各回答はコードオニオンに新しいレイヤーを追加し、リストで何か新しいことをします... "
カルビンの趣味14年

1
@Optimizer番号(これらのI / Oルールはやや厳しいと思いますが、それは言語間で一貫性を保つためです。)
カルビンの趣味

回答:


10

CJam、N = 5、27(26)個の一意の文字

スペースを数えないと、26文字です。プログラムは、実際には、すべての空のスペースを何もしないで埋めることでスペースを使用しないものに変換することができます(たとえば_;、一番上のスタック要素を複製してから破棄するか、配列を何度も並べ替えます)実際のコードから注意をそらすだけです。

l~]_|S*      
{l~]$S*      
 {l~]W%S*    
  {l~]_,\    
   {l~]{z    
    }%$W=    
    "CORE    
    "*       
         }   
   ;:+d\/ }  
  ;        } 
 ;          }
;            

ここでテストしてください。

コアは

l~]{z
}%$W=
"CORE
"*

(プラス空の行。)

私はそれN = 4がCJamではできないと確信しています(そうでなければ、デニスがそうでなければ私を説得するでしょう:D)。上記には17文字があり、16文字まで減らすことができるかもしれませんが(たとえば、CJamにチョークするバグがなく、ARGV :zを必要とする{z}%、またはARGVを使用してバグがある場合)、あなたはそれに合うことができないと思います内の改行を導入せずにレイアウトでCORE

実装はすべて、特定のタスクに対する非常に簡単なソリューションです。それらのすべてはで始まりますl~]、STDINを読み取り、それを評価し、それを配列に入れます。

前のレイヤーは常にで囲まれ{...}ているため、自動的に実行されないブロックになります。それを実行する代わりに、からスタックから破棄するだけな;ので、前のレイヤーのコードに依存するレイヤーはありません。レイヤー1では、コードが最初の行に収まらなかったため、コアブロックを破棄した後もコードを続けました。

次に、実際のプログラムについて:

  • コア:

    {z}%$W="CORE
    "*
    

    absリストにマップし、ソートし、最後の要素を取得し、CORE何度も繰り返します(そして改行します)。

  • レイヤー1:

    _,\:+d\/
    

    リストを複製し、長さを取得し、スタック要素を交換し、合計を取得し、キャストしdouble、スタック要素を交換し、分割します。これはもっと短くなると思いますが、そうするインセンティブはありません。

  • レイヤー2:

    W%S*
    

    配列を反転し、スペースで波打ちます。

  • レイヤー3:

    $S*
    

    配列を並べ替え、スペースで波打ちます。

  • レイヤー4:

    複製し、セットユニオンを取得し、スペースでリフルします。

他のいくつかの最適化を再利用するように、また可能である;*S再びレイヤ2の、しかし、それがスコアに影響を与えません。


17

Python 2-N = 17、53文字

ああ、Pythonのソースレイアウトの課題が大好きです...

i=4                     ;
ii=3                    ;
iii=2                   ;
iiii=1                  ;
iiiii=0;R=raw_input     ;
iiiii;w=R().split()     ;
iiiii;n=map(int,w)      ;
iiiii;S=set(n);M=max    ;
iiiii;s=sorted(n)       ;
iiiii;J="\n".join       ;
iiiii;j=" ".join        ;
iiiii;k=M(map(abs,n))   ;
iiiii;A=J(["CORE"]*k)   ;
iiiii;B=sum(n)/len(n)   ;
iiiii;C=j(w[::-1])      ;
iiiii;D=j(map(str,s))   ;
iiiii;E=j(map(str,S))   ;
iiiii;P=A,B,C,D,E       ;
iiiii;print P[i]        ;
iiiii;" /__----__\  "   ;
iiiii;"|/ (')(') \| "   ;
iiii;"  \   __   /  "   ;
iii;"   ,'--__--'.   "  ;
ii;"   /    :|    \   " ;
i;"   (_)   :|   (_)   ";

ただし、未使用の空白はまだ残っています。

固有の文字数をさらに改善することはできますが、読みやすさを維持します(ある場合)。

編集:ああ、それは再びスタンです!


おそらく、代わりに印刷エイリアシングによっていくつかの行を保存することができますi=*トリックを
M.Herzkamp

@ M.Herzkamp:printPython 2ではエイリアシングは不可能です。しかし、おそらくPython 3を使用して、おそらく改善の余地があるでしょう。
Falko

私は、Pythonを知らないが、コアコード出力で、この行方不明絶対値ではありませんか-c*max(n)
nutki

@nutki:その通りです!注意深く読みませんでした。しかし、私はそれを修正することができました。
ファルコ14年

6

Python 3:N = 11、40の異なる文字

if 1:              
 if 1:             
  if 1:            
   if 1:           
    p=print;R=0    
    a=input()      
    b=a.split()    
    m=map;a=abs    
    E=max;l=len    
    n=m(int,b);    
    C=['CORE']     
   "R=E(m(a,n))"   
   OO=C*R;s=sum    
   "x='\n'.join"   
   "p(x(O))    "   
  "p(s(n)/l(b)) "  
 "p(*b[::-1])    " 
"p(*sorted(n))    "
p(*set(n))         

@Falkoが私のミューズになってくれてありがとう。Pythonはifステートメントごとに新しいスコープを作成しないため、これは機能します。したがって、変数は外側のprintステートメントに保持されます。面倒なことの1つは、mapオブジェクト(この場合n)は1回しか使用できないことです。そのため、R=E(...)行を並べる必要がありましたが、R定義されませんでした。したがって、幸運にも最初の行に4つのスペースが残っていました!

*b[::-1]リストの代わりに複数の要素を提供することにより、出力を解決できます。代替案' '.join(...)は長すぎたでしょう。


綺麗な!Pythonの可変行の開始を処理する代替アプローチを見るのは素晴らしいことです。短いif文とそれらすべてのスペースは問題ありません。:)
ファルコ

@ファルコ:欠点は:スタンのためのスペースがない:(
M.Herzkamp 14年

2

C(gcc)、N = 15、47個の一意の文字

と仮定sizeof(int) == 4sizeof(int*) >= sizeof(int)ます。

;                     ;
 ;                   ; 
  ;                 ;  
   ;           float   
    s;c(a,b)int*a,*    
    b;{b=*b-*a;}i,n    
    ,*f;*q,*R,C,E ;    
    main(a){for(;0<    
    scanf("%i",&a);    
    i=i<abs(a)?a:i,    
    s+=f[n-!0]=a)f=    
    realloc(f,++n*4    
    );qsort(f,n*C,4    
    ,c);for(i=q?R?n    
    :!0:i;i--;a=f[i    
    ])!E|n-i<2|a!=f    
    [i]&&printf(q?R    
    ?R:q:"CORE\n",!    
    q+R?f[i]:s/n);}    
   ;*q="%f";       ;   
  ;*R="%.0f ";      ;  
 ;C=!0;              ; 
;E=!0;                ;

4層

3層

2層

1層

コア


0

ルーン文字のエンチャントN = 9 N = 8、38文字

/ o/\  \     \S\
" //RiU\      \}
@            q "
"        }+1\r @
}   ^U \    {q "
     \{\?)}\+  }
  o\/'|A:{:/R' S
 //r/Ril2=?\?R :
   ,A~/"OC"/=? {
   @| \"RE"\3= =
 D$\' /rqka/l2S?
    i \*@   il\/
   'R1i     Ui ~
 R$/Rak      U \
 ?!D  Rlril1-{=
R   R: }S:{=?\~

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

私が間違っていたことが判明し、o以前に「リストを並べ替える」問題に遭遇したため、明示的なs rtコマンドをすでに忘れていました。ただし、これは、sortコマンドの内部コストのために、最終プログラムが取得できる入力のサイズ(8つの値)を制限します。微調整を行うと、入力サイズが1ユニークキャラクターのコストで13、または19に増加します。 2ユニークキャラクターに(すべての追加キャラクターはレイヤー1にあり、同時に追加されますが、IPのスタックの容量の増加はありませんC、L1、およびL2が入力全体をメモリに保持することなく計算を実行できるため、レイヤー3まで必要です。

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

レイヤー1:オンラインで試してみてください!

レイヤー2:オンラインで試してみてください!

レイヤー3:オンラインで試す

レイヤー4:オンラインで試してみてください!

スペースが小さいため、フロー制御文字の数を増やす必要があるため、さらに圧縮することはほとんどありません。コアプログラムに9つの空のスペースを与える配置を見つけましたが、それは十分ではありません(適切に配置された)15。

これらのプログラムがどのように機能するかを説明することは、IPがたどる経路の視覚的なマップなしでは困難であり、作成するのは面倒で時間がかかります。最初のエントリポイントは、Coreプログラムの左上隅(^)であり、各レイヤーには上部または下部に新しく追加された行でインターセプトする機会があるため、新しいレイヤーが追加されても一貫したフロー制御が可能です。

レイヤー1とレイヤー2は下部でインターセプトし(上部の行が将来のレイヤーのために空のままになるように)、右端(垂直に配置されたループ)に沿って操作を実行します。レイヤー1は少し長すぎて、上端に沿って3文字もかかりますが、斜めのリフレクター(\)は次のループ反復でIPを再調整します。

レイヤー3は、ボトムエッジにリダイレクトする前に最初の入力値を取得するためにトップエッジに沿ってインターセプトし(レイヤー4はボトムラインのこの列にNOPを残します)、ボトムループを使用して完全な入力を読み取り、ダウンにリダイレクトしますD左下のコマンド()。そこからIPが数回バウンドしてから$、値をスペースで区切るために、左下の出力()ループになります。

レイヤー4はレイヤー3のすべての機能を使用します(そのため空白です)が、レイヤー3の処理の最後に独自の機能を実行するために、独自の新しい上端(左上)でインターセプトします。左上隅"@"は、配列の終わりを示すために使用される文字列を挿入してから、下に沿って処理ループに入ります。重複する値が見つかった場合、それはポップ(~、右下隅)されます。それ以外の場合、新しい右端を消費する分岐が行われます。このサイドブランチは、配列の最後に到達しているかどうかを確認し、到達している場合は、ブレークアウトして、レイヤー3から同じスペースで区切られた出力ループに進みます。ループ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.