Auf Wiedersehen grausame Welt!


49

Hintergrund

Hallo Golfer! Ich möchte alle Programmiersprachen lernen! Aber ich habe ein bisschen eine kurze Aufmerksamkeitsspanne ... und das Kopieren aller Hello World-Beispiele wird langweilig ... aber ich mag Feuer! ^ w ^

Herausforderung

Also hier ist der Plan! Ich möchte, dass Sie alle den kleinsten Code schreiben, der kompiliert, druckt Goodbye Cruel World!und dann abstürzt. Oder drucken Sie als Bonus-Twist-Herausforderung Hello World!und stürzen Sie sich abGoodbye Cruel World!

Regeln

  • Ihre Punktzahl ist die Gesamtzahl der verwendeten Charaktere. Die Antwort muss ein ausführbares Programm sein.
  • Ihr Programm muss Goodbye Cruel World!zur Ausgabe drucken und dann abstürzen (unerwarteter Fehler).
    • Für einen Punktebonus müssen Sie Hello World!stattdessen drucken, um auszugeben, aber die Fehlermeldung muss auch enthalten Goodbye Cruel World!. Wenn Sie die Bonusherausforderung abgeschlossen haben, können Sie Ihre Punktzahl durch 2 teilen. (Fügen Sie am Ende Ihrer Punktzahl ein! Hinzu, wenn Sie den Bonus beanspruchen!)
  • Solange die Standardausgabe noch gedruckt wird und Standardfehler noch gedruckt werden, spielt die Reihenfolge keine Rolle. Nur solange keiner den anderen davon abhalten kann.
  • Die Ausgabe muss den Inhalt der obigen Informationen enthalten. "sollte nicht in der Ausgabe erscheinen.
  • Die Ausgabe sollte die angegebene Zeichenfolge und nichts anderes enthalten.
  • Der Absturzbericht kann alles enthalten, aber um den Bonus in Anspruch zu nehmen, sollte der folgende reguläre Ausdruck übereinstimmen /Goodbye Cruel World!/mi(auch bekannt als, enthält, Groß- / Kleinschreibung / umgebenden Text ignorieren).
  • Die Zeichenfolgen Hello World!und Goodbye Cruel World!sind unabhängig von der Groß- und Kleinschreibung, sollten aber ansonsten genauso aussehen wie oben.
  • Wenn die Sprache abstürzen kann (der Beendigungscode kann nicht geändert werden), muss sie abstürzen. Andernfalls verwenden Sie den Standard "Fehlerbericht" (dh STDERR) für die Sprache.

Ich kann Python 3 zum Absturz bringen, daher habe ich ein Beispiel für eine Python 3-Antwort beigefügt ! Jetzt können alle die Welt in Brand setzen! ^ W ^


Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Dennis

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

Angenommen, ich arbeite in einer Sprache wie Java, in der STDOUT und STDERR natürlich in verschiedenen Threads gedruckt sind. Dies bedeutet, dass, obwohl das Programm in der angegebenen Reihenfolge "Hello world" ausgibt und dann abstürzt, möglicherweise zuerst der Stack-Trace gedruckt wird ... Ist das zulässig?
Socratic Phoenix

@SocraticPhoenix Solange STDOUT noch druckt und STDERR noch druckt, spielt die Reihenfolge keine Rolle. Nur solange keiner den anderen davon abhalten kann.
Tezra

1
Das macht so viel Spaß, ich kann nicht aufhören, Lösungen zu finden!
Adám

Antworten:


36

Gelee , 12 Bytes

“¿µƝɓṭỵae»Ȯ:

Probieren Sie es online!

Erläuterung:

“¿µƝɓṭỵae»Ȯ:

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

Da es sich bei der Ganzzahldivision um eine Dyade handelt, wird implizit der aktuelle Wert der Kette als beide Argumente verwendet. Dies ist eine Zeichenfolge. Stürzt ab, weil es ganze Zahlen erwartet.


7
Willkommen bei PPCG!
Dennis

