Triplegolf-不仅源代码的长度很重要!


15

挑战的目标是编写一个程序,其中以下三个的长度完全相同:

  • 源代码的长度
  • 打印到标准输出的输出长度
  • 您选择的(未修改)编译器生成的编译器警告的长度

获胜者是满足所有这三个条件的最短代码,并且必须至少长1个字符。

更有趣的是,如果输出中少于三个不同的字符,则每个字符的长度加5点惩罚(如果只有一种,则为+10,两个为+5)。

(您可以选择以1或2个字符作为换行符,但是在所有这三个条件中换行符必须保持一致。在这三个条件的所有行中,前导空格和尾随空格都将被忽略)

如果得分相等,则赢得最有趣结果(而不是垃圾)的人将成为赢家。


1
什么是“字符类型”?
彼得·泰勒

5
另外,如果编译器产生非警告输出(例如“ Compiling Main”),该怎么办?另外,如果源文件名出现在警告消息中(例如“ foo.c:1:1:...”)怎么办?
乔伊·亚当斯

3
我选择的武器是VBA,它实际上没有编译器,并且不输出要运行的二进制文件(我相信某些其他语言也是如此)。是否有考虑因素,或者我是否默认被取消资格?
加菲2012年

2
我想知道在某些语言中三重奎因是否可行?
Ry- 2012年

2
对于解释型语言,即使出现错误,我们也会得到输出,在这种情况下,这些错误是否被接受或仅接受警告?
l0n3sh4rk'5

Answers:


14

Bash,23个字符

错误:

bash: /: Is a directory

资源:

echo       $0-$01234;/;

输出:

/bin/bash-/bin/bash1234


Brainf * ck,32个字符

该代码执行大约3秒钟,然后停止并显示以下错误和输出。

错误:

bff: out of memory (-2058691272)

资源:

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

输出:(Hexdump)

0505 0505 0505 0404 0404 0404 0303 0303
0303 0202 0202 0202 0101 0101 0101 0000


C,35个字符

警告:

b.c:1:30: warning: division by zero

源和输出:

main(){system("cat "__FILE__)/0;;;}


PHP,50个字符

警告:

PHP Warning:  Division by zero in /tmp/3 on line 1

源和输出:

<?php echo (0/0).''.file_get_contents(__FILE__);?>

1
bash示例是一个错误,而不是警告。
彼得·泰勒

您为C解决方案使用什么编译器?
12

@breadbox gcc版本4.7.0 20120505(预发行版)(GCC)
l0n3sh4rk 2012年

8

C-48个字符

main(i){while(++i<49)putchar(i);putchar('\z');}

注意:包括最后一个(Unix风格的)换行符。

输出gcc a.c内容如下:

a.c:1:41: warning: unknown escape sequence '\z'

来自的输出a.out大部分是非打印字符,因此这是通过hexdump进行管道传输后的样子:

00000000: 0203 0405 0607 0809 0A0B 0C0D 0E0F 1011  ................
00000010: 1213 1415 1617 1819 1A1B 1C1D 1E1F 2021  .............. !
00000020: 2223 2425 2627 2829 2A2B 2C2D 2E2F 307A  "#$%&'()*+,-./0z

我的理解是不可打印的(whitepace?)被截断了,所以这不算在内。如果可行,我可以改善自己的答案。
加菲2012年

1
控制字符通常不被视为空格,除了\ t,\ n,\ r,\ f以及有时为\ v以外。这些都不是领先或落后,所以我认为我很安全。
面包箱

1
我认为这完全可以接受。他们不是空白,并且在任何情况下,这不是ACM是严格的要求。此“空白规则”的主要原因是某些IDE可能会严重格式化其编译器输出。
vsz 2012年

1
@copy或main(i){i='\z';while(i-->74)putchar(i);}-但减小程序大小实际上适得其反。
面包箱2012年

1
这是我最喜欢的答案,我知道我应该禁止访问文件的内容(就像真正的奎因一样)
vsz 2012年

5

JavaScript,63 66

!function x(){console.log(x+'...');eval(Array(33).join('$'))}()

输出为:

function x(){console.log(x+'...');eval(Array(33).join('$'))}...

在Chrome中,错误为:

ReferenceError: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ is not defined

3

Visual Basic .NET,185

e,vbc其编译警告非常冗长。无论如何,代码是这样的:

Public Module Main
    Public Sub Main()
        Console.WriteLine(New String("a"c,185))
    End Sub

    Public Function A()
        'This is actually just padding.
        'Hi
    End Function
End Module

(请注意,它们应该是制表符,而不是空格。)

输出是这样的:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

编译器警告是这样的:

warning BC42105: Function 'A' doesn't return a value on all code paths. A null reference exception could occur at run time when the result is used.

    End Function
    ~~~~~~~~~~~~

(这一次,实际上是四个空格,而不是制表符。)


3

Zsh,20个字节

<<<   $-$_$_$_$_$_
[

上面的评论中提到了我们在这里面临的问题:Zsh 在每个错误之前在行号之外还打印程序名称。这里的解决方案使用一个字符的文件名来滥用它。 我将其包装在一个辅助脚本中,以准确显示其打印内容,并用于wc -cstderr,stdout和源文件。

输出:569Xcatcatcatcatcat后跟换行
错误:s:[:2: ']' expected后跟换行


编辑:备用20字节解决方案,无文件限制:

<<<$-$-$-$-$_>&1 >&2

在线尝试!

岩组zsh -x10个字节

<<<$_$_$_

-x标志启用xtrace。这再次需要一个单字符的文件名。 在线尝试!

Zsh zsh -JNTwEDY,12个字节

<<<$->&1 >&2

-flag没有文件名要求的最短答案。设置更多标志,并$-全部打印出来。在线尝试!


2

JavaScript(Firefox 54),34个字节

alert((f=function(x)1234)(56)+f+f)

输出:

1234function(x)1234function(x)1234

并将此警告发送到浏览器控制台:

expression closures are deprecated

在我的Firefox Developer Edition(54.0a2)副本中看起来像这样。它也可以在其他版本的Firefox中使用。


2

Ruby,48个字符

IO=1;puts ?a*48;# let's make it 48 bytes long :)

产出

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

警告

r.rb:1: warning: already initialized constant IO

(文件是r.rb,我删除了路径,如果从irb运行它,则会得到(irb):1:警告...)

Ruby中有warn方法,但是它只是将其参数输出到$ stderr,使其看起来不像是警告。


1

Python,57个字节

其他口译员可能会以不同的方式显示警告。仅在TIO上进行了测试。

from warnings import*
print("prt"*19)
warn("Warning...!")

在线尝试

输出量

prtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprtprt

警告

.code.tio:3: UserWarning: Warning...!
  warn("Warning...!")

请注意,前导空格不计入字节数。如果不忽略前导空格,则可以以51个字节为单位。


1

Javascript(ES6),32个 30字节

Screen(console.log(Function));

版画

ƒ Function() { [native code] }

在Chrome中,然后抛出

TypeError: Illegal constructor

我原来的32字节解决方案:

(x=y=>console.log(x+!0+10)||z)()

首先,版画

y=>console.log(x+!0+10)||ztrue10

并抛出错误

ReferenceError: z is not defined

0

VBA,39字节

给定编译器约束,不确定是否符合条件,但是:

输入:(在立即窗口中)

For i=1 To 39:a=a & Chr(i):Next:Print a

* 输出中包含在此窗口中无法正常播放的非打印字符。


VBA没有给出任何编译器警告,所以我认为这不算是有效
Taylor Scott

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.