Selamat tinggal Dunia Kejam!


49

Latar Belakang

Halo pegolf! Saya ingin mempelajari semua bahasa pemrograman! Tapi saya agak memiliki rentang perhatian yang pendek ... dan menyalin semua contoh Hello World menjadi membosankan ... tapi saya suka api! ^ w ^

Tantangan

Jadi inilah rencananya! Saya ingin Anda semua menulis kode terkecil yang akan dikompilasi, dicetak Goodbye Cruel World!, dan kemudian crash. Atau, sebagai tantangan twist bonus, cetak Hello World!dan crash denganGoodbye Cruel World!

Aturan

  • Skor Anda akan menjadi jumlah total karakter yang digunakan. Jawabannya harus seluruh program yang dapat dieksekusi.
  • Program Anda harus mencetak Goodbye Cruel World!ke keluaran, dan kemudian macet (kesalahan tak terduga).
    • Untuk bonus skor, Anda harus mencetak Hello World!ke keluaran sebagai gantinya, tetapi pesan kesalahan juga harus mengandung Goodbye Cruel World!. Jika Anda menyelesaikan tantangan bonus, Anda dapat membagi skor Anda dengan 2. (Sertakan a! Di akhir skor Anda jika Anda mengklaim bonus!)
  • Selama output standar masih dicetak, dan kesalahan standar masih dicetak, urutannya tidak masalah. Selama tidak ada yang bisa menghalangi yang lain terjadi.
  • Output harus mengandung konten di atas; "seharusnya tidak muncul di output.
  • Outputnya harus berisi string yang ditentukan, dan tidak ada yang lain.
  • Laporan kerusakan dapat berisi apa saja, tetapi untuk mengklaim bonus, regex berikut harus cocok /Goodbye Cruel World!/mi(alias, berisi, abaikan case / teks sekitarnya))
  • String Hello World!dan Goodbye Cruel World!case-sensitive, tetapi sebaliknya harus muncul persis seperti di atas.
  • Jika bahasa tersebut mampu mogok (tidak dapat mengubah kode keluarnya), bahasa harus mogok. Kalau tidak gunakan standar "laporan kesalahan" (yaitu, STDERR) untuk bahasa.

Saya dapat crash Python 3, jadi saya telah menyertakan contoh jawaban Python 3! Sekarang mari kita semua membakar dunia! ^ W ^


Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

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

Misalkan saya bekerja dalam bahasa seperti Java, di mana STDOUT dan STDERR, tentu saja, dicetak dalam utas yang berbeda. Ini berarti bahwa, meskipun program, secara berurutan, mencetak "Hello world" dan kemudian crash, ada kemungkinan bahwa jejak stack akan dicetak terlebih dahulu ... Apakah itu diizinkan?
Socratic Phoenix

@ SocratesPhoenix Selama STDOUT masih mencetak, dan STDERR masih mencetak, urutannya tidak masalah. Selama tidak ada yang bisa menghalangi yang lain terjadi.
Tezra

1
Ini sangat menyenangkan, saya tidak bisa berhenti membuat solusi!
Adám

Jawaban:


36

Jelly , 12 byte

“¿µƝɓṭỵae»Ȯ:

Cobalah online!

Penjelasan:

“¿µƝɓṭỵae»Ȯ:

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

Karena divisi integer adalah angka dua, maka secara implisit akan mengambil nilai rantai saat ini sebagai kedua argumen - yang merupakan string. Gangguan karena mengharapkan bilangan bulat.


7
Selamat datang di PPCG!
Dennis

Terima kasih! Saya sudah mengintai untuk sementara waktu sekarang tetapi ini adalah pertama kalinya saya menemukan tantangan yang saya rasa bisa saya selesaikan dengan baik!
berhamburan

28
Jawaban yang mengesankan, meskipun hampir semua jawaban Jelly mengesankan, baik karena panjang dan fakta bahwa Anda berhasil mempelajari Jelly.
Gryphon - Pasang kembali Monica

4
A base-250 encoded stringItu sama-sama keren yang menakutkan yang bisa Anda lakukan itu. X3
Tezra

3
Ini jauh lebih singkat daripada string "Selamat tinggal di dunia yang kejam!" (20 byte). Gila ...
Adam Plocher

35

C, 43 byte

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