Danke! Ich lauere jetzt schon eine Weile, aber dies ist das erste Mal, dass ich eine Herausforderung fand, die ich anständig lösen konnte!
Scatter

28
Beeindruckende Antwort, obwohl fast alle Gelee-Antworten beeindruckend sind, sowohl aufgrund der Länge als auch der Tatsache, dass Sie es geschafft haben, Gelee zu lernen.
Gryphon - Reinstate Monica

4
A base-250 encoded stringDas ist beides cool und beängstigend, dass man das kann. X3
Tezra

3
Dies ist deutlich kürzer als die Zeichenfolge "Goodbye grausame Welt!" (20 Bytes). Verrückt ...
Adam Plocher

35

C 43 Bytes

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

Druckt die Zeichenfolge und versucht dann, den Rückgabewert als Zeiger auf eine andere zu druckende Zeichenfolge zu verwenden, wodurch ein Segmentierungsfehler verursacht wird.

Probieren Sie es online!

C, 42 Bytes

Vielen Dank an @Ruslan!

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

Probieren Sie es online!

Nur zum Spaß: C (unter 64-Bit-Linux), 149 Byte

Geändert von diesem Hallo Welt-Programm hier .

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

Probieren Sie es online!


Ich mag diesen Ansatz, aber die Anweisungen sagen,The answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}Entfernt ein Byte.
Ruslan

1
Das brauchst du nicht i. puts("")/0;ist eine syntaktisch korrekte Aussage.
rici

1
@rici Ja, aber es stürzt nicht ab (zumindest bei TIO).
Steadybox

1
@Steadybox: Das ist die Optimierung für Sie.
rici

11

SOGL , 15 25 17 Bytes / 2 = 8,5!

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

Erläuterung:

...‘           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) verwendet die Tatsache, dass SOGL STDERR als Debug-Ausgabe verwendet, sodass neben der Zeile viel Text enthalten ist

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

Wenn Sie das STDOUT der Verarbeitungsskizze an eine Datei weitergeleitet haben, wird "Goodbye Cruel World!" wäre da.


Da in der Abfrage erwähnt wird, dass die Zeichenfolgen Hello World!und Goodbye Cruel World!die Groß- und Kleinschreibung nicht berücksichtigt werden, ansonsten aber genau wie oben angezeigt werden sollten , können Sie Ihren Code bearbeiten, indem Sie die Funktion vollständig entfernen und nur in Kleinbuchstaben ausgeben.
Kevin Cruijssen

@ KevinCruijssen oh huh, danke!
Dzaima

10

> <> 25 Bytes

"!dlroW leurC eybdooG">o<

Grundsätzlich wird der String dem Stack hinzugefügt (Rückwärts, last in first out) und dann das Äquivalent von:

while(1):
  pop the stack
  print the character

Wenn sich keine Zeichen mehr auf dem Stapel befinden (die gesamte Zeichenfolge wurde gedruckt), wird beim Öffnen des Stapels ein Fehler angezeigt


+1. Kam zu #o<"Goodbye Cruel World!", was im Grunde das gleiche ist.
hakr14

9

sed, 32 bytes

iGoodbye Cruel World!
w/dev/full

iFügt eine Zeile ein und wschreibt in eine Datei. /dev/fullIn diesem Fall werden alle Schreibvorgänge zurückgegeben ENOSPC("Kein Platz mehr auf dem Gerät").

Es ist jedoch immer noch eine einzige Eingabezeile erforderlich, um zu funktionieren.

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

3
Wusste gar nicht, dass es so ein Gerät gibt!
Ruslan

9

Lua, 31 , 30 Bytes

a=-print'Goodbye Cruel World!'

druckt zuerst 'Goodbye Cruel World!' und stürzt dann ab, wenn versucht wird, einen Nullwert und 0 hinzuzufügen.

Ausgabe:

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

Gutschrift an GalladeGuy für 1 Byte weniger


2
es druckt "Goodbye Cruel World!" und dann stürzt ab, von dem ich dachte, es müsste einfach abstürzen, um akzeptiert zu werden.
Ausrufer

