クインの大ピラミッド


11

このタスクは、ひねりを加えたかなり単純な挑戦です。ソースコードをピラミッドの形で出力する必要があります。ピラミッドの形状は次のように定義されます。

       1
      234
     56789
    ABCDEFG
   HIJKLMNOP
  QRSTUVWXYZa
 bcdefghijklmn
......etc......

この課題の主な制限は、ピラミッドのパターンを妨げないように、クインに正確に十分なバイトを含める必要があることです。たとえば、次のプログラムの長さが機能します。

1-byter: 1st layer of the pyramid (not allowed by definition of a quine).
4-byter: 1st and 2nd layers of the pyramid.
9-byter: 1st, 2nd and 3rd layers of the pyramid.
etc...

したがって、プログラムが次の場合:

QWERTY

次のように配置されるため、有効ではありません。

  Q
 WER
TY

ただし、プログラムがQWERTYUIOであれば、それで問題ありません。

  Q
 WER
TYUIO

ルール

  • 標準的な抜け穴は明らかに禁止されており、独自のソースを読むことはできません。
  • ピラミッドは中央に配置する必要があり、末尾の文字は許可されますが、必須ではありません。
    • また、ピラミッドを中央に配置するために任意の文字を使用できますが、その必要はありません(char)32
  • あなたのウマはピラミッドに形作られなければなりません。
    • ソースコードの元の順序を保持する必要があります。
    • ソースコードには、ピラミッドのフォーマットに使用されている文字が含まれていない場合があります。
    • 例えば、ソースコードにスペースが含まれている場合、フォーマットに別の文字が必要になります。
  • 馬のコメントを使用して、正しいサイズに「パッド」できます。
    • 明らかに、これらはクインの一部として出力されなければなりません。
  • プログラムに改行/タブが含まれている場合、それらはクインの一部ではないため、出力では省略されるべきです。
  • 形状は、バイトではなく文字でカウントされます。形状が正しくない場合、あなたはそれを正しくしていません。

ここで可能な最低スコアは4でなければなりません。


元のクインはピラミッド型である必要がありますか、それとも出力だけが必要ですか?
KrystosTheOverlord

@KrystosTheOverlordの出力は、オリジナルは関係ありません。オリジナルにタブまたは改行がある場合は、出力の形状を保持するために、出力でもこれらを省略する必要があります。
魔法のタコUr

出力に後続のスペース/改行がたくさんある場合は有効ですか?
エミグナ

@Emignaはどうでしょうか?他の人がこの時点で問題を起こさない限り、私はそれで問題を見ません。また、「の束」を定義してください、コンセンサスは通常「単一の末尾の改行は許容可能」ではありませんか?
魔法のタコUr

1
あなたはピラミッドの形式でクインを持っている必要がある場所に挑戦する必要があります:)。
KrystosTheOverlord

回答:


4

05AB1E、36バイト

"34çs«DJā·<£õK.cJ?"34çs«DJā·<£õK.cJ?

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

trailing characters are allowed出力の最後にもある場合0"D34çýā·<£.c"D34çýā·<£.cは、25バイトの短いレイヤーです。


34ç05AB1Eのすべてのquinesの基礎になっています。また、ランダムな量の末尾の改行についてどのように感じているかわかりません...誰かがその呼び出しを行うことを望みます(通常は何ですか、1つの末尾/先行が許可されていますか?)
魔法のタコ

@MagicOctopusUrn:ええ、それはちょっと疑わしいです。私の短いバージョンは大丈夫ではないと思うので、それをプライマリプログラムとして使用しませんでしたが、レイヤー全体を節約できるので、尋ねる必要があると感じました。
エミグナ

ダン、あなたは私を打ち負かした。そして、ā·<私が使用した代わりに9ÅÉ(25バイトで、末尾の改行については考えませんでした。)
ケビンクルーイッセン

