转置奎因


10

在这种quine变体中,程序必须输出其源代码,该源代码从左上角到右下角跨对角线转置。例如:

你的程序
上
四行

输出

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

输出中的空格不是任意的。在两种情况下会出现空格:原始文件中有空格(例如,第四列之间rl之中),并且必须填充字符(例如,第一列中的所有空格)。这两者都是必需的,并且空格不能出现在任何地方其他在输出中。

输出中的单个尾随换行符可以有选择地忽略。源代码中的尾随换行符对输出没有影响,并且源代码中的前导换行符必须按照上面的示例进行处理。假定不是换行符的每个字符都是一列宽和一行高,即使对于诸如tab这样的字符,这也可能导致难看的输出。

您的解决方案必须至少有两行,每行至少有两个非换行符,并且不得为自己的转置(输出不能与源相同)。

不允许从包含源代码的文件中读取作弊的quine,从URL中提取数据,使用内置的quining内建等等。

这就是代码高尔夫:以字节为单位的最短代码获胜。


这需要成为真正的奎因吗?
lirtosiast

2
@ThomasKwa相对于?
Martin Ender

@MartinBüttner也许有一种语言,其中字面量被回显了。以防万一。
lirtosiast

@ThomasKwa只要遵循所有指定的规则,就可以了。
路加福音

是否禁止使用外部库(例如Java中的Lodash)?
Mama Fun Roll

Answers:


5

CJam,14个字节

{`"_~".+N*}
_~

在这里测试。

虽然更短,但可能不如Fission解决方案有趣。

说明

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~

10

裂变,17个字节

还是我最喜欢的奎因语言...

'"
!0
0+
;!
DN
"!

在线尝试!

说明

这与基本的Fission奎纳十分相似。实际上,如果不是因为“必须至少有两行且每个行中至少有两个非换行符”规则,我可以将其换位并替换RD。该规则使事情变得更加有趣,因为我们需要打印另一行。

控制流从D单个原子向南运动开始。因为它命中了"它会环绕并打印

'!0;D

到STDOUT,类似于普通的平底锅。'!然后将原子的质量设置为的字符代码!。的0是输送原子到第二塔,在那里它仍然向南移动一个传送点。

随着+我们将原子的质量增加到的值"!N!打印报价,换行,报价。STDOUT现在看起来像这样:

'!0;D"
"

环绕后,原子碰到另一个原子,"然后逐字打印第二行:

'!0;D"
"0+!N!

现在完成了。原子再次使用传送器,并落入原子中;,从而将其破坏并终止程序。

我想这里最干净的位是一个"放在底部,另一个放在顶部,这样我就可以一次打印它们,而不必再次设置值!(因为再次进入字符串模式会覆盖它)。


3

Javascript ES6,90个字节

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

还不错,还不错。

说明

这是标准的quine框架:

$=_=>`$=${$};$()`;$()

要进行修改,我只是将quine字符串沿换行符和char拆分以创建char矩阵,使用2个映射函数进行转置,然后结合以创建输出。



2

Befunge-93,57个字节

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

通过将每个字符放在堆栈的第一列中(引号本身除外),然后将每个项目从堆栈中打印出来,可以工作。之后,它将打印引号,打印换行符,然后移至第二列。它在打印换行符时执行相同的操作。

您可以在标题的链接中对其进行测试,但是您需要自己将代码复制粘贴到窗口中。如果单击“慢速”按钮,它将显示指针所经过的路径以及当时的堆栈。


像我在裂变答案中所做的那样,将第二列中的报价移到顶部的时间会更短吗?
Martin Ender

我可以将引号移到顶部并重新排列第二列,并且仍然可以使用,但是由于第一列的高度必须相同,最终它仍然是57个字节
Kevin W.

嗯,我认为它可能只允许您生成"一次,因此您可以将一些代码从第一列转移到第二列。
Martin Ender

1

Python 2,91 75 69字节

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

在线尝试

说明:

这使用了标准quine的修改:

s='s=%r;print s%%s';print s%s

修改后:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

如果只允许一行,就足够了。然后,我在第二行中添加了两个字符来满足该要求。#第二行中的字符可以用任何东西替换,只要您也在第一行中进行更改即可,这使得程序在语法上有效。

现在要正确打印,我必须#在前两行的末尾打印。所以我从字符串中删除了前两个字符s,并在打印#前用来打印它们s%s。我将其中一个#放在的开头,s以通过删除换行文字来节省一些字节。

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.