@Trebuchette Die Anforderung lautet "Ihr Programm muss Goodbye Cruel World! Drucken, um auszugeben, und dann abstürzen". Das OP hat nicht angegeben, ob "Ausgabe" "stderr", "stdout", "eine Nachrichtenbox" oder eine der oben genannten Bedeutungen bedeutet.
Pharap

@Pharap Oh, ich verstehe. STDERR ist nur wichtig, wenn Sie den Bonus erhalten möchten. Vielen Dank!
Trebuchette

@ Trebuchette Nope. Es heißt: "Oder drucken Sie als Bonus-Twist-Herausforderung Hello World! Und stürzen Sie mit Goodbye Cruel World ab!". 'crash' impliziert nicht zwangsläufig stderr, 'crash' kann unter anderem auch bedeuten, dass eine Ausnahme geworfen wird. Sofern das OP es nicht weiter definiert, ist es offen für Interpretationen. Einige Anwendungen von Lua kennen kein stderr-Konzept (z. B. Lua ist als Skriptsprache für Spiele eingebettet) und werden stattdessen in ein Meldungsfeld oder eine Protokolldatei usw.
gedruckt

1
Sie können stattdessen ein Byte speichern, indem Sie dies tun:a=-print"Goodbye Cruel World!"
GalladeGuy

8

Python 3 | Prüfungsergebnis: 24.5! 23 22!

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

Drucken Sie "Hello World", und verwenden Sie den ungültigen Operator "+" für "Goodbye Cruel World!" zum Rückgabeelement NoneType. (\ n \ r aus der vorherigen Version ausschneiden)

Probieren Sie es online!

Python 3 | Prüfungsergebnis: 34 30

+print("Goodbye Cruel World!")

Print Goodbye, dann eine ungültige + unäre Operation für das Druckergebnis ausführen (NoneType)

Probieren Sie es online!


+"Goodbye Cruel World!"ist um 3 Bytes kürzer und gibt einen TypeError aus.
Gábor Fekete

print("Goodbye Cruel World!")/0ist kürzer für die zweite (3 Bytes?)
Matsjoyce

@matsjoyce Ich hatte Angst, dass vor dem Druck abstürzen würde. Aber da es zuerst gedruckt wird, werde ich das Druckergebnis einfach
unärgern

24
2.585e + 22 ist eine ziemlich hohe Punktzahl ... Sie sind sicher, dass Sie nicht mehr Golf spielen können?
Tuskiomi

1
@tuskiomi Das '!' bedeutet, dass die Endpunktzahl durch die Bonusherausforderung geändert wird.
Tezra



6

CJam , 34 Bytes, 17 Punkte!

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

Probieren Sie es online! (Siehe Debug Panel für STDERR)

Erläuterung

"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.

Bei TIO wird folgende Fehlermeldung generiert:

"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 Präprozessor, 27 Bytes

#error Goodbye Cruel World!

Ausgabe:

fatal error C1189: #error:  Goodbye Cruel World!

1
Möglicherweise können Sie es mit just#Goodbye Cruel World!
apricot boy

@apricotboy Das würde immer noch einen Fehler erzeugen, aber die vollständige Fehlermeldung "Goodbye Cruel World" wird nicht vom Compiler ausgegeben (mindestens auf MSVC)
Govind Parmar

@ Gorvind Parmar ah. Nun, auf gcc tut es definitiv: i.imgur.com/qmGnoJv.png
Aprikosenjunge

6

APL (Dyalog) , 17,5 Bytes

Ohne Bonus 20 Bytes

Goodbye Cruel World!

Probieren Sie es online!

Beachten Sie, dass der Code nicht in Anführungszeichen gesetzt ist. APL versucht, ihn auszuführen, Worldist jedoch nicht definiert. Dies führt zu einem Absturz von VALUE ERROR mit der fehlerhaften Codezeile in der Fehlermeldung.

Mit Bonus, 35 ÷ 2 = 17,5 Bytes

'Hello World!'
Goodbye Cruel World!

