“ สวัสดีโลก!” (ตัวละครอื่น ๆ ตอนที่ 2)


18

เป็นส่วนที่ 2 ถึงสวัสดีโลก! (ตัวละครอื่น ๆ ทุกตัว)เขียนโปรแกรมที่ทั้งสามโปรแกรมเหล่านี้พิมพ์ "Hello, World!": โปรแกรมทั้งหมด, ตัวอักษรที่ 1, 3, 5, ฯลฯ ของโปรแกรมของคุณและตัวที่ 2, 4, 6, เป็นต้น

หากโปรแกรมของคุณคือ:

abc
def

มันควรจะส่งออก "Hello, World!" แต่ควรจะ

acdf

และ

b
e

ไม่มีวิธีแก้ไขพร้อมกับ "Hello, World!" ในตัว


6
ทำไมไม่เปลี่ยนข้อความจาก "Hello, World!" เพื่ออะไรอย่างอื่น?
Conor O'Brien

1
ฉันคิดว่าหลีกเลี่ยงช่องโหว่เพียงพอและ "สวัสดีโลก!" เป็นที่ยอมรับ
Leo Tenenbaum

24
IMO คงจะดีถ้าได้เห็นสตริงที่แตกต่างจาก "Hello, World!" ครั้งในขณะที่ (นั่นเป็นเพียงความคิดของฉัน)
Conor โอไบรอัน

1
ช่องว่างและบรรทัดใหม่ถูกนับเป็นอักขระหรือไม่
อย่างเป็นทางการ

6
@ ConorO'Brien ด้วยผลข้างเคียงที่น่าพึงพอใจที่มีเพียงไม่กี่ภาษาในตัวสำหรับสตริงอื่น ๆ
Dennis

คำตอบ:


24

รหัสเครื่อง x86, 378 ไบต์

การสาธิต

PROG.COM ดาวน์โหลดและเรียกใช้ในMS-DOSจำลองDOSBoxตัวอย่างเช่น

B3 B4 B3 02 90 B3 B3 B4 02 B3 B4 B3 02 90 B3 B2
B3 48 90 B3 B3 B2 48 B3 B2 B3 48 90 B3 CD B3 21
90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 65 90 B3
B3 B2 65 B3 B2 B3 65 90 B3 CD B3 21 90 B3 B3 CD
21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2 6C B3
B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3
21 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 2C
90 B3 B3 B2 2C B3 B2 B3 2C 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 20 90 B3 B3 B2
20 B3 B2 B3 20 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 77 90 B3 B3 B2 77 B3 B2 B3
77 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 6F 90 B3 B3 B2 6F B3 B2 B3 6F 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 B2 B3 72
90 B3 B3 B2 72 B3 B2 B3 72 90 B3 CD B3 21 90 B3
B3 CD 21 B3 CD B3 21 90 B3 B2 B3 6C 90 B3 B3 B2
6C B3 B2 B3 6C 90 B3 CD B3 21 90 B3 B3 CD 21 B3
CD B3 21 90 B3 B2 B3 64 90 B3 B3 B2 64 B3 B2 B3
64 90 B3 CD B3 21 90 B3 B3 CD 21 B3 CD B3 21 90
B3 B2 B3 21 90 B3 B3 B2 21 B3 B2 B3 21 90 B3 CD
B3 21 90 B3 B3 CD 21 B3 CD B3 21 90 B3 CD B3 20
90 B3 B3 CD 20 B3 CD B3 20 90

นอกจากนี้คุณสามารถดาวน์โหลดLEFT.COMและRIGHT.COM

มันทำงานอย่างไรและทำงานอย่างไร

ดูคำตอบในส่วนที่หนึ่ง

มายากล

หากคุณต้องการดำเนินการคำสั่ง opcode 0xABด้วยพารามิเตอร์หนึ่ง0xCDคุณเขียน

มายากล

เครื่องกำเนิดไฟฟ้า

เรียกใช้รหัสรับ hex แปลงเป็นไบนารี่

cat prog.hex | xxd -r -p > PROG.COM


13

Python 3 , 115 ไบต์

print=="partisn't";
"ran" >="partisn't" ;
print((""" "HHeelllloo,,  wwoorrlldd!! """[" ) #2">"1":: 3- 1] [ 1:-1 ]))

ทุกตัวละครแปลก ๆ

pit=print;"a">"ats'";pit(" Hello, world! "[  2>1: -1  :1])

ทุกตัวละคร

rn="ats'"
rn =print 
rn("""Hello, world!""")#""":3 ][1- )

ลองออนไลน์!

นี่อาจจะสั้นกว่านี้เยอะ แต่ฉันดีใจที่ฉันได้ทำงานให้กับ Python คล้ายกับคำตอบของ vroomfondelในส่วนแรก

น่าเบื่อคำตอบ 93 ไบต์

""""""
print("Hello, world!")
""""""#
""""

pprriinntt((""HHeelllloo,,  wwoorrlldd!!""))
#"""

ทุกตัวละครแปลก ๆ

"""pit"el,wrd"
"""
""
print("Hello, world!")#"

ทุกตัวละคร

"""
rn(Hlo ol!)"""#""
print("Hello, world!")
""

ลองออนไลน์!


9

> <> , 45 ไบต์

! """!!ddllrrooWW  oolllleeHH"!!"" >~o <> o <

หรือแม้แต่ตัวอักษร:

 "!dlroW olleH"!">o<  

หรือตัวละครแปลก ๆ :

!""!dlroW olleH!" ~ >o<

ลองพวกเขาออนไลน์: เดิม , evens , อัตราต่อรอง

เวอร์ชันดั้งเดิมจะผลัก " !!ddllrrooWW oolllleeHH" ไปที่สแต็กจากนั้นปลาก็กระเด้งไปมาระหว่าง>~o <ที่ลบจดหมายพิมพ์สองพิมพ์สองสองพิมพ์สองพิมพ์สองลบสอง ฯลฯ โปรแกรมครึ่งสองเป็นโปรแกรมการพิมพ์สตริงมาตรฐานที่ค่อนข้างยุติธรรม ส่วนที่ซับซ้อนได้รวม"และ!สลับเข้าและออกจากโหมดสตริงในทั้งสามโปรแกรมอย่างถูกต้อง


7

Befunge-98 , 43 bytes

120 x""!!ddllrrooWW  ,,oolllleeHH""cckk,,@@

ลองออนไลน์!

เฉพาะของแปลก ๆ :

10x"!dlroW ,olleH"ck,@

ลองออนไลน์!

เฉพาะคู่:

2 "!dlroW ,olleH"ck,@

ลองออนไลน์!

คำอธิบาย

โปรแกรมเต็มรูปแบบ:

120               Push 1, push 2, push 0.
x                 Pop 0 (y) and 2 (x) and set the instruction pointer's movement
                  delta to (x,y). That is, run the remainder of the code
                  by skipping every other cell.
"!dlroW ,olleH"   Push the code points of the output.
ck,               Print 13 characters from the top of the stack.
@                 Terminate the program.

ในโปรแกรมคี่2จะหายไปดังนั้นจึง10xไม่ทำอะไรเลยเลย (มันกำหนดเดลต้า(1,0)ซึ่งเป็นค่าเริ่มต้นอยู่แล้ว) ส่วนที่เหลือของโปรแกรมจะเหมือนกัน

ในโปรแกรมคู่เราแค่กด2จุดเริ่มต้นซึ่งเราสามารถเพิกเฉยได้ทั้งหมด ส่วนที่เหลือของโปรแกรมเหมือนเดิม



5

Mathematica, 65 ไบต์

PPrriinntt[[""HHeelllloo,,  WWoorrlldd!!""]]Print@"Hello, World!"

มันจะพ่นบางคำเตือน, พิมพ์และผลตอบแทนHello, World! Null PPrriinntt[["" HHeelllloo, Null, "" WWoorrlldd!!]]เมื่อรันเป็นโปรแกรม (ไม่ใช่ใน REPL) ค่าส่งคืนจะไม่ถูกพิมพ์

หลังจากลบตัวอักษรคู่:

Print["Hello, World!"]Pit"el,Wrd"

มันพิมพ์และผลตอบแทนHello, World!"el,Wrd" Null Pit

หลังจากลบอักขระคี่:

Print["Hello, World!"]rn@Hlo ol!

มันพิมพ์และผลตอบแทนHello, World!Null ol! rn[Hlo]


5

รหัสเครื่อง x86, 73 ไบต์

ได้รับแรงบันดาลใจจากวิธีการแก้ปัญหาของЕвгенийНовиковฉันคิดว่ามันน่าจะเป็นไปได้ที่จะใช้กลอุบายน้อยลงเช่นเพียงแค่กระโดดไปที่รหัส "แยกส่วน" สำหรับตัวแปรทั้งสาม ฉันยังคงลองใช้ชุดตัวเลือกอัจฉริยะที่ใช้lodsb; lodsbเป็นจุดศูนย์กลาง (ดังนั้นจึงจำเป็นต้องใช้ค่าคงที่สตริงเดียวเท่านั้นสำหรับชุดตัวเลือกทั้งหมด)

EB 14 00 00 8A 8A 17 16 01 01 B4 B4 09 09 CD CD
21 21 CD CD 20 20 8A 1f 01 B4 09 CD 21 CD 20 48
65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 00 48 48 65
65 6c 6c 6c 6c 6f 6f 2c 2c 20 20 57 57 6f 6f 72
72 6c 6c 64 64 21 21 00 00

ถ้าผมจำได้อย่างถูกต้องจากวันวัยเด็กของฉัน COM ของรุ่นเล็กจะเริ่มต้นด้วยและรหัสที่ถูกโหลดจากจุดเริ่มต้นDS=CS=SS CS:0100hฉันไม่คิดว่าจะรับประกันได้ว่ารหัสจะถูกโหลดลงในบล็อกหน่วยความจำที่เป็นศูนย์ (หากมีการรับประกันฉันสามารถปล่อยสองไบต์)

การถอดรหัสขนาดยาวควรเป็น

  JMP *+14h
  ; 20 irrelevant bytes
  MOV DX,message
  MOV AH,09h
  INT 21h;  print string pointed to by DS:DX
  INT 20h;  exit program
message:
  DB "Hello, World!\0"
  DB "HHeelllloo,,  WWoorrlldd!!\0\0"

ถอดชิ้นส่วนของรหัสคี่

  JMP *+00h
  MOV DX,message
  MOV AH,09h
  INT 21h;  print string pointed to by DS:DX
  INT 20h;  exit program
  ; some irrelevant bytes
message:
  DB "Hello, World!\0"

ถอดชิ้นส่วนของรหัส:

  ADC AL,00h
  MOV DX,message
  MOV AH,09h
  INT 21h;  print string pointed to by DS:DX
  INT 20h;  exit program
  ; some irrelevant bytes
message:
  DB "Hello, World!\0"

เยี่ยมมาก! ในโปรแกรม DOSBox ไม่ทำงาน ฉันไม่รู้ว่าทำไมไฟล์ com ด้วยรหัสนี้หยุดการทำงานของระบบ
ЕвгенийНовиков

ทดสอบรหัสของคุณในครั้งต่อไป 8Aที่ 0116 ควรจะBAแทนและสตริงจะยกเลิกโดย$ไม่เป็นโมฆะ
NieDzejkob

4

เรติน่า 48 ไบต์

G |`

HHeelllloo,,  WWoorrlldd!!
$_&

(.)\1t?
$1

ลองออนไลน์!

ตำแหน่งคี่:

G|
Hello, World!
_
()1?$

ลองออนไลน์!

ตำแหน่งคู่:

 `
Hello, World!$&
.\t
1

ลองออนไลน์!

คำอธิบาย

โปรแกรมเต็มรูปแบบ:

G |`

มันไม่ทำอะไรเลย |ไม่ได้เป็นตัวเลือกการกำหนดค่าที่มีอยู่ Gนี้จะทำให้ขั้นตอน grep แต่มีจริงๆไม่มีอะไรที่จะ grepped และ regex ว่างเปล่าใด ๆ ดังนั้นนี้ไม่ได้ทำอะไร จุดประสงค์ของขั้นตอนนี้คือมีฟีดสองบรรทัดต่อหน้า "Hello, World!" บรรทัดเพื่อให้หนึ่งในนั้นอยู่รอดการลดลง เหตุผลในการทำ grep stag นี้คือเราต้องการออฟเซ็ต parity ของบรรทัดและขั้นตอน grep ต้องการเพียงบรรทัดเดียว


HHeelllloo,,  WWoorrlldd!!

สิ่งนี้จะเปลี่ยนสตริงการทำงาน (ว่าง) เป็นเอาต์พุตที่ต้องการโดยมีอักขระสองตัวเป็นสองเท่า

$_&

มันไม่ทำอะไรเลย regex พยายามจับคู่ a _และ a &หลังสิ้นสุดของสตริงซึ่งเป็นไปไม่ได้แน่นอน เราต้องการตัวละครเหล่านั้นในเวอร์ชั่นที่ลดลงอีกครั้งเพื่อจัดการกับฟีดไลน์ที่หายไป

(.)\1t?
$1

สุดท้ายเราเอาตัวละครที่ซ้ำกันโดยการแทนที่ด้วย(.)\1 จะไม่ใช้อีกครั้ง แต่จะมีความจำเป็นในรุ่นที่ลดลง$1t?

โปรแกรมคี่:

G|
Hello, World!

Gไม่สามารถจับคู่การป้อนข้อมูลที่ว่างเปล่า แต่ที่ว่าทำไมเรามี|ที่จะช่วยให้การแข่งขันทางเลือกที่ว่างเปล่า สิ่งนี้จะเปลี่ยนสตริงการทำงานที่ว่างเปล่าเป็นผลลัพธ์ที่ต้องการ

_
()1?$

สิ่งนี้แทนที่ขีดล่างด้วย()1?$แต่ไม่มีขีดล่างในสตริงดังนั้นจึงไม่ทำอะไรเลย

โปรแกรมคู่:

 `
Hello, World!$&

`เพียงหมายถึงการกำหนดค่าสตริงที่ว่างเปล่าอีกครั้งเพื่อให้เราใช้ regex ว่างเปล่าเพื่อแทนที่สตริงการทำงานกับการส่งออก ครั้งนี้เรายังแทรก$&แต่นั่นคือการจับคู่ตัวเองซึ่งว่างเปล่าแน่นอนว่ามันจะไม่ทำอะไรเลย

.\t
1

สิ่งนี้จะแทนที่ตัวอักษรใด ๆ ตามด้วยแท็บด้วย1แต่เราไม่มีแท็บดังนั้นนี่จึงเป็นแบบไม่ใช้




2

PHP, 70 ไบต์

"";echo'Hello, World!'.""//pprriinntt''HHeelllloo,,  WWoorrlldd!!''
;;

ตัวละครแปลก:

";coHlo ol!."/print'Hello, World!';

ตัวละครคู่:

"eh'el,Wrd'"/print'Hello, World!'
;

2

Haskell , 92 ไบต์

{---- }

mmaaiinn==ppuuttSSttrr""HHeelllloo,,  WWoorrlldd!!""----}main=putStr"Hello, World!"

ลองออนไลน์! ดูเหมือนว่าการละเมิดความคิดเห็นมีมากเกินไปสำหรับการเน้นไวยากรณ์ที่จะจัดการ {- ... -}เป็นความคิดเห็นแบบอินไลน์หรือหลายบรรทัดในขณะที่--เริ่มความคิดเห็นในบรรทัด

ตัวละครแปลก:

{--}
main=putStr"Hello, World!"--mi=uSrHlo ol!

ลองออนไลน์!

ตัวละครคู่:

-- 
main=putStr"Hello, World!"--}anptt"el,Wrd"

ลองออนไลน์!


2

Zsh , 54 ไบต์

<<<Hello\ world!||eecchhoo  HHeelllloo\\  wwoorrlldd!!

ลองออนไลน์!

โปรแกรมหลักดำเนินการคำสั่งแรกได้สำเร็จดังนั้นคำสั่งหลังจากบูลีน||จะถูกละเว้น

สำหรับคี่ / คู่ค่า<<<Hello\ world!จะกลายเป็นค่าที่ไม่ได้ระบุ<<heredocหรือค่าที่<fileระบุใน stdin ทั้งสองวิธี||จะกลายเป็นและสิ่งที่จะส่งออกโดยคำสั่งแรกเป็นประปาเข้าและละเลยโดย|echo


1

โลโก้ , 71 ไบต์

;;\\
pr[Hello, World!]er "|

pprr[[HHeelllloo,,  WWoorrlldd!!]]
;;\\
|

(โปรแกรมมีบรรทัดใหม่ต่อท้าย)

รุ่นที่ลบออกสองรุ่น:

;\p[el,Wrd]r"
pr[Hello, World!]
;\|

และ

;\
rHlo ol!e |
pr[Hello, World!];\

(โปรแกรมมีบรรทัดใหม่ต่อท้าย)

สำหรับคำอธิบายสิ่งที่เป็นprและerทำดูโพสต์นี้ ในกรณีนี้erคือฟีดที่มีคำว่ากำหนดชื่อโพรซีเดอร์

\เป็นตัวหนีในรูปแบบซึ่งจะหลบหนีขึ้นบรรทัดใหม่หลังจากการสิ้นสุดของความคิดเห็นจึงทำให้บรรทัดที่สอง ( rHlo ol!e |) ของโปรแกรมที่ลบออกไปสองแสดงความคิดเห็น


1

Javascript, 68 ไบต์

//**
alert`Hello, World`//**//aalleerrtt``HHeelllloo,,  WWoorrlldd``

ตัวละครแปลก:

/*aetHlo ol`/*/alert`Hello, World`

แม้แต่ตัวละคร:

/*
lr`el,Wrd/*/alert`Hello, World`

เวอร์ชันคำตอบของฉันถูกแก้ไขในอีกอันหนึ่ง


1
ทำไมคุณต้องการพื้นที่ในช่วงเริ่มต้น?
CalculatorFeline

ดูเหมือนจะไม่ถูกต้องทางไวยากรณ์เมื่อคุณใช้อักขระที่ 1, 3 และอื่น ๆ นอกจากนี้มันหายไปในl HHeelllloo
Arnauld

@ CalculatorFeline, @ Arnauld fixed
SuperStormer


1

BotEngine , 180 178 ไบต์

ขึ้นอยู่กับคำตอบของฉันนี้คำถาม

 vv 
 v < 
 eHH 
 eee 
 ell 
 ell 
 eoo 
 e,, 
 e   
 eWW 
 eoo 
 err 
 ell 
 edd 
 e!! 

>>P          e     e     e     e     e     e     e     e     e     e     e     e     e P

อักขระแปลก (จดบันทึกช่องว่างต่อท้ายหลายรายการในบรรทัดสุดท้าย):

 v
v<
eH
ee
el
el
eo
e,
e 
eW
eo
er
el
ed
e!
>P                                          

ตัวละครคู่:

v     H  e  l  l  o  ,     W  o  r  l  d  ! 
>     e  e  e  e  e  e  e  e  e  e  e  e  eP  

0

Runic Enchantments 52 ไบต์

 L @""H!edlllroo,W  W,oorlllde!H"" ~@"!dlroW ,olleH"

ลองออนไลน์!

รูนมักจะไม่ค่อยเก่งในการรับมือกับการแผ่รังสีเนื่องจากมีการลบตัวควบคุมการไหลออกมาโดยการสุ่มทำให้การติดตามการทำงานนั้นเจ็บปวดมาก แต่การแผ่รังสีที่คาดเดาได้เช่นเดียวกับตัวละครอื่น ๆ ง่าย ๆ เราเพียงแค่เข้ารหัสสองโปรแกรมที่กลับด้านซึ่งกันและกันและแทรกจากนั้นจึงทำการสำเนาที่สามสำหรับการดำเนินการพื้นฐานและการควบคุมที่หนึ่งถูกดำเนินการด้วยอักขระตัวเดียว ในโปรแกรม 2 สำเนาที่สามคือขยะที่ไม่เคยเห็นมาก่อนและในโปรแกรม 3 จะยังคงรักษาคำพูดอยู่โดยอนุญาตให้สามารถคัดลอกได้โดยไม่ต้องพิมพ์

โปรแกรม 1 ดำเนินการส่วนนี้เท่านั้น:

 L                                  @"!dlroW ,olleH"

โปรแกรม 2 รันเฉพาะส่วนนี้:

    " H e l l o ,   W o r l d ! "   @               

แบบนี้:

  "Hello, World!" @!lo olH

ลองออนไลน์!

โปรแกรม 3 รันเฉพาะส่วนนี้:

 L @ " ! d l r o W   , o l l e H " ~ " d r W , l e "

แบบนี้:

L@"!dlroW ,olleH"~"drW,le"

ลองออนไลน์!

"drW,le"ส่วนจะถูกดำเนินการ แต่~ทันทีที่ปรากฏออกกองรักษาผลลัพธ์ที่ต้องการ

จะปรากฏว่าการแปลงคำตอบ> <> จะทำให้โปรแกรมสั้นลงโดยมีน้ำหนัก 45 ไบต์:

! ```!!ddllrrooWW  oolllleeHH`!!`` R~$ LR $ L

อย่างไรก็ตาม Runic มีข้อ จำกัด หนึ่งข้อที่> <> ไม่มี: ขนาดสแต็กสูงสุด 10 + IP ของมานา (ซึ่งตอนแรกคือ 10) และ!!ddllrrooWW oolllleeHHมีอักขระ 24 ตัวทำให้ IP มีมานาเลือดออกจนกว่าจะหมดอายุก่อนดำเนินการRคำสั่งทำให้ไม่มีเอาต์พุตสำหรับโปรแกรมฐาน

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.