ไซต์นี้มีปัญหามากมายเกี่ยวกับการใช้ภาษาต่างๆในแท็กล่าม อย่างไรก็ตามจริง ๆ แล้วพวกเขาทั้งหมดเป็นภาษาลึกลับที่ไม่มีใครใช้ ใช้เวลาในการสร้างล่ามสำหรับภาษาที่ใช้งานได้จริงซึ่งผู้ใช้ส่วนใหญ่ที่นี่อาจรู้จักอยู่แล้ว ใช่มันเป็นเชลล์สคริปต์ในกรณีที่คุณมีปัญหาในการอ่านชื่อ (ไม่ใช่ว่าคุณมี) (ใช่ฉันตั้งใจทำสิ่งนี้อย่างท้าทายเพราะฉันเบื่อภาษาอย่าง GolfScript และ Befunge ชนะทุกอย่างดังนั้นฉันจึงวางความท้าทายที่ภาษาการเขียนโปรแกรมเชิงปฏิบัติมากขึ้นมีโอกาสชนะมากขึ้น)
อย่างไรก็ตามเชลล์สคริปต์เป็นภาษาที่ค่อนข้างใหญ่ดังนั้นฉันจะไม่ขอให้คุณใช้มัน ฉันจะสร้างชุดย่อยของฟังก์ชันเชลล์สคริปต์แทน
ชุดย่อยที่ฉันเลือกคือชุดย่อยต่อไปนี้:
- การดำเนินการโปรแกรม (โปรแกรมจะมีตัวอักษรเท่านั้นแม้ว่าจะอนุญาตให้ใช้เครื่องหมายคำพูดเดี่ยว)
- ข้อโต้แย้งของโปรแกรม
- เครื่องหมายคำพูดเดี่ยว (ยอมรับอักขระ ASCII ที่พิมพ์ได้รวมถึงช่องว่างยกเว้นคำพูดเดียว)
- สตริงที่ไม่ได้ระบุไว้ (อนุญาตให้ตัวอักษรตัวเลขและขีดกลาง ASCII)
- ท่อ
- งบเปล่า
- หลายคำสั่งคั่นด้วยบรรทัดใหม่
- ส่วนต่อท้าย / นำหน้า / หลายช่องว่าง
ในภารกิจนี้คุณต้องอ่านอินพุตจาก STDIN และรันทุกคำสั่งที่ร้องขอ คุณสามารถสมมติระบบปฏิบัติการที่รองรับ POSIX ได้อย่างปลอดภัยดังนั้นจึงไม่จำเป็นต้องพกพากับ Windows หรืออะไรทำนองนั้น คุณสามารถสรุปได้อย่างปลอดภัยว่าโปรแกรมที่ไม่ได้ถูกไพพ์ไปยังโปรแกรมอื่นจะไม่อ่านจาก STDIN คุณสามารถสันนิษฐานได้อย่างปลอดภัยว่าคำสั่งนั้นจะมีอยู่ คุณสามารถสรุปได้อย่างปลอดภัยว่าจะไม่มีการใช้อะไรอีก หากข้อสันนิษฐานที่ปลอดภัยถูกทำลายคุณสามารถทำอะไรก็ได้ คุณสามารถสรุปได้อย่างปลอดภัยที่สุด 15 ข้อโต้แย้งและบรรทัดที่ต่ำกว่า 512 ตัวอักษร (ถ้าคุณต้องการการจัดสรรหน่วยความจำอย่างชัดเจนหรือบางสิ่งบางอย่าง - ฉันจะให้โอกาสน้อยมากในการชนะ C แม้ว่ามันจะยังเล็กก็ตาม) คุณไม่ต้องล้างไฟล์ descriptors
คุณได้รับอนุญาตให้รันโปรแกรมได้ทุกเมื่อ - แม้หลังจากได้รับข้อมูลเต็มบรรทัดหรือหลังจาก STDIN สิ้นสุดลง เลือกแนวทางใดก็ได้ที่คุณต้องการ
ตัวอย่างง่ายๆที่ให้คุณทดสอบเชลล์ของคุณ (สังเกตช่องว่างการสืบค้นหลังจากคำสั่งที่สาม):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
โปรแกรมด้านบนควรแสดงผลลัพธ์ดังนี้
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
คุณไม่ได้รับอนุญาตให้เรียกใช้งานเชลล์เองยกเว้นว่าคุณไม่มีข้อโต้แย้งใด ๆ สำหรับคำสั่ง (ข้อยกเว้นนี้ถูกสร้างขึ้นสำหรับ Perl ซึ่งจะรันคำสั่งในเชลล์เมื่อใส่อาร์กิวเมนต์เพียงsystem
แต่อย่าลังเลที่จะใช้ข้อยกเว้นนี้สำหรับผู้อื่น ภาษาด้วยหากคุณสามารถทำได้ในลักษณะที่ช่วยประหยัดอักขระ) หรือคำสั่งที่คุณใช้คือเชลล์เอง นี่อาจเป็นปัญหาที่ใหญ่ที่สุดในการท้าทายนี้เนื่องจากมีหลายภาษาที่มีsystem
ฟังก์ชั่นที่ใช้เชลล์ ใช้ API ภาษาที่เรียกใช้โปรแกรมโดยตรงเช่นsubprocess
โมดูลใน Python นี่เป็นความคิดที่ดีสำหรับความปลอดภัยอย่างไรก็ตามคุณไม่ต้องการสร้างเชลล์ที่ไม่ปลอดภัยคุณต้องการทำอะไร? สิ่งนี้น่าจะหยุด PHP แต่มีภาษาอื่นให้เลือกอยู่ดี
หากคุณกำลังจะทำให้โปรแกรมของคุณในสคริปต์เปลือกคุณจะไม่ได้รับอนุญาตให้ใช้eval
, source
หรือ.
(ในขณะที่ฟังก์ชั่นไม่ได้ตัวอักษร) มันจะทำให้การท้าทายง่ายเกินไปในความคิดของฉัน
อนุญาตการละเมิดกฎที่ฉลาด มีหลายสิ่งที่ฉันไม่อนุญาตอย่างชัดเจน แต่ฉันเกือบแน่ใจว่าคุณยังได้รับอนุญาตให้ทำสิ่งที่ฉันไม่ได้คิด บางครั้งฉันก็แปลกใจที่ผู้คนตีความกฎของฉัน นอกจากนี้จำไว้ว่าคุณสามารถทำอะไรก็ได้เพื่อสิ่งที่ฉันไม่ได้พูดถึง ตัวอย่างเช่นถ้าฉันพยายามใช้ตัวแปรคุณสามารถล้างฮาร์ดดิสก์ (แต่โปรดอย่า)
รหัสที่สั้นที่สุดชนะเช่นนี้เป็น codegolf