再见残酷的世界!


49

背景

高尔夫球手您好!我想学习所有的编程语言!但是我的注意力范围很短...复制所有Hello World示例变得很无聊...但是我喜欢火!^ w ^

挑战

所以这是计划!我希望所有人都编写最小的代码,这些代码将进行编译,打印Goodbye Cruel World!然后崩溃。或者,作为额外的扭曲挑战,打印Hello World!并崩溃Goodbye Cruel World!

规则

  • 您的分数将是使用的总字符数。答案必须是一个完整的可执行程序。
  • 您的程序必须打印Goodbye Cruel World!输出,然后崩溃(意外错误)。
    • 要获得高分,必须打印Hello World!输出,但错误消息还必须包含Goodbye Cruel World!。如果您完成了奖金挑战,则可以将分数除以2。(如果要领取奖金,请在分数末尾加一个!!)。
  • 只要仍然输出标准输出,并且仍然输出标准错误,顺序就没有关系。只要两者都不能阻止对方发生。
  • 输出必须包含上述内容;"不应出现在输出中。
  • 输出应包含指定的字符串,且不包含其他任何内容。
  • 崩溃报告可以包含任何内容,但要获得红利,以下正则表达式应匹配/Goodbye Cruel World!/mi(aka,包含,忽略大小写/周围的文字)
  • 字符串Hello World!Goodbye Cruel World!不区分大小写,否则应与上面完全一样。
  • 如果该语言能够崩溃(它不能更改其退出代码),则需要崩溃。否则,请使用该语言的标准“错误报告”(即STDERR)。

我可以使Python 3崩溃,因此我提供了一个示例 Python 3答案!现在,让所有人放纵世界!^ W ^


评论不作进一步讨论;此对话已转移至聊天
丹尼斯

as a bonus twist challenge, print "Hello World!" and crash with "Goodbye Cruel World!"
Magic Octopus Urn

假设我正在使用Java之类的语言,其中STDOUT和STDERR当然是在不同的线程中打印的。这意味着,尽管该程序按顺序打印了“ Hello world”,然后崩溃了,但是有可能首先打印堆栈跟踪信息...是否允许?
苏格拉底凤凰城,

@SocraticPhoenix只要STDOUT仍在打印,而STDERR仍在打印,则顺序无关紧要。只要两者都不能阻止对方发生。
Tezra

1
这太有趣了,我不能停止提出解决方案!
亚当

Answers:


36

果冻,12字节

“¿µƝɓṭỵae»Ȯ:

在线尝试!

说明:

“¿µƝɓṭỵae»Ȯ:

          Ȯ     Print
“¿µƝɓṭỵae       A string...
         »      Decoded from base-250
           :    Integer division

由于整数除法是一个二元组,它将隐式地将链的当前值用作两个参数-这是一个字符串。崩溃,因为它期望整数。


7
欢迎来到PPCG!
丹尼斯,

谢谢!我已经潜伏了一段时间,但这是我第一次发现自己觉得可以真正解决的挑战!
散布

28
令人印象深刻的答案,尽管几乎所有的Jelly答案都令人印象深刻,这既是因为篇幅太长,又是您设法学习Jelly的事实。
狮phon-恢复莫妮卡

4
A base-250 encoded string两者都很酷,您可以这样做。X3
Tezra

3
这比字符串“再见残酷的世界!”短得多。(20个字节)。疯狂...
Adam Plocher

35

C,43个字节

main(){puts(puts("Goodbye Cruel World!"));}

打印该字符串,然后尝试将返回值用作要打印的另一个字符串的指针,这会导致分段错误。

在线尝试!

C,42个字节

感谢@Ruslan!

main(i){i=puts("Goodbye Cruel World!")/0;}

在线尝试!

只是为了好玩:C(在64位Linux上),149字节

Hello World程序这里修改。

const int main[]={-443987883,440,113408,-1922629632,4149,1358336,84869120,15544,266023168,1869563654,1702453860,1970422560,1461742693,1684828783,33};

在线尝试!


我喜欢这种方法,但说明中却说:The answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}剥离一个字节。
Ruslan

1
您不需要iputs("")/0;是句法正确的陈述。
rici

1
@rici是的,但是不会崩溃(至少在TIO上)。
Steadybox

1
@Steadybox:这是为您优化的。
rici

11

SOGL15 25 17 字节 / 2 = 8.5!

Q7┌θ/²?‘■←#c℮‘o0n

说明:

...‘           push "goodbye cruel world!"
    ...‘       push "hello world!"
         o     output "Hello World!"
           0n  attempt to make an array where each line is 0 characters long, making the array
               required to be infinite, which crashes (OutOfMemoryError)