Probieren Sie es online!

Zuerst wird die erforderliche Zeichenfolge gedruckt, dann stürzt das Programm wie oben beschrieben ab.

Ausgefeiltere Bonusversion, 35 ÷ 2 = 17,5 Bytes

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

Probieren Sie es online!

Druckt die erste Zeichenfolge, löscht dann die ersten fünf Zeichen von that ( 5↓), verknüpft that ( ,) mit einem neuen Präfix und versucht dann, this ( ) auszuführen , wodurch derselbe Fehler wie oben verursacht wird.


1
@Cyoce Tippfehler. Vielen Dank
Adám

5

Bash 20.5! 18,5!

Ich werde kein Gelee schlagen, aber ich bin ein bisschen schüchtern, weil ich ein schnelles Bash-Skript ausprobiert habe. 18.5 ist nicht schlecht für eine Nicht-Golf-Sprache. (Beachten Sie, dass dies ein Skript sein muss. Interaktive Bash wird versuchen, es !als Verlaufssuche zu interpretieren. )

echo Hello World!
Goodbye\ Cruel\ $_

Rückgabe mit Fehlercode 127 und:

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

Wie gewünscht "nix ... nirgendwo :). Wie von apricot boymir vorgeschlagen, suche ich jetzt das letzte Argument des vorherigen Befehls, um 4 Bytes zu sparen.


Ich habe versucht dich zu schlagen ... und bin mit 21 gescheitert! Bytes. :) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus

1
Sie könnten wahrscheinlich die zweite Zeile ändern Goodbye\ Cruel\ !$, nicht zu 100%, aber ziemlich sicher, dass dies !$"letztes Wort des letzten Befehls" ist
Aprikosenjunge

Was aber, wenn eine ausführbare Datei "Goodbye Cruel World" heißt? existiert im PFAD? :)
Spuck

OK auf TIO.run überprüft ... schlägt meine Antwort zsh: /
Roblogic

4

TeX, 19!

Hello World!#\bye Goodbye Cruel World!

Um TeX zu zwingen, eine DVI / PDF-Datei ohne manuellen Eingriff zu erstellen, kompilieren Sie mit -interaction=nonstopmode.

Es wird gedruckt Hello World!, ein Fehler für die Verwendung ausgegeben, #wenn dies nicht erwünscht ist, und dann die Kompilierung mit abgebrochen \bye. Was auch immer danach \byeist, wird dennoch in der Fehlermeldung ausgegeben, sodass es für den Bonus gilt.


4

WinDBG (Windows XP / Vista Local Kernel Debugging), 33 Bytes

.echo Goodbye Cruel World!;.crash

Warnung: Dies wird den gesamten Computer zum Absturz bringen, nicht nur das Programm.

Das Debuggen des lokalen Kernels ist nur unter Windows XP und Vista zulässig (in Vista jedoch standardmäßig nicht aktiviert). Das WinDBG-Dialogfeld zum Debuggen des lokalen Kernels erwähnt kein anderes Windows-Betriebssystem, daher gehe ich davon aus, dass es für diese nicht einmal aktiviert werden kann. Vermutlich können Sie für andere Windows-Betriebssysteme eine Verbindung zu einem Remotecomputer für das Kernel-Debugging herstellen, aber es ist der Remotecomputer, der abstürzt.


Das Debuggen des lokalen Kernels wird auch unter Windows 7 unterstützt, und ich habe nicht gehört, dass es seitdem entfernt wurde (aber ich habe es möglicherweise verpasst).
Cody Grey

4

JS (ES5), 46/2 = 23 Bytes!

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

Warnungen Hello, World!, dann Fehler mitUncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell, 26 Bytes

'Goodbye Cruel World!';1/0

Ich denke, das Teilen durch 0 ist der einfachste Weg, einen Fehler zu werfen.

PowerShell, 35/2 = 17,5 Byte

"Hello World!";Goodbye Cruel World!

von TessellatingHeckler löst den Fehler folgendermaßen aus:

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!

