原始和独特的保龄球


80

您面临的挑战很简单:仅使用唯一的字节以您选择的语言编写尽可能长的原始程序。(从该链接复制的原始程序的完整定义在此问题的底部。)

是的,没有附加条件。您的代码根本不需要做任何事情,只需运行就不会出错,满足原始程序的要求(上面链接),并且在使用的编码中不包含重复的字节。

出于以上解释和“原始程序”的链接定义的目的,错误定义为导致程序在有限的时间后完全无法运行或以非零退出代码终止的任何错误。

因为这是最长而不是最短,所以代码获胜(按字节数衡量)。理论上最大可能的分数是256,因为可能有256个不同的字节。如果是平局,则以最高分的第一个答案为准。


这是原始程序的完整定义,从上面的链接复制而来:

让我们将原始程序定义为本身没有任何错误,但是如果您通过删除任何连续的N个字符的子字符串来修改它会出错的程序,其中1 <= N < program length

例如,三个字符的Python 2程序

`8`

是原始程序,因为删除长度为1的子字符串导致的所有程序均会引起错误(实际上是语法错误,但任何类型的错误都可以):

8`
``
`8

并且由于删除长度为2的子字符串而产生的所有程序也会导致错误:

`
`

例如,如果`8曾经是一个没有错误的程序,那么`8`它将不会是原始的,因为所有删除子字符串的结果都必须出错。


37
恭喜您成功创建了一个很好的代码收集挑战!
ETHproductions

如果子程序永远运行但没有出错,那么答案是否无效?
dylnan '18

1
@dylnan“将错误定义为在有限的时间后终止[...] 。
user202729 '18

3
@Baldrickk不,这个挑战不会被允许。(如果您引用的是问题中的示例,那么这是一个原始程序的演示,但不满足唯一字节的额外要求。)
Aidan F. Pierce

1
如果在实践中通常会导致错误,那么我们可以将未定义的行为视为错误吗?我在想类似JMP <address outside of the program's memory>组装的东西。原则上,在真实计算机上,它可以无限循环或以非零错误退出,但通常会崩溃。
克里斯(Chris)

Answers:


20

果冻253254256字节

M“¢£¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#%&'()*+,-./0145689:;<=>?@ABCDEFGHIJKNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż”L»«’Ɗạ‘}237$¤¡

在线尝试!验证!

事实证明打高尔夫球的语言可以打...

  • 通过工作+1字节现在只«»不使用
  • 带+的+2个字节«»。现在获得最佳分数!

怎么样?

Jelly的关键特性使之成为可能,因为字符串文字的开始和结束字符与几乎所有其他语言都不相同。

程序结构如下:

M <239 character long string> L»«’Ɗạ‘}237$¤¡

M查找其参数指向最大元素的索引。重要的是,在对该程序不加任何参数的情况下0,Jelly M应用于时会分配给链和Jelly错误0

为了防止在整个程序中M起作用0,我们使用¡快速键,该快速键将应用M多次,该次数由紧接其前的链接的结果确定。在这种情况下,该链接为<239 character long string> L»«’Ɗạ‘}237$¤

L接受此字符串的长度(239),并将其»«’Ɗ减小为238。该»«部分除了执行任何操作外Ɗ(最后三个链接为monad)使之无效,因此,如果删除它们,则会发生错误。然后取的结果»«’Ɗ‘}237$应用于字符串的monad 之间的绝对差。递增并为monad,但将其}变为dyad并将其应用于正确的参数237,产生238。这样就产生0了完整的程序。

¤链接回字符串字面量,形成零位点。其结果是0,因此M根本不会应用,从而防止了任何错误。

可能的子程序:

  • 如果删除了字符串的任何部分,则该字符串<string>..¤将为非零值并将其M应用于0,从而导致错误。
  • 如果L»«’Ɗạ‘}237$删除了的任何部分,M则将其应用到0该字符串或一个数字之间,或者在该数字和数字之间进行运算,结果为TypeError
  • 如果任何一个¤¡被删除,M将应用于0
  • 如果字符串结尾字符和两者都’‘被删除并且没有被删除,则之后的所有内容都M将变成字符串,因此M将作用于0
    • 如果字符串关闭字符被删除而没有删除,则和之间的所有内容都会变成一个整数列表。
  • 如果M单独删除,则会出现一个,EOFError因为¡期望前面的nilad之前有一个链接。
  • 如果M“将其删除后再加上任意数量的字符,则会出现一个,EOFError因为在¤其前面查找了一个nilad但找不到一个。238不算在内,因为它是monad的一部分。

这几乎涵盖了所有内容。

我以前没有使用过,«»‘因为后两个不能与字符串匹配,因为它们与字符匹配以形成字符串以外的东西。«也不能放在“”字符串中,但我不知道为什么。


31

Haskell39 45 50 52 60字节

main=do{(\𤶸	陸 ⵙߜ 新->pure fst)LT
EQ[]3
2$1}

标识符main必须具有IO a某些类型a的类型。执行该程序时,将执行计算main,并且其结果将被丢弃。在这种情况下,其类型为IO ((a,b)->a)

结果是函数的应用,该函数(λ a b c d e f → return fst)是一个六参数常数函数,返回函数fst(给出2元组的第一个元素),该函数被注入IO monad中。这六个参数是LT(枚举不到), EQ(枚举平等),空列表[]321

用空格作为唯一字符替换什么是空格:制表符,不间断空格,换页,垂直制表符,OGHAM SPACE MARK,常规空格,换行符和回车符。如果缺少任何这些,则参数数量将不匹配。参数名称选择为三个或四个字节的UTF-8字符𤶸陸ⵙ商ߜ新,请谨慎选择不会导致重复字节的字符。

感谢@BMO的宝贵贡献。

十六进制转储:

00000000: 6d61 696e 3d64 6f7b 285c f0a4 b6b8 09ef  main=do{(\......
00000010: a793 c2a0 e2b5 990c e595 860b df9c e19a  ................
00000020: 80e6 96b0 2d3e 7075 7265 2066 7374 294c  ....->pure fst)L
00000030: 540a 4551 5b5d 330d 3224 317d            T.EQ[]3.2$1}

在线尝试!


嗯,'\109999'至少在GHC 8.2.2中似乎是有效的。'\10999a'产生词汇错误。
chepner '18

@chepner:我刚刚使用GHC 8.2.2进行了测试,并且𚶯也会产生词法错误。
ბიმო

2
@chepner:最大的Char是maxBound :: Char,即'\1114111'。注意:默认情况下,数字为小数,因此,如果要为十六进制,则必须在x后面加上\ ,例如'\x10999a'
nimi

@nimi Aaaand我想我们已经确定了我实际使用Unicode转义的频率:)对十六进制值使用正确的格式,\x10ffff可以正常工作,并且\x110000提供了超出预期的错误。
chepner '18

24

Python 2中 20个21 33 39 45  50字节

现在非常需要协作!

+2感谢Aidan F. Pierce(替换sorted({0})map(long,{0})

8由于dylnan(使用\和换行来替换空间;建议从移动0到一个数学表达式;替换-1-True;使用十六进制的)

+11感谢Angs(4*23+~91-> ~4836+9*1075/2然后是~197836254+0xbCABdDF-> ~875+0xDEAdFBCbc%1439/2*6


if\
map(long,{~875+0xDEAdFBCbc%1439/2*6})[-True]:q

在线尝试!或查看确认套件

0xDEAdFBCbc是十六进制,计算结果为59775106236
~是按位补码,因此~875计算为-876
%是取模运算符,因此0xDEAdFBCbc%1439求值为293
/是整数除法,因此0xDEAdFBCbc%1439/2求值为146
*是乘法,因此xDEAdFBCbc%1439/2*6求值为876
+是加法,因此~875+xDEAdFBCbc%1439/2*6评估为0
...没有剥离的版本也计算为0

{0}是一个set包含单个元素的0

主叫sortedset作为参数产生一个列表,该列表可以被索引与[...]

如果没有sorted代码({0}),只会产生,set而无法以相同的方式if({0})[-True]:q将其编入索引,则会引发TypeError

Python中的索引是基于0的,并且允许从后面进行负索引,并且True等价于1,因此sorted({0})[-True]找到元素0,而sorted({0})[True]will会引发和IndexErrorsorted({})[-True]并且sorted({0})[]语法无效。

0被发现是falsey这样的身体ifq被永远不会执行,但如果它是这将提高NameError,因为q尚未确定。

由于非空列表是真实的,所以我们不能缩小到if[-1]:q任何一个。

请参阅确认套件以查看:确认字节是唯一的;所有错误;以及代码本身的成功。


17

C(TCC),x86_64的,29个 31 33 39 40字节

main[]={(23*8),-~0xABEDFCfebdc%95674+1};

返回0感谢@feersum建议大写的十六进制数字。

在线尝试!

这个怎么运作

该分配将两个整数(18449664)写入main的内存位置。使用32位int和little-endian字节顺序时,精确的字节为b8 00 00 00 00 c2 00 00

由于tcc不会将定义的数组声明为.data(大多数编译器会声明),因此跳转到main会执行它指向的机器代码。

  • b8 00 00 00 00mov eax, imm32)将int 0存储在eax寄存器中。

  • c2 00 00ret imm16)从堆栈中弹出0个额外的字节并返回。(eax寄存器中的值是函数返回值)。


15

> <>,122字节

e"~l=?!z6-d0p}xwutsrqonmkjihgfcba`_]\[>ZYXWVUTSRQPONMLKJIHGFEDCB@<:98754321/,+*)('&%$# .	|{Ay

在线尝试!

什么也没做。基于与“ 编程原始世界”答案相同的格式。

首先,我们检查代码长度是否为122,如果不是,则返回错误。><>程序不能不使用该;命令而结束,但是如果该命令在程序中,我们可以删除它之前的所有内容以立即结束该程序。为了解决这个问题,我们在运行时使用p命令;在代码中放置一个。为此,我们从中减去6 A并将其放在之后p

一旦找出正确的两个字节值,我可能会在127以上添加其他大多数值。缺少的5个值是v^;和两个换行符。

在7502个子程序中,其中7417个由于无效指令而出错,72个由于内存下溢而出错,而13个由于内存不足而出错。


13

JavaScript,42个字节

if([0XacdCADE*Proxy.length]!=362517948)田
  • 删除ifif将引起SyntaxError: missing ; before statement;
  • 去除会导致SyntaxError: expected expression, got end of script;
  • 从中删除1或2个字节将导致Invalid or unexpected token;
  • 修改布尔表达式会导致语法错误或引用错误

00000000: 6966 285b 3058 6163 6443 4144 452a 5072  if([0XacdCADE*Pr
00000010: 6f78 792e 6c65 6e67 7468 5d21 3d33 3632  oxy.length]!=362
00000020: 3531 3739 3438 29e7 94b0                 517948)...


8

Brain-Flak,2个字节

<>

在线尝试!

或者[]{}()。卸下其中一个支架会导致另一个支架不匹配。

证明这是最佳解决方案:

Brain-Flak程序是由尼拉德人(一对单独的托槽)或单子(一个包含1个或多个尼拉德的托槽)组成的。一个monad不能处于原始程序中,因为您可以简单地删除一个或多个nilads。同样,程序中不能包含多个nilad,因为您可以在不破坏程序的情况下删除其中一个。

因此,对于原始或唯一编程而言,这可能是最不理想的语言。


6

Ada,110个字节(latin1)

您可能会从行业中使用的任何一种语言中得到最好的答案?

十六进制转储:

0000000: 7061 636b 4167 4520 6266 686a 6c6d 6f71  packAgE bfhjlmoq
0000010: 7274 7576 7778 797a e0e1 e2e3 e4e5 e6e7  rtuvwxyz........
0000020: e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f8  ................
0000030: f9fa fbfc fdfe 0d69 730b 656e 6409 4246  .......is.end.BF
0000040: 484a 4c4d 4f51 5254 5556 5758 595a c0c1  HJLMOQRTUVWXYZ..
0000050: c2c3 c4c5 c6c7 c8c9 cacb cccd cecf d0d1  ................
0000060: d2d3 d4d5 d6d8 d9da dbdc ddde 3b0a       ............;.

通过保存到任何结尾.ads并正在运行的文件进行编译gcc -c <filename>。产生不执行任何操作的可执行文件。(无法提供TIO链接,因为TIO将代码放入.adb文件中,并且gcc默认情况下会尝试为其找到匹配的规范)

基本上声明一个名称滥用大写/小写拉丁字母的软件包。每个空格都需要一个不同的空格字符,因此它使用空格,CR,LF和TAB。

在vim版本中的外观:

packAgE bfhjlmoqrtuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ^Mis^Kend^IBFHJLMOQRTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ;

这个怎么运作

在Ada中,甚至可以编译规范。Spec就像c的头文件一样,但是功能更全,可以编译一些基本代码。为了有效,任何规范都必须具有以下格式:package <NAME> is ... end <NAME>;具有<NAME>匹配项。关于Ada的好处是它完全不区分大小写。因此,只要您的名字有大写和小写变体,就可以了!

困难的部分是获得可编译的单元。通常,Ada程序的“主”过程或函数位于将成为最终可执行文件的任何程序包之外。不幸的是,过程需要begin关键字,这会导致es 过多(仅2种情况),而函数需要return关键字,这会导致ns 过多。因此,我只需要编译一个程序包。


4

C,8个字节

main(){}

什么也没做。

在线尝试!


1
也许我不理解挑战,但是呢main(){short x;}
Jerry Jeremiah

@JerryJeremiah:不,main(){short;}仅编译一个warning: useless type name in empty declaration。我认为C99和C ++需要一个显式的返回类型,因此int main(或也许unsigned main)可以工作,但不能与gcc一起使用,后者甚至会发出警告-std=c11
彼得·科德斯

@JerryJeremiah:return 0;C89可能有可能,其中C return 0的末尾没有隐式main。根据其他答案,以非零状态退出可以视为失败。是否-Werror在代码保龄球中以良好的方式添加类似编译器标记的分数?因为严格执行违反C11的规定可能允许更长的程序。嗯,#include<>先用点东西再用;您不能同时删除包含和用法,如果没有原型或宏定义而崩溃,您将获胜。
彼得·科德斯

@PeterCordes我想过,但maininclude都含有i,所以你不能兼得。类似地用于声明和使用函数。还在使用return中想到了它。
克里斯(Chris)

糟糕,我忘记了唯一字节要求;当然int main不能用。
彼得·科德斯

4

JavaScript,22个字节

with(0xF?JSON:[])parse

在线尝试!

可能的错误

更改后,它将引发以下错误1之一

[some_identifier] is not defined
expected expression, got ')'
expected expression, got ':'
expected expression, got '?'
expected expression, got ']'
expected expression, got end of script
identifier starts immediately after numeric literal
missing ( before with-statement object
missing ) after with-statement object
missing : in conditional expression
missing ] after element list
missing exponent
missing hexadecimal digits after '0x'
missing octal digits after '0o'
unexpected token: ')'
unexpected token: ']'
unexpected token: identifier

