ท้าทาย : เขียนไฟล์สคริปต์เดียวfoo.cmd
ซึ่งสามารถเรียกจากวานิลลาของ Windows cmd.exe
พรอมต์ (ไม่ PowerShell ไม่ได้อยู่ในโหมดผู้ดูแลระบบ) ในการดำเนินการ Windows รหัสเฉพาะพล ...
> .\foo.cmd
Hello Windows!
... แต่ยังถูกเรียกไม่เปลี่ยนแปลงจากปกติ POSIX สอดคล้อง (Linux / OSX) เปลือกพรอมต์ ( bash
, tcsh
หรือzsh
) ในการดำเนินการโดยพลการรหัส POSIX เฉพาะ:
$ chmod a+x foo.cmd
$ ./foo.cmd
Hello POSIX!
... โดยไม่ต้องมีการติดตั้งหรือสร้างล่าม / เครื่องมือของบุคคลที่สาม
ฉันรู้ว่ามันเป็นไปได้ แต่ด้วย cruft (เช่นใน Windows บรรทัดข้อความขยะ / ข้อผิดพลาดหนึ่งหรือสองบรรทัดจะถูกพิมพ์ไปยัง stderr หรือ stdout ก่อน "Hello Windows!")
เกณฑ์ที่ชนะคือการลดจำนวนของบรรทัด cruft (แรก) และ (วินาที) จำนวนอักขระ cruft
Cruft สามารถกำหนดเป็นเอาท์พุทของคอนโซล (stdout หรือ stderr) ที่ไม่ได้ผลิตโดยรหัส payload (ตามอำเภอใจ) บรรทัดว่างจะถูกนับในการนับบรรทัด บรรทัดใหม่จะไม่ถูกนับในการนับตัวละคร คะแนน Cruft ควรจะถูกนำมารวมกันในทั้งสองแพลตฟอร์ม เรามองข้ามกลไกแบบนี้cls
ไปเพื่อกำจัด cruft แต่ก็ต้องทำการตัดเอาท์พุทของเทอร์มินัลก่อนหน้าด้วย หาก Windows สะท้อนคำสั่งของคุณเนื่องจากคุณยังไม่ได้เปิดใช้@echo off
งานให้แยกอักขระที่ใช้ในการพิมพ์ไดเรกทอรีปัจจุบันและพรอมต์
เกณฑ์รองคือความเรียบง่าย / ความสง่างามของโซลูชันภายในfoo.cmd
: ถ้า "โครงสร้างพื้นฐาน" ถูกกำหนดเป็นอักขระใด ๆ ที่ไม่เกี่ยวข้องโดยตรงในรหัส payload โดยพลการจากนั้นลดจำนวนบรรทัดที่มีอักขระโครงสร้างพื้นฐานเป็นอันดับแรกและลดจำนวนโครงสร้างพื้นฐานเป็นอันดับสอง ตัวละคร
ความรุ่งโรจน์เพิ่มเติมหากส่วน POSIX จะทำงานแม้จะมีไฟล์ที่มี CRLF line-endings! (ไม่แน่ใจว่าส่วนสุดท้ายเป็นไปได้หรือไม่)
โซลูชันที่มีอยู่ของฉันซึ่งฉันจะโพสต์ที่นี่เมื่อคนอื่นมีโอกาสใช้รหัสโครงสร้างพื้นฐาน 6 บรรทัด (52 ตัวอักษรยกเว้นบรรทัดใหม่) มันสร้าง cruft 5 บรรทัดโดยที่สองบรรทัดนั้นว่างเปล่าทั้งหมดนั้นเกิดขึ้นบน Windows (30 chars ยกเว้นการขึ้นบรรทัดใหม่และไม่รวมสตริงไดเรกทอรี / พรอมต์ปัจจุบันที่ปรากฏบนสองบรรทัดเหล่านั้น)