Do widzenia okrutny świecie!


49

tło

Cześć golfiści! Chciałbym nauczyć się wszystkich języków programowania! Ale mam trochę uwagi ... a kopiowanie wszystkich przykładów Hello World staje się nudne ... ale lubię ogień! ^ w ^

Wyzwanie

Oto plan! Chcę, żebyście wszyscy napisali najmniejszy kod, który skompiluje, wydrukuje Goodbye Cruel World!, a następnie zawiesi. Lub jako bonusowe wyzwanie, drukuj Hello World!i zawieszaj sięGoodbye Cruel World!

Zasady

  • Twój wynik będzie całkowitą liczbą użytych znaków. Odpowiedź musi być całym programem wykonywalnym.
  • Twój program musi wydrukować Goodbye Cruel World!dane wyjściowe, a następnie zawiesić się (nieoczekiwany błąd).
    • Aby uzyskać bonus punktowy, musisz Hello World!zamiast tego wydrukować, aby wydrukować , ale komunikat o błędzie musi również zawierać Goodbye Cruel World!. Jeśli ukończysz wyzwanie premiowe, możesz podzielić swój wynik przez 2. (Jeśli chcesz otrzymać bonus, dołącz!! Na końcu swojego wyniku!)
  • Dopóki standardowe wyjście nadal się drukuje, a standardowy błąd nadal się drukuje, kolejność nie ma znaczenia. Tak długo, jak żadne z nich nie może zablokować drugiego.
  • Dane wyjściowe muszą zawierać treść powyższego; "nie powinien pojawić się na wyjściu.
  • Dane wyjściowe powinny zawierać określony ciąg i nic więcej.
  • Raport o awarii może zawierać wszystko, ale aby ubiegać się o bonus, następujący regex powinien pasować /Goodbye Cruel World!/mi(inaczej: zawiera, ignoruje wielkość liter / otaczający tekst))
  • Ciągi Hello World!i Goodbye Cruel World!są wrażliwe na wielkość liter, ale poza tym powinien pojawić się dokładnie tak, jak powyżej.
  • Jeśli język ulega awarii (nie może zmienić kodu wyjścia), musi ulec awarii. W przeciwnym razie użyj standardowego „raportu o błędzie” (tj. STDERR) Dla języka.

Mogę zawiesić Python 3, więc dołączyłem przykładową odpowiedź na Python 3! Teraz pozwala wszystkim podpalić świat! ^ W ^


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis

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

Załóżmy, że pracuję w języku takim jak Java, gdzie STDOUT i STDERR są oczywiście drukowane w różnych wątkach. Oznacza to, że chociaż program w kolejności wypisuje „Witaj świecie”, a następnie ulega awarii, możliwe jest, że najpierw zostanie wydrukowany ślad stosu ... Czy to dozwolone?
Socratic Phoenix,

@SocraticPhoenix Dopóki STDOUT nadal drukuje, a STDERR nadal drukuje, kolejność nie ma znaczenia. Tak długo, jak żadne z nich nie może zablokować drugiego.
Tezra

1
To świetna zabawa, nie mogę przestać tworzyć rozwiązań!
Adám

Odpowiedzi:


36

Galaretka , 12 bajtów

“¿µƝɓṭỵae»Ȯ:

Wypróbuj online!

Wyjaśnienie:

“¿µƝɓṭỵae»Ȯ:

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

Ponieważ dzielenie liczb całkowitych jest diademem, domyślnie przyjmuje bieżącą wartość łańcucha jako oba argumenty - co jest ciągiem. Awarie, ponieważ oczekuje liczb całkowitych.


7
Witamy w PPCG!
Dennis

Dziękuję Ci! Czaję się już od jakiegoś czasu, ale po raz pierwszy znalazłem wyzwanie, które czułem, że naprawdę potrafię rozwiązać przyzwoicie!
rozproszyć

28
Imponująca odpowiedź, chociaż prawie wszystkie odpowiedzi na galaretki są imponujące, zarówno ze względu na długość, jak i fakt, że udało ci się nauczyć galaretki.
Gryphon - Przywróć Monikę

4
A base-250 encoded stringTo jest zarówno przerażające, że możesz to zrobić. X3
Tezra

3
Jest to znacznie krótszy niż ciąg „Żegnaj okrutny świecie!” (20 bajtów). Szalony ...
Adam Plocher

35

C, 43 bajty

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