すべてはこの36-byterを除いて無効になるので、@MagicOctopusUrnはところで、他のすべての答えは...、末尾の改行を持っている
ケビンCruijssen

4

Java 11、324 256 227バイト

v->{var s="v->{vars=%c%s%1$c;for(inti=0;;)System.out.printf(%1$c%%%1$c+(15+i)+%1$cs%%n%1$c,s.format(s,34,s).substring(i*i,++i*i));}///";for(int i=0;;)System.out.printf("%"+(15+i)+"s%n",s.format(s,34,s).substring(i*i,++i*i));}//

@JoKingのおかげで-29バイト。

三角形を作成するための先行スペースを含む出力。(間の空白ことを注意var sとはint i、タブ、スペースではないです。)

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

説明:

-part:

  • var s 未フォーマットのソースコード文字列が含まれています
  • %s この文字列をそれ自体に入れるために使用されます s.format(...)
  • %c%1$cおよび34二重引用符(")のフォーマットに使用されます
  • %% をフォーマットするために使用されます %
  • s.format(s,34,s) すべてをまとめる

チャレンジパート:

for(int i=0;;)         // Loop `i` indefinitely upwards from 0
  System.out.printf(   //  Print with format:
    "%"+(15+i)+"s      //   Add leading spaces to make the line length size 15+`i`
                 %n",  //   And include a trailing newline
    s.format(s,34,s).substring(
                       //   And append a substring of the source code-String
       i*i,            //    From index `i` squared
       ++i*i));}       //    To index `i+1` squared

これで停止java.lang.StringIndexOutOfBoundsException: begin 225, end 256, length 226するため、エラーString#substring(int,int)が(結果印刷した後に繰り返し、方法メタに従って結構です)。


実際には何も保存されませんs=s.formatが、代わりにループ内で形式を使用できる場合は別れする必要はありません
ジョーキング

@JoKing Ahもちろん。ありがとう。残念ながら、コメントなしで基本プログラムを少なくとも196(14 2)に減らしてバイトを節約する必要があります(または、ゴルフを225(15 2)に減らして、なんとなく奇数のバイトを使用する回避策を見つけます)。現在、コメントなしの228です。
ケビンクルーイッセン

1
別のアプローチを試みただけ終わった2バイトオフのみので、それが奇数であるのを...奇数の長さを回避するには、ある%%文字列内で、唯一の%実際のコードでは、この手段は、コメントは必須である
チョキング

1
@JoKing先行スペースを使用できるように、スペースをタブに置き換えた素敵なアプローチ(およびチャレンジルールのために出力からタブを省略)。///forで停止する前に、文字列がすべてを印刷するために予想される反復に進むのに十分な長さになるように、文字列内でコードを修正できStringIndexOutOfBoundsExceptionました.substring。また//、実際のプログラムの末尾に末尾が2つしかないため、末尾//にも2つしか出力されないためです。:)
ケビンクルーイッセン

わあ、Javaの答えは期待していなかった!良いですね!!!
魔法のタコUr

4

Python 2、81バイト

s='n=0;\nprint(8-n)*chr(32)+("s=%r;exec(s*9)"%s)[n*n:][:n-~n];n+=1;#JK';exec(s*9)

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

フィラー文字としてスペースを使用する評価クイン。




または...まあ...明らかにそのくらいのパディングで署名(つまり、aaaaaaaaaというより興味深い文字列)を入れることができます:P
ASCIIのみ

@ASCIIのみの良い点、更新された回答を参照してください;)
ジョーキング

3

Perl 6、67バイト

<say("<$_>~~.EVAL".substr($!++²,$!*2-1).indent(8-$!))xx⁸>~~.EVAL

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

その余分なレイヤーを絞り出すために、いくつかのユニコード文字を使用しました。スペースを使用した出力:

       <
      say
     ("<$_
    >~~.EVA
   L".substr
  ($!++²,$!*2
 -1).indent(8-
$!))xx⁸>~~.EVAL

説明:

<say("<$_>~~.EVAL"                                  )   >~~.EVAL   # Normal quine
                  .substr($!++²,$!*2-1)              xx⁸  # Split into layered substrings
                                       .indent(8-$!)      # And indent each one

3

Python 2、169バイト

0ピラミッドのフォーマットに使用します。

s='s=%r;k=s%%s;print"\\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for n in range(13))#######################';k=s%s;print"\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for n in range(13))

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


Python 2、147バイト

これには、ルールが使用されます。プログラムに改行/タブが含まれる場合、それらはクインの一部ではないため、出力で省略する必要があります。

s='s=%r;k=s%%s;print"\\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]forninrange(13))##';k=s%s;print"\n".join(`1-1`*(12-n)+k[n*n:][:n-~n]for	n	in	range(13))##

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


2

Gol> <>、36バイト

":P}r6&56F:M}F0ss|&:P&Roao{|;Nooooo!

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

さらに若いバージョン、36バイト

":P}r6&56F:M}R` &:P&Fo|ao{|;Noooooo!

私はそれを一行短くすることに非常に近いと感じます、grrrr ...

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

さらに新しいバージョン、36バイト

"r2ss6&56F:M}R` &:P&Fo|ao{|;what????

このコードは小さいですが、残念ながら同じ量になります。コメントが残りのスペースを占有します。

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

少し新しいバージョン、36バイト

"r2ss156F:M}F` o|:PP}Fo|ao{{|;Wowza!

うわー!へえ、私はそれをいくつかのスペースを埋めるために使用しましたが、プログラムは機能します。

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

古いバージョン、42バイト

"r2ss0V_~6:&F&:M&F` o|_PPV_Fo|ao|;empty...

これには末尾の改行があり、私が望むよりも多くの文字があります...

私はこれを厳しくゴルフするつもりです...

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



2

クリーン、256バイト

module QQ;import StdEnv,Text;q=dec'#';$n#k=(s<+q<+s<+q)%(n^2,n^2+n*2)=lpad k(16+n)(dec q);Start=join{toChar 10}(map$[0..15]);s="module QQ;import StdEnv,Text;q=dec'#';$n#k=(s<+q<+s<+q)%(n^2,n^2+n*2)=lpad k(16+n)(dec q);Start=join{toChar 10}(map$[0..15]);s="

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

書式設定機能が追加された、ほぼ標準のクイン、便利なのはテンプレートクインです。


1
それはコードゴルフですが、私はこれらのより長い答えが大好きです。印象的な聖牛。
魔法のタコUr

2

R169 144バイト

s='`!`=intToUtf8;cat(sprintf("%*s",11+(i=1:12),substring(paste0("s=",q<-!39,s,q,";eval(parse(t=s))"),(i-1)^2+1,i^2)),sep=!010)';eval(parse(t=s))

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

           s
          ='`
         !`=in
        tToUtf8
       ;cat(spri
      ntf("%*s",1
     1+(i=1:12),su
    bstring(paste0(
   "s=",q<-!39,s,q,"
  ;eval(parse(t=s))")
 ,(i-1)^2+1,i^2)),sep=
!010)';eval(parse(t=s))

出発した式ではなく、解析された文字列に移動することにより、なんとか短縮しました。しかし、単項演算子の再定義を使用して144の下で取得する必要がありました。


1

C#(Visual C#Interactive Compiler)、225バイト

var s="var s={0}{1}{0};for(int i=0;;)WriteLine(string.Format(s,(char)34,s).Substring(i*i++,2*i-1).PadLeft(i+14,(char)2));//";for(int i=0;;)WriteLine(string.Format(s,(char)34,s).Substring(i*i++,2*i-1).PadLeft(i+14,(char)2));//

STX文字をパディングとして使用します。私が完了するまで、Kevin Cruijssenが投稿前にjavaで正確なコピーをすでに送信していることに気づきませんでしたが、とにかくこれを投稿することにしました。

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

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