1.不同错误的确切数量取决于引擎。该列表是使用SpiderMonkey(Firefox)生成的。


3

Python 3 + Flask-Env7 13 14 17字节

import\
flask_env

没有TIO,因为它没有flask-env

找到最长的模块名称,该名称与名称无交集import且名称末尾没有任何数字。_sha256更长,但256仅靠它本身不会出错。我确实找到了一个库,b3j0f.sync该库长了一个字节,但是我无法正确导入它。

  • 1字节由后更换空间import\<newline>。取出其中一个或两个都导致错误。

可能还有比更长的选择flask_env,我没有进行详尽的搜索,但确实浏览了约70,000个模块。公开建议。


256运行没有错误。
艾丹·皮尔斯

@ AidanF.Pierce谢谢,已修复。
dylnan '18

我尝试了import *[hawkey]类似的操作,但不幸的是无法正常工作……
dylnan '18

1
hawkey不在标准库中,因此是“带有hawkey的Python”(可能可以在某些地方使用其他模块做得更好)
Jonathan Allan

@JonathanAllan好点。必须马上走,但我稍后再搜索
dylnan '18

3

R,14个字节

(Sys.readlink)

在线尝试!

这在R中可能是最长的。调用任何函数注定会失败,因为您将能够删除除函数名之外的所有内容,这只会导致打印函数的源代码。这是默认R设置中最长的命名对象,删除重复的字符时没有重复的字符,也没有剩余的对象名。

