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.