Adieu monde cruel!


49

Contexte

Bonjour les golfeurs! Je voudrais apprendre tous les langages de programmation! Mais j'ai un peu d'attention ... et copier tous les exemples de Hello World devient ennuyeux ... mais j'aime le feu! ^ w ^

Défi

Alors voici le plan! Je veux que vous écriviez tous le plus petit code qui compilera, imprimera Goodbye Cruel World!et plantera. Ou, en bonus, tordre, imprimer Hello World!et planter avecGoodbye Cruel World!

Règles

  • Votre score sera le nombre total de caractères utilisé. La réponse doit être tout un programme exécutable.
  • Votre programme doit imprimer Goodbye Cruel World!en sortie, puis se bloquer (erreur inattendue).
    • Pour un bonus de score, vous devez imprimer Hello World!à la place, mais le message d'erreur doit également contenir Goodbye Cruel World!. Si vous remplissez le défi de bonus, vous pouvez diviser votre score par 2. (Inclure un! À la fin de votre score si vous réclamez le bonus!)
  • Tant que la sortie standard est toujours imprimée et que l'erreur standard est toujours imprimée, l'ordre n'a pas d'importance. Tant que ni l'un ni l'autre ne peut empêcher l'autre de se produire.
  • La sortie doit contenir le contenu de ce qui précède; "ne devrait pas apparaître dans la sortie.
  • La sortie doit contenir la chaîne spécifiée et rien d’autre.
  • Le rapport d'incident peut contenir n'importe quoi, mais pour réclamer le bonus, les expressions rationnelles suivantes doivent correspondre /Goodbye Cruel World!/mi(c'est-à-dire, contient, ignore la casse / le texte environnant))
  • Les chaînes Hello World!et Goodbye Cruel World!sont insensibles à la casse, mais devraient sinon apparaître exactement comme ci-dessus.
  • Si le langage est capable de se bloquer (il ne peut pas changer son code de sortie), il doit se bloquer. Sinon, utilisez le "rapport d'erreur" standard (c'est-à-dire STDERR) pour la langue.

Je peux planter Python 3, alors j’ai inclus un exemple de réponse Python 3! Maintenant, mettons tous le feu au monde! ^ W ^


Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Dennis

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

Supposons que je travaille dans un langage tel que Java, où STDOUT et STDERR sont, bien sûr, imprimés dans des threads différents. Cela signifie que, bien que le programme imprime dans l’ordre "Hello world" puis se bloque, il est possible que la trace de la pile soit imprimée en premier ... Est-ce autorisé?
Phoenix socratique

@SocraticPhoenix Tant que STDOUT imprime et STDERR imprime, l'ordre n'a pas d'importance. Tant que ni l'un ni l'autre ne peut empêcher l'autre de se produire.
Tezra

1
C'est tellement amusant, je ne peux pas m'empêcher de trouver des solutions!
Adám

Réponses:


36

Gelée , 12 octets

“¿µƝɓṭỵae»Ȯ:

Essayez-le en ligne!

Explication:

“¿µƝɓṭỵae»Ȯ:

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

Comme la division entière est une dyade, elle prendra implicitement la valeur actuelle de la chaîne comme deux arguments - qui est une chaîne. Se bloque parce qu'il attend des entiers.


7
Bienvenue chez PPCG!
Dennis

Je vous remercie! Cela fait un moment que je guette, mais c’est la première fois que je découvre un défi que j’ai le sentiment de pouvoir résoudre décemment!
scatter

28
Réponse impressionnante, bien que presque toutes les réponses de Jelly soient impressionnantes, à la fois par la longueur et par le fait que vous avez réussi à apprendre Jelly.
Gryphon - Réintégrer Monica le

4
A base-250 encoded stringC'est à la fois cool et effrayant que vous puissiez le faire. X3
Tezra

3
C'est nettement plus court que la chaîne "Au revoir monde cruel!" (20 octets). Crazy ...
Adam Plocher

35

C, 43 octets

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

Imprime la chaîne, puis tente d’utiliser la valeur renvoyée comme pointeur sur une autre chaîne à imprimer, ce qui provoque une erreur de segmentation.

Essayez-le en ligne!

C, 42 octets

Merci à @Ruslan!

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

Essayez-le en ligne!

Juste pour le plaisir: C (sous Linux 64 bits), 149 octets

Modifié à partir de ce programme Hello World ici .

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

Essayez-le en ligne!


J'aime cette approche, mais les instructions l'indiquent,The answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}supprime un octet.
Ruslan

1
Tu n'as pas besoin i. puts("")/0;est une déclaration syntaxiquement correcte.
Rici

1
@rici Oui, mais ça ne plante pas (du moins sur TIO).
Steadybox

1
@Steadybox: c'est l'optimisation pour vous.
Rici

11

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

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

Explication:

...‘           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) utilise le fait que SOGL utilise STDERR en tant que sortie de débogage. Il contient donc beaucoup de texte, ainsi que la ligne.

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

