你好世界扭曲


17

您的目标:编写一段代码,得到经典的结果:“ Hello,world!” 被打印到STDOUT或同等版本。

规则:代码必须完全以ASCII码打印。所有代码都必须可以使用-删除任何单个计数字符都必须更改结果或导致代码无法使用。分配后必须使用所有变量。字符和字符串文字必须是输出所必需的-也就是说,用另一个字符替换任何字符文字或字符串文字中的任何字符都必须能够更改结果(而不是通过转义序列的作用-用反斜杠替换字符)或同等学历)

(注意:最终规则已编辑)

得分:这是有趣的地方。根据典型的代码保龄球规则,最高分数取决于字符数。但是重复使用字符会导致扣分。特别...

  1. 重复使用任何字母数字字符(az,AZ,0-9)将导致每次重复扣除3分(首次使用不会导致扣除)。
  2. 重复使用基本标点符号([!?.-,“:';])-包括方括号-将导致每次重复扣除2分。
  3. 重复使用其他ASCII字符{`〜@#$%^&* _ + = | \ /> <}-包括大括号-将导致每次重复减少4点。
  4. 重复使用空格,制表符和换行符将导致每次重复扣除1分。也就是说,只有第一次使用空格,制表符或换行符才会计入总计。

注意:尽管标记注释开始/结束的字符确实占注释的总和,但注释不会计入总数。例如,在C / C ++中,如果您有/* This is a comment */,则它将计算两个斜杠和两个星号,但它们之间没有任何区别。

一些示例(注意:使用Julia作为示例语言)...

print("Hello, world!");

可见字符总数:22
包含空格:+1
重复的字母数字:ll表示-12
重复的标点:-2表示“
最终分数:22 + 1-12-2 = 9

print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII

总字符数:43(不包括#后的任何字符,它是注释字符)
包含空格:+1
重复的字母数字:rr1008 -18
重复的标点符号:()“”“”“ ,,,,
Final得分:43 + 1-24-18 = 2

xy=STDOUT
m="Hello, world!"
print(xy,m);

可见字符总数:37
包含换行符:+1
包含空格:+1
重复的字母数字:xyllor的-18
重复的标点符号:“ -4”,
重复的其他ASCII字符:-4代表=
最终得分:37 + 1 + 1-18-4 -4 = 13

几段无效的代码...

x=2;print("Hello,world!")  

问题:x已分配但未使用。

print("Hello,"*" world!")  

问题:*是不必要的,没有它的结果将是相同的。

k=1
if k>0
  print("Hello, world!")
else
  print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end  

问题:第二个print命令将无法运行。另外,在第二个print命令中删除引号中的字符不会更改输出。

x="Hello, world!";
print(x)  

问题:删除换行符不会改变结果或引起错误(在Julia中,仅当同一行上有多个命令时才需要分号,否则将取消返回值)。

print("Hellos\b, world!")  

问题:s字符不会影响结果,因为它会被擦除\b。如果通过代码("Hello",char(100),"\b, world!")完成,则可以接受,但不能通过字符串文字或字符文字来完成。

便捷的分数计算器 -http : //jsfiddle.net/4t7qG/2/-感谢Doorknob




3
我创建了一个JSFiddle,您可以在其中放置代码,它将自动计算出您的分数。您可以将它的链接编辑到帖子中吗?
门把手

1
@Dennis-如果您的程序由于该命令而产生换行符,则没问题(例如,Julia中的println打印,然后在末尾添加换行符)。但这不应该是字符串的一部分。
Glen O

1
@ACarter-基本上是的。但是限制和推论使它变得微不足道。
2014年

Answers:


17

Perl-96

(相当不错,理论上最高为97分)

s{}[Hel0o, w3$=d!];y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(
    6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)+print

(请注意,第二行以实际的\t制表符开头)

该代码长98个字符,并且每个ascii字符仅包含一次,外加一个额外的-
98-2 = 96

这里没有字符串文字,但是删除任何单个字符都会破坏程序。

去混淆

这个程序中有3条语句(嗯,实际上是2条,但是我滥用+了某种语句分隔符)

  1. s{}[Hel0o, w3$=d!]
    这是sed运算符的非常复杂的情况。它通常写为s/a/b/or s:a:b:,但是perl在这里允许更多幻想:s(a)(b) s(a)^b^ s(a)[b],甚至s qaqbq
    它将一个空字符串(inside {})替换为Hel0o w360d!(inside [])(默认情况下为$=插值60)。由于缺少~=运算符,因此无法运行$_

  2. y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
    这也是一个很复杂的情况,但是是一个tr运算符,也称为yy< >( ))。
    让我们看一下替换表:
    " # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
    \n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
    我已经移动了一些字符,以便不破坏现有的字符串。这里唯一实际起作用的部分是/-9-> k-u。它取代了0l3o,并6r
    再次由于缺少~=运算符,它在上运算。$_
    所以现在我们在$_变量中有了完整的短语。

  3. print
    缺少参数使它仅输出$_变量。


我不太了解Perl对此发表评论-<和+之间的字符集是什么?
Glen O

@GlenO仅用于/-9k-u实际上用于转换字符串。其余的是大小相等的垃圾。如果仅删除一个字符,则集合将不对齐,并且程序将不会输出“ Hello,world!”。不再。
mniip 2014年

在那种情况下,以什么方式执行“垃圾”?也就是说,它以什么方式起作用?如果只是填充符被代码跳过,那么它就等同于条件代码中的非运行代码。
2014年

3
@GlenO不是。规范:<...> removal of any single counting character must change the result or cause the code to not function.在任何地方删除1个字符都会破坏它。您可以通过删除2个字符来使其正常工作,但这不在规则中。
mniip 2014年

2
All code must be functional。显然,您至少在弯曲规则。我并不是在说“违反规则”,但这绝对值得怀疑。
Glen O

7

该答案是在添加有关字符串文字的规则之前创建的,并且不参与比赛。

#include <iostream>
int main(){std::cout<<56+"  !$%^&*?12347890-_QWERTYUIOPASDFGJKLZXVBNM,.qypfghjk:zvbHel\x6Co, world!";}

完全合法。:P如果从该字符串中删除任何字符,它将打印ello, world!


请在答案中包含代码得分。
ProgramFOX

同样,它也不会改变您的分数,但是<<需要删除周围的空格。
Martin Ender 2014年

1
嗯...虽然我对您的回答表示赞赏,但主要是我的限制有一个小漏洞。我要给你点赞,如果其他人喜欢,我也很高兴能做同样的事情,但是我会在其他限制下进行编辑。
Glen O

1
好的,除了我之前的评论,我现在添加了一个限制,指出字符串和字符文字必须相关-替换其中的字符必须能够更改结果。这允许使用if 'x'>'w'技术,但是例如将“ k \ bH”块阻止为“ H”。在增加了限制之后,请随时提供第二个答案。
Glen O

4

果酱,94

{'H"EJO, WoRLD!"el96A+c/~_-3=0$@}"# 
`&^<>|;:?.()[]\1aBCdfFgGhiIjkKmMnNpPqQrsStTuUvVwxXyYzZ"254b87%*

在线尝试!请注意,换行符之前应有一个制表符。SE不喜欢制表符,因此您必须手动将其插入。

  • 100个字符长
  • 重复的数字:-0()
  • 重复标点符号:-6(“”“)
  • 重复其他:-0()
  • 重复空格:-0()

总分94

我使用以下代码检查字符串中的所有字符都不能删除:

"#  
`&^<>|;:?.()[]\1aBCdfFgGhiIjkKmMnNpPqQrsStTuUvVwxXyYzZ"
:A,,{_A\<A@)>+254b87%}%`

它打印一个数组,显示您好,世界!如果删除了对应于索引的字符,则将被打印。


当我在您的链接中运行它时,它会产生“你好,世界!” 连续六次。另外,字符串是做什么的?
Glen O

我猜换行符是错误的-删除它会使它起作用。
2014年

复制粘贴问题。LF前面应该有一个制表符。看来SE不允许我这样做...该字符串被认为是以254为底的数字(254b)。最终结果模数7应该为1,因此前一个代码块执行一次。我需要一个模数来使每个字符都必要。
丹尼斯2014年

那么,在丢失的标签添加(它“修复”的代码),取出后Z,在T,或可能是一些其他的角色不会改变结果。
Glen O

我非常误解您问题的一部分。现在已修复。
丹尼斯2014年

3

红宝石,28 41

只是根据问题的精神以解决方案开始答案:

print"He#{?l*2}o, "+'world!'if[$`&(9<=>6)^7|~8-5/3.1%0x4]

计分(我认为我没错):

  • 长57个字符
  • 重复的数字:-12(orli
  • 重复标点:-4("'
  • 重复其他:-0
  • 重复空格:-0

在我看来,得分不错。无需包括不适用的罚款,但包括这些罚款则无害。
2014年

.3.1可以没有问题地去除。如可以在x0x4-8-5

3

PHP,1分(是,只有一点!)

使用魔术字符生成校验和,该校验和以二进制形式与“ Hell”,“ o,w”,“ orld”和“!”匹配。

通常,我喜欢发现漏洞,但是这次我决定根据比赛的精神和意图进行比赛。每个字符及其位置对于输出都是必不可少的。可以替代的唯一地方是变量名不属于文字值之间的空白phpforeachPHP对待等同,并使用'VS "PHP对待类似。

<?php foreach(array('_MC:`~+V4@SbHR/l[J','dN#UB`5!Rv^NG@D}','9gm6L&-kuD','8OM97g.q]XQ0')as$j)print(hash("crc32",$j,1))?>

仅供参考,以下是一些其他有趣的魔术和哈希值:

E.D}S:  Hell
9UDIRQ: Hell
N\7&*`%:    orld
UWX[E^O:    orld
mAHzDEb:    !   
uLJ7Ck&:    Hell
B+bG5mYJ:   Hell
:OvMzuOR:   !   
TgYR9g!6k:  o, w
NkFN`!8mI:  o, w
N#VA\j~}J[: Hell
vEl*]@0XQ5: o, w
9gm6L&-kuD: orld
*}{Xg@HN`\: !   
Pj@Y44uA6YJ:    Hell
|7OX0VF8gv}:    !   
DLRJAjgMj}\:    !   
!0bT*D}O4Lw:    orld
YGN97^v7ZY`:    Hell
++~bL/kP:|]W:   o, w
8OM97g.q]XQ0:   !   
l^m-DqZ^g[&+:   !   
Ewu]Rv~*DHQ7:   Hell
JIqjgF|S!\`8l:  Hell
b4l!MEG7vTu6/:  Hell
+B:zEq*J\k-Cm:  !   
_}E7wZD76^`Y9AU:    orld
q:Nq-~+_S7~N9Hz:    !   

如果我删除,或空格\t,代码仍然起作用\n。不是PHP专家,但;似乎也是可选的。
mniip 2014年

@mniip-进行编辑。我不知道在某些情况下分号是可选的。

3

Befunge-98,97分!

"v!dlrow ,h
B[CDEFGIJkLMNOPH
$<QRSTUV@|5cg1fe':-%\64*ab+7_/89}{0  j2
WXYZK`.=#>]
s()impq	n 3~
Atuxz&;y^ ?

在线尝试!

该标签位于q和之间n

使用与以前的Befunge答案类似的技巧来用剩余的字符填充行,但避免在执行部分中使用重复的字符。删除任何不执行的字符会导致执行部分不正确,通常会陷入无限循环或打印错误的输出。

怎么运行的

实际上,唯一的执行部分如下所示:

"v!dlrow ,h
         k     H
$<      @|5cg1fe':-%\64*ab+7
         >]
        ^ ?

首先,它使用包装字符串文字将其添加, world!到堆栈中。这样可以避免两个"s。

$<      @|5cg1fe':-%\64*ab+7

Hello使用多种方法添加到堆栈中,以避免重复字符。$弹出由换行字符串文字引起的多余空间。

7+h从字符串文字的末尾添加7来创建oba*46\%:计算111的ascii值l并将其复制。

'e 将e添加到堆栈中。

f1g 在1,15处获得字符,即 H

然后,它重复使用,字符串中的来打印出整个Hello, world!。剩下的只是方向更改以导航到结尾@


1

红宝石,78岁

我想更多地滥用规则,不确定到底是什么补丁。使用长字符串并检查结果的总和,因此任何删除或更改都将导致程序失败。可能需要进行一些优化,以消除某些字母的重复并在那里保留空格。

puts('Hello, world!')if%["\#$&*+-/:;<>?@ABCDEFGIJKLMNOPQRSTUVWXYZ^_`abcghjknqvxyz{|}~123].sum==4980

3
问题是,包含在内的所有内容if都可以删除。
seequ 2014年

@TheRare-没什么问题,只要do if确实起作用并且它后面的内容仍然遵守规则。
Glen O

@GlenO但是它不算作“可移动代码”吗?只是puts('Hello, world!')会工作。我认为规则需要澄清这是否合法。
seequ 2014年

@TheRare-在事后看来,我可能应该使用笼统的“代码的子集不应该能够产生相同的输出”,但是我不认为我应该继续更改规则。就目前而言,只要代码是功能性的并且是非任意的,并且遵循其他规则,那么它就是合法的。至少,在大多数语言中都无法实现这种解决方案(我所做的编辑掩盖了在大多数语言中都有效的漏洞)。
Glen O

@GlenO您是法官。如果您觉得不必要,请问我删除这些评论。
seequ 2014年

1

PHP,2257

漏洞:规格和分数计算器中省略了反斜杠!

此代码计算每个字符串中反斜杠的出现次数,并打印等效的ASCII码。用其他字符替换任何反斜杠,或删除一个反斜杠,都会导致解析错误或更改结果。

关于反斜杠的一个很好的功能PHP是,它们需要被转义,所以得分会自动加倍!您可以通过乘以反斜杠的数目来将分数重新翻倍,三倍等,但是您不想贪婪,我想它可能会超出您可以输入的范围。

<?php foreach(array('\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\','\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\')as$x)print(chr(substr_count($x,"\\")))?>

显然,它只是描述中的错字,而不是漏洞。而且,您已经知道了。该说明确实明确指出“其他AS​​CII字符”。在您阅读本文时,将对其进行编辑以包括在内。
Glen O

特别是,反斜杠是问题的根源,但是我没有意识到它已经将其视为转义序列。
Glen O

这不是规则上的更改,它是纠正了一个较小的错字。反斜杠在规则中,只是没有显示(要亲自查看,请单击“已编辑”按钮,然后单击“并排减价”)。其他人没有利用漏洞,而是在利用语言的功能。
Glen O

1

Befunge-87

"dlrow ,olleH"bk,                                                                   v
!#$%&'()*+-./0123456789:;  <=>?ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`acfghijmnpqstuvxyz{|}~@

由于所有重复,第一行值得四分,但第二行没有重复的字符。这段代码中唯一的字符串文字是dlrow ,olleH,它被反转并打印为输出。删除任何一个字符都会v使第一行末尾的和第二行末尾的断开@,从而使程序永不终止。如果v其自身删除,则代码将进入打印正确输出的无限循环。



0

加速!,-138(是的是负138)

虽然这可能并不是我在PPCG中获得的最高成绩,但我怀疑它在Acc中的得分是否会更高!

108
Write 72
Write 101
Count i while i-2 {
	Write _
}
Write _+3
Write 44
Write 32
Write 119
Write 111
Write 114
Write _
Write 100
Write 33

在线尝试!

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.