안녕 잔인한 세상!


49

배경

골퍼 안녕하세요! 모든 프로그래밍 언어를 배우고 싶습니다! 그러나 나는 약간의주의를 기울였습니다 ... 모든 Hello World 예제를 복사하는 것은 지루해집니다 ...하지만 나는 불을 좋아합니다! ^ w ^

도전

여기 계획이 있습니다! 컴파일, 인쇄 Goodbye Cruel World!및 충돌 하는 가장 작은 코드를 모두 작성하시기 바랍니다 . 또는 보너스 트위스트 도전으로 인쇄 Hello World!및 충돌Goodbye Cruel World!

규칙

  • 점수는 사용 된 총 문자 수입니다. 답은 전체 실행 가능한 프로그램이어야합니다.
  • 프로그램이 출력 Goodbye Cruel World!을 위해 인쇄 한 다음 충돌합니다 (예기치 않은 오류).
    • 점수 보너스의 경우, Hello World!대신 출력으로 인쇄해야 하지만 오류 메시지에도을 포함해야합니다 Goodbye Cruel World!. 보너스 챌린지를 완료하면 점수를 2로 나눌 수 있습니다 (보너스를 주장하는 경우 점수 끝에!를 포함하십시오!)
  • 표준 출력이 여전히 인쇄되고 표준 오류가 여전히 인쇄되는 한 순서는 중요하지 않습니다. 어느 쪽도 상대방이 일어나지 않도록 막을 수있는 한.
  • 출력은 위의 내용을 포함해야합니다. "출력에 나타나지 않아야합니다.
  • 출력은 지정된 문자열을 포함해야하며 그 밖의 것은 없습니다.
  • 충돌 보고서는 무엇이든 포함 할 수 있지만 보너스를 청구하려면 다음 정규식이 일치해야합니다 /Goodbye Cruel World!/mi(일명, 대 / 소문자를 포함하거나 무시 함).
  • 문자열 Hello World!Goodbye Cruel World!대소 문자를 구분하지만, 그렇지 않은 경우 위와 같이 정확하게 표시됩니다.
  • 언어가 충돌 할 수 있으면 (종료 코드를 변경할 수 없음) 충돌해야합니다. 그렇지 않으면 STDERR언어에 표준 "오류 보고서"(예 :)를 사용하십시오 .

Python 3을 중단시킬 수 있으므로 Python 3 답변 의 예를 포함 시켰습니다 ! 이제 모든 사람들이 세상을 불 태워 보자! ^ W ^


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Dennis

as a bonus twist challenge, print "Hello World!" and crash with "Goodbye Cruel World!"?
매직 문어 Urn

STDOUT과 STDERR이 다른 스레드로 인쇄되는 Java와 같은 언어로 작업한다고 가정 해보십시오. 이것은 프로그램이 순서대로 "Hello world"를 인쇄 한 다음 충돌하더라도 스택 추적이 먼저 인쇄 될 수 있음을 의미합니다. 허용됩니까?
Socratic Phoenix

@SocraticPhoenix STDOUT이 여전히 인쇄되고 STDERR이 여전히 인쇄되는 한 순서는 중요하지 않습니다. 어느 쪽도 상대방이 일어나지 않도록 막을 수있는 한.
Tezra

1
너무 재미있어서 솔루션 만들기를 멈출 수 없습니다!
Adám

답변:


36

젤리 , 12 바이트

“¿µƝɓṭỵae»Ȯ:

온라인으로 사용해보십시오!

설명:

“¿µƝɓṭỵae»Ȯ:

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

정수 나누기는 dyad이므로 암시 적으로 체인의 현재 값을 두 인수 (문자열)로 사용합니다. 정수를 기대하기 때문에 충돌이 발생합니다.


7
PPCG에 오신 것을 환영합니다!
Dennis

감사합니다! 나는 잠시 동안 숨어 있었지만, 이것이 실제로 제대로 해결할 수 있다고 느꼈던 도전을 발견 한 것은 이번이 처음입니다!
산란

28
젤리를 배우는 길이와 사실 때문에 거의 모든 젤리 답변이 인상적이지만 인상적인 답변입니다.
그리폰-복원 모니카

4
A base-250 encoded string그것은 당신이 할 수있는 무서운 멋진 것입니다. X3
Tezra

3
이것은 "Goodbye cruel world!"라는 문자열보다 훨씬 짧습니다. (20 바이트). 미친 ...
아담 플로로

35

C, 43 바이트

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

문자열을 인쇄 한 다음 반환 할 값을 인쇄 할 다른 문자열의 포인터로 사용하려고하면 세그먼트 오류가 발생합니다.

온라인으로 사용해보십시오!

C, 42 바이트

@Ruslan에게 감사합니다!

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

온라인으로 사용해보십시오!

재미로만 : C (64 비트 Linux), 149 바이트

이 Hello World 프로그램 에서 수정되었습니다 .

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

온라인으로 사용해보십시오!


이 접근 방식이 마음에 들지만 지침에 따르면The answer must be a whole executable program.
Cody

1
main(i){i=puts("Goodbye Cruel World!")/0;}1 바이트를 제거합니다.
Ruslan

1
당신은 필요하지 않습니다 i. puts("")/0;구문 상 올바른 문장입니다.
rici

1
@rici 그렇습니다.하지만 적어도 TIO에서는 충돌하지 않습니다.
Steadybox

1
@ 스테 디 박스 : 그것은 당신을위한 최적화입니다.
rici

11

SOGL , 15 25 17 바이트 / 2 = 8.5!

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

설명:

...‘           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이 STDERR을 디버그 출력으로 사용한다는 사실을 사용하므로 줄과 함께 많은 텍스트가 있습니다.

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

처리 스케치의 STDOUT을 파일로 파이프 한 경우 "Goodbye Cruel World!" 거기에있을 것입니다.


도전 언급 이후 " 문자열 Hello World!과는 Goodbye Cruel World!대소 문자를 구분하지만, 그렇지 않은 경우 위와 같이 정확하게 표시되어야합니다. "당신이 기능을 제거하기로 골프 코드를 할 수있는 모든 소문자 완전히 그냥 출력.
Kevin Cruijssen

@KevinCruijssen 감사합니다!
dzaima

10

> <> , 25 바이트

"!dlroW leurC eybdooG">o<

기본적으로 문자열을 스택에 추가하고 (뒤로, 처음부터) 다음과 같습니다.

while(1):
  pop the stack
  print the character

스택에 문자가 남아 있지 않은 경우 (전체 문자열이 인쇄 됨) 스택을 터뜨리면 오류가 발생합니다


+1. 온 #o<"Goodbye Cruel World!"기본적으로 동일하다.
hakr14

9

sed, 32 바이트

iGoodbye Cruel World!
w/dev/full

i줄을 삽입하고 w파일에 씁니다. /dev/full이 경우 모든 쓰기 작업이 반환되므로 ENOSPC"장치에 남은 공간이 없습니다".

그래도 작동하려면 한 줄의 입력이 필요합니다.

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

3
그런 장치가 있다는 것을 몰랐습니다!
Ruslan

9

루아, 31 , 30 바이트

a=-print'Goodbye Cruel World!'

먼저 'Goodbye Cruel World!'를 인쇄합니다. nil 값과 0을 추가하려고하면 충돌이 발생합니다.

산출:

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

1 바이트 미만의 GalladeGuy 크레딧


2
'Goodbye Cruel World!'를 인쇄합니다. 그리고 나는 단지 그것이 받아 들여지기 위해 단순히 충돌해야한다고 생각했지만 충돌합니다.
eniallator 2016 년

@Trebuchette 요구 사항은 "프로그램이 Goodbye Cruel World!를 출력하여 출력 한 다음 충돌해야합니다."입니다. OP는 "출력"이 stderr, stdout, 메시지 상자 또는 위의 것을 의미하는지 여부를 지정하지 않았습니다.
Pharap

@Pharap 아, 알겠습니다. STDERR는 보너스를 받으려는 경우에만 중요합니다. 감사!
Trebuchette

@Trebuchette Nope. 또는 보너스 트위스트 챌린지로 Hello World!를 인쇄하고 Goodbye Cruel World!와 충돌합니다. '충돌'은 반드시 stderr을 의미하지는 않으며, '충돌'은 (다른 것들 중에서도) 예외가 발생하는 것을 의미 할 수 있습니다. OP가 더 정의하지 않는 한 해석에 개방적입니다. 또한 Lua의 일부 응용 프로그램에는 stderr (예 : 게임용 스크립팅 언어로 포함 된 Lua) 개념이 없으며 대신 메시지 상자 나 로그 파일 등으로 인쇄됩니다.
Pharap

1
대신 이렇게하면 바이트를 절약 할 수 있습니다.a=-print"Goodbye Cruel World!"
GalladeGuy

8

파이썬 3 | 점수 : 24.5! 23 22!

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

"Goodbye Cruel World!"에서 유효하지 않은 연산자 '+'를 사용하는 것보다 "Hello World"를 인쇄하십시오. NoneType 반환 요소에. (이전 버전에서 \ n \ r을 잘라 냄)

온라인으로 사용해보십시오!

파이썬 3 | 점수 : 34 30

+print("Goodbye Cruel World!")

인쇄 결과에 유효하지 않은 단항 + 작업을 수행하는 것보다 인쇄 작별 인사 (없음 유형)

온라인으로 사용해보십시오!


+"Goodbye Cruel World!"3 바이트 더 짧고 TypeError를 출력합니다.
Gábor Fekete

print("Goodbye Cruel World!")/0는 두 번째 바이트보다 짧습니다 (3 바이트?)
matsjoyce

@matsjoyce 나는 인쇄 전에 부서 질 까봐 두려웠다. 그러나 먼저 인쇄되기 때문에 인쇄 결과에 대해 단항 할 것입니다 : 3
Tezra

24
2.585e + 22는 꽤 큰 점수입니다 ... 더 이상 골프를 타지 못했다고 확신하십니까?
tuskiomi

1
@tuskiomi '!' 보너스 챌린지에 의해 최종 점수가 수정됨을 의미합니다.
Tezra



6

CJam , 34 바이트, 17 점!

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

온라인으로 사용해보십시오! (STDERR의 디버그 패널 참조)

설명

"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에서는 다음과 같은 오류 메시지가 생성됩니다.

"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 전 처리기, 27 바이트

#error Goodbye Cruel World!

산출:

fatal error C1189: #error:  Goodbye Cruel World!

1
당신은 더욱를 단축 할 수 있습니다#Goodbye Cruel World!
살구 소년

@apricotboy 그래도 여전히 오류가 발생하지만 컴파일러에 의해 "최소한 잔인한 세계"라는 전체 오류 메시지가 출력되지 않습니다 (MSVC 이상)
Govind Parmar

@Gorvind Parmar 아. 잘 그것은 gcc에 확실히 : i.imgur.com/qmGnoJv.png
살구 소년

6

APL (Dyalog) , 17.5 바이트

보너스없이 20 바이트

Goodbye Cruel World!

온라인으로 사용해보십시오!

코드의 인용 부호가 없으므로 APL이 코드를 실행하려고 시도하지만 World정의되지 않았으므로 오류 메시지에 포함 된 코드의 오류 코드와 함께 VALUE ERROR 충돌이 발생합니다.

보너스 포함, 35 ÷ 2 = 17.5 바이트

'Hello World!'
Goodbye Cruel World!

온라인으로 사용해보십시오!

먼저 필요한 문자열을 인쇄 한 다음 위 프로그램과 같이 충돌합니다.

보다 정교한 보너스 버전, 35 ÷ 2 = 17.5 바이트

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

온라인으로 사용해보십시오!

첫 번째 문자열을 인쇄 한 다음 첫 번째 다섯 문자를 ( 5↓)에서 삭제 한 다음 해당 ,접두사 ( )를 새 접두사 로 연결 한 다음 실행을 시도하여 ( ) 위와 동일한 오류를 발생시킵니다.


1
@Cyoce Typo. 감사합니다
Adám

5

배쉬 20.5! 18.5!

나는 젤리를 강타하지 않을 것이다. 그러나 나는 빠른 강타 스크립트를 강타 할 때 나의 강타를 조금 강타한다. 18.5는 골프가 아닌 언어에는 나쁘지 않습니다. (이것은 스크립트 여야함에 유의하십시오. 대화식 bash는 !히스토리 조회 로 해석하려고 시도합니다 )

echo Hello World!
Goodbye\ Cruel\ $_

오류 코드 127과 함께 반환되며

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

요청한대로 "... 어디에도 없습니다 :). apricot boy내가 제안한 것처럼 이제 4 바이트를 절약하기 위해 이전 명령의 마지막 인수를 찾습니다.


나는 당신을 이길려고 노력했습니다 ... 그리고 21로 실패했습니다! 바이트. :) W=\ World\!;echo Hello$W;"Goodbye Cruel$W"
reitermarkus 2016 년

1
아마도 두 번째 줄을 Goodbye\ Cruel\ !$100 %가 아니라 !$"마지막 명령의 마지막 단어"로 바꿀 수 있습니다
살구 소년

그러나 "Goodbye Cruel World!"라는 실행 파일이 있다면 어떨까요? PATH에 존재합니까? :)
spuck


4

TeX, 19!

Hello World!#\bye Goodbye Cruel World!

TeX가 실제로 수동 개입없이 dvi / pdf 파일을 생성하도록하려면으로 컴파일하십시오 -interaction=nonstopmode.

Hello World!을 사용 #하지 않아야 할 때 인쇄 하고을 사용하여 오류를 발생시킨 다음로 컴파일을 중지합니다 \bye. 그러나 이후의 내용 \bye은 여전히 ​​오류 메시지에 출력되므로 보너스에 적용됩니다.


4

WinDBG (Windows XP / Vista 로컬 커널 디버깅), 33 바이트

.echo Goodbye Cruel World!;.crash

경고 : 프로그램뿐만 아니라 전체 시스템이 충돌합니다.

로컬 커널 디버깅은 Windows XP 및 Vista에서만 가능하지만 Vista에서는 기본적으로 활성화되어 있지 않습니다. 로컬 커널 디버깅의 WinDBG 대화 상자에는 다른 Windows OS가 언급되어 있지 않으므로이를 사용할 수 없다고 가정합니다. 아마도 다른 Windows OS의 경우 커널 디버깅을 위해 원격 컴퓨터에 연결할 수 있지만 충돌 할 원격 컴퓨터 이므로이 솔루션이 여기에 있다고 생각하지 않습니다.


로컬 커널 디버깅은 Windows 7에서도 지원되며 그 이후로 제거되었다는 소식을 듣지 못했습니다 (그러나 놓칠 수 있습니다).
코디 그레이

4

JS (ES5), 46/2 = 23 바이트!

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

경고 Hello, World!, 다음 오류Uncaught TypeError: Cannot read property 'Goodbye Cruel World!' of undefined


4

PowerShell, 26 바이트

'Goodbye Cruel World!';1/0

0으로 나누는 것이 오류를 던지는 가장 쉬운 방법이라고 생각합니다.

PowerShell, 35/2 = 17.5 바이트

"Hello World!";Goodbye Cruel World!

TessellatingHeckler 에 의해 다음과 같은 오류가 발생합니다.

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!

그것은해야하지 $w='World!'(AN으로 !)?
gmatht

"Hello World!";Goodbye Cruel World!는 17.5 바이트이며, 작별 인사가 명령으로 인식되지 않기 때문에 예외가 발생하고 예외 메시지에 전체 행이 포함되어 정규식과 일치합니다.
TessellatingHeckler

1
17.5b 답변과 동일한 논리를 사용하면 'Goodbye Cruel World!';x24 분의 2 바이트를 절약 할 수 있습니다.
Veskah



4

Node.js, 점수 : 25.5 24.5!

ETH 프로덕션 덕분에 1 포인트 절약

console.log()함수를 반환하지 않기 때문에 런타임에 충돌하는 구문 상 올바른 전체 프로그램입니다 .

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

온라인으로 사용해보십시오!


안타깝게도 25.5... : ((
Mr. Xcoder

@ Mr.Xcoder Gamma(26.5)Mathematica 정의와 동일합니다.
user202729 2016 년

1
누가 Mathematica가 고장 나지 않았다고 말했습니까? :)))
Mr. Xcoder

X(그리고 아마도 줄 바꿈) 을 제거 할 수 있습니까 ?
ETHproductions

@ETHproductions 그렇습니다. 감사!
Arnauld

3

아세토 , 점수 : 21.5!

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

인쇄 Hello World!한 다음

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 바이트

"GOODBYE CRUEL WORLD!"hY

문자열을 인쇄 한 다음 빈 목록의 첫 번째 요소를 가져 오려고 시도합니다.

이 시도!


3

AHK, 50/2 = 25! (비경쟁)

추가 요구 사항으로 인해 답변이 유효하지 않기 때문에 비경쟁입니다. 컴파일하고 텍스트를 출력하고 충돌하게 만드는 방법을 찾을 수 없습니다. 내가 시도하는 것은 그 요구 사항 중 하나 이상에 실패합니다.


Send,Hello World!
OutputDebug,Goodbye Cruel World!

이것이 제가 생각할 수있는 가장 지루한 해결책입니다. 실제로 충돌하지는 않지만 기술적으로 요구되는 것은 아닙니다. 디버그 창에 메시지를 출력하기 만하면됩니다. 그렇게하라고 지시하기 때문에 그렇게합니다.


현재 유효하지 않습니다. OP는 언어가 가능하면 AHK 인 경우 프로그램이 충돌해야한다고 명시합니다.
internet_user

@pycoder Ah, 게시 후 40 분 후에 추가되었습니다. 새 규칙을 업데이트하지만 바이트 비용이 듭니다.
엔지니어 토스트 :

3

apt , 22 바이트

°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

온라인으로 사용해보십시오!

obarakon 및 ETH 프로덕션 덕분에 3 바이트 절약


문자열을 사용하여 압축 Oc"<string>"한 다음 현재 문자열을 압축 버전으로 바꾸고 백틱으로 묶을 수 있습니다.
Luke

설명이 좋을 것입니다.
iFreilicht

1
@iFreilicht 설명이 추가되었습니다.
Tom

3

C #, 116/2 = 58 바이트!

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

94 87 바이트의 일반 버전 :

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

@KevinCruijssen 덕분에 7 바이트가 절약되었습니다.


int n=0;n/=n;첫 번째 답변보다 짧습니다.
Kevin Cruijssen

@KevinCruijssen Nice spot, 상수 0 오류로 나누지 않고 컴파일하는 데 문제가있었습니다.
TheLethalCoder

예, Java에서는 그냥 할 수는 int n=1/0;있지만 C #에서는 불가능합니다 (실제로는 언어에는 좋지만 코드 골프에는 좋지 않습니다). Btw, 왜 보너스가 맨 위에 있지 않습니까? 그 중 하나가 더 짧습니다.
Kevin Cruijssen

@KevinCruijssen 나는 답변을 게시했을 때 약간 불분명하여 자격이 있는지 확실하지 않았으며, 더 명확 해졌으므로 전환했습니다.
TheLethalCoder

3

젤리 , 10.5! 바이트

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

온라인으로 사용해보십시오!

이것은 Jelly 문자열 (1 문자 문자열 목록) 대신 Python 문자열 (문자열)을 사용하여 정의되지 않은 동작을 이용합니다. 변환은 젤리 문자열을 더하여 줄임으로써 이루어지며, 파이썬은 +두 개의 문자열을 연결하므로 두 개의 문자열이 함께 연결되어 파이썬 방식으로 연결됩니다. 그런 다음 적절한 모나드 (범위) int를 사용하여 문자열에서 Python 이 호출되어 항상을 포함하는 오류가 발생합니다 Goodbye Cruel World!.

설명:

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

루비, 43 42 바이트 / 2 = 21!

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

Alexis Andersen의 도움으로을 (를) 대체 "String"/0하여 반 바이트를 절약 했습니다 -"String". 루비 버전이 2.3보다 낮 으면 "작동"합니다. 단항 빼기 방법이 실제로 String 클래스에 추가되었습니다!

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)

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)

당신은 사용하여 (반) 바이트를 저장할 수 있습니다 -대신 문자열 /-"Goodbye crueld World!"
알렉시스 안데르센

@AlexisAndersen 감사합니다! 오늘은 또한 String 클래스의 새로운 메소드에 대해 배웠습니다 (업데이트 된 게시물 참조)
daniero

3

x86-64 이진 코드 (Linux 시스템 호출 사용), 43 바이트

분해 :

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

이 프로그램은 필요한 데이터 (문자열 "Goodbye Cruel World!\n")를 자체 코드로 묶습니다 . rip상대 주소 지정을 사용하여 해당 문자열에 대한 포인터를로드하고 writeglibc 래퍼를 사용하지 않고 syscall을 직접 호출 하므로 위치에 독립적이므로 코드를 const문자열 에 포함시키고 해당 문자열을 함수에 캐스팅 하여 쉽게 테스트 할 수 있습니다 바늘. 프로그램을 중단시키기 위해 hlt링 0 권한으로 프로세서를 영원히 (또는 적어도 다음 인터럽트가 올 때까지) 침묵 시키는 명령으로 종료 하지만 링 3 권한 (일반적으로 사용자 프로그램)에서는 훨씬 적습니다. 극적인 Segmentation Fault.

테스트 프로그램 :

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

산출:

Code bytes: 43
Now running the code:

Goodbye Cruel World!
Segmentation fault

43 바이트 코드 기능이 아니라 챌린지에서 지정한대로 완전한 프로그램입니다. main테스트 프로그램 의 기능에 의존하여 올바르게 작동 하지 않습니다 . 로더가 직접로드하여 점프하면 여전히 문자열을 인쇄하고 충돌합니다.


push/ pop를 사용하여 레지스터를로드 하여 몇 바이트를 저장하십시오 . 예를 들어, 처음 두 명령어는 push 1+ pop rax일 수 있으며 이는 1 바이트 더 짧습니다. 그런 다음 다음 두 명령어를 mov edi, eax2 바이트 더 짧은 로 대체 할 수 있습니다 . 같은 push/ pop트릭 지침 6, 7에 적용 할 수 있습니다 : push 0x15+를 pop rdx.
코디 그레이


3

Pyth , 38/2 = 19 바이트! 36/2 = 18 바이트!

"Hello World!"v"Goodbye Cruel World!

온라인으로 테스트하십시오!

설명

인쇄 Hello World!한 다음 평가 해보십시오 Goodbye Cruel World!. 해당 문자열이 유효한 코드가 아니기 때문에 실패합니다.

결과는 다음과 같습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.