Si vous avez transféré le STDOUT du croquis de traitement dans un fichier, le "Au revoir Cruel World!" serait là.


Étant donné que le défi mentionne " Les chaînes Hello World!et ne Goodbye Cruel World!sont pas sensibles à la casse, mais vous devez les afficher exactement comme ci-dessus. "
Kevin Cruijssen

@ KevinCruijssen oh hein, merci!
dzaima

10

> <> , 25 octets

"!dlroW leurC eybdooG">o<

Fondamentalement, il ajoute la chaîne à la pile (Backwards, dernier entré, premier sorti), puis effectue l'équivalent de:

while(1):
  pop the stack
  print the character

Lorsqu'il ne reste plus de caractères sur la pile (toute la chaîne a été imprimée), le vidage de la pile génère une erreur


+1 Entré à #o<"Goodbye Cruel World!", qui est fondamentalement la même.
hakr14

9

sed, 32 octets

iGoodbye Cruel World!
w/dev/full

iinsère une ligne et wécrit dans un fichier. /dev/fulldans ce cas, car toutes les écritures sont renvoyées ENOSPC("Il ne reste plus d’espace sur le périphérique").

Cependant, il n'a toujours besoin que d'une seule ligne d'entrée pour fonctionner.

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

3
Je ne savais même pas qu'il existe un tel appareil!
Ruslan

9

Lua, 31 , 30 octets

a=-print'Goodbye Cruel World!'

premiers tirages 'Goodbye Cruel World!' puis se bloque lorsque vous essayez d'ajouter une valeur nulle et 0.

Sortie:

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

Crédit à GalladeGuy pour 1 octet de moins


2
il affiche 'Au revoir le monde cruel!' et puis se bloque bien que je pensais juste qu'il faudrait simplement planter pour être accepté.
Eniallator

@Trebuchette L'exigence est "Votre programme doit imprimer Goodbye Cruel World! Pour générer une sortie, puis se bloquer", le terminal opérateur n'a pas précisé si "sortie" signifiait stderr, stdout, une boîte de message ou l'un de ces éléments.
Pharap

@Pharap Oh, je vois. STDERR ne compte que si vous visez le bonus. Merci!
Trébuchette

@Trebuchette Nope. Il indique "Ou, en bonus, relevez Hello World! Et écrasez-vous avec Goodbye Cruel World!". 'crash' n'implique pas nécessairement stderr, le 'crash' peut aussi signifier (entre autres) qu'une exception est levée. À moins que le PO ne le définisse plus avant, il est ouvert à interprétation. De plus, certaines applications de Lua n'ont aucun concept de stderr (par exemple, Lua est intégré comme langage de script pour les jeux) et imprimera à la place dans une boîte de message ou un fichier journal, etc.
Pharap

1
Vous pouvez sauvegarder un octet en faisant ceci à la place:a=-print"Goodbye Cruel World!"
GalladeGuy

8

Python 3 | Score: 24,5! 23 22!

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

Imprimez "Hello World", puis utilisez un opérateur non valide '+' sur "Goodbye Cruel World!" à l'élément de retour NoneType. (découpe de la version précédente)

Essayez-le en ligne!

Python 3 | Score: 34 30

+print("Goodbye Cruel World!")