Sollte es nicht $w='World!'(mit !) sein?
Gmatht

"Hello World!";Goodbye Cruel World!beträgt 17,5 Bytes, löst eine Ausnahme aus, da Goodbye nicht als Befehl erkannt wird und die Ausnahmemeldung die Zeile vollständig enthält, sodass sie mit der regulären Schreibweise übereinstimmt.
TessellatingHeckler

1
Bei Verwendung der gleichen Logik wie bei der 17.5b-Antwort 'Goodbye Cruel World!';xwürden zwei Bytes für 24
Veskah



4

Node.js, Score: 25,5 24,5!

Dank ETHproductions 1 Punkt gespart

Ein syntaktisch korrektes Vollprogramm, das zur Laufzeit abstürzt, weil console.log()es keine Funktion zurückgibt.

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

Probieren Sie es online!


Leider gibt es keine Fakultät für 25.5...: ((
Mr. Xcoder

@ Mr.Xcoder Es ist Gamma(26.5), wie bei Mathematica Definition.
user202729

1
@ user202729 wer hat gesagt, dass Mathematica nicht kaputt ist? :)))
Mr. Xcoder

Kannst du die X(und vielleicht sogar die Newline) entfernen ?
ETHproductions

@ETHproductions Ja in der Tat. Vielen Dank!
Arnauld

3

Aceto , Kerbe: 21.5!

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

Druckt Hello World!und stürzt dann mit ab

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

Pyth, 28 24 Bytes

"GOODBYE CRUEL WORLD!"hY

Druckt eine Zeichenfolge und versucht dann, das erste Element der leeren Liste abzurufen.

Versuche dies!


3

AHK, 50/2 = 25! (nicht konkurrierend)

Nicht konkurrierend, da eine zusätzliche Anforderung die Antwort ungültig machte. Ich kann keine Möglichkeit finden, es kompilieren, den Text ausgeben und abstürzen zu lassen. Was auch immer ich versuche, versagt mindestens eine dieser Anforderungen.


Send,Hello World!
OutputDebug,Goodbye Cruel World!

Dies ist die langweiligste Lösung, die ich mir vorstellen kann. Es stürzt eigentlich nicht ab, aber das ist technisch keine Voraussetzung. Es muss lediglich eine Meldung an das Debug-Fenster ausgegeben werden. Das tut es, weil ich es dazu auffordere.


Dies ist derzeit ungültig. OP besagt, dass das Programm abstürzen muss, wenn die Sprache fähig ist, wenn das die AHK ist.
Internet_user

@pycoder Ah, das wurde 40 Minuten nachdem ich gepostet habe hinzugefügt. Ich werde für die neue Regel aktualisieren, aber es wird Bytes kosten.
Ingenieur Toast

3

Japt , 22 Bytes

°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

Probieren Sie es online!

3 Bytes gespart dank obarakon und ETHproductions


Sie können die Zeichenfolge mit komprimieren Oc"<string>"und dann die aktuelle Zeichenfolge durch die komprimierte Version ersetzen, die von Backticks umgeben ist.
Luke

Eine Erklärung wäre nett.
iFreilicht

1
@iFreilicht Erklärung hinzugefügt.
Tom

3

C #, 116/2 = 58 Bytes!

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

Normale Version für 94 87 Bytes:

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

7 Bytes gespart dank @KevinCruijssen.


int n=0;n/=n;ist kürzer für Ihre erste Antwort.
Kevin Cruijssen

@ KevinCruijssen Schöne Stelle, ich hatte Probleme damit, es ohne Division durch konstanten Nullfehler zu kompilieren.
TheLethalCoder

Ja, in Java kann man das einfach machen int n=1/0;, aber anscheinend ist das in C # nicht möglich (was eigentlich gut für die Sprache ist, aber schlecht für das Codegolfing). Übrigens, warum ist der Bonus nicht oben? Dieser ist kürzer.
Kevin Cruijssen

@ KevinCruijssen Ich war mir nicht sicher, ob es qualifiziert war, da es etwas unklar war, als ich meine Antwort veröffentlichte.
TheLethalCoder

