奎因大金字塔


11

该任务是一个非常简单的带有缠绕的quine挑战,您必须以金字塔形状输出源代码。金字塔的形状定义如下:

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

此挑战的主要局限性是您的Quine必须包含足够多的字节,以免阻碍金字塔的样式。例如,以下程序长度将起作用:

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
  • 您的提篮必须能够成形为金字塔形。
    • 它必须保留源代码的原始顺序。
    • 您的源代码可能包含用于格式化金字塔的字符。
    • EG如果您的源代码包含空格,则将需要另一个char作为格式。
  • 您可以在提包中使用注释来“填充”正确的大小。
    • 显然,这些必须作为木盒的一部分输出。
  • 如果程序包含换行符/制表符,则它们不属于quine,应在输出中将其省略。
  • 形状以字符而不是字节为单位;如果形状不正确,则说明操作不正确。

最低分数应为4。


原始的奎纳是否需要呈金字塔形,还是仅输出需要?
KrystosTheOverlord '19

@KrystosTheOverlord输出,原来没关系。如果原始文档中包含制表符或换行符,则也应在输出中也将其省略,以保持输出的形状。
魔术章

如果输出中有一堆尾随空格/换行符是否有效?
Emigna '19

@Emigna应该吗?除非其他人这样做,否则我认为它没有问题。另外,定义“一堆”,共识通常不是“一个结尾的换行符是可以接受的”吗?
魔术章鱼缸

1
当您需要以金字塔形式的奎纳时,您应该挑战:)。
KrystosTheOverlord '19

Answers:


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:是的,这有点问题。我认为我的较短版本不合适,这就是为什么我不将其用作主要程序的原因,但是我觉得我应该问一下,因为这样可以节省我一整层。
Emigna '19

亲爱的你打败我了 而不是ā·<我使用9ÅÉ(在25字节中,没有考虑尾随换行符。)
Kevin Cruijssen

@MagicOctopusUrn顺便说一句,所有其他的答案有一个结尾的新行,所以一切就都无效,除了这36 byter ..
凯文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));}//

-29个字节,感谢@JoKing

输出带有前导空格的三角形。(注意空格之间var sint i有标签,没有空格。)

在线尝试。

说明:

-part:

  • var s 包含未格式化的源代码String
  • %s 用于将String本身放入 s.format(...)
  • %c%1$c34用于格式化双引号("
  • %% 用于格式化 %
  • 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 226String#substring(int,int)方法因错误而停止,在打印结果后进行迭代(根据meta可以)。


它并不会真正为您节省任何费用,但是s=s.format当您可以在循环中使用该格式时,您无需
Jo King,

@JoKing Ah当然。谢谢。不幸的是,我必须将不带注释的基本程序减少到至少196(14 2)个以保存字节(或仅将其保留为225个(15 2),并找到一种变通方法以某种方式具有奇数个字节)。当前是228个,没有评论。
凯文·克鲁伊森

1
尝试了一种不同的方法,并最终仅减少了两个字节,并且仅因为它是一个奇数...奇数长度的解决方法是%%在字符串中包含a ,而%在实际代码中仅包含一个,但这意味着注释是强制性的
Jo

1
@JoKing Nice方法,用制表符代替空格,这样我们就可以有前导空格(由于挑战规则,在输出中省略制表符)。我已经能够对///字符串中的代码进行重新处理,因此该字符串足够长,可以转到预期的迭代中以打印所有内容,然后再停止StringIndexOutOfBoundsExceptionfor .substring//在实际程序的末尾只有两个尾随,因为它也只打印两个尾随//。:)
凯文·克鲁伊森

哇,我没想到Java的答案!好东西!!!
魔术章鱼缸


3

Perl 6、67字节

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

在线尝试!

我使用了一些unicode字符来挤出多余的层。使用空格的输出:

       <
      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字节

这使用以下规则:如果程序包含换行符/制表符,则它们不是quine的一部分,应在输出中将其省略。

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="

在线尝试!

添加了格式化功能,几乎是标准quine,也很方便是模板quine。


1
即使是代码高尔夫,我也喜欢这些更长的答案。令人印象深刻的圣牛。
魔术章鱼缸

2

R169144字节

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#交互式编译器),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中已经提交了精确的副本,但是我还是决定将其发布。

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.