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 ^

Tezra
la source
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.

dispersion
la source
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!

Steadybox
la source
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à.

dzaima
la source
É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

Agourd
la source
+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
abricot garçon
la source
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

éniallateur
la source
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!

Tezra
la source
+"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
7

R, 22 20! octets (44/2) (40/2)

cat("Hello World!")
`Goodbye Cruel World!`

Essayez-le en ligne!

Sortie:

Bonjour le monde!

Erreur: objet 'Adieu le monde cruel!' pas trouvé

Sauvegardé deux points grâce à digEmAll

tourbull
la source
Vous pouvez le raccourcir pour l' 40/2 essayer en ligne!
digEmAll
6

AWK , 72 octets, score 36!

BEGIN{print"Hello World!";print"Goodbye Cruel World!">"/dev/stderr";0/0}

Essayez-le en ligne!

AWK n'aime pas essayer de diviser par 0.

Robert Benson
la source
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)
Chat d'affaires
la source
6

Préprocesseur C, 27 octets

#error Goodbye Cruel World!

Sortie:

fatal error C1189: #error:  Goodbye Cruel World!
Govind Parmar
la source
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.

Adam
la source
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.

Gmatht
la source
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.

cp.fe.cp
la source
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.

Lait
la source
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


la source
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!
Colsw
la source
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

Langage de script Operation Flashpoint , 45/2 = 22,5 octets

f={hint"Hello World!";a Goodbye Cruel World!}

Appeler avec:

call f;

Sortie:

Steadybox
la source
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!

Arnauld
la source
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
L3viathan
la source
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!

KarlKastor
la source
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.

Rôti d'ingénieur
la source
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

À M
la source
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.

TheLethalCoder
la source
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
Erik le golfeur
la source
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)
Daniero
la source
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.

Noix de calcul
la source
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
Jim
la source