Print Au revoir, qu'une opération unaire + non valide sur le résultat de l'impression (NoneType)

Essayez-le en ligne!


+"Goodbye Cruel World!"est plus court de 3 octets et génère une erreur TypeError.
Gábor Fekete

print("Goodbye Cruel World!")/0est plus court pour le second (3 octets?)
matsjoyce

@matsjoyce J'avais peur que ça s'écroule avant l'impression. Mais puisqu'il imprime en premier, je vais juste faire unaire sur le résultat: 3
Tezra

24
2.585e + 22 est un très gros score ... vous êtes sûr que vous ne pourriez pas jouer plus?
Tuskiomi

1
@tuskiomi Le '!' signifie que le score final est modifié par le challenge bonus.
Tezra



6

CJam , 34 octets, marquons 17!

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

Essayez-le en ligne!(Voir le panneau de débogage pour STDERR)

Explication

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

Sur TIO, il génère ce message d'erreur:

"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

Préprocesseur C, 27 octets

#error Goodbye Cruel World!

Sortie:

fatal error C1189: #error:  Goodbye Cruel World!

1
Vous pourrez peut-être le raccourcir davantage avec just#Goodbye Cruel World!
apricot boy

@apricotboy Cela produirait toujours une erreur, mais le message d'erreur complet "Au revoir monde cruel" n'est pas émis par le compilateur (au moins sur MSVC)
Govind Parmar

@Gorvind Ah ah. Eh bien , il fait sans aucun doute sur gcc: i.imgur.com/qmGnoJv.png
garçon abricot

6

APL (Dyalog) , 17,5 octets

Sans bonus, 20 octets

Goodbye Cruel World!

Essayez-le en ligne!

Notez que le code n'est pas entre guillemets. APL essaie de l'exécuter mais Worldn'est pas défini, ce qui provoque un blocage de VALUE ERROR avec la ligne de code incriminée incluse dans le message d'erreur.

Avec bonus, 35 2 = 17,5 octets

'Hello World!'
Goodbye Cruel World!

Essayez-le en ligne!

Affiche d'abord la chaîne requise, puis se bloque comme dans le programme ci-dessus.

Version bonus plus sophistiquée, 35 2 = 17,5 octets

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

Essayez-le en ligne!

Imprime la première chaîne, puis supprime les cinq premiers caractères de this ( 5↓), puis concatène that ( ,) en un nouveau préfixe, puis tente de l'exécuter ( ), en provoquant la même erreur que ci-dessus.


1
@ Cyoce Typo. Merci
Adám

5

Bash 20.5! 18,5!

Je ne vais pas faire de la gelée, mais je suis un peu timide pour critiquer un script rapide. 18.5 n'est pas si mal pour une langue qui ne joue pas au golf. (Notez que cela doit être un script, bash interactive essaiera de l'interpréter !comme une recherche dans l'historique)

echo Hello World!
Goodbye\ Cruel\ $_

Renvoie avec le code d'erreur 127 et:

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

Comme demandé, aucun "... n'importe où :). Comme suggéré par, apricot boyje recherche maintenant le dernier argument de la commande précédente pour économiser 4 octets.


J'ai essayé de te battre… et j'ai échoué avec 21! octets. :) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus

1
Vous pourriez probablement changer la deuxième ligne en Goodbye\ Cruel\ !$, pas à 100% mais à peu près sûr que !$c'est "le dernier mot de la dernière commande"
abricot garçon

Mais que se passe-t-il si un exécutable nommé "Goodbye Cruel World!" existe dans le chemin? :)
spuck

Vérifié OK sur TIO.run ... bat mon zsh réponse: /
roblogic

4

TeX, 19 ans!

Hello World!#\bye Goodbye Cruel World!

Pour forcer TeX à produire réellement un fichier dvi / pdf sans intervention manuelle, compilez avec -interaction=nonstopmode.

Il imprime Hello World!, génère une erreur d'utilisation #lorsque vous n'êtes pas censé le faire, puis arrête la compilation avec \bye. Cependant, tout ce qui \byeest après est toujours affiché dans le message d'erreur, il est donc valable pour le bonus.