Mencetak string dan kemudian mencoba menggunakan nilai kembali sebagai penunjuk ke string lain untuk dicetak, yang menyebabkan kesalahan segmentasi.

Cobalah online!

C, 42 byte

Terima kasih kepada @Ruslan!

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

Cobalah online!

Hanya untuk bersenang-senang: C (di Linux 64-bit), 149 byte

Dimodifikasi dari program Hello World ini di sini .

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

Cobalah online!


Saya suka pendekatan ini, tetapi petunjuknya mengatakan,The answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}melepas satu byte.
Ruslan

1
Anda tidak perlu i. puts("")/0;adalah pernyataan yang benar secara sintaksis.
rici

1
@rici Ya, tapi tidak macet (setidaknya di TIO).
Steadybox

1
@Steadybox: itulah optimasi untuk Anda.
rici

11

SOGL , 15 25 17 byte / 2 = 8.5!

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

Penjelasan:

...‘           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) menggunakan fakta bahwa SOGL menggunakan STDERR sebagai output debug, jadi di dalamnya ada banyak teks, bersama dengan baris

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

Jika Anda mengirim STDOUT sketsa Pemrosesan ke file, "Selamat Tinggal Dunia yang Kejam!" akan ada di sana.


Karena tantangannya menyebutkan " String Hello World!dan Goodbye Cruel World!case-sensitive, tetapi sebaliknya akan muncul persis seperti di atas. ", Anda dapat golf kode Anda dengan menyingkirkan fungsi sepenuhnya dan hanya output di semua huruf kecil.
Kevin Cruijssen

@KevinCruijssen oh ya, terima kasih!
dzaima

10

> <> , 25 byte

"!dlroW leurC eybdooG">o<

Pada dasarnya ia menambahkan string ke stack (Mundur, terakhir masuk pertama keluar) dan kemudian melakukan yang setara dengan:

while(1):
  pop the stack
  print the character

Ketika tidak ada karakter yang tersisa di tumpukan (Seluruh string telah dicetak) muncul tumpukan memberikan kesalahan


+1. Datang ke #o<"Goodbye Cruel World!", yang pada dasarnya sama.
hakr14

9

sed, 32 byte

iGoodbye Cruel World!
w/dev/full

imenyisipkan baris, dan wmenulis ke file. /dev/fulldalam hal ini karena semua menulis kembali ENOSPC("Tidak ada ruang yang tersisa di perangkat").

Masih membutuhkan satu baris input untuk bekerja.

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

3
Bahkan tidak tahu ada perangkat seperti itu!
Ruslan

9

Lua, 31 , 30 byte

a=-print'Goodbye Cruel World!'

pertama kali mencetak 'Selamat Tinggal Dunia yang Kejam!' dan kemudian macet ketika mencoba menambahkan nilai nol dan 0.

Keluaran:

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

Kredit ke GalladeGuy kurang dari 1 byte


2
itu mencetak 'Selamat Tinggal Dunia Kejam!' dan kemudian crash meskipun yang saya pikir hanya harus crash untuk diterima.
eniallator

@ Trebuchette Syaratnya adalah "Program Anda harus mencetak Goodbye Cruel World! Ke output, dan kemudian crash", OP tidak menentukan apakah "output" berarti stderr, stdout, kotak pesan, atau yang di atas.
Pharap

@Pharap, Oh, begitu. STDERR hanya penting jika Anda menginginkan bonus. Terima kasih!
Trebuchette

@ Trebuchette Tidak. Dikatakan "Atau, sebagai tantangan twist bonus, cetak Hello World! Dan tabrak dengan Goodbye Cruel World!". 'crash' tidak berarti stderr, 'crash' juga dapat berarti (di antara hal-hal lain) pengecualian yang dilemparkan. Kecuali OP mendefinisikannya lebih jauh, itu terbuka untuk interpretasi. Juga beberapa aplikasi Lua tidak memiliki konsep stderr (misalnya Lua tertanam sebagai bahasa scripting untuk game) dan sebagai gantinya akan mencetak ke kotak pesan atau file log dll.
Pharap

1
Anda dapat menyimpan byte dengan melakukan ini sebagai gantinya:a=-print"Goodbye Cruel World!"
GalladeGuy

8

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

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

Cetak "Hello World", daripada gunakan operator '+' yang salah pada "Goodbye Cruel World!" ke elemen pengembalian NoneType. (hilangkan \ n \ r dari versi sebelumnya)

Cobalah online!

Python 3 | Nilai: 34 30

+print("Goodbye Cruel World!")

Cetak Selamat Tinggal, daripada melakukan operasi unary + yang tidak valid pada hasil cetak (NoneType)

Cobalah online!


+"Goodbye Cruel World!"lebih pendek 3 byte dan menghasilkan TypeError.
Gábor Fekete

print("Goodbye Cruel World!")/0lebih pendek untuk yang kedua (3 byte?)
matsjoyce

@matsjoyce Saya takut akan macet sebelum dicetak. Tetapi karena itu mencetak lebih dulu, saya hanya akan melakukan unary pada cetakan 'hasil': 3
Tezra

24
2.585e + 22 adalah skor yang cukup besar ... Anda yakin tidak bisa menurunkannya lagi?
tuskiomi

1
@tuskiomi The '!' berarti skor akhir dimodifikasi oleh tantangan bonus.
Tezra



6

CJam , 34 byte, skor 17!

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

Cobalah online! (Lihat panel Debug untuk STDERR)

Penjelasan

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

Pada TIO, ia menghasilkan pesan kesalahan ini:

"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 Preprocessor, 27 byte

#error Goodbye Cruel World!

Keluaran:

fatal error C1189: #error:  Goodbye Cruel World!

1
Anda mungkin dapat mempersingkat lebih jauh hanya dengan#Goodbye Cruel World!
apricot boy

@apricotboy Itu masih akan menghasilkan kesalahan tetapi pesan kesalahan penuh "selamat tinggal dunia yang kejam" tidak dihasilkan oleh kompiler (setidaknya pada MSVC)
Govind Parmar

@Gorvind Parmar ah. Yah itu pasti terjadi pada gcc: i.imgur.com/qmGnoJv.png
apricot boy

6

APL (Dyalog) , 17,5 byte

Tanpa bonus, 20 byte

Goodbye Cruel World!

Cobalah online!

Perhatikan bahwa kode tidak dikutip, jadi APL mencoba menjalankannya tetapi Worldtidak didefinisikan, menyebabkan crash VALUE ERROR dengan garis kode yang menyinggung yang termasuk dalam pesan kesalahan.

Dengan bonus, 35 ÷ 2 = 17,5 byte

'Hello World!'
Goodbye Cruel World!

Cobalah online!

Pertama-tama mencetak string yang diperlukan, lalu macet seperti program di atas.

Versi bonus lebih canggih, 35 ÷ 2 = 17,5 byte

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

Cobalah online!

Mencetak string pertama, lalu menjatuhkan lima karakter pertama dari itu ( 5↓), lalu menyatukan itu ( ,) ke awalan baru, dan kemudian mencoba mengeksekusi ( ) itu, menyebabkan kesalahan yang sama seperti di atas.


1
@Cyoce Typo. Terima kasih
Adám

5

Bash 20,5! 18,5!

Saya tidak akan bash jelly, tapi saya sedikit malu bash saya di bashing skrip bash cepat. 18.5 tidak terlalu buruk untuk bahasa non-golf. (Catatan ini harus berupa skrip, bash interaktif akan mencoba menafsirkannya !sebagai pencarian riwayat)

echo Hello World!
Goodbye\ Cruel\ $_

Kembali dengan kode kesalahan 127 dan:

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

Seperti yang diminta no "... di mana saja :). Seperti yang disarankan oleh apricot boysaya sekarang mencari argumen terakhir dari perintah sebelumnya untuk menyimpan 4 byte.


Saya mencoba untuk mengalahkan Anda ... dan gagal dengan 21! byte. :) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus

1
Anda mungkin dapat mengubah baris kedua menjadi Goodbye\ Cruel\ !$, bukan 100% tetapi cukup yakin itu !$adalah "kata terakhir dari perintah terakhir"
apricot boy

Tapi bagaimana jika seorang executable bernama "Selamat Tinggal Dunia Kejam!" ada di PATH? :)
spuck

Diverifikasi OK pada TIO.run ... beats my zsh answer: /
roblogic

4

TeX, 19!

Hello World!#\bye Goodbye Cruel World!

Untuk memaksa TeX untuk benar-benar menghasilkan file dvi / pdf tanpa intervensi manual, kompilasi dengan -interaction=nonstopmode.

Itu mencetak Hello World!, melempar kesalahan untuk digunakan #ketika Anda tidak seharusnya dan kemudian berhenti kompilasi dengan \bye. Namun, apa pun yang terjadi setelah \byeitu masih output dalam pesan kesalahan, jadi itu berlaku untuk bonus.


4

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

.echo Goodbye Cruel World!;.crash

Peringatan: Ini akan merusak seluruh mesin, bukan hanya program.

Debugging kernel lokal hanya diperbolehkan pada Windows XP dan Vista (tetapi tidak diaktifkan secara default di Vista). Dialog WinDBG pada debugging kernel lokal tidak menyebutkan OS Windows lain jadi saya menganggap itu bahkan tidak dapat diaktifkan untuk itu. Mungkin untuk OS Windows lainnya Anda dapat melampirkan ke mesin jarak jauh untuk debugging kernel, tapi itu mesin jarak jauh yang akan macet jadi saya tidak berpikir solusi ini penting di sana.


Debugging kernel lokal juga didukung pada Windows 7, dan saya belum pernah mendengar bahwa itu telah dihapus sejak itu (tapi saya mungkin melewatkannya).
Cody Grey

4

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

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

Lansiran Hello, World!, lalu galat denganUncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell, 26 Bytes

'Goodbye Cruel World!';1/0

Saya pikir membagi dengan 0 adalah cara termudah untuk melempar kesalahan.

PowerShell, 35/2 = 17,5 Bytes

"Hello World!";Goodbye Cruel World!

oleh TessellatingHeckler , melempar kesalahan seperti:

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!

Bukankah seharusnya $w='World!'(dengan sebuah !)?
gmatht

"Hello World!";Goodbye Cruel World!adalah 17,5 byte, melempar pengecualian karena Goodbye tidak dikenali sebagai perintah, dan pesan pengecualian menyertakan garis secara penuh sehingga cocok dengan regex ..
TessellatingHeckler

1
Menggunakan logika yang sama dengan jawaban 17.5b, 'Goodbye Cruel World!';xakan menghemat dua byte untuk 24
Veskah



4

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

Disimpan 1 poin berkat produk ETH

Program penuh yang benar secara sintaksis yang macet saat runtime karena console.log()tidak mengembalikan fungsi.

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

Cobalah online!


Sayangnya, tidak ada faktorial untuk 25.5...: ((
Tn. Xcoder

@ Mr.Xcoder Ini Gamma(26.5), seperti dengan definisi Mathematica.
user202729

1
@ user202729 yang mengatakan bahwa Mathematica tidak rusak? :)))
Tn. Xcoder

Bisakah Anda menghapus X(dan mungkin bahkan baris baru)?
ETHproduk

@ EHProduk Ya memang. Terima kasih!
Arnauld

3

Aceto , skor: 21,5!

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

Cetakan Hello World!, lalu macet dengan

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 byte

"GOODBYE CRUEL WORLD!"hY

Mencetak string, lalu mencoba untuk mendapatkan elemen pertama dari daftar kosong.

Coba ini!


3

AHK, 50/2 = 25! (tidak bersaing)

Tidak bersaing karena persyaratan tambahan membuat jawaban tidak valid. Saya tidak dapat menemukan cara untuk membuatnya mengkompilasi, mengeluarkan teks, dan crash. Apa pun yang saya coba gagal setidaknya satu dari persyaratan itu.


Send,Hello World!
OutputDebug,Goodbye Cruel World!

Ini adalah solusi paling membosankan yang bisa saya pikirkan. Sebenarnya tidak crash tapi itu bukan persyaratan teknis. Yang harus dilakukan hanyalah menampilkan pesan ke jendela debug. Itu karena saya katakan untuk melakukannya.


Ini saat ini tidak valid. OP menyatakan bahwa program tersebut harus macet jika bahasanya mampu jika itu, yang AHK adalah.
internet_user

@pycoder Ah, itu ditambahkan 40 menit setelah saya diposting. Saya akan memperbarui untuk aturan baru tetapi akan dikenakan biaya byte.
Engineer Toast

3

Japt , 22 byte

°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

Cobalah online!

Disimpan 3 byte berkat obarakon dan produk ETH


Anda dapat mengompres string menggunakan Oc"<string>"dan kemudian mengganti string saat ini dengan versi terkompresi dan dikelilingi oleh backtick.
Luke

Penjelasan akan menyenangkan.
iFreilicht

1
Penjelasan @iFreilicht ditambahkan.
Tom

3

C #, 116/2 = 58 byte!

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

Versi normal untuk 94 87 byte:

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

Disimpan 7 byte berkat @KevinCruijssen.


int n=0;n/=n;lebih pendek untuk jawaban pertama Anda.
Kevin Cruijssen

@KevinCruijssen Tempat yang bagus, saya mengalami kesulitan untuk mengkompilasi tanpa pembagian dengan kesalahan nol konstan.
TheLethalCoder

Ya, di Jawa Anda hanya bisa melakukannya int n=1/0;, tetapi tampaknya itu tidak mungkin di C # (yang sebenarnya merupakan hal yang baik untuk bahasa, tetapi buruk untuk codegolfing). Btw, mengapa bonus tidak ada di atas? Yang itu lebih pendek.
Kevin Cruijssen

@KevinCruijssen Saya tidak yakin apakah itu memenuhi syarat karena agak tidak jelas ketika saya memposting jawaban saya, karena sudah diklarifikasi lebih lanjut, saya sudah mengubahnya.
TheLethalCoder

3

Jelly , 10,5! byte

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

Cobalah online!

Ini mengeksploitasi perilaku yang tidak terdefinisi, menggunakan string Python (string) alih-alih string Jelly (daftar string 1-char). Konversi dilakukan dengan mengurangi string Jelly dengan tambahan, dan Python +menggabungkan dua string, sehingga dua string yang ditambahkan bersama-sama digabungkan dengan Python-wise. Kemudian, ia menggunakan monad yang sesuai (rentang) sehingga Python intdipanggil pada string, menghasilkan kesalahan yang selalu berisi Goodbye Cruel World!.

Penjelasan:

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

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

Disimpan setengah byte dengan bantuan Alexis Andersen, dengan menggantinya "String"/0dengan -"String". Ini hanya "berfungsi" dengan versi Ruby lebih rendah dari 2.3, di mana metode minus unary sebenarnya ditambahkan ke kelas String!

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

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

Anda dapat menyimpan (setengah) byte dengan menggunakan -string, bukan /ie-"Goodbye crueld World!"
Alexis Andersen

@AlexisAndersen terima kasih! Hari ini saya juga belajar tentang metode baru di kelas String (lihat posting yang diperbarui)
daniero

3

x86-64 Binary Code (dengan panggilan sistem Linux), 43 byte

Membongkar:

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

Program ini menggabungkan data yang dibutuhkannya (string "Goodbye Cruel World!\n") ke dalam kodenya sendiri. Itu memuat pointer ke string yang menggunakan rippengalamatan relatif, dan memanggil writesyscall langsung daripada melalui pembungkus glibc, jadi itu sepenuhnya posisi-independen, dan kita dapat dengan mudah mengujinya dengan menanamkan kode ke dalam conststring dan casting string itu ke suatu fungsi penunjuk. Untuk menghentikan program, saya mengakhirinya dengan hltinstruksi, yang dengan privilege dering 0 akan membungkam prosesor selamanya (atau setidaknya sampai interupsi berikutnya masuk), tetapi dengan privilege ring 3 (khas untuk program pengguna) kami mendapatkan jauh lebih sedikit dramatis Segmentation Fault.

Program Tes:

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

Keluaran:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

Perhatikan bahwa kode 43 byte adalah program lengkap seperti yang ditentukan oleh tantangan, bukan hanya fungsi. Itu tidak tergantung pada mainfungsi program pengujian untuk berfungsi dengan benar; itu masih akan mencetak string dan crash jika dimuat dan langsung oleh loader.


Simpan beberapa byte dengan menggunakan push/ popuntuk memuat register. Sebagai contoh, dua instruksi pertama bisa push 1+ pop rax, yang lebih pendek 1 byte. Kemudian, dua instruksi selanjutnya dapat diganti mov edi, eax, yaitu 2 byte lebih pendek. Sama push/ poptrik dapat diterapkan untuk petunjuk 6 dan 7: push 0x15+ pop rdx.
Cody Grey


3

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

"Hello World!"v"Goodbye Cruel World!

Uji secara online!

Penjelasan

Mencetak Hello World!, lalu mencoba mengevaluasi Goodbye Cruel World!. Gagal melakukannya, karena string itu bukan kode yang valid.

Hasilnya adalah:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.