输出长度与代码相同


97

在这个挑战中,您应该编写一个程序或函数,该程序或函数不输入任何内容,并输出或返回一个与程序本身具有相同字节数的字符串。有一些规则:

  • 您只能输出可打印ASCII范围(0x20至0x7E,包括0x20至0x7E)或换行符(0x0A或0x0D)中的字节。
  • 您的代码不得为quine,因此代码和输出必须至少相差一个字节。
  • 您的代码必须至少一个字节长。
  • 如果您的输出包含尾随换行符,则这些是字节数的一部分。
  • 如果您的代码需要非标准命令行标志,请照常对它们进行计数(即,通过将对语言实现的标准调用中的差异加到字节数上),并且输出的长度必须与解决方案的分数相匹配。例如,如果您的程序是ab并且需要非标准标志-n(我们假定它不能与标准标志结合使用,那么它是3个字节),则应该总共输出5个字节。
  • 只要您可以证明每个可能的输出都满足上述要求,输出就不必总是相同的。
  • 通常的奎因规则适用。您可以阅读源代码或其大小,但我怀疑这会比大多数语言中的硬编码短。

您可以编写程序或函数,并使用提供输出的任何标准方法。请注意,如果您打印结果,则可以选择将其打印到标准输出或标准错误流中,但是只有其中一个计数。

您可以使用任何编程语言,但是请注意,默认情况下,这些漏洞是禁止的。

这是,因此以字节为单位的最短有效答案为准。

排行榜



18
“您的代码一定不能是quine”但是……但是……它被标记为quine
Okx

4
@Okx因为它是广义的quine,即所需的输出取决于源代码。
Martin Ender

4
@MartinEnder您可能应该禁止通过退出代码输出,这是默认设置。如果允许,几乎允许使用几乎每种语言的每个字节程序。 一个用户已经这样做了
Sriotchilism O'Zaic

2
退出代码输出的@WheatWizard不是字符串,因此不适用于此处。
马丁·恩德

Answers:


204

C(现代Linux),19字节

main(){puts('s');}

编译并运行后,将输出:

Segmentation fault

20
:D
Beta衰变

4
这更像是“ C + English unix / posix OS;)”
Florian Castellane

5
我认为写“ C,现代Linux”比只写“ C”会更好:在Windows下,错误消息有所不同,在过去,Linux程序甚至以可读取地址0x73('s')的方式进行编译因此没有引起异常。
马丁·罗斯瑙

9
我加入该网站只是为了支持这个答案。
Nitish

7
令人印象深刻的是,不是输出输出的是C程序,而是运行它的
Dennis,

80

Excel,11个字节

挪威语版本:

=SMÅ(13^9)

英文版(12字节):

=LOWER(17^9)

生成n位数字,并通过转换为小写形式转换为文本。


106
这给“为工作选择正确的语言”赋予了全新的含义。
Martin Ender

4
这是一个好主意。=9^7&""生成两种语言中的7位数字并且只有7个字节的操作会更短。
OpiesDad

@OpiesDad不错的解决方案,我认为您应该将其发布为答案,以便我投票。
pajonk

4
@MartinEnder让我感到很高兴的是,您的猜测/潜在的笑话比这个答案更令人讨厌(尽管它很接近)。
HyperNeutrino

55

迷宫,4字节

!!>@

在线尝试!

版画 0000

说明

!   Print an implicit 0 from the stack.
!   Print an implicit 0 from the stack.
>   Rotate the source code right by one cell, so the code now becomes

    @!!>

    The IP is moved along, so it's now at the end of the line, which is 
    a dead end. So the IP turns around and starts moving left.
!   Print an implicit 0 from the stack.
!   Print an implicit 0 from the stack.
@   Terminate the program.

6
那太聪明了。在房子上加+1!
caird coinheringaahing


40

视网膜,2个字节

no

在线尝试!

打印0和换行。

有很多2字节解决方案,但我认为这是最佳选择。视网膜默认情况下始终打印尾随换行符,而摆脱掉它需要太多字节。因此,我们必须找到一个1字节的程序,使空输入保持不变。我相信唯一执行此操作的程序是包含单个换行符的程序,因此该换行符等于输出,因此不被挑战所允许。

接下来要做的最简单的事情是让Retina输出一位数字(某些正则表达式与空输入的匹配数),我们可以使用很多失败(或匹配)的2字节模式来做到这一点。


27
+1对于告诉我不要运行的代码:P
Christopher