4

WinDBG (débogage du noyau local sous Windows XP / Vista), 33 octets

.echo Goodbye Cruel World!;.crash

Avertissement: Ceci plantera la machine entière, pas seulement le programme.

Le débogage du noyau local n'est autorisé que sous Windows XP et Vista (mais n'est pas activé par défaut sous Vista). La boîte de dialogue WinDBG sur le débogage du noyau local ne mentionne aucun autre système d’exploitation Windows. Je suppose donc qu’il ne peut même pas être activé pour ceux-ci. Vraisemblablement pour d'autres systèmes d'exploitation Windows, vous pouvez vous connecter à une machine distante pour le débogage du noyau, mais c'est la machine distante qui va tomber en panne, donc je ne pense pas que cette solution compte ici.


Le débogage du noyau local est également pris en charge sur Windows 7 et je n’ai pas entendu dire qu’il avait été supprimé depuis (mais j’ai peut-être manqué cela).
Cody Grey

4

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

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

Alertes Hello, World!, puis erreurs avecUncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell, 26 octets

'Goodbye Cruel World!';1/0

Je pense que diviser par 0 est le moyen le plus simple de générer une erreur.

PowerShell, 35/2 = 17,5 octets

"Hello World!";Goodbye Cruel World!

par TessellatingHeckler , jette l'erreur comme suit:

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!

Ne devrait-il pas être $w='World!'(avec un !)?
Dimm

"Hello World!";Goodbye Cruel World!est de 17,5 octets; une exception est générée, car Goodbye n'est pas reconnu en tant que commande et le message d'exception inclut la ligne dans son intégralité, ce qui correspond à la regex.
TessellatingHeckler

1
En utilisant la même logique que la réponse 17.5b, 'Goodbye Cruel World!';xéconomiserait deux octets pour 24
Veskah



4

Node.js, Score: 25.5 24.5!

Économisé 1 point grâce à ETHproductions

Un programme complet correct du point de vue syntaxique qui se bloque au moment de l’exécution parce qu’il console.log()ne renvoie pas de fonction.

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

Essayez-le en ligne!


Malheureusement, il n'y a pas de facteur pour 25.5...: ((
M. Xcoder

@ Mr.Xcoder C'est Gamma(26.5)comme dans la définition de Mathematica.
user202729

1
@ user202729 qui a dit que Mathematica n'était pas cassé? :)))
M. Xcoder le

Pouvez-vous supprimer le X(et peut-être même la nouvelle ligne)?
ETHproductions

@ETHproductions Oui en effet. Merci!
Arnauld

3

Aceto , score: 21,5!

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

Imprime Hello World!, puis plante avec

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 octets

"GOODBYE CRUEL WORLD!"hY

Imprime une chaîne, puis essaie d’obtenir le premier élément de la liste vide.

Essaye ça!


3

AHK, 50/2 = 25! (non-concurrent)

Non en concurrence parce qu'une exigence supplémentaire rendait la réponse invalide. Je ne trouve pas le moyen de le faire compiler, de sortir le texte et de planter. Quoi que j'essaye, au moins une de ces exigences échoue.


Send,Hello World!
OutputDebug,Goodbye Cruel World!

C’est la solution la plus ennuyeuse à laquelle je puisse penser. Cela ne plante pas réellement mais ce n'est pas techniquement une exigence. Tout ce qu'il a à faire est d'envoyer un message à la fenêtre de débogage. Il le fait parce que je lui dis de le faire.


Ceci est actuellement invalide. OP indique que le programme doit planter si la langue en est capable, ce qui est AHK.
internet_user

@pycoder Ah, cela a été ajouté 40 minutes après avoir posté. Je vais mettre à jour pour la nouvelle règle, mais cela coûtera des octets.
Ingénieur Toast

3

Japt , 22 octets

°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

Essayez-le en ligne!

3 octets sauvés grâce à obarakon et ETHproductions


Vous pouvez compresser la chaîne en utilisant Oc"<string>"puis remplacer la chaîne en cours par la version compressée et entourée de backticks.
Luke

Une explication serait bien.
iFreilicht