(ab)使用了SOGL使用STDERR作为调试输出的事实,因此其中有很多文本以及该行

`∑`@22: ["goodbye cruel world!"]

如果将“处理”草图的STDOUT通过管道传输到文件,则“再见残酷世界!” 会在那里。


由于挑战中提到“ 字符串Hello World!Goodbye Cruel World!并且不区分大小写,否则应该完全如上显示。 ”,因此,您可以通过完全放弃该函数并只输出所有小写字母来编写代码。
凯文·克鲁伊森

@KevinCruijssen哦,谢谢!
dzaima

10

> <>,25个字节

"!dlroW leurC eybdooG">o<

基本上,它将字符串添加到堆栈中(向后,后进先出),然后执行以下操作:

while(1):
  pop the stack
  print the character

当堆栈上没有剩余字符(已打印整个字符串)时,弹出堆栈会出现错误


+1。来到#o<"Goodbye Cruel World!",基本上是一样的。
hakr14

9

sed,32个字节

iGoodbye Cruel World!
w/dev/full

i插入一行,然后w写入文件。/dev/full在这种情况下,因为所有写入都将返回ENOSPC(“设备上没有剩余空间”)。

但是,它仍然需要一行输入才能起作用。

$ echo 1 | sed -f crash.sed
Goodbye, cruel world!
sed: couldn't flush /dev/full: No space left on device

3
甚至都不知道存在这样的设备!
Ruslan

9

Lua中,31,30个字节

a=-print'Goodbye Cruel World!'

首先打印出“再见残酷的世界!” 然后在尝试添加nil值和0时崩溃。

输出:

Goodbye Cruel World!
input:1: attempt to perform arithmetic on a nil value

少加1个字节即可贷给GalladeGuy


2
它会打印出“再见残酷的世界!” 然后崩溃,尽管我只是以为它必须崩溃才能被接受。
eniallator

@Trebuchette要求是“您的程序必须打印Goodbye Cruel World!才能输出,然后崩溃”,OP没有指定“输出”是否表示stderr,stdout,消息框或以上任何内容。
法拉普

@Pharap哦,我知道了。STDERR仅在您要获得奖金时才重要。谢谢!
Trebuchette

@Trebuchette不。它说:“或者,作为额外的扭曲挑战,打印Hello World!并与Goodbye Cruel World崩溃!”。'crash'并不一定意味着stderr,'crash'可能还意味着抛出异常。除非OP对其进行了进一步定义,否则它尚待解释。此外Lua中的一些应用有没有标准错误的概念(例如嵌入式的Lua的脚本语言游戏)而会打印到消息框或日志文件等
Pharap

1
您可以改为执行以下操作来保存一个字节:a=-print"Goodbye Cruel World!"
GalladeGuy

8

Python 3 | 得分:24.5! 23 22!

print("Hello World!")+"Goodbye Cruel World!"

打印“ Hello World”,然后在“ Goodbye Cruel World!”上使用无效的运算符“ +”。到NoneType返回元素。(从旧版本中删除\ n \ r)

在线尝试!

Python 3 | 得分:34 30

+print("Goodbye Cruel World!")

打印再见,比对打印结果执行无效的一元+操作(NoneType)

在线尝试!


+"Goodbye Cruel World!"短3个字节,并输出TypeError。
加伯·费克特(GáborFekete)

print("Goodbye Cruel World!")/0是第二个较短(3个字节?)
matsjoyce

@matsjoyce我担心打印前会崩溃。但是,因为它先打印,所以我只对结果“一”进行一元分析:3
Tezra

24
2.585e + 22是一个非常高的分数...您确定不能再降低它了吗?
tuskiomi17年

1
@tuskiomi'!' 表示最终分数被奖励挑战修改。
Tezra



6

CJam,34个字节,得分17!

"Goodbye Cruel World!"D>"Hello"ooo

在线尝试!(有关STDERR,请参见调试面板)

说明

"Goodbye Cruel World!"              e# Push "Goodbye Cruel World!".
                      D>            e# Slice after index 13: " World!".
                        "Hello"o    e# Push "Hello" and print it.
                                o   e# Print " World!".
                                 o  e# Attempt to print from an empty stack. Crashes.

在TIO上,它将生成以下错误消息:

"Goodbye Cruel World!"D>"Hello"ooo
                                 ^