第一次尝试没有用,但是我通过尝试学到了很多东西!

dontCheck({family;NROW})


2

Perl 5、3个字节

y=>

=>是“胖逗号”,在左边引用了裸字。所以这相当于

"y",

什么都不做。

没有胖逗号的y是音译运算符,如果后面没有重复三个相同字符,则无效。

单独脂肪逗号也是无效的,因为是=>孤独。




1

标准ML,22字节

val 1089=op-(765,~324)

在线尝试! op-(a,b)是的减糖形式a-b~表示一元减,所以我们实际上是在计算765+324。该表达式在常量上模式匹配1089。如果程序没有被篡改并且没有发生,则此匹配成功-没事。

如果由于删除了一些数字而导致匹配失败,则会得到一个unhandled exception: Bind。删除会op-导致类型错误,因为元组在上匹配int。所有其他删除都将导致语法错误。


1

斯威夫特4,19字节

[].contains{1 !=
0}

在线尝试!

我发现的所有可能的错误是:

  • 移除任何一项[]{}将导致语法错误
  • 删除[].将导致Use of unresolved identifier 'contains'
  • 删除.将导致Consecutive statements on a line must be separated by ';'
  • 删除[]将导致Reference to member 'contains' cannot be resolved without a contextual type
  • 删除{1 !=␊0}将导致Expression resolves to an unused function
  • 删除1 !=␊0将导致Missing return in a closure expected to return 'Bool'
    • 删除换行符将导致 '!=' is not a prefix unary operator
    • 删除空间将导致 '=' must have consistent whitespace on both sides
    • 删除!=将导致Missing return in a closure expected to return 'Bool'
      • 同时删除换行符将导致 Consecutive statements on a line must be separated by ';'
      • 删除空格和换行符(以及零或一位数字)将导致 Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
  • 删除[].contains将导致Closure expression is unused

其他一些有趣的程序是(每行一个):

[].isEmpty
[:].values
[1:2]

这包含两个as
caird coinheringaahing 18-4-19的



0

视网膜,2个字节

如果这是最佳的,我不会感到惊讶...

()

在线尝试!

正则表达式包含一个空组。由于括号不匹配,删除任何一个括号都会导致解析错误。

其他的解决方案是:\(\)\[\]\*\+\?a]


a]没有错误。
jimmy23013 '18

@ jimmy23013啊,我不知道我怎么想念它。回滚。
mbomb007 '18

-2

C(gcc)73 75字节

#include <ftw.h>
ABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890(){g FTW_D-1;}

在线尝试!

基于@Steadybox的答案,感谢@Angs检测到严重错误。

是的,这一个肮脏的技巧(因为它实际上使用了#definewith -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main-Dg=return),但是我看不到任何禁止此类编译器选项的规则。


第一行可以删除,因此程序不原始
Angs

@Angs谢谢,已修复(带有添加其他编译器选项的价格)
法拉利813 '18

6
根据此元后,您提交的是C语言不再,但C89 + -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main+ -Dg=return,所以我认为,这使用专为挑战而设计的虚构的语言,这是默认禁止的。
丹尼斯
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.