1
@iFreilicht explication ajoutée.
Tom

3

C #, 116/2 = 58 octets!

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

Version normale pour 94 87 octets:

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

Sauvegardé 7 octets grâce à @KevinCruijssen.


int n=0;n/=n;est plus court pour votre première réponse.
Kevin Cruijssen

@KevinCruijssen Nice spot, j'avais du mal à le faire compiler sans division par erreur de zéro constant.
TheLethalCoder

Oui, en Java, vous pouvez le faire int n=1/0;, mais apparemment, cela n’est pas possible en C # (ce qui est en fait une bonne chose pour le langage, mais pas pour le codegolfing). Au fait, pourquoi le bonus n'est-il pas au sommet? Celui-ci est plus court.
Kevin Cruijssen

@KevinCruijssen Je ne savais pas trop si c'était qualifié, car je ne savais pas trop quand j'ai posté ma réponse, vu que cela a été précisé, je les ai inversées.
TheLethalCoder

3

Gelée , 10.5! octets

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

Essayez-le en ligne!

Cela exploite un comportement indéfini, en utilisant des chaînes Python (chaînes) au lieu de chaînes Jelly (liste de chaînes à 1 caractère). La conversion est effectuée en réduisant la chaîne Jelly par addition, et Python +concatène deux chaînes, de sorte que deux chaînes additionnées sont concaténées en Python. Ensuite, il utilise la monade appropriée (plage) de sorte que celle de Python intsoit appelée sur la chaîne, générant une erreur qu’elle contiendrait toujours Goodbye Cruel World!.

Explication:

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

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

Économisé un demi-octet avec l'aide d'Alexis Andersen, en le remplaçant "String"/0par -"String". Cela fonctionne uniquement avec les versions Ruby inférieures à 2.3, dans lesquelles le moins unaire méthode été ajoutée à la classe String!

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

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

vous pouvez enregistrer ( la moitié) un octet en utilisant -sur la chaîne au lieu de par /exemple-"Goodbye crueld World!"
Alexis Andersen

@AlexisAndersen merci! Aujourd'hui, j'ai aussi appris l'existence d'une nouvelle méthode dans la classe String (voir article mis à jour).
daniero

3

Code binaire x86-64 (avec appels système Linux), 43 octets

Démontage:

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

Ce programme regroupe les données dont il a besoin (la chaîne "Goodbye Cruel World!\n") dans son propre code. Il charge un pointeur sur cette chaîne en utilisant ripun adressage relatif et appelle le writesyscall directement plutôt que via un wrapper glibc. Il est donc totalement indépendant de la position. Nous pouvons facilement le tester en incorporant le code dans une constchaîne et en la convertissant en fonction. aiguille. Pour bloquer le programme, je le termine par une hltinstruction qui, avec les privilèges sonnerie 0, ferait taire le processeur pour toujours (ou du moins jusqu'à la prochaine interruption), mais avec les privilèges sonnerie 3 (typiques des programmes utilisateur), nous obtenons un résultat beaucoup moins dramatique Segmentation Fault.

Programme de test:

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

Sortie:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

Notez que le code de 43 octets est un programme complet tel que spécifié par le défi, pas seulement une fonction. Cela ne dépend pas de la mainfonction du programme de test pour fonctionner correctement; il continuerait à imprimer la chaîne et à planter s’il était chargé directement par le chargeur.


Enregistrez quelques octets à l’aide de push/ poppour charger les registres. Par exemple, les deux premières instructions peuvent être push 1+ pop rax, ce qui correspond à un octet plus court. Ensuite, les deux instructions suivantes peuvent être remplacées par mov edi, eax, soit 2 octets de moins. Le même push/ poptour peut être appliqué aux instructions 6 et 7: push 0x15+ pop rdx.
Cody Gray


3

Pyth , = 19 octets! 36/2 = 18 octets!

"Hello World!"v"Goodbye Cruel World!

Testez-le en ligne!

Des explications

Il imprime Hello World! , puis essaie d'évaluerGoodbye Cruel World! . Cela échoue, car cette chaîne n'est pas un code valide.

Le résultat est:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.