RuntimeException: The stack is empty
Java exception:
java.lang.RuntimeException: The stack is empty
    at net.aditsu.cjam.CJam.pop(CJam.java:75)
    at net.aditsu.cjam.Op1.run(Op1.java:10)
    at net.aditsu.cjam.Block.run(Block.java:304)
    at net.aditsu.cjam.CJam.runCode(CJam.java:210)
    at net.aditsu.cjam.CJam.main(CJam.java:240)

6

C预处理器,27字节

#error Goodbye Cruel World!

输出:

fatal error C1189: #error:  Goodbye Cruel World!

1
您可能可以用#Goodbye Cruel World!
杏男孩

@apricotboy仍然会产生错误,但是编译器不会输出完整的错误消息“再见残酷的世界”(至少在MSVC上)
Govind Parmar

@戈文·帕尔玛啊。好吧,它肯定会对gcc 起作用
杏男孩

6

APL(Dyalog),17.5字节

没有奖金,20个字节

Goodbye Cruel World!

在线尝试!

请注意,该代码未引用,因此APL尝试执行它但World未定义,导致错误消息中包含有问题的代码行,导致VALUE ERROR崩溃。

加上奖金,35÷2 = 17.5字节

'Hello World!'
Goodbye Cruel World!

在线尝试!

首先打印所需的字符串,然后像上述程序一样崩溃。

更复杂的奖励版本,35÷2 = 17.5字节

'Goodbye Cruel',5↓⎕←'Hello World!'

在线尝试!

打印第一个字符串,然后从(5↓)删除前五个字符,然后将(,)连接到新的前缀,然后尝试执行(),导致与上述相同的错误。


1
@Cyoce Typo。谢谢
亚当

5

重击20.5!18.5!

我不会猛扑果冻,但是对于猛扑一个快速的bash脚本我还是有些害羞。18.5对于非高尔夫语言来说还算不错。(请注意,这必须是一个脚本,交互式bash会尝试将其解释!为历史记录查询)

echo Hello World!
Goodbye\ Cruel\ $_

返回,错误代码为127,并且:

Hello World!
bash.sh: line 2: Goodbye Cruel World!: command not found

根据要求"在任何地方都没有:)。正如apricot boy我建议的那样,现在查找上一个命令的最后一个参数以节省4个字节。


我试图击败你……并以21分失败!个字节。:) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus

1
您可能将第二行更改为Goodbye\ Cruel\ !$,而不是100%,但可以肯定的是,这!$是“最后命令的最后一句话”
杏男孩

但是,如果可执行文件名为“ Goodbye Cruel World!”,该怎么办?是否存在于PATH中?:)
凌晨

在TIO.run上通过验证,确认正常 ……击败了我的zsh答案:/
roblogic

4

TeX,19岁!

Hello World!#\bye Goodbye Cruel World!

要强制TeX在没有人工干预的情况下实际生成dvi / pdf文件,请使用进行编译-interaction=nonstopmode

它会打印Hello World!#在您不应该使用的时候抛出错误,然后使用停止编译\bye。但是,\bye错误消息中仍会输出所有内容,因此该内容适用于奖励。


4

WinDBG(Windows XP / Vista本地内核调试),33字节

.echo Goodbye Cruel World!;.crash

警告:这将使整个计算机崩溃,而不仅仅是程序崩溃。

仅在Windows XP和Vista上允许进行本地内核调试(但在Vista中默认未启用)。关于本地内核调试的WinDBG对话框没有提及任何其他Windows操作系统,因此我认为甚至无法为这些Windows操作系统启用它。大概对于其他Windows操作系统,您可以连接到远程计算机上进行内核调试,但是远程计算机将崩溃,因此我认为这种解决方案不起作用。


Windows 7也支持本地内核调试,从那时起我还没有听说过将其删除(但是我可能会错过它)。
科迪·格雷

4

JS(ES5),46/2 = 23个字节!

alert("Hello, World!")["Goodbye Cruel World!"]

警报Hello, World!,然后出现错误Uncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell,26字节

'Goodbye Cruel World!';1/0

我认为除以0是引发错误的最简单方法。

PowerShell,35/2 = 17.5字节

"Hello World!";Goodbye Cruel World!

TessellatingHeckler抛出这样的错误:

PS C:\Users\Connor> "Hello World!";Goodbye Cruel World!
Hello World!
Goodbye : The term 'Goodbye' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:16
+ "Hello World!";Goodbye Cruel World!

不应该$w='World!'(带有!)吗?
gmatht

"Hello World!";Goodbye Cruel World!为17.5个字节,抛出异常,因为再见没有被识别为一个命令,和异常消息包括在整个范围内的线,使其与正则表达式匹配..
TessellatingHeckler