33

Mathematica,2个字节

4!

阶乘

24


1
加!太聪明了。
tuskiomi

2
击败我!+1。(我想您应该提到这是Mathematica的REPL版本。)
格雷格·马丁

如果这是一个合理的答案,答案“ 1”是否也将是一个合理的答案?(在Mathematica的REPL中添加“ 1”也将返回“ 1” ...)
马克·西格尔

3
@MarkSegal这将违反无规则规则。
AlexR

6
规则:...“ ...代码和输出必须至少相差一个字节”
J42161217

29

C,20个字节

f(){printf("%20d");}

输出一些数字,用空格填充,长度为20。(什么数字?内存中接下来发生的任何事情。)

一些示例在我的系统上运行:

llama@llama:...code/c/ppcg121056samelen$ ./a.out 
           -666605944
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
          -1391039592
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
           1727404696
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
             10717352
llama@llama:...code/c/ppcg121056samelen$ ./a.out 
           1485936232

可惜的是,输出不能是任意字节,因为这样可以允许这种19字节的解决方案:

f(){write(1,f,19);}

f的地址开始输出19个字节的垃圾。


我很高兴看到一个利用变化输出规则的答案。:)
Martin Ender

这不是段错误吗?
丹尼尔(Daniel)

TIO链接在哪里?
CalculatorFeline

@Daniel否,打印的号码将来自%esi寄存器的先前内容。
门把手

8
@Doorknob,但是它仍然是未定义的行为,因此,更具虐待狂性的编译器在这里可能会做一些完全不同的事情
Sarge Borsch

29

Linux上的Bash,6

uname

(后跟换行符)

输出Linux后跟换行符。


2
从技术上讲uname不是内置的bash-它是一个单独的可执行文件
Jason Musgrove


@GammaFunction您认为unamebash内置在哪里?我现在可以放手的每个发行版都是一个单独的二进制文件,包括TIO。相反,正如您所链接的答案所示,umask大多数/所有Shell中都内置了该组件。
数字创伤

没有看到uname一个内置。当我说“ -1,实际上是内置的”时,我的意思是“此答案使用umask-1字节,umask实际上是内置的”。
GammaFunction

@GammaFunction抱歉-我在您的评论中误解了“ -1”的含义-我已经习惯了那些含义不佳的评论和解释原因的评论。
数字创伤

27

Javascript ES6,9个字节

使用模板字符串

_=>`${_}`

f=

_=>`${_}`

console.log(f());
console.log(typeof f());


undefined认为是字符串?
毛茸茸的

3
@Shaggy查看编辑。我正在使用字符串插值
Weedoze

哇,这是我在PPCG上的第二篇文章和14个赞!谢谢
Weedoze

1
为什么简单的乳清会让您遇到困难?(_=>_+'')
GOTO 0

1
@ GOTO0好的,您保留括号。这是另一种选择。我个人更喜欢我的嘿嘿
Weedoze

24

金字塔方案74 43 42字节

感谢Khuldraeseth na'Barya,节省了31个字节!由于JoKing重新设计了解决方案,节省了1个字节!

  ^
 /^\
^---^
-^ ^-
 -^-
 /2\
/ 8 \
-----

在线尝试!输出41位数字28^28 = 33145523113253374862572728253364605812736,后跟换行符。


旧版本

  ^
 / \
/out\
-----^
    /^\
   ^---^
  /1\ /9\
 /606\---
/51015\
-------

在线尝试!

输出71277303925397560663333806233294794013421332605135474842607729452115234375= 160651015 ** 9或大约10 74


6
嘿,您要出售语言吗?如果是这样,您将被逮捕。-警察
NoOneIsHere

2
@NoOneIsHereHere请原谅?
科纳·奥布莱恩

3
抱歉,它称为“金字塔方案”,它也是一种骗局的名称。
NoOneIsHere

1
ohhhhhhhhhhh rofl
Conor O'Brien

1
隐式输出使您减少到43个字节
Khuldraeseth na'Barya



18

brainfuck,25个字节

--[-->+<]+++++[->-.....<]

在线尝试! 注意:需要使用8位无符号单元的实现

输出:

~~~~~}}}}}|||||{{{{{zzzzz

说明

--[         254
 -->+<]      /2 = 127 into the second cell
+++++[      Five times
 ->-.....<]  Print the second cell - 1 five times

4
有许多BF变化,例如8位单元初始化磁带。或有限的磁带和无限的单元格。我很确定您的模型是无符号的8位单元模型,但是如果您将其包含在答案中,那会很好。
罗曼·格拉夫(RomanGräf),

@RomanGräf好点!如果需要非标准实现,我通常会提供这些信息。这个答案应该适用于任何标准实现(8位无符号单元,任何磁带),但是我将添加一条注释来阐明。
Zack C.

您不能使用一个1字节的程序.来打印无法打印的NULL字符吗?
重力1998年

@Graviton这将违反此挑战的第一条规则。但是,这是默认为可打印值的BF导数的有效解决方案(请参阅:my brainbool答案)。
Zack C.


16

C(Ideone),14个字节

f(){warn(0);}

命名其可执行文件的Ideone上,这将prog输出以下内容并带有结尾的换行符。

prog: Success

C(GCC),15个字节

f(){warn(00);}

因为GCC会写一个a.out默认情况下命名的可执行文件(没有其他会占用字节的标志),所以这会输出以下内容并带有尾随的换行符。

a.out: Success

7
@MDXF规范说明程序或函数,因此函数提交是完全有效的。由于用户未在此处选择文件名(Ideone和gcc都具有默认值),所以我认为这很好(个人观点)。
丹尼斯

15

C(gcc)18 17字节

f(){puts('@C');}

需要注意的是有一个STX字节(0×02之间)@C

在线尝试!

可移植性

已在Fedora 25上使用gcc 6.3.1和clang 3.9.1,在Ubuntu 14.04.4上使用gcc 4.8.4和在openSUSE 13.2上使用gcc 4.8.3对此进行了测试,在此打印以下输出。

inux-x86-64.so.2

我希望这会与所有版本的gcc产生相同的输出,只要它可以编译为以下类型的可执行文件即可。

ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2

不同的平台将需要不同的内存地址,并且多字符字符常量中的字节可能需要不同的顺序。

例如,用clang 3.8.0在FreeBSD 11上替换@\2C@\2\4打印exec/ld-elf.so.1和换行符。

离线验证

$ printf "%b\n" "f(){puts('@\2C');}main(){f();}" > quine.c
$ gcc -w -o quine quine.c
$ ./quine
inux-x86-64.so.2
$ ./quine | wc -c
17

这个怎么运作

缺省情况下,ld使用0x400000作为文本段的基地址,这意味着我们可以找到从内存地址0x400000开始的ELF内容。

ELF的前640个字节在很大程度上与实际源代码无关。例如,如果在f的声明后面紧跟着main(){f();}别的,则它们看起来如下。

00000000: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  .ELF............
00000010: 02 00 3e 00 01 00 00 00 00 04 40 00 00 00 00 00  ..>.......@.....
00000020: 40 00 00 00 00 00 00 00 e8 19 00 00 00 00 00 00  @...............
00000030: 00 00 00 00 40 00 38 00 09 00 40 00 1e 00 1b 00  ....@.8...@.....
00000040: 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00  ........@.......
00000050: 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00  @.@.....@.@.....
00000060: f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00  ................
00000070: 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00  ................
00000080: 38 02 00 00 00 00 00 00 38 02 40 00 00 00 00 00  8.......8.@.....
00000090: 38 02 40 00 00 00 00 00 1c 00 00 00 00 00 00 00  8.@.............
000000a0: 1c 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00  ................
000000b0: 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00  ................
000000c0: 00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00  ..@.......@.....
000000d0: 04 07 00 00 00 00 00 00 04 07 00 00 00 00 00 00  ................
000000e0: 00 00 20 00 00 00 00 00 01 00 00 00 06 00 00 00  .. .............
000000f0: 08 0e 00 00 00 00 00 00 08 0e 60 00 00 00 00 00  ..........`.....
00000100: 08 0e 60 00 00 00 00 00 1c 02 00 00 00 00 00 00  ..`.............
00000110: 20 02 00 00 00 00 00 00 00 00 20 00 00 00 00 00   ......... .....
00000120: 02 00 00 00 06 00 00 00 20 0e 00 00 00 00 00 00  ........ .......
00000130: 20 0e 60 00 00 00 00 00 20 0e 60 00 00 00 00 00   .`..... .`.....
00000140: d0 01 00 00 00 00 00 00 d0 01 00 00 00 00 00 00  ................
00000150: 08 00 00 00 00 00 00 00 04 00 00 00 04 00 00 00  ................
00000160: 54 02 00 00 00 00 00 00 54 02 40 00 00 00 00 00  T.......T.@.....
00000170: 54 02 40 00 00 00 00 00 44 00 00 00 00 00 00 00  T.@.....D.......
00000180: 44 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  D...............
00000190: 50 e5 74 64 04 00 00 00 b0 05 00 00 00 00 00 00  P.td............
000001a0: b0 05 40 00 00 00 00 00 b0 05 40 00 00 00 00 00  ..@.......@.....
000001b0: 3c 00 00 00 00 00 00 00 3c 00 00 00 00 00 00 00  <.......<.......
000001c0: 04 00 00 00 00 00 00 00 51 e5 74 64 06 00 00 00  ........Q.td....
000001d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001f0: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00  ................
00000200: 52 e5 74 64 04 00 00 00 08 0e 00 00 00 00 00 00  R.td............
00000210: 08 0e 60 00 00 00 00 00 08 0e 60 00 00 00 00 00  ..`.......`.....
00000220: f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00  ................
00000230: 01 00 00 00 00 00 00 00 2f 6c 69 62 36 34 2f 6c  ......../lib64/l
00000240: 64 2d 6c 69 6e 75 78 2d 78 38 36 2d 36 34 2e 73  d-linux-x86-64.s
00000250: 6f 2e 32 00 04 00 00 00 10 00 00 00 01 00 00 00  o.2.............
00000260: 47 4e 55 00 00 00 00 00 02 00 00 00 06 00 00 00  GNU.............
00000270: 20 00 00 00 04 00 00 00 14 00 00 00 03 00 00 00   ...............

使用,例如,main(int c, char**v){f();}改为更改一些字节,但不更改字符串的偏移量/lib64/ld-linux-x86-64.so.2,我们将使用它来产生输出。

所述字符串的偏移量为0x238,长度为27个字节。我们只想打印17个字节(如果使用puts,最后一个将是换行符),因此我们在偏移量上加上11以获得0x243,即偏移量inux-x86-64.so.2。将0x4000000x243相加得到0x400243,即的存储位置inux-x86-64.so.2

要获得此内存地址,我们可以使用多字符字符常量,这些常量表现出实现定义的行为。0x400243在基数256中为(64)(2)(67),并且gcc的多字符字符常量使用big-endian字节顺序,因此'@\2C'产生所需字符串的内存地址。

最后,puts在该内存位置打印一个(以null结尾的)字符串,并在结尾插入换行符,从而创建17个字节的输出。


这是巫术...这是否假定已编译程序集的字节顺序或其他内容?
帕特里克·罗伯茨

在我的系统上输出(使用GCC 6.3.1的Linux):U使用编译时-Df=mainU使用编译时main(){f();}
MD XF

@PatrickRoberts在这一点上,我真的不确定这些假设是什么。由于它在汇编的ELF文件中查找,因此它很大程度上取决于编译器在实际代码之前编写的所有内容。
丹尼斯

@MDXF找到了一种获取合适的内存地址的较短方法。它现在可以在我的Ubuntu 14.04 VPS上运行,但可以使用ymmv。
丹尼斯

@Dennis现在可以正常工作了。如果到了周末,没有人找到一个更短的解决方案,那么赏金就是您的。
MD XF

13

自修改Brainfuck,5字节

<[.<]

在线尝试!

输出:

]<.[<

说明:

真的很简单,反向打印源。在SMBF中,程序的内容存储在磁带上指针初始位置的左侧。向左滑动并打印将向后输出源代码。

由于在此挑战中允许阅读源,因此绝对应在规则之内。


13

基本算术计算器,2个字节

1=

打印1.,或:

    |
    |
    |  .

在那些愚蠢的七段显示器上。

要重现,请选择任何随机计算器;他们都以某种方式安装了这种编程语言。


1
所有的计算器都是这样吗?我确定他们确实会不断显示小数点
Beta衰减

是不是1.不是1x?同样,这是一个规则规定不允许的奎因。
暴民埃里克(Erik the Outgolfer)'17年

不,是1=,我搞砸了。我的意思是1x隐式等于,但是我忘了那=是一个按钮。
OldBunny2800 '17

它仅1在我的TI-36和TI-84 CE上输出。这些不算作“基本”计算器吗?
本杰明·厄克特

不,TI 84不是算术计算器,而是图形计算器。我不知道36,但是我很确定它是科学的计算器。该答案适用于四功能计算器。
OldBunny2800


12

Brachylog,1个字节

w

在线尝试!

说明

w是内置的“写入”。在这里,它将写入输入。由于Input是一个自由变量,w因此在打印之前将其标记为整数。它尝试的第一个整数是0


Here, it will write the Input.“输入”是程序本身吗?难道这不算是阅读源代码吗?默认情况下,源代码是骗子?
MD XF

4
@MDXF“通常的奎因规则不适用”
罗伯·瓦茨

3
@MDXF输入是特殊的Brachylog变量,您可以在调用Brachylog程序时进行设置。它进入TryItOnline的Input部分。在这里,我们没有为Input设置任何内容,因此它实际上是一个变量。它不是程序。
致命的行动

10

Java(OpenJDK 8),11个字节

o->1e8-1+""

在线尝试!

输出:

9.9999999E7

只是比显而易见的答案更复杂一点()->"".format("%23s",0)

节省

  • 18-> 16个字节:由于PunPun1000,舍入和10的幂的更有利的组合
  • 16-> 13个字节:更好的公式,这要归功于JollyJoker
  • 13-> 11个字节:改进了公式,这要归功于Kevin Cruijssen

2
()->1E10-1+"",又"9.999999999E9" (13)节省了三个字节
JollyJoker

1
您可以通过更改1e10为来保存1个字节1e9,或者使用空输入代替() 2个字节,而不是这样:o->1e8-1+""(outputs 9.9999999E7; length&byte-count 11)。
Kevin Cruijssen

9

05AB1E,1个字节

õ

输出单个换行符。õ推送一个空字符串,并用换行符隐式输出。

在线尝试!

其他一些2字节解决方案,为您带来观看乐趣(输出位于方括号中,并且所有输出均带有尾随换行符):

X, (1)
Y, (2)
¾, (0)
¼, (1)
¶, (newline)
ð, (space)
Î, (0)

虽然还有更多的2字节解决方案。


“这是一种可接受的输出方法”仅适用于功能解决方案,不适用于完整程序。
马丁·恩德

@MartinEnder那么这些解决方案可以算作功能吗?不太确定,因为我在这里不经常使用函数。
Okx

我对05AB1E的了解还不够,但是只有当它们实际上是对函数对象求值的表达式时,它们才被认为是函数(我怀疑它们会这样做,因为使用它们会立即导致命令被执行)。
Martin Ender

9

V / vim,1个字节

o

这将打印一个换行符。

在线尝试!

有很多变种也可以使用。例如,

O

在vim中,以及

Ä
ä
ï
Ï

在V中

还有很多很多很多的三字节解决方案。例如:

3ii
i³i
¬ac

这些都是V特有的。


3ii不会扩展,直到您按Escape键,那么它应该是三到四个字节(还是击键)?
almyr

@algmyr在vim中,您是正确的。它必须是。4ii<ESC>但是V隐式地在程序结束时填充了转义符。
DJMcMayhem


8

六边形,3个字节

o!@

在线尝试!

印刷品111

展开:

 o !
@ . .
 . .

但是代码实际上只是按顺序运行o!@

o   Set the memory edge to 111, the code point of 'o'.
!   Print this value as a decimal integer.
@   Terminate the program.





7

果冻,1 字节

V

相当多的Jelly byterter(这是一个),它评估左参数,当没有提供任何输入作为输入时,默认为零,然后默认为零,然后隐式打印结果为a 0

在线尝试!

实际上,在代码页中的256个字节中,当作为一个完整程序运行时,只有95个当前在指定范围内不会产生不同的一个字节输出。这些是(按字节顺序的代码页字符):

¡¢£¦©½¿€ÇÑÞßçıȷñ÷þ"#&',-./0123456789:;?@IMRTVZ\`dmpstxyz{}~°³⁴⁵⁹ƓƈɠḶỌṬḊĖİĿṄȮṖṘẆẊṃọṣṭḃḟḣŀṁṗṡẋż’“

笔记:

  • 大部分1字节程序会打印a 0(无操作/产生一个带有单个零的列表,其中打印a 0),大多数其他程序会打印a 10=0等等)

  • 是一个程序,产生一个不同的字节,但是一个程序超出规范的范围-它产生空字节(将0to 转换为字符)

  • 产生一个空格(文字)

  • 产生换行(文字)

  • 现在可以工作的某些字节将来可能不会再使用-我认为有几个字节被保留(我相信),这些值在分配时几乎肯定不会产生一个字节的输出。


1
死链接byte
Weedoze

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.