"สวัสดีชาวโลก!" (ด้ายของโจร)


11

นี่คือเธรดของโจร ด้ายตำรวจเป็นที่นี่

ความท้าทายของคุณคือนำการส่งที่ไม่ได้ติดตามจากเธรดของตำรวจและค้นหาสิ่งที่อินพุตหรืออินพุตโปรแกรมจะพิมพ์Hello, World!และขึ้นบรรทัดใหม่ การใช้ตัวพิมพ์ใหญ่เว้นวรรคและเครื่องหมายวรรคตอนต้องเป็นตัวพิมพ์ใหญ่

โปรดแสดงความคิดเห็นในการส่งของตำรวจเมื่อคุณถอดรหัสรหัสของพวกเขา

คำตอบ:


12

Bash โดย Sisyphus

รหัสเดิม:

[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"

การป้อนข้อมูล:

__=; (( __++, __-- ));
(( ___        = __,        ___++));
(( ____       = ___,       ____++));
(( _____      = ____,      _____++));
(( ______     = _____,     ______++));
(( _______    = ______,    _______++));
(( ________   = _______,   ________++));
(( _________  = ________,  _________++));

${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'

คำอธิบาย:

สิ่งนี้เข้ารหัส "echo Hello, World!" เป็นลำดับการยกเว้นฐานแปด (\ xxx)

ยกเว้นคุณไม่สามารถใช้ตัวเลขได้ดังนั้นส่วนแรกจึงสร้างตัวแปรสำหรับตัวเลข 0-7 คุณสามารถใช้สิ่งเหล่านั้นเพื่อสร้างสตริงที่มีลำดับฐานแปดที่จะประเมินเพื่อให้คำสั่งจริงแก่คุณ

แต่evalยังเป็นตัวอักษรและตัวเลข ดังนั้นแทนที่จะท่อที่สตริงเป็น input bashตัวอย่างของผู้อื่น $0มีชื่อของคำสั่งที่ใช้ในการเรียกใช้ Bash ซึ่งโดยปกติจะเป็นเพียงbash(หรือ-bashสำหรับเชลล์การเข้าสู่ระบบ) หากคุณใช้งานตามปกติ (ผ่าน TIO หรือโดยการวางในเทอร์มินัล) (สิ่งนี้หมายความว่าหากคุณพยายามเรียกใช้โดยการวางลงในสคริปต์สิ่งต่าง ๆ จะผิดปกติอย่างน่ากลัวเพราะมันพยายามแยกตัวเองออกเป็นหลายครั้ง)

แต่อย่างไรก็ตามคุณไม่สามารถพูด$0ได้โดยตรง แต่$__มีชื่อของ$0( "0") และคุณสามารถใช้การขยายตัวทางอ้อมเพื่อเข้าถึงได้ ( ${!__}หมายถึงเนื้อหาของ$0)

และในที่สุดก็ให้ชิ้นส่วนทั้งหมดที่คุณต้องการ


ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! ฉันได้แสดงความคิดเห็นกับคำตอบของตำรวจ ลิงก์ TIO สำหรับผู้สนใจ: tio.run/##jc/…
Dennis

ดี! โซลูชันของฉันดูแตกต่างออกไป แต่ใช้แนวคิดเดียวกัน - การสร้างสตริงเลขฐานแปดและใช้ไวยากรณ์ใบเสนอราคาเดียวดอลลาร์และใช้ทางอ้อม ทำได้ดีมาก =)
Sisyphus




3

เยลลี่: EriktheOutgolfer

〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ〡㋄ⶐ✐сᑀ⟙ⶐⶐ〡ސЀᶑ

เยลลี่ 11 ไบต์

sLƽ$Xṙ5O½Ọ

ลองออนไลน์!

คำอธิบาย

รหัสเดิมสามารถอธิบายได้ดังนี้:

sLƽ$Xṙ5O½Ọ  Main link; argument is z
s            Split z into n slices, where n is:
    $
  ƽ         The integer square root of
 L                                      the length of z
     X       Random of a list. Returns a random row of the input put into a square
      ṙ5     Rotate the list left 5 times
        O    Get codepoints
         ½   Floating-point square root
          Ọ  From codepoints

ดังนั้นเพียงแค่ใช้ "สวัสดีโลก!" และรับ codepoints, สแควร์พวกเขา, โยนกลับไปที่ codepoints, หมุนขวา 5 ครั้งแล้วสี่เหลี่ยมและผลแบน


3

อ็อกเทฟโดย Stewie Griffin

ไม่แน่ใจว่านี่เป็นทางออกที่ถูกต้องหรือไม่ (บน TIO มันจะพิมพ์\00ตัวอักษร) แต่ในoctave-cliเชลล์ของฉันดูเหมือนว่า:

อ็อกเทฟเชลล์

นอกจากนี้ในความท้าทายดั้งเดิมมันบอกว่าไม่มีอะไรพิมพ์ (หรือตัวละครโมฆะ)ดังนั้นหากไม่มีอะไรเหมือนกัน\00แล้วควรจะดี

[72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 0]

ลองออนไลน์!



แต่นั่นไม่ใช่สิ่งที่ความท้าทายดูเหมือนว่าถ้าเป็นเช่นนั้นฉันจะง่ายกว่านี้มาก (แทนที่อันสุดท้าย0ด้วย10)
2560

@BruceForte นั่นคือสิ่งที่ท้าทายถาม: "ความท้าทายของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่มีอินพุตที่แน่นอนให้พิมพ์สตริงที่แน่นอนHello, World!และขึ้นบรรทัดใหม่" เป็นคำพูดที่แน่นอนจากความท้าทาย และแน่นอนที่ทำให้คำตอบเล็กน้อย
hvd

@hvd Yeah แต่ถ้าคุณดูภาพลักษณ์ของ OP เขาไม่ได้นั่นแหละที่ความสับสนหลักมาจาก
2560

1
@HyperNeutrino FWIW นี่คือสิ่งที่ฉันคิดว่าสไตล์ของการแก้ปัญหาคือ
Jonathan Allan


3

JavaScript (ES6) โดย Ephellon Dantzler

{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}

ลองออนไลน์!

นั่นง่ายมาก

ฉันสังเกตเห็นว่าอินพุตสตริงใด ๆ ไม่สามารถส่งออกได้Hello, World!เพราะทุกอย่างภายในString.fromCharCodeจะคืนค่าทวีคูณของ 4 เท่านั้นและ!มีรหัสถ่าน 33 ดังนั้นชัดเจนเราต้องแฮ็กโปรแกรมทั้งหมด การแฮ็คในตัวใน JavaScript นั้นไม่สำคัญหากไม่มีใครพยายามที่จะหยุดพวกเขา (และแม้ว่าจะทำเช่นนั้นก็มักจะมีวิธีแก้ปัญหามากมาย ... )


3

JavaScript (ES6), Voile

พร็อกซีธรรมดาที่ส่งกลับอักขระที่ต้องการทุกครั้งที่มีการเรียก

var i = 0;
var string = "Hello, World!";
var proxy = new Proxy([], {
  get: function(target, property) {
    if (!(++i%3)) {
      return string[property];
    }
    return [1];
  }
});

ลองออนไลน์!


2
ใช่นี่คือทางออกที่ตั้งใจ :) Proxy ต้องการความรักมากกว่านี้
Voile

3

Ruby โดย Histocrat

อินพุตมายากลคือ: 1767707618171221 30191World!

ลองออนไลน์

คำอธิบาย:

  • จำนวน1767707618171221เป็นสำคัญและการเขียนในฐาน 36 "hello"มันเป็น เมื่อพิมพ์ใหญ่แล้วจะสร้าง"Hello"จะพิมพ์ออกมาโดยใช้$><<
  • บรรทัด$><<", #$'"if/30191/ค้นหาหมายเลข30191ในอินพุตและเขียนไปยัง stdout สตริงที่ประกอบด้วยเครื่องหมายจุลภาคช่องว่างและอะไรก็ตามที่อยู่ในอินพุตหลังจาก30191ใช้ ( $POSTMATCHซึ่งใช้เรียกซึ่งนี่คือตัวแปรสั้น$')

3

Lua 5.1 โดย tehtmi

ผ่านสิ่งนี้เป็นอาร์กิวเมนต์แรก:

C=("").char;_G[C(112,114,105,110,116)](C(72,101,108,108,111,44,32,87,111,114,108,100,33))

สมมติว่ารหัสต้นฉบับอยู่ในไฟล์tehtmi.luaให้รัน (ใน bash หรือ shell ที่คล้ายกัน):

lua tehtmi.lua 'C=("").char;_G[C(112,114,105,110,116)](C(72,101,108,108,111,44,32,87,111,114,108,100,33))'

มันใช้งานได้กับ Lua 5.3 ซึ่งเป็นสิ่งที่ TIO ใช้ดังนั้นทำไมคุณไม่ลอง ลองออนไลน์ ? ฉันยังไม่ได้ทดสอบเกี่ยวกับการใช้งานที่ใช้แกน "Lua 5.1" ของ PUC-Rio (เพราะฉันไม่สามารถหาข้อมูลใด ๆ ได้) แต่โซลูชันของฉันก็อาจใช้งานได้เช่นกัน

อย่างไร?

มันรันอาร์กิวเมนต์แรกเป็นรหัส แต่ถ้ามันมีน้อยกว่า 5 ตัวอักษรตัวเล็ก

print("Hello, World!")เคล็ดลับคือการวิ่ง วิธีนี้สามารถใช้คือการใช้อีก_G["print"]("Hello, World!")ซึ่งใช้สตริง

แต่เราไม่สามารถใช้สตริงได้โดยตรงเนื่องจากข้อ จำกัด จำนวนตัวพิมพ์เล็กอย่างไรก็ตามคุณสามารถเรียกใช้("").charเพื่อรับฟังก์ชั่นstring.charที่สามารถแปลงจากชุดไบต์เป็นสตริง ฉันกำหนดให้ตัวแปรตัวพิมพ์ใหญ่ (ดังนั้นเราจึงไม่ถึงขีด จำกัด ) ดังนั้นเราจึงสามารถใช้มันเพื่อสร้างทั้งสตริงprintและHello, World!สตริงที่สามารถใช้ได้เหมือนด้านบน


อ่าทำได้ดีมาก! ฉันคิดว่าจะใช้nextแทนที่จะใช้charLua 5.3 ไม่ได้เนื่องจากคำสั่งการวนซ้ำ
tehtmi

3

JavaScript (ES6) โดย Voile

ข้อมูลที่ป้อนต้องเป็นสตริงที่มีสิ่งนี้:

e(
`\
_\
=\
>\
"\
H\
e\
l\
l\
o\
,\
 \
W\
o\
r\
l\
d\
!\
"\
+\
\`
\`
`)

ลองใช้สิ่งนี้:

const e=eval,p=''.split,c=''.slice,v=[].every,f=s=>(t=c.call(s),typeof s=='string'&&t.length<81&&v.call(p.call(t,`\n`),l=>l.length<3)&&e(t)(t))

input='e(\n`\\\n_\\\n=\\\n>\\\n\"\\\nH\\\ne\\\nl\\\nl\\\no\\\n,\\\n \\\nW\\\no\\\nr\\\nl\\\nd\\\n!\\\n\"\\\n+\\\n\\`\n\\`\n`)'
console.log(f(input))

หากคุณไม่สนใจข้อกำหนดการขึ้นบรรทัดใหม่สำหรับผลลัพธ์คุณสามารถแทนที่ 6 บรรทัดสุดท้ายด้วยสิ่งนี้แทน:

!"
`)

ฉันทำยังไง

ข้อ จำกัด ของอินพุตคือสตริงแต่ละบรรทัดยาวสองไบต์หรือน้อยกว่าและความยาวรวมคือ 80 ไบต์หรือน้อยกว่า ความพยายามครั้งแรกของฉันหลังจากที่เข้าใจอย่างถูกต้องคือ:

_
=>
`\
H\
e\
l\
l\
o\
,\
 \
W\
o\
r\
l\
d\
!
`

หมายเหตุ: \s จะละเว้นบรรทัดใหม่ในสตริงในอินพุต นี่เป็นสิ่งสำคัญอย่างยิ่งต่อคำตอบและฉันไม่อยากเชื่อเลยว่าฉันจะสะดุดเมื่อได้รับอุบัติเหตุ (ฉันคุ้นเคยกับมันมาก่อน แต่ลืมไปแล้ว)

แต่สิ่งนี้ไม่ได้ผลเนื่องจาก=>จะต้องอยู่ในบรรทัดเดียวกันกับข้อโต้แย้ง โชคดีที่ฉันมีความคิดในการห่อสิ่งที่คล้ายกันในสตริงและใส่ eval ในข้อมูลของฉันเพื่อลดลงหนึ่งบรรทัดทำให้เกิดคำตอบสุดท้ายของฉัน หลังจากที่ eval ในอินพุตเกิดขึ้นต่อไปนี้จะถูกสร้างขึ้นเป็นสตริง (ซึ่งจากนั้น eval'd ไปที่ฟังก์ชันแล้วเรียกใช้):

_=>"Hello, World!"+`
`

นี่เป็นเรื่องยากมากที่จะถอดรหัส แต่ฉันก็ประสบความสำเร็จในที่สุด

นอกจากนี้ยังมีการถอดรหัสครั้งแรก!


3

Cubicallyโดย MD XF

ฉันคิดว่านี่เป็นสิ่งที่อันตรายเสมอ แต่ฉันคิดว่าฉันมีรอยแตกรออยู่ว่าฉันถูกต้องแล้วว่ามีข้อผิดพลาดในล่าม (ซึ่งตอนนี้ฉันเพิ่งรวบรวม)

อินพุตของฉัน

0 1 0 1 0 1 0 1 1 0 1 0 0

การส่งออกขึ้นอยู่Hello, World!\n\n\n\n\n\n\n\n\n\n.....กับการขึ้นบรรทัดใหม่ที่ไม่สิ้นสุด

แต่ฉันสังเกตเห็นส่วนสุดท้ายของรหัส:

:1/1+1$(@6)7

ตั้งค่า notepad ให้เป็น0x0A(ขึ้นบรรทัดใหม่) ด้วยวิธีที่น่ากลัวอ่านอินพุตต่อหน้า 7 (หน้าอินพุต) จากนั้นพิมพ์ใบหน้า 6 หน้า (หน้า notepad) ซ้ำ ๆ จนกระทั่งหน้า 7 เป็นศูนย์ หากคุณตั้งค่าหน้า 7 เป็นศูนย์คุณควรได้หนึ่งบรรทัดใหม่เท่านั้น อย่างไรก็ตามฉันได้รับบรรทัดใหม่ที่ไม่มีที่สิ้นสุดและอินพุตที่ 13 ของฉันเป็นศูนย์และฉันสามารถตรวจสอบได้ว่า 7 ใบหน้าเสมอศูนย์โดยการใส่ "หมายเลขพิมพ์จาก 7 หน้า" ในลูป:

:1/1+1$(@6%7)7

จากนั้นมันจะพิมพ์\n0คู่ที่ไม่รู้จักจบ

ฉันกำลังดูรายละเอียดเกี่ยวกับหน้า GitHub Cubicallyและพฤติกรรมนี้ดูเหมือนมากอันยิ่งใหญ่เช่นข้อผิดพลาด การเปลี่ยนอักขระสุดท้ายของโปรแกรมต้นฉบับจาก a 7เป็น0ผลลัพธ์ในลักษณะการทำงานที่คาดไว้ ล่าม TIO แสดงพฤติกรรมที่ไม่ถูกต้องเหมือนกัน


ควรได้รับการแก้ไขทันทีที่ Dennis ดึงแบบไม่ต่อเนื่องมันจะได้รับการแก้ไขใน TIO
MD XF


2

C # (.NET Core) , Grzegorz Puławski

วิธีแก้ปัญหาที่ฉันพบนั้นใช้ตัวอักษรที่ไม่สามารถพิมพ์ได้อย่างมากมายดังนั้นความพยายามที่จะวางไว้ที่นี่ไม่ได้ผล ค่าไบต์สำหรับอินพุตคือ:

109, 89, 4, 121, 3, 11, 8, 29, 37, 38, 27, 25, 72, 4, 4, 4, 3, 3, 3, 4, 4, 37, 3, 27, 4, 3

หรือเวอร์ชันสตริงมีอยู่ในฟิลด์อินพุตของลิงก์ TIO

ลองออนไลน์!

โปรแกรมต้นฉบับจะใช้อักขระที่แตกต่างในอินพุตจากนั้นย้อนกลับอินพุตและคูณองค์ประกอบของสองรายการ ดังนั้นฉันสร้างสตริง 26 ตัวยาวที่ 13 ตัวแรกที่แตกต่างกันสุดท้าย 13 ตัวละครทุกตัวก็ปรากฏตัวขึ้นเป็นครั้งแรกในวันที่ 13 และคู่ของดัชนีแต่ละ[i, 26-i]คูณกับค่าไบต์ i-TH Hello, World!ตัวละครใน


เยี่ยมมาก! คุณสามารถข้ามกับดัก Take (a.First () - 33) มันทำให้ฉันรู้ว่าฉันลืม Disctinct on the Reverse แต่แหมดียังทำเพื่อความท้าทายที่ดีฉันคิดว่า นอกจากนี้ยังมี% 255 เพื่อให้คุณสามารถใช้ตัวเลขที่สูงขึ้นใน ASCII ที่พิมพ์ได้
Grzegorz Puławski

2

Ly , LyricLy

n[>n]<[8+o<]

2 25 92 100 106 103 79 24 36 103 100 100 93 64

ลองที่นี่ (แม้ว่าหน้าจะไม่แสดงบรรทัดใหม่)

nใช้เวลาในการป้อนข้อมูลพยายามที่จะแยกในช่องว่างและส่งไปยัง ints เหล่านี้ได้รับการวางในกอง oพิมพ์จุดลำดับและ8+ทำในสิ่งที่คิด ดังนั้นอินพุตจะต้องน้อยกว่า 8 codepoints ในการเรียงลำดับแบบย้อนกลับด้วยช่องว่าง


สิ่งนี้ไม่พิมพ์บรรทัดใหม่ที่ตามมาใช่หรือไม่
LyricLy

อ๊ะโอ๊ะโอแก้ไขได้อย่างง่ายดาย!
Jonathan Allan

... จริงเหรอ ฉันคิดว่า2จะใช้งานได้ - เป็นเพียงหน้า herokuapp ที่ไม่แสดงผลหรือไม่
Jonathan Allan

1
ใช่เพิ่มอีก 2 งาน หน้าเว็บไม่แสดงบรรทัดใหม่ต่อท้าย
LyricLy

2

C (gcc) โดย Felix Palmen

รหัสเดิม:

#define O(c)(((char**)v)+c)
#define W(c)*(O(c)-**O(2)+x)
main(x,v){puts(W(42));}

อาร์กิวเมนต์:

"Hello, World!" ","

ลองออนไลน์!

คำอธิบาย:

W(c)กำลังคำนวณที่อยู่ของสตริงจากรายการอาร์กิวเมนต์ที่ต้องการพิมพ์ มันเริ่มต้นด้วยที่อยู่ของอาร์กิวเมนต์ cth ( O(c)) ซึ่งเป็นอาร์กิวเมนต์ที่ 42 ในกรณีนี้จากนั้นลบอักขระตัวแรกของอาร์กิวเมนต์ที่สอง ( **O(2)) เป็นออฟเซ็ตจำนวนเต็มจากนั้นเพิ่มxซึ่งก็คือจำนวนอาร์กิวเมนต์

W(c)ใช้อาร์กิวเมนต์ที่สองเพื่อให้คุณรู้ว่าต้องมีอย่างน้อย 3 ข้อ (0, 1, 2) จากนั้น "สวัสดีโลก!" สามารถไปในอาร์กิวเมนต์แรกแล้วไปยังที่อยู่อาร์กิวเมนต์ที่คุณต้องการตัวละครที่มีค่า ASCII พอดีในสมการ "42-x + 3 = 1" ที่เกิดขึ้นเป็น ","


คำอธิบายที่ดีฉันจะแก้ไขโพสต์ของฉันทันทีที่ฉันบนเครื่องพีซี :)
เฟลิกซ์ Palmen

2

JavaScript: ThePirateBay

ฉันแทนที่valueOf()และวิธีการของวัตถุแจงเพื่อให้การบังคับขู่เข็ญว่าล้มเหลวด้วยtoString()TypeError

{"valueOf": 7, "toString": 7}

12
อืมฉันดูเหมือนจะไม่เข้าใจ กรุณาอธิบายอย่างละเอียดหรืออะไร? โดยเฉพาะอย่างยิ่งส่วนdalksdjalkdjaS djalksdjalksdjaมันทำให้ฉันสับสน
Erik the Outgolfer

@EriktheOutgolfer ฉันแก้ไขส่วนของสแปมออกไป แต่ฉันไม่รู้ว่าทำไมถึงอยู่ที่นั่น
NoOne อยู่ที่นี่

@EriktheOutgolfer โอ้ lol นั่นคือการหยุดคำตอบของฉันจากการแปลงเป็นความคิดเห็นโดยอัตโนมัติ
Maltysen

1
@Maltysen ดีมีการแก้ไขปุ่มขวามีซึ่งจะเป็นประโยชน์ในครั้งต่อไป;)
เอริก Outgolfer

2

6502 Assembly (C64) - Felix Palmen

คำตอบที่ถูกต้องคือ 52768,23

คำอธิบายเกี่ยวข้องเล็กน้อย

00 c0                          ;load address
20 fd ae      jsr $aefd        ; checks for comma
20 eb b7      jsr $b7eb        ; reads arguments

รหัสแรกจะตรวจสอบเครื่องหมายจุลภาค (จำเป็นต้องใช้ไวยากรณ์) จากนั้นอ่านในสองอาร์กิวเมนต์ซึ่งตัวแรกคือ WORD ซึ่งเก็บไว้แบบเอนด์เอนเดิ้ลในตำแหน่งหน่วยความจำ 0014 และ 0015 ซึ่งจะถูกเก็บไว้ใน X register

8a              TXA            ;Store second argument into A (default register)
0a              ASL            ; bitshifts the second argument left (doubles it)
45 14           EOR $14        ; XOR that with the low byte of first argument
8d 21 c0        STA $c021      ; Drop that later in the program

มันค่อนข้างฉลาดโดยใช้อินพุตของเราเพื่อเขียนโปรแกรมใหม่ ในที่สุดมันก็จะเขียนตัวนับสำหรับลูปเอาท์พุทในตอนท้ายของโปรแกรม

45 15           EOR $15        ; XOR that with the high byte of the first argument
85 15           STA $15        ; Put the result in $15
49 e5           EOR #$e5       ; XOR that with the number $e5
85 14           STA $14        ; Put that in $14

ส่วนที่คดเคี้ยวมาที่นี่:

8e 18 d0        STX $d018      ; stores the original second argument in d018

บน C64, d018 เป็นไบต์ที่สำคัญมาก มันเก็บจุดอ้างอิงสำหรับสิ่งต่าง ๆ ที่เกี่ยวข้องกับผลลัพธ์ของหน้าจอ ดูที่นี่สำหรับข้อมูลเพิ่มเติม หากสิ่งนี้ได้รับค่าที่ผิดมันจะทำให้ C64 ของคุณเสีย หากต้องการพิมพ์ตัวอักษรผสมและตัวพิมพ์เล็กผสมที่จำเป็นต้องมีค่านี้คือ $ 17

ตอนนี้เราเริ่มลูปเอาท์พุทของเรา:

a0 00               ldy #$00       ; zeroes out the Y register
b1 14               lda ($14),y    ; puts the memory referenced by the byte
                                   ;   starting at $14 (remember that byte?)
                                   ;   into the default register
20 d2 ff            jsr $ffd2      ; calls the kernal routine to print the char stored in A
c8                  iny            ; increment Y
c0 0e               cpy #$0e       ; test for equality with the constant $0e

ค่าคงที่นั่นคือสิ่งที่ได้เขียนไปก่อนหน้านี้ มันกำหนดระยะเวลาการวนซ้ำอย่างชัดเจน มันเป็นค่าที่ถูกต้องแล้ว แต่เราต้องติด 0e ที่นั่นอีกครั้ง

d0 f6                   bne *-8        ; jump back 8 bytes if y and that constant weren't equal
60                      rts            ; ends the program

ส่วนที่เหลือเป็นเพียงข้อมูลที่เราจำเป็นต้องพิมพ์โดยเริ่มจากที่อยู่หน่วยความจำ c025

ดังนั้นจึงเป็นเพียงแค่ติดตามคณิตศาสตร์จากที่นั่น


ขอแสดงความยินดีอย่างถูกต้อง อาจใช้เวลาสักครู่ในการแก้ไขโพสต์ของฉันอย่างเหมาะสมตอนนี้ฉันอยู่บนมือถือ
เฟลิกซ์ Palmen

d018 นั้นฉลาดมากและฉันชอบวิธีที่คุณโพสต์คำใบ้อย่างลับ ๆ
ชายทอง

d018 เป็นผู้เปิดประตูที่ตั้งใจ ... คำใบ้นั้นไม่ได้ตั้งใจฉันหมายถึง $FFนั่น แต่ก็ตัดสินใจออกไป
เฟลิกซ์ Palmen

2

รหัสเครื่อง 6502 (C64) - Felix Palmen

คำตอบที่ถูกต้องคือ

8bitsareenough

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

นี่คือการถอดรหัสที่เป็นประโยชน์เล็กน้อยเพื่อช่วยให้เข้าใจว่าเกิดอะไรขึ้น ไวยากรณ์สำหรับ KickAssembler

*=$c000       // LOAD ADDRESS
jsr $aefd     //checks for a comma
jsr $ad9e     /*Reads in an argument. Stores length of it into
                $61, with the address of the stored arg in $62-3*/
jsr $b6a3     /*Evaluates the string, leaving the pointer on $22-3
                and the length on A*/ //I think

ldy #$00
loop: lda thedata,y   
cpy #$01
beq shuffle
cpy #$07
beq shuffle
cpy #$0b
beq shuffle
tricks: jsr output
iny
bne loop
output: eor ($22),y      //XOR's A with the y-eth letter of our input
jmp $ffd2               //good old CHROUT, returns to tricks above
thedata: .byte $f0,$48,$fa,$a2, $1c,$6d,$72,$30
.byte $06,$a9,$03,$48,$7c,$a3
shuffle: sta $c048      //drops A in mystery+4, over the constant
lda $c026,y
sta $c045               //overwrites the low byte of mystery
lda $c027,y
sta $c046               //overwrites the high byte of mystery
ldx #$00
mystery: lda $aefd,x              
eor #$23
jsr output
iny
inx
cpx #$03
bne mystery
cpy #$0e
bne loop
eor #$1a
sta $d018                
rts

การติดฉลากมันแบบนี้ก็เพียงพอแล้วสำหรับฉันที่จะเห็นว่ารหัส XORs เป็นค่าคงที่ที่ซ่อนอยู่รอบ ๆ เพื่อพิมพ์สิ่งที่เราต้องการ เนื่องจาก XOR สามารถย้อนกลับได้ถ้าคุณป้อนเอาต์พุตที่ต้องการมันจะบอกคุณว่าสำคัญคืออะไร

ดังนั้นฉันจึงเปลี่ยนบรรทัดสุดท้าย

/*from sta $d018 
to*/ jsr $ffd2

ดังนั้นมันจะพิมพ์อินพุตที่ต้องการล่าสุดแทนที่จะหยุดทำงานในอินพุตที่ไม่ถูกต้อง

และนั่นคือ!

หากมีความสนใจฉันจะถอดรหัสรหัสเพิ่มเติม


ว้าวนี่อันที่จริงแล้วเป็นทางลัดขนาดใหญ่ฉันน่าจะบังคับให้เกิดการขัดข้อง ป้อนข้อมูลผิดพลาดก่อนหน้านี้ในการประมวลผล มีอีกเป็นทางลัดviceไปได้ครับโดยใช้ดีบักของ แต่อะไรก็ตามมันเป็นทางออกที่ถูกต้อง
เฟลิกซ์ Palmen

ฉันไม่รู้ว่ารองมีบั๊ก นี่คือสิ่งที่ฉันได้รับจากการเรียนรู้ภาษาเพื่อแยกคำตอบ
ชายทอง

แก้ไขโพสต์ของฉันพร้อมคำอธิบายบางอย่าง ดีมากเพียงแค่ปรับเปลี่ยนโปรแกรมเพื่อไม่ให้เกิดข้อผิดพลาดแน่นอนเป็นวิธีที่ค่อนข้างชัดเจนฉันไม่ได้คิดถึงสิ่งนี้
เฟลิกซ์ Palmen

Nitpick: " drops A in mystery+1, over the constant" <- ที่จริงแล้วmystery+4มีป้ายกำกับของคุณ Offests อยู่ในหน่วยไบต์ :) และ FWIW การปรับเปลี่ยนด้วยตนเองนั้นค่อนข้างพบได้ทั่วไปในรหัส 6502 ที่ร้ายแรงตราบใดที่โค้ดนั้นรันจาก RAM
เฟลิกซ์ Palmen

1

ระเบิด , ไก่ขั้นตอน

@_?&4_-j>5&f^~c>&6\|4>7

Rh / ฉี? WCR + ดู่

ลองออนไลน์!

  • พยายามหาว่า "นักสำรวจ" ทุกคนทำอะไรเจ็บหัวมากเกินไปดังนั้นฉันก็เลยออกแบบวิศวกรรมย้อนกลับ (ตัวอักษร: p - เริ่มจากตัวอักษรที่ถูกต้องที่สุดที่ฉันชดเชยให้แต่ละตัวตาม [และบริเวณใกล้เคียง] ช่วงของตัวอักษรที่พิมพ์ได้) .

ทำได้ดีมาก :) ฉันจะเพิ่มคำอธิบายในอีกสองสามชั่วโมงเมื่อฉันกลับมาที่พีซี
Stephen

1

C (tcc) โดย Joshua

int puts(const char *s)
{
    printf("Hello, World!%s", s);
}

ลองออนไลน์!


ยี้ ฉันมีรอยแตกที่แน่นอน แต่ไม่สามารถทำให้ TIO ทำงานได้ +1
MD XF

ขอโทษด้วยนะ Fwiw ได้รับการแก้ไขแล้ว
เดนนิส

คุณรู้ว่าปัญหาคืออะไร?
MD XF

ฉันรู้ว่าฉันแก้ไขได้อย่างไร (ต้องสร้างด้วยการสนับสนุน SELinux) แต่ฉันไม่แน่ใจว่ามันทำอะไรหรือทำไมมันจำเป็นในตอนแรก
เดนนิส


1

เยลลี่จากโจนาธานอัลลัน

รหัสเดิม:

œ?“¥ĊɲṢŻ;^»œ?@€⁸ḊFmṪ⁷

ลองออนไลน์!

การป้อนข้อมูล:

1,2586391,2949273,3312154,3312154,1134001,362881,2223505,766081,1134001,1497601,3312154,1860601,140

คำอธิบาย:

ส่วนใหญ่มีความจำเป็นต้องเข้าใจสิ่งที่รหัสทำ สิ่งแรกที่มันทำก็คือมันต้องใช้สาย"!,Word Hel"(กับตัวละครที่ต้องการทั้งหมดยกเว้นการขึ้นบรรทัดใหม่) และสร้างการเรียงสับเปลี่ยนของพวกเขา อินพุตระบุหมายเลขการเรียงสับเปลี่ยนและการเปลี่ยนลำดับแต่ละคู่จากอินพุตถูกนำไปใช้กับสตริงที่แยกคู่ซึ่งจะใช้การเปลี่ยนลำดับแรกก่อน โดยทั่วไป P2 (P1 (S)), P2 (P2 (S), P2 (P3 (S)), ... , P2 (PN (S)), P3 (P1 (S)), ... , P3 (PN (S)), ... ... , PN (P1 (S)), ... , PN (PN (S)) สิ่งเหล่านี้ถูกรวมเข้าด้วยกันจากนั้นอินพุตสุดท้ายจะถูกนำกลับมาใช้ใหม่เพื่อนำ PNth ทุกอัน ตัวละครจากสตริงใหญ่นี้ดังนั้นฉันจึงใช้ PN = len (S) * N = 10 * N ซึ่งหมายความว่าเราจะใช้อักขระตัวแรกของ P2 (P1 (S)) ซึ่งเป็นอักขระตัวแรกของ P3 (P1 (S) )) ไปจนถึงอักขระตัวแรกของ PN (P1 (S)) เพื่อให้ง่ายขึ้นต่อไปฉันปล่อยให้ P1 = 1 ซึ่งเป็นการเปลี่ยนรูปแบบตัวตนจากนั้นพอเลือก P2 ใด ๆ ที่อนุญาตให้ "H" ลงในอันแรก ตำแหน่ง, P3 ที่อนุญาตให้ "e" อยู่ในตำแหน่งที่หนึ่งเป็นต้น โชคดีที่ตัวเลขการเปลี่ยนแปลงขนาดเล็กอย่างที่เลือกไว้สำหรับ PN ไม่ส่งผลกระทบต่ออักขระก่อนหน้าในสตริงดังนั้น PN จึงทิ้ง "!" ที่จุดเริ่มต้นของสตริง (หากนี่ไม่เป็นจริงก็ยังเป็นไปได้ที่จะแก้ปัญหาโดยเลือก P1 อื่น)


ใช้การเรียงสับเปลี่ยน 14 รายการของการเปลี่ยนลำดับ 14, แบน, dequeues และจากนั้นใช้ทุก ๆ 140 ตัวอักษร
Jonathan Allan

1

C (GCC บน TIO) โดย MD XF

4195875

ลองออนไลน์!

อย่างไร?

มันพยายามที่จะพิมพ์อาร์กิวเมนต์ที่สองเป็นสตริงซึ่งเป็นตัวชี้ที่เราสามารถกำหนดในการป้อนข้อมูล มันเกิดขึ้นที่ตำแหน่งหน่วยความจำ4195875เริ่มต้น"Hello, World!\n"สตริง

จำนวนถูกกำหนดโดยการเพิ่มprint("%p", "Hello, World!");ก่อนprintf, แปลงเลขฐานสิบหกให้เป็นทศนิยมและลองใช้กับ TIO ดั้งเดิม อย่างไรก็ตามมันแสดงให้ฉันเห็นprintfสตริงรูปแบบ โดยการลองตัวเลขฉันพบว่าสตริงนั้นอยู่ก่อนสตริงรูปแบบ

ดังนั้นในหน่วยความจำจะมีลักษณะเช่นนี้ (เป็นสตริง C):

Hello, World!\n\0%2$s\0

นี่ก็หมายความว่าการอัพเดทใด ๆ กับคอมไพเลอร์อาจทำให้โซลูชันแตก






1

JavaScript (ES6), Voile

เนื่องจากขีด จำกัด 81 ตัวอักษรนี่อาจไม่ใช่โซลูชันที่ตั้งใจ

global.g = ()=>"Hello, World!";
var str = "g";

ลองออนไลน์!


สะดวกปลอดภัยประหยัดไฟ ผ่านหนึ่งอักขระถ่านด้วยการจัดการระดับโลก ดูเหมือนว่ามันเป็นทางออกที่ตั้งใจไว้
ЕвгенийНовиков

นั่นไม่ใช่วิธีแก้ปัญหาที่ตั้งใจไว้ :(
Voile

ตอนนี้ฉันกำลังคิดเกี่ยวกับมันฉันไม่คิดว่ามันจะอนุญาตให้ทำสิ่งต่าง ๆ เช่นนี้ก่อนที่จะส่งผ่านข้อมูลในฟังก์ชั่นเว้นแต่ว่าสิ่งต่าง ๆ สามารถถูกแต่งขึ้นเป็นส่วนหนึ่งของอินพุต (เช่นภายในฟังก์ชันซึ่งจะเป็น ประเมินผลภายใน) เนื่องจากความท้าทายต้องการให้คุณป้อนข้อมูลที่จะส่งผลให้ 'Hello, World!' ไม่ใช่โปรแกรมเต็มรูปแบบ ไม่อย่างนั้นจะปลอดภัย ดังนั้นฉันคิดว่ารอยแตกนี้อาจไม่ถูกต้อง?
Voile

@Voile มันอาจจะเป็นอย่างดี ฉันคิดว่ามันยุติธรรมที่จะอ่านงานราวกับว่าอินพุตต้องอยู่คนเดียว (เช่นไม่มีการเปลี่ยนแปลงระบบภายนอก) - โดยเฉพาะอย่างยิ่งถ้านี่ไม่ใช่วิธีการแก้ปัญหาที่ตั้งใจ :) ไม่จำเป็นต้องทำเครื่องหมายตำรวจของคุณเป็นรอยร้าว
Birjolaxew

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