1
使用与17.5b答案相同的逻辑,'Goodbye Cruel World!';x将为24保存两个字节
Veskah,



4

Node.js,得分:25.5 24.5!

ETHproductions节省了1分

语法正确的完整程序,由于console.log()未返回函数而在运行时崩溃。

console.log('Hello World!')`Goodbye Cruel World!`

在线尝试!


可悲的是,25.5...... 没有阶乘。:((
Xcoder先生17年

@ Mr.Xcoder Gamma(26.5)与Mathematica定义相同。
user202729

1
@ user202729谁说Mathematica没坏?:)))
Xcoder先生,2015年

您可以删除X(甚至换行符)吗?
ETHproductions

@ETHproductions是的。谢谢!
Arnauld

3

Aceto得分:21.5!

yeru
b Ce+
do l"d
GoWorl
"!dl
p"or
HeW
"llo

打印Hello World!,然后崩溃

Traceback (most recent call last):
  File "/Users/l3viathan/bin/aceto", line 230, in _plus
    self.push(y+x)
TypeError: unsupported operand type(s) for +: 'int' and 'str'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/l3viathan/bin/aceto", line 811, in <module>
    A.run()
  File "/Users/l3viathan/bin/aceto", line 104, in run
    raise e
  File "/Users/l3viathan/bin/aceto", line 98, in run
    self.step()
  File "/Users/l3viathan/bin/aceto", line 152, in step
    method(self, cmd)
  File "/Users/l3viathan/bin/aceto", line 233, in _plus
    raise CodeException(f"Can't add {x!r} to {y!r}")
__main__.CodeException: Can't add 'Goodbye Cruel World' to 0


3

AHK,50/2 = 25!(非竞争)

不竞争,因为增加的要求使答案无效。我找不到使它编译,输出文本并崩溃的方法。无论我尝试什么,都至少不能满足其中一项要求。


Send,Hello World!
OutputDebug,Goodbye Cruel World!

这是我能想到的最无聊的解决方案。它实际上并没有崩溃,但这在技术上不是必需的。它所要做的就是向调试窗口输出一条消息。这样做是因为我告诉它这样做。


目前无效。OP指出,如果该语言支持AHK,则该程序必须崩溃。
internet_user

@pycoder啊,那是我发布40分钟后添加的。我将为新规则进行更新,但它将花费字节。
Engineer Toast

3

Japt,22字节

°Oo`!dlžW ¤¨C eybºoG`w
°Oo`!dl&#158;W ¤¨C eybºoG`w
 Oo                            output
   `!dl&#158;W ¤¨C eybºoG`     the compressed string "!dlroW leurC eybdooG"
                          w    reversed.
°                              ° transpiles to ++, causing an error; a string can't be incremented

在线尝试!

由于obarakon和ETHproductions节省了3个字节


您可以使用压缩字符串Oc"<string>",然后将当前字符串替换为压缩版本,并用反引号括起来。
路加福音

一个解释会很好。
iFreilicht

1
@iFreilicht说明已添加。
汤姆

3

C#,116/2 = 58个字节!

using System;class P{static void Main(){Console.Write("Hello World!");throw new Exception("Goodbye Cruel World!");}}

普通版 94 87字节:

class P{static void Main(){System.Console.Write("Goodbye Cruel World!");int n=0;n/=n;}}

感谢@KevinCruijssen,节省了7个字节。


int n=0;n/=n;对于您的第一个答案来说更短。
Kevin Cruijssen

@KevinCruijssen不错的地方,我很难将其编译为不被常数零误差所除。
TheLethalCoder

是的,在Java中您可以做到int n=1/0;,但是显然在C#中是不可能的(这对语言来说确实是一件好事,但对代码golfing却不利)。顺便说一句,为什么奖金不在顶部?那一个较短。
凯文·克鲁伊森

@KevinCruijssen我不确定它是否合格,因为当我发布我的答案时还不清楚,因为我已经进一步澄清了我已经将它们切换了。
TheLethalCoder

3

果冻 10.5!个字节

“,ḷṅḳȦ»¹“¿µƝɓṭỵae»+/R

在线尝试!

这利用Python字符串(字符串)而不是Jelly字符串(1-char字符串列表)来利用未定义的行为。转换是通过加减Jelly字符串来完成的,Python +将两个字符串串联在一起,因此,将两个加在一起的字符串以Python方式串联在一起。然后,它使用适当的monad(范围),以便int在字符串上调用Python ,导致始终包含的错误Goodbye Cruel World!

说明:

“,ḷṅḳȦ»¹“¿µƝɓṭỵae»+/R Main Link, niladic.
“,ḷṅḳȦ»¹              Print "Hello World!"
        “¿µƝɓṭỵae»+/  Convert "Goodbye Cruel World!" to a Python string
                    R Make a range out of it

3

Ruby,43个 42个字节/ 2 = 21!

puts"Hello World!"
-"Goodbye cruel World!"

在Alexis Andersen的帮助下,将替换"String"/0为,节省了半个字节-"String"。这仅适用于低于2.3的Ruby版本,其中一元减法实际上已添加到String类中!

对于Ruby <2.3:

$ ruby -e 'puts"Hello World!";-"Goodbye cruel World!"'
Hello World!
-e:1:in `<main>': undefined method `-@' for "Goodbye cruel World!":String (NoMethodError)

使用Ruby> = 2.3时:

$ ruby -e 'puts"Hello World!";"Goodbye cruel World!"/0'
hello world!
-e:1:in `<main>': undefined method `/' for "Goodbye cruel World!":String (NoMethodError)

您可以使用保存(半)字节-的字符串,而不是/-"Goodbye crueld World!"
亚历克西斯安德森

@AlexisAndersen谢谢!今天,我还了解了String类中的新方法(请参阅更新的帖子)
daniero

3

x86-64二进制代码(带有Linux系统调用),43个字节

拆卸:

0:  31 c0                   xor    eax,eax
2:  ff c0                   inc    eax            ; write syscall number = 1
4:  31 ff                   xor    edi,edi
6:  ff c7                   inc    edi            ; stdout file descriptor = 1
8:  48 8d 35 07 00 00 00    lea    rsi,[rip+0x7]  ; load the string at offset 16 into rsi
f:  31 d2                   xor    edx,edx
11: b2 15                   mov    dl,0x15        ; 21 byte string
13: 0f 05                   syscall
15: f4                      hlt
16: 47 6f 6f 64 62 79 65 20 43 72 75 65 6c 20 57 6f 72 6c 64 21 0a .ascii "Goodbye Cruel World!\n"

Note: 0x16 code bytes + 0x15 string bytes = 0x2B = 43 total bytes

该程序将所需的数据(字符串"Goodbye Cruel World!\n")捆绑到自己的代码中。它使用rip相对寻址加载指向该字符串的指针,并write直接调用syscall而不是通过glibc包装器进行调用,因此它是完全独立于位置的,我们可以通过将代码嵌入const字符串中并将该字符串转换为函数来轻松地对其进行测试指针。要使程序崩溃,我会以一条hlt指令结束它,该指令具有环0特权将使处理器永远静音(或至少直到下一个中​​断进入),但是具有环3特权(对于用户程序通常如此),我们得到的却少得多戏剧性Segmentation Fault

测试程序:

#include <stdio.h>

const char code[43] = "\x31\xC0\xFF\xC0\x31\xFF\xFF\xC7\x48\x8D\x35\x07\x00\x00\x00\x31\xD2\xB2\x15\x0F\x05\xF4Goodbye Cruel World!\n";

int main() {
    printf("Code bytes: %zi\nNow running the code:\n\n", sizeof(code));
    ((void(*)())code)();
    printf("Failed to crash, now exiting!\n");
    return 0;
}

输出:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

请注意,该43字节代码挑战所指定的完整程序,而不仅仅是一个功能。能否main正常运行不依赖于测试程序的功能。如果直接由加载程序加载并跳转到它,它仍然会打印字符串并崩溃。


通过使用push/ pop加载寄存器来节省一些字节。例如,前两个指令可以是push 1+ pop rax,即短1个字节。然后,下两个指令可以用代替mov edi, eax,后者缩短2个字节。相同push/ pop技巧可以应用于指令6和7:push 0x15+ pop rdx
科迪·格雷


3

Pyth38/2 = 19个字节!36/2 = 18个字节!

"Hello World!"v"Goodbye Cruel World!

在线测试!

说明

打印Hello World!,然后尝试评估Goodbye Cruel World!。这样做失败,因为该字符串不是有效的代码。

结果是:

Hello World!
Traceback (most recent call last):
  File "pyth.py", line 760, in <module>
  File "<string>", line 4, in <module>
  File "/app/macros.py", line 1085, in Pliteral_eval
  File "/app/.heroku/python/lib/python3.4/ast.py", line 46, in literal_eval
  File "/app/.heroku/python/lib/python3.4/ast.py", line 35, in parse
  File "<unknown>", line 1
    Goodbye Cruel World!
                ^
SyntaxError: invalid syntax
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.