3

Gelee , 10,5! Bytes

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

Probieren Sie es online!

Dabei wird undefiniertes Verhalten ausgenutzt, indem Python-Zeichenfolgen (Zeichenfolgen) anstelle von Jelly-Zeichenfolgen (Liste der Zeichenfolgen mit einem Zeichen) verwendet werden. Die Konvertierung erfolgt durch Reduzieren der Jelly-Zeichenfolge durch Hinzufügen. Pythons +verkettet zwei Zeichenfolgen, sodass zwei zusammengefügte Zeichenfolgen pythonweise verkettet werden. Anschließend wird die entsprechende Monade (Range) verwendet, sodass Pythons intin der Zeichenfolge aufgerufen wird, was zu einem Fehler führt, der immer enthalten würde Goodbye Cruel World!.

Erläuterung:

“,ḷṅḳȦ»¹“¿µƝɓṭỵ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 Bytes / 2 = 21!

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

Mit Hilfe von Alexis Andersen ein halbes Byte gespart, durch Ersetzen "String"/0durch -"String". Dies "funktioniert" nur mit Ruby-Versionen unter 2.3, bei denen die unäre Minus- Methode tatsächlich zur String-Klasse hinzugefügt wurde!

Mit 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)

Mit 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)

Sie können (ein halbes) Byte speichern, indem Sie -auf der Zeichenfolge anstelle von z. /B. verwenden-"Goodbye crueld World!"
Alexis Andersen

@AlexisAndersen danke! Heute habe ich auch etwas über eine neue Methode in der String-Klasse gelernt (siehe aktualisierten Beitrag)
daniero

3

x86-64-Binärcode (bei Linux-Systemaufrufen), 43 Byte

Demontage:

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

Dieses Programm bündelt die benötigten Daten (den String "Goodbye Cruel World!\n") in einem eigenen Code. Es lädt einen Zeiger auf diese Zeichenfolge unter Verwendung der riprelativen Adressierung und ruft den writeSyscall direkt und nicht über einen Glibc-Wrapper auf, sodass er völlig positionsunabhängig ist. Wir können ihn einfach testen, indem wir den Code in eine constZeichenfolge einbetten und diese Zeichenfolge in eine Funktion umwandeln Zeiger. Um das Programm zum Absturz zu bringen, beende ich es mit einer hltAnweisung, die den Prozessor mit Ring 0-Berechtigungen für immer zum Schweigen bringt (oder zumindest bis zum nächsten Interrupt), aber mit Ring 3-Berechtigungen (typisch für Benutzerprogramme) erhalten wir weitaus weniger dramatisch Segmentation Fault.

Testprogramm:

#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;
}

Ausgabe:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

Beachten Sie, dass der 43 - Byte - Code ist ein komplettes Programm , wie durch die Herausforderung angegeben, nicht nur eine Funktion. Es hängt nicht von der mainFunktion des Testprogramms ab, ob es richtig funktioniert. Es würde immer noch den String drucken und abstürzen, wenn er direkt vom Loader geladen und angesprungen wird.


Sparen Sie ein paar Bytes, indem Sie push/ popzum Laden von Registern verwenden. Beispielsweise können die ersten beiden Anweisungen push 1+ sein pop rax, was 1 Byte kürzer ist. Dann können die nächsten beiden Anweisungen durch ersetzt werden mov edi, eax, was 2 Bytes kürzer ist. Das Gleiche push/ der gleiche popTrick kann auf die Anweisungen 6 und 7 angewendet werden: push 0x15+ pop rdx.
Cody Grey


3

Pyth , 38/2 = 19 Bytes! 36/2 = 18 Bytes!

"Hello World!"v"Goodbye Cruel World!

Online testen!

Erklärungen

Es wird gedruckt Hello World!und dann versucht auszuwerten Goodbye Cruel World!. Dies schlägt fehl, da diese Zeichenfolge kein gültiger Code ist.

Das Ergebnis ist:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.