Drukuje łańcuch, a następnie próbuje użyć wartości zwracanej jako wskaźnika do innego łańcucha, który ma zostać wydrukowany, co powoduje błąd segmentacji.

Wypróbuj online!

C, 42 bajty

Dzięki @Ruslan!

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

Wypróbuj online!

Dla zabawy: C (w 64-bitowym systemie Linux), 149 bajtów

Zmodyfikowano z tego programu Hello World tutaj .

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

Wypróbuj online!


Lubię to podejście, ale instrukcje mówią:The answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}usuwa jeden bajt.
Ruslan

1
Nie trzeba i. puts("")/0;jest poprawną składniowo instrukcją.
rici

1
@rici Tak, ale nie ulega awarii (przynajmniej na TIO).
Steadybox

1
@ Steadybox: to optymalizacja dla Ciebie.
rici

11

SOGL , 15 25 17 bajtów / 2 = 8,5!

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

Wyjaśnienie:

...‘           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) wykorzystuje fakt, że SOGL używa STDERR jako wyniku debugowania, więc jest w nim dużo tekstu wraz z linią

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

Jeśli przesłałeś STDOUT szkicu przetwarzania do pliku, „Goodbye Cruel World!” będzie tam


Ponieważ w wyzwaniu wspomniano: „ Ciągi znaków Hello World!i Goodbye Cruel World!nie rozróżniają wielkości liter, ale poza tym powinny wyglądać dokładnie tak, jak powyżej. ”, Możesz zagrać w golfa, całkowicie pozbywając się tej funkcji i po prostu wypisując małe litery.
Kevin Cruijssen

@KevinCruijssen oh huh, dzięki!
dzaima

10

> <> , 25 bajtów

"!dlroW leurC eybdooG">o<

Zasadniczo dodaje ciąg znaków do stosu (wstecz, ostatni weszło pierwsze wyszło), a następnie robi równowartość:

while(1):
  pop the stack
  print the character

Gdy na stosie nie pozostały żadne znaki (wydrukowano cały ciąg), pęknięcie stosu powoduje błąd


+1. Przyszedł do #o<"Goodbye Cruel World!", co w zasadzie jest takie samo.
hakr14

9

sed, 32 bajty

iGoodbye Cruel World!
w/dev/full

iwstawia linię i wzapisuje do pliku. /dev/fullw tym przypadku, ponieważ wszystkie zapisy do niego zwracają ENOSPC(„Brak miejsca na urządzeniu”).

Jednak nadal potrzebuje jednego wiersza danych wejściowych do działania.

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

3
Nawet nie wiedziałem, że istnieje takie urządzenie!
Ruslan

9

Lua, 31 , 30 bajtów

a=-print'Goodbye Cruel World!'

po raz pierwszy drukuje „Goodbye Cruel World!” a następnie ulega awarii przy próbie dodania wartości zero i 0.

Wynik:

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

Kredyt dla GalladeGuy za 1 bajt mniej


2
drukuje „Goodbye Cruel World!” a potem dochodzi do awarii, ale pomyślałem, że po prostu musiałby się zawiesić, aby zostać zaakceptowanym.
eniallator

@Trebuchette Wymaganie jest następujące: „Twój program musi wydrukować Goodbye Cruel World !, aby wyjść, a następnie zawiesić się”, OP nie określił, czy „wyjście” oznacza stderr, stdout, okno komunikatu lub dowolne z powyższych.
Pharap

@Pharap Oh, rozumiem. STDERR ma znaczenie tylko w przypadku premii. Dzięki!
Trebuchette

@Trebuchette Nope. Mówi: „Lub jako bonusowe wyzwanie, wydrukuj Hello World! I upaść z Goodbye Cruel World!”. „crash” niekoniecznie oznacza stderr, „crash” może również oznaczać (między innymi) wyjątek. O ile OP nie określi tego bardziej szczegółowo, może być interpretowane. Również niektóre aplikacje Lua nie mają pojęcia stderr (np. Lua osadzona jako język skryptowy do gier) i zamiast tego będą drukować do okna komunikatu lub pliku dziennika itp.
Pharap

1
Zamiast tego możesz zapisać bajt:a=-print"Goodbye Cruel World!"
GalladeGuy

8

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

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

Wydrukuj „Hello World”, niż użyj niepoprawnego operatora „+” na „Goodbye Cruel World!” do elementu zwracanego NoneType. (wycięty \ n \ r z poprzedniej wersji)

Wypróbuj online!

Python 3 | Wynik: 34 30

+print("Goodbye Cruel World!")

Wydrukuj do widzenia, niż wykonaj niepoprawną operację jednorazową + na wyniku drukowania (NoneType)

Wypróbuj online!


+"Goodbye Cruel World!"jest krótszy o 3 bajty i generuje błąd typu.
Gábor Fekete

print("Goodbye Cruel World!")/0jest krótszy dla drugiego (3 bajty?)
matsjoyce

@matsjoyce Bałem się, że rozbije się przed wydrukiem. Ale ponieważ drukuje się jako pierwszy, po prostu zrobię jednoargumentowy na wydruku „wynik”: 3
Tezra

24
2.585e + 22 to całkiem niezły wynik ... jesteś pewien, że nie mógłbyś więcej zagrać w golfa?
tuskiomi

1
@tuskiomi The! oznacza, że ​​ostateczny wynik jest modyfikowany przez wyzwanie premiowe.
Tezra



6

CJam , 34 bajty, wynik 17!

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

Wypróbuj online! (Zobacz Panel debugowania dla STDERR)

Wyjaśnienie

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

W TIO generuje ten komunikat o błędzie:

"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 Preprocesor, 27 bajtów

#error Goodbye Cruel World!

Wynik:

fatal error C1189: #error:  Goodbye Cruel World!

1
Możesz być w stanie go skrócić dalej tylko z#Goodbye Cruel World!
moreli chłopca

@apricotboy To wciąż powoduje błąd, ale kompilator nie wyświetla pełnego komunikatu o błędzie „żegnaj okrutny świat” (przynajmniej na MSVC)
Govind Parmar

@Gorvind Parmar ah. Cóż, zdecydowanie robi to na gcc: i.imgur.com/qmGnoJv.png
morelowy chłopiec

6

APL (Dyalog) , 17,5 bajtów

Bez premii 20 bajtów

Goodbye Cruel World!

Wypróbuj online!

Zauważ, że kod nie jest cytowany, więc APL próbuje go wykonać, ale Worldnie jest zdefiniowany, powodując awarię BŁĄD WARTOŚCI z nieprawidłową linią kodu zawartą w komunikacie o błędzie.

Z premią 35 ÷ 2 = 17,5 bajtów

'Hello World!'
Goodbye Cruel World!

Wypróbuj online!

Najpierw drukuje wymagany ciąg, a następnie ulega awarii, jak powyższy program.

Bardziej wyrafinowana wersja premiowa, 35 ÷ 2 = 17,5 bajtów

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

Wypróbuj online!

Drukuje pierwszy ciąg, następnie upuszcza pierwsze pięć znaków z tego ( 5↓), a następnie konkatenuje to ( ,) z nowym prefiksem, a następnie próbuje wykonać ( ), powodując ten sam błąd, co powyżej.


1
@Cyoce Typo. Dzięki
Adám,

5

Bash 20.5! 18,5!

Nie zamierzam strzelać do galaretki, ale trochę zawstydzam się tym, że wybrałem szybki skrypt. 18.5 nie jest takie złe jak na język nie golfowy. (Uwaga: to musi być skrypt, interaktywne bash spróbuje zinterpretować !jako wyszukiwanie historii)

echo Hello World!
Goodbye\ Cruel\ $_

Zwraca z kodem błędu 127 i:

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

Zgodnie z prośbą nie "ma ... nigdzie :). Jak zasugerowałem apricot boy, sprawdzam teraz ostatni argument poprzedniego polecenia, aby zapisać 4 bajty.


Próbowałem cię pokonać ... i nie udało mi się z 21! bajty. :) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus

1
Prawdopodobnie możesz zmienić drugą linię na Goodbye\ Cruel\ !$, nie w 100%, ale całkiem pewne, że !$to „ostatnie słowo ostatniego polecenia”
morelowy chłopiec

Ale co, jeśli plik wykonywalny o nazwie „Goodbye Cruel World!” istnieje w ŚCIEŻCE? :)
spuck

Zweryfikowano OK na TIO.run ... bije moją odpowiedź zsh: /
roblogic

4

TeX, 19 lat!

Hello World!#\bye Goodbye Cruel World!

Aby zmusić TeXa do utworzenia pliku dvi / pdf bez ręcznej interwencji, skompiluj z -interaction=nonstopmode.

Drukuje Hello World!, zgłasza błąd podczas używania, #gdy nie należy, a następnie kończy kompilację \bye. Jednak to, co następuje po, \byejest nadal wyprowadzane w komunikacie o błędzie, więc dotyczy to premii.


4

WinDBG (debugowanie lokalnego jądra systemu Windows XP / Vista), 33 bajty

.echo Goodbye Cruel World!;.crash

Ostrzeżenie: spowoduje to awarię całego komputera, a nie tylko programu.

Debugowanie lokalnego jądra jest dozwolone tylko w systemach Windows XP i Vista (ale domyślnie nie jest włączone w systemie Vista). Okno dialogowe WinDBG dotyczące debugowania lokalnego jądra nie wspomina o żadnym innym systemie operacyjnym Windows, więc zakładam, że nie można nawet dla nich włączyć. Prawdopodobnie w przypadku innych systemów operacyjnych Windows możesz podłączyć się do zdalnego komputera w celu debugowania jądra, ale to zdalny komputer się zawiesi, więc nie sądzę, że to rozwiązanie się tam liczy.


Lokalne debugowanie jądra jest również obsługiwane w systemie Windows 7 i od tego czasu nie słyszałem, że zostało usunięte (ale mogłem to przegapić).
Cody Gray

4

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

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

Alerty Hello, World!, a następnie błędy za pomocąUncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell, 26 bajtów

'Goodbye Cruel World!';1/0

Myślę, że dzielenie przez 0 jest najprostszym sposobem na zgłoszenie błędu.

PowerShell, 35/2 = 17,5 bajtów

"Hello World!";Goodbye Cruel World!

przez TessellatingHeckler , zgłasza błąd w następujący sposób:

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!

Czy nie powinno być $w='World!'(z !)?
gmatht

"Hello World!";Goodbye Cruel World!ma 17,5 bajtów, zgłasza wyjątek, ponieważ pożegnanie nie jest rozpoznawane jako polecenie, a komunikat wyjątku zawiera wiersz w całości, więc pasuje do wyrażenia regularnego ..
TessellatingHeckler

1
Korzystanie z tej samej logiki, co odpowiedź 17.5b, 'Goodbye Cruel World!';xpozwoliłoby zaoszczędzić dwa bajty na 24
Veskah



4

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

Oszczędność 1 punktu dzięki produktom ETH

Pełny składni poprawny program, który ulega awarii w czasie wykonywania, ponieważ console.log()nie zwraca funkcji.

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

Wypróbuj online!


Niestety nie ma silni dla 25.5...: ((
Xcoder,

@ Mr.Xcoder Jest tak Gamma(26.5), jak w przypadku definicji Mathematica.
user202729,

1
@ user202729, kto powiedział, że Mathematica nie jest zepsuta? :)))
Mr. Xcoder,

Czy możesz usunąć X(a może nawet nową linię)?
ETHproductions

@ETHproductions Tak, rzeczywiście. Dzięki!
Arnauld

3

Aceto , wynik: 21,5!

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

Drukuje Hello World!, a następnie ulega awarii

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! (niekonkurujący)

Nie konkuruje, ponieważ dodatkowy wymóg unieważnił odpowiedź. Nie mogę znaleźć sposobu na skompilowanie go, wygenerowanie tekstu i awarię. Cokolwiek spróbuję, nie spełni przynajmniej jednego z tych wymagań.


Send,Hello World!
OutputDebug,Goodbye Cruel World!

To najbardziej nudne rozwiązanie, jakie mogłem wymyślić. W rzeczywistości nie ulega awarii, ale nie jest to technicznie wymagane. Wystarczy, że wyśle ​​komunikat do okna debugowania. Robi to, ponieważ tak mówię.


To jest obecnie nieprawidłowe. OP stwierdza, że ​​program musi ulec awarii, jeśli język jest w stanie, jeśli to, co jest AHK.
internet_user

@pycoder Ah, który został dodany 40 minut po opublikowaniu. Zaktualizuję nową regułę, ale będzie to kosztować bajty.
Inżynier Toast

3

Japt , 22 bajty

°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

Wypróbuj online!

Zaoszczędzono 3 bajty dzięki obarakon i produktom ETH


Możesz skompresować ciąg za pomocą, Oc"<string>"a następnie zastąpić bieżący ciąg skompresowaną wersją i otoczony backtickami.
Luke

Wyjaśnienie byłoby miłe.
iFreilicht,

1
Dodano wyjaśnienie @iFreilicht.
Tom

3

C #, 116/2 = 58 bajtów!

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

Wersja normalna dla 94 87 bajtów:

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

Zaoszczędź 7 bajtów dzięki @KevinCruijssen.


int n=0;n/=n;jest krótszy dla twojej pierwszej odpowiedzi.
Kevin Cruijssen

@KevinCruijssen Ładne miejsce, miałem problem z kompilacją bez dzielenia przez stały błąd zerowy.
TheLethalCoder,

Tak, w Javie możesz po prostu to zrobić int n=1/0;, ale najwyraźniej nie jest to możliwe w języku C # (co jest właściwie dobrą rzeczą dla języka, ale złe dla kodegolfingu). Przy okazji, dlaczego premia nie jest u góry? Ten jest krótszy.
Kevin Cruijssen

@KevinCruijssen Nie byłem pewien, czy kwalifikowało się, ponieważ było trochę niejasne, kiedy opublikowałem swoją odpowiedź, widząc, że wyjaśniono, że zmieniłem je.
TheLethalCoder,

3

Galaretka , 10,5! bajty

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

Wypróbuj online!

Wykorzystuje to niezdefiniowane zachowanie, używając ciągów Python (ciągów) zamiast ciągów Jelly (lista ciągów 1-znakowych). Konwersja odbywa się poprzez zmniejszenie ciągu galaretki przez dodanie, a Python +łączy dwa ciągi, więc dwa dodane razem są konkatenowane pod względem Pythona. Następnie używa odpowiedniej monady (zakresu), aby Python'sint jest wywoływany w ciągu, co powoduje błąd, który zawsze będzie zawierał Goodbye Cruel World!.

Wyjaśnienie:

“,ḷṅḳȦ»¹“¿µƝɓṭỵ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

Rubinowy, 43 42 bajtów / 2 = 21!

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

Zapisane pół bajt za pomocą Alexis Andersen, zastępując "String"/0z -"String". Działa to tylko z wersjami Ruby niższymi niż 2.3, w których metoda Unary minus została faktycznie dodana do klasy String!

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

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

możesz zapisać (pół) bajt, używając -ciągu zamiast /np.-"Goodbye crueld World!"
Alexis Andersen

@AlexisAndersen dzięki! Dzisiaj dowiedziałem się także o nowej metodzie w klasie String (patrz zaktualizowany post)
daniero

3

x86-64 Kod binarny (z wywołaniami systemowymi Linuksa), 43 bajty

Demontaż:

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

Ten program łączy potrzebne dane (ciąg "Goodbye Cruel World!\n") we własny kod. Ładuje wskaźnik do tego ciągu przy użyciu ripwzględnego adresowania i wywołuje writesyscall bezpośrednio, a nie poprzez opakowanie glibc, więc jest całkowicie niezależny od pozycji, i możemy go łatwo przetestować, osadzając kod w constciągu i rzutując ten ciąg na funkcję wskaźnik. Aby zawiesić program, kończę go hltinstrukcją, która z uprawnieniami pierścienia 0 wyciszy procesor na zawsze (lub przynajmniej do następnego następnego przerwania), ale z uprawnieniami pierścienia 3 (typowymi dla programów użytkownika) otrzymamy znacznie mniej dramatyczny Segmentation Fault.

Program testowy:

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

Wynik:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

Zauważ, że 43-bajtowy kod jest kompletnym programem określonym przez wyzwanie, a nie tylko funkcją. mainPrawidłowe działanie programu testowego nie zależy od funkcji programu testowego; nadal ładowałby ciąg i powodowałby awarię, gdyby został załadowany i bezpośrednio do niego załadowany.


Zaoszczędź kilka bajtów, używając push/ popdo załadowania rejestrów. Na przykład dwie pierwsze instrukcje mogą być push 1+ pop rax, czyli o 1 bajt krócej. Następnie można zastąpić dwie następne instrukcje mov edi, eax, która jest o 2 bajty krótsza. Ten sam push/ poplewę można zastosować do instrukcji 6 i 7: push 0x15+ pop rdx.
Cody Gray


3

Pyth , 38/2 = 19 bajtów! 36/2 = 18 bajtów!

"Hello World!"v"Goodbye Cruel World!

Przetestuj online!

Objaśnienia

Drukuje Hello World!, a następnie spróbuj ocenićGoodbye Cruel World! . Nie udaje się tego zrobić, ponieważ ten ciąg nie jest prawidłowym kodem.

Wynik to:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.