Hoşçakal zalim dünya!


49

Arka fon

Merhaba golfçüler! Tüm programlama dillerini öğrenmek istiyorum! Ama kısa bir dikkat süresine sahibim ... ve tüm Merhaba Dünya örneklerini kopyalamak sıkıcı oluyor ... ama ateşi seviyorum! ^ W ^

Meydan okuma

Demek plan burada! Hepinizin derlenecek, yazdırılacak Goodbye Cruel World!ve çökecek en küçük kodu yazmanızı istiyorum . Veya, bir bonus twist meydan okuma olarak, baskı Hello World!ve çarpışmaGoodbye Cruel World!

kurallar

  • Puanınız kullanılan toplam karakter sayısı olacaktır. Cevap, çalıştırılabilir bir program olmalıdır.
  • Programınızın Goodbye Cruel World!çıktıya yazdırması ve ardından kilitlenmesi (beklenmeyen hata) gerekir.
    • Bir puan bonusu için, Hello World!çıktı almak için yazdırmanız gerekir , ancak hata mesajı da içermelidir Goodbye Cruel World!. Bonus yarışmasını tamamlarsanız, puanınızı 2'ye bölebilirsiniz. (Bonus talep ediyorsanız puanınızın sonuna a! Dahil edin!)
  • Standart çıktı hala yazdırıldığı ve standart hata hala yazdırıldığı sürece, sipariş önemli değildir. Hiçbiri diğerinin olmasını engelleyemediği sürece.
  • Çıktı, yukarıdakilerin içeriğini içermelidir; "çıktıda görünmemelidir.
  • Çıktı belirtilen dizgeyi içermeli ve başka bir şey içermemelidir.
  • Kilitlenme raporu herhangi bir şey içerebilir, ancak bonusu talep etmek için, aşağıdaki regex'in eşleşmesi gerekir /Goodbye Cruel World!/mi(aka, içeren, yoksay / metni çevreleyen)
  • Dizeler Hello World!ve Goodbye Cruel World!büyük / küçük harf duyarsız, ancak aksi takdirde tam olarak yukarıdaki gibi görünmelidir.
  • Dil çökebilirse (çıkış kodunu değiştiremez), kilitlenmesi gerekir. Aksi halde STDERR, dil için standart "hata raporunu" (yani ) kullanın.

Python 3'ü çökertebilirim, bu yüzden bir örnek Python 3 cevabı ekledim! Şimdi tüm dünyayı ateşe verelim! ^ W ^


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Dennis,

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

Diyelim ki STDOUT ve STDERR'nin tabii ki farklı başlıklar halinde basıldığı Java gibi bir dilde çalışıyorum. Bu, program sırayla "Merhaba dünya" yazıp çöktüğü halde, yığın izlemesinin önce basılabileceği anlamına gelir ... Buna izin var mı?
Socratic Phoenix,

@SocraticPhoenix STDOUT hala yazdırdığı ve STDERR hala yazdırdığı sürece, sipariş önemli değil. Hiçbiri diğerinin olmasını engelleyemediği sürece.
Tezra

1
Bu çok eğlenceli, çözüm üretmekten vazgeçemiyorum!
Adám

Yanıtlar:


36

Jöle , 12 bayt

“¿µƝɓṭỵae»Ȯ:

Çevrimiçi deneyin!

Açıklama:

“¿µƝɓṭỵae»Ȯ:

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

Tamsayı bölümü bir dyad olduğundan, zincirin şu anki değerini her iki argüman olarak (yani bir dize) örtük olarak alır. Tamsayılar beklediği için çöküyor.


7
PPCG'ye Hoşgeldiniz!
Dennis

Teşekkür ederim! Bir süredir gizleniyordum ama bu ilk kez gerçekten dürüstçe çözebileceğimi düşündüğüm bir meydan okuma buldum!
dağılım

28
Etkileyici bir cevap, hemen hemen tüm Jelly cevapları etkileyici olsa da, hem uzunluğu hem de Jelly'i öğrenmeyi başardınız.
Gryphon - Monica

4
A base-250 encoded stringHer ikisi de bunu yapabileceğin bir korkutucu. X3
Tezra

3
Bu, "Hoşçakal zalim dünya!" Dizisinden çok daha kısa. (20 bayt). Crazy ...
Adam Plocher

35

C, 43 bayt

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

Dizeyi yazdırır ve dönüş değerini yazdırılacak başka bir dizeye işaretçi olarak kullanmaya çalışır, bu da segmentasyon hatasına neden olur.

Çevrimiçi deneyin!

C, 42 bayt

@Ruslan'a teşekkürler!

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

Çevrimiçi deneyin!

Sadece eğlence için: C (64 bit Linux'ta), 149 bayt

Dan Modifiye bu Hello World burada -Program .

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

Çevrimiçi deneyin!


Bu yaklaşımı seviyorum, ama talimatlar diyor kiThe answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}bir bayt çıkarır.
Ruslan

1
İhtiyacın yok i. puts("")/0;sözdizimsel olarak doğru bir ifadedir.
rici

1
@rici Evet öyle, fakat çökmedi (en azından TIO'da).
Steadybox

1
@Steadybox: Bu sizin için bir optimizasyon.
rici

11

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

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

Açıklama:

...‘           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) SOGL'un STDERR'yi hata ayıklama çıktısı olarak kullandığı gerçeğini kullanıyor, bu yüzden içinde çok fazla metin var

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

Processing skeçinin STDOUT'unu bir dosyaya aktardıysanız, "Goodbye Cruel World!" orada olurdu.


Zorluk, " Dizeler Hello World!ve Goodbye Cruel World!büyük / küçük harfe duyarsız, ancak aksi takdirde tam olarak yukarıdaki gibi görünmelidir " diye bahsettiğinden , işlevinizden tamamen kurtularak kodunuzu yazıp tüm küçük harflerle çıktırabilirsiniz.
Kevin Cruijssen

@KevinCruijssen oh ha, teşekkürler!
dzaima

10

> <> , 25 bayt

"!dlroW leurC eybdooG">o<

Temel olarak dizeyi yığına ekler (Geriye doğru, ilk giren ilk çıkar) ve sonra eşdeğerini yapar:

while(1):
  pop the stack
  print the character

Yığında karakter kalmadıysa (dizenin tamamı basıldı) yığını açarken hata veriyor


+1. #o<"Goodbye Cruel World!"Temelde aynı olan geldi .
hakr14

9

sed, 32 bayt

iGoodbye Cruel World!
w/dev/full

ibir satır ekler ve wbir dosyaya yazar. /dev/fullBu durumda tüm yazarlar ona geri döner ENOSPC("Cihazda yer kalmaz").

Yine de çalışması için hala tek bir girdi satırı gerekiyor.

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

3
Böyle bir cihaz olduğunu bile bilmiyordum!
Ruslan

9

Lua, 31 , 30 bayt

a=-print'Goodbye Cruel World!'

ilk 'Hoşçakal Zalim Dünya!' ve bir sıfır değeri ve 0 eklemeye çalışırken kilitleniyor.

Çıktı:

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

GalladeGuy'a 1 bayt daha az kredi verin


2
'Hoşçakal Zalim Dünya!' ve sonra sadece kabul edilmek için çökmesi gerekeceğini düşündüğüm halde çöküyor.
eniallator

@Trebuchette “Programınız çıktı almak ve sonra çökmek için Goodbye Cruel World!
Pharap

@Pharap Oh, anlıyorum. STDERR sadece bonusa gidiyorsanız önemlidir. Teşekkürler!
Trebuchette

@Trebuchette Noope. "Veya, bir bonus twist mücadelesi olarak, Hello World'ü yazdırın! Ve Goodbye Cruel World ile çarpışın!" Yazıyor. 'çarpışma', zorunlu olarak stderr anlamına gelmez, 'çarpışma' aynı zamanda (başka şeylerin yanı sıra) atılan bir istisna anlamına da gelebilir. OP daha fazla tanımlamazsa, yoruma açıktır. Ayrıca bazı Lua uygulamalarında stderr kavramı yoktur (örneğin, oyunlar için bir komut dosyası dili olarak gömülü Lua) ve bunun yerine bir mesaj kutusuna veya bir günlük dosyasına vb.
Yazdırır

1
Bunun yerine bir bayt kurtarabilirsiniz:a=-print"Goodbye Cruel World!"
GalladeGuy

8

Python 3 | Puan: 24.5! 23 22!

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

"Hoşçakal Zalim Dünya!" Üzerinde geçersiz '+' operatörünü kullanmak yerine, "Merhaba Dünya" yazdırabilirsiniz. NoneType return öğesine. (önceki sürümden kesildi \ n)

Çevrimiçi deneyin!

Python 3 | Puan: 34 30

+print("Goodbye Cruel World!")

Hoşçakal, yazdırma sonucunda geçersiz bir unary + işlemi yapmak yerine yazdırma (NoneType)

Çevrimiçi deneyin!


+"Goodbye Cruel World!"3 bayt daha kısa ve bir TypeError çıkar.
Gábor Fekete

print("Goodbye Cruel World!")/0ikincisi için daha kısa (3 bayt?)
matsjoyce

@ matsjoyce Bu baskıdan önce çökecek korkuyordum. Ama ilk
basıldığından

24
2.585e + 22 oldukça büyük bir skor ... daha fazla golf oynayamayacağınızdan emin misiniz?
tuskiomi

1
@tuskiomi The '!' final puanının bonus mücadelesi tarafından değiştirildiği anlamına gelir.
Tezra



6

CJam , 34 bayt, 17 puan!

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

Çevrimiçi deneyin! (Bkz. STDERR için Hata Ayıklama paneli)

açıklama

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

TIO'da bu hata mesajını oluşturur:

"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 Önişlemcisi, 27 bayt

#error Goodbye Cruel World!

Çıktı:

fatal error C1189: #error:  Goodbye Cruel World!

1
Daha fazla kısaltmak mümkün olabilir#Goodbye Cruel World!
kayısı çocuğu

@apricotboy Bu hala bir hataya yol açar, ancak tam bir hata mesajı "güle güle acımasız dünya" derleyici tarafından verilmez (en azından MSVC'de)
Govind Parmar

@Gorvind Parmar ah. Eh, kesinlikle gcc üzerinde yapar: i.imgur.com/qmGnoJv.png
kayısı çocuğu

6

APL (Dyalog) , 17.5 bayt

Bonus olmadan, 20 bayt

Goodbye Cruel World!

Çevrimiçi deneyin!

Kodun işaretlenmediğine dikkat edin, bu nedenle APL onu çalıştırmaya çalışır, ancak Worldtanımlanmaz, hata iletisinde yer alan kod satırındaki bir DEĞER HATASI çökmesine neden olur.

Bonus ile, 35 ÷ 2 = 17,5 bayt

'Hello World!'
Goodbye Cruel World!

Çevrimiçi deneyin!

Önce istenen dizeyi yazdırır, ardından yukarıdaki programdaki gibi kilitlenir.

Daha sofistike bonus versiyonu, 35 ± 2 = 17,5 bayt

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

Çevrimiçi deneyin!

İlk dizgiyi yazdırır, sonra ilk beş karakteri bundan ( 5↓) ayırır, sonra bunu ( ,) yeni bir önekle birleştirir ve daha sonra yukarıdakiyle aynı hataya neden olan bunu ( ) çalıştırmaya çalışır .


1
@Cyoce Typo. Thanks
Adám

5

Bash 20.5! 18.5!

Jöle basmayacağım, ama hızlı bir bash betiği bash yaparken bashımdan biraz utanıyorum. 18.5 golf oynamayan bir dil için çok da kötü değil. (Bunun bir komut dosyası olması gerektiğini unutmayın, etkileşimli bash, !tarih araması olarak yorumlanmaya çalışacaktır )

echo Hello World!
Goodbye\ Cruel\ $_

Hata kodu 127 ile döner ve:

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

İstediği gibi hayır "... hiçbir yerde :). apricot boyŞimdi önerdiğim gibi , 4 bayttan tasarruf etmek için önceki komutun son argümanına bakıyorum.


Seni yenmeye çalıştım… 21 ile başarısız oldum! bayt. :) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus

1
Muhtemelen ikinci satırı değiştirebilirsin Goodbye\ Cruel\ !$,% 100 değil, ama !$"son komutun son sözü" olduğundan eminim
kayısı çocuğu

Peki ya "Goodbye Cruel World!" Adında bir çalıştırılabilir. PATH'ta var mı? :)
spuck

TIO.run'da Doğrulanmış Tamam ... benim zsh cevabımı atıyor: /
roblogic

4

TeX, 19!

Hello World!#\bye Goodbye Cruel World!

TeX'i, manuel müdahale olmadan bir dvi / pdf dosyası oluşturmaya zorlamak için derleyin -interaction=nonstopmode.

Basmanız Hello World!, #gerekmediğinde kullanmak için bir hata atar ve ardından derlemeyi durdurur \bye. Bununla birlikte, neyin peşindeyse \bye, hata mesajında ​​hala çıktı olduğundan, bonus için de geçerlidir.


4

WinDBG (Windows XP / Vista Yerel Çekirdek Hata Ayıklama), 33 bayt

.echo Goodbye Cruel World!;.crash

Uyarı: Bu sadece programı değil tüm makineyi çökertir.

Yerel çekirdek hata ayıklamasına yalnızca Windows XP ve Vista'da izin verilir (ancak Vista'da varsayılan olarak etkin değildir). Yerel çekirdek hata ayıklaması üzerindeki WinDBG iletişim kutusu, başka bir Windows işletim sisteminden söz etmiyor, bu yüzden bunun için bile etkin olamayacağını varsayıyorum. Muhtemelen diğer Windows işletim sistemlerinde çekirdek hata ayıklaması için uzaktaki bir makineye takabilirsiniz, ancak çökecek uzaktaki makine olduğundan, bu çözümün burada sayıldığını sanmıyorum.


Yerel çekirdek hata ayıklaması da Windows 7'de desteklenmektedir ve o zamandan beri kaldırıldığını duymadım (ancak bunu kaçırmış olabilirim).
Cody Gray,

4

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

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

Uyarılar Hello, World!, ardından hatalarUncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell, 26 Bayt

'Goodbye Cruel World!';1/0

Sanırım 0'a bölünmek, hata atmanın en kolay yoludur.

PowerShell, 35/2 = 17,5 Bayt

"Hello World!";Goodbye Cruel World!

TessellatingHeckler tarafından , böyle bir hatayı atar:

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!

Olmamalı mı $w='World!'(ile !)?
gmatht

"Hello World!";Goodbye Cruel World!17.5 bayt, bir istisna atar çünkü Goodbye bir komut olarak kabul edilmez ve istisna mesajı satırı tam olarak içerir, böylece regex ile eşleşir ..
TessellatingHeckler

1
17.5b'nin cevabıyla aynı mantığı kullanmak, 'Goodbye Cruel World!';x24 için iki bayt kazandıracak
Veskah



4

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

ETHproductions sayesinde 1 puan kazandırdı

console.log()İşlev döndürmediğinden çalışma zamanında çöken sözdizimsel olarak doğru tam bir program .

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

Çevrimiçi deneyin!


Ne yazık ki, bunun için hiçbir faktör yok 25.5:: ((
Bay Xcoder

@ Mr.Xcoder Gamma(26.5)Mathematica tanımında olduğu gibi.
user202729

1
@ user202729, Mathematica'nın kırılmadığını söyledi? :)))
Bay Xcoder

X(Ve belki hatta yeni satırı) kaldırabilir misiniz ?
ETHproductions

@ETHproductions Evet gerçekten. Teşekkürler!
Arnauld,

3

Aseto , skor: 21,5!

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

Yazdırır Hello World!, ardından

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 bayt

"GOODBYE CRUEL WORLD!"hY

Bir dize yazdırır, ardından boş listenin ilk öğesini almaya çalışır.

Bunu dene!


3

AHK, 50/2 = 25! (Rekabetsiz)

Rekabet etmeme, çünkü ek bir gereklilik cevabı geçersiz kılmıştır. Derleme yapmanın, metni çıkarmanın ve kilitlenmenin bir yolunu bulamıyorum. Ne denersem deneyeyim bu şartlardan en az biri başarısız oluyor.


Send,Hello World!
OutputDebug,Goodbye Cruel World!

Bu, aklıma gelen en sıkıcı çözüm. Aslında çökmez ama teknik olarak bu bir gereklilik değildir. Tek yapması gereken, hata ayıklama penceresine bir mesaj göndermek. Bunu yapıyor çünkü ben öyle yapmasını söylüyorum.


Bu şu anda geçersiz. OP, eğer dil uygunsa, AHK olan programın çökmesi gerektiğini belirtir.
internet_user

@ pycoder Ah, bu yayınlandıktan 40 dakika sonra eklendi. Yeni kural için güncelleme yapacağım ancak bu baytlara mal olacak.
Mühendis Tost

3

Japt , 22 bayt

°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

Çevrimiçi deneyin!

Obarakon ve ETHproductions sayesinde 3 bayt kurtardı


Kullanarak Oc"<string>"dizeyi sıkıştırılmış sürümle değiştirip sonra da backtick'lerle çevrili olarak dizeyi sıkıştırabilirsiniz.
Luke,

Bir açıklama güzel olurdu.
iFreilicht

1
@ iFreilicht açıklaması eklendi.
Tom,

3

C #, 116/2 = 58 bayt!

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

94 87 bayt için normal sürüm :

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

@KevinCruijssen sayesinde 7 bayt kaydedildi.


int n=0;n/=n;ilk cevabınız için daha kısa.
Kevin Cruijssen

@KevinCruijssen Güzel nokta, sürekli sıfır hatayla bölmeden derlemek için almakta zorlanıyordum.
TheLethalCoder

Evet, Java'da yapabilirsiniz int n=1/0;, ancak görünüşe göre bu C # 'da mümkün değil (ki bu aslında dil için iyi bir şey ama kodlama için kötü). BTW, bonus neden üstte değil? Bu daha kısa.
Kevin Cruijssen

@KevinCruijssen Cevabımı gönderdiğimde biraz net olmadığı için nitelikli olup olmadığından emin değildim, daha açık bir şekilde göründüğünü görünce onları değiştirdim.
TheLethalCoder

3

Jöle , 10.5! bayt

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

Çevrimiçi deneyin!

Bu, Jelly dizeleri (1 karakter dizelerinin listesi) yerine Python dizeleri (dizeleri) kullanarak tanımsız davranışlardan yararlanır. Dönüştürme, Jelly dizisinin ilave edilerek indirgenmesiyle gerçekleştirilir ve Python's +iki dizgiyi birleştirir, bu nedenle birlikte eklenen iki dizgiler Python-wise olarak birleştirilir. Ardından, uygun monad'ı (aralık) kullanır, böylece Python'un intdizgide çağrılması sonucu her zaman içerebilecek bir hata oluşur Goodbye Cruel World!.

Açıklama:

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

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

Değiştirerek, Alexis Andersen yardımıyla yarım bayt Kaydedilen "String"/0ile -"String". Bu sadece, unary eksi yönteminin gerçekten String sınıfına eklendiği 2.3'ten daha düşük Ruby sürümleriyle "çalışır" !

Ruby <2.3 ile:

$ ruby -e 'puts"Hello World!";-"Goodbye cruel World!"'
Hello World!
-e:1:in `<main>': undefined method `-@' for "Goodbye cruel World!":String (NoMethodError)

Ruby ile> = 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)

bir -dize yerine ( /yani ) bir dize kaydedebilirsiniz-"Goodbye crueld World!"
Alexis Andersen

@AlexisAndersen teşekkürler! Bugün String sınıfında yeni bir yöntem de öğrendim (güncellenmiş
gönderiye

3

x86-64 İkili Kod (Linux sistem çağrılarıyla birlikte), 43 bayt

demontaj:

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

Bu program ihtiyacı olan verileri (string "Goodbye Cruel World!\n") kendi koduna toplar. ripGöreceli adreslemeyi kullanarak bu dizgiye bir işaretçi yükler ve writebir glibc sargıcısı yerine doğrudan sistem çağrısı yapar, böylece tamamen konum bağımsızdır ve kodu bir constdizgeye gömerek ve dizgiyi bir işleve dökerek kolayca test edebiliriz Işaretçi. Programı çökertmek için, hlt0 halkasıyla işlemciyi sonsuza dek susturacak (ya da en azından bir sonraki kesmeye kadar) işlemciyi sona erdirecek bir talimatla bitirdim, ancak 3 halkası ayrıcalığıyla (kullanıcı programları için tipik) çok daha azını elde ettik dramatik Segmentation Fault.

Test programı:

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

Çıktı:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

43 bayt kodu unutmayın olan meydan, sadece bir fonksiyon tarafından belirtildiği gibi tam bir programdır. mainTest programının fonksiyonunun doğru çalışmasına bağlı değildir ; doğrudan yükleyiciden yüklenir ve atlanırsa dizeyi basar ve kilitlenir.


Kayıtları yüklemek için push/ tuşunu kullanarak birkaç bayttan tasarruf edin pop. Örneğin, ilk iki komut 1 bayt daha kısa olan push 1+ olabilir pop rax. Ardından, sonraki iki komut mov edi, eax2 bayt daha kısa olan ile değiştirilebilir . Aynı push/ pophile talimatları 6 ve 7 uygulanabilir: push 0x15+ pop rdx.
Cody Gray,


3

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

"Hello World!"v"Goodbye Cruel World!

Çevrimiçi test edin!

açıklamalar

Yazdırır Hello World!, sonra değerlendirmeyi deneyin Goodbye Cruel World!. Yapmaz, çünkü bu dize geçerli bir kod değildir.

Sonuç:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.