ในตอนท้ายของการสัมภาษณ์ผู้สัมภาษณ์ที่ชั่วร้ายจะบอกคุณว่า "เราทำให้ผู้สมัครของเราทั้งหมดทำการทดสอบการเข้ารหัสสั้น ๆ เพื่อดูว่าพวกเขารู้จริง ๆ ว่าพวกเขากำลังพูดถึงอะไรอยู่อย่ากังวลมันเป็นเรื่องง่ายและถ้าคุณสร้าง โปรแกรมทำงานฉันจะเสนองานให้คุณทันที " เขาทำท่าให้คุณนั่งลงที่คอมพิวเตอร์ใกล้ ๆ "สิ่งที่คุณต้องทำคือสร้างโปรแกรม Hello World ที่ใช้งานได้ แต่" - และเขายิ้มกว้าง - "มีสิ่งที่น่าเสียดาย แต่คอมไพเลอร์เดียวที่เรามีในเครื่องนี้มีบั๊กเล็ก ๆ มันสุ่มลบอักขระหนึ่งตัวจาก ไฟล์ซอร์สโค้ดก่อนคอมไพล์ตกลงเห็นคุณในห้านาที! " และเขาก็เดินออกจากห้องพร้อมผิวปากอย่างมีความสุข
คุณรับประกันได้ไหมว่าคุณจะได้งานทำ?
งาน
เขียนโปรแกรมที่จะพิมพ์Hello, world!
ไปยังเอาต์พุตมาตรฐานแม้หลังจากลบอักขระเดี่ยวจากตำแหน่งใด ๆ ในไฟล์ หรือมาใกล้เคียงกับสิ่งนี้มากที่สุด
กฎระเบียบ
ไม่มี Extraneous Output - Hello, world!
ต้องเป็นสิ่งสำคัญเพียงอย่างเดียวที่พิมพ์ไปยังเอาต์พุตมาตรฐาน มันก็โอเคที่จะรวมตัวละครอื่น ๆ หากพวกเขาถูกสร้างขึ้นตามภาษาที่คุณเลือกเช่นบรรทัดใหม่หรือแม้กระทั่งสิ่งที่ชอบ[1] "Hello, world!"
(ตัวอย่างเช่นถ้าคุณใช้ R) แต่มันจะต้องพิมพ์สิ่งเดียวกันทุกครั้ง ไม่สามารถพิมพ์Hello, world!Hello, world!
หรือHello world!" && x==1
บางครั้งตัวอย่างเช่น อย่างไรก็ตามคำเตือนได้รับอนุญาต
การทดสอบเพื่อทดสอบคะแนนของคุณคุณจะต้องทดสอบการเปลี่ยนแปลงที่เป็นไปได้ของโปรแกรมแต่ละรายการ: ทดสอบด้วยการลบอักขระแต่ละตัวออกและดูว่ามันสร้างผลลัพธ์ที่ถูกต้องหรือไม่ ฉันได้รวมโปรแกรม Perl อย่างง่ายสำหรับจุดประสงค์นี้ไว้ด้านล่างซึ่งควรใช้ได้กับหลายภาษา ถ้ามันไม่ได้ผลสำหรับคุณโปรดสร้างโปรแกรมทดสอบและรวมไว้ในคำตอบของคุณ
เกณฑ์การให้คะแนนคะแนนของคุณจะจำนวนครั้งที่โปรแกรมของคุณล้มเหลว กล่าวอีกนัยหนึ่งจำนวนตำแหน่งแต่ละตำแหน่งในไฟล์ของคุณที่การลบอักขระทำให้โปรแกรมไม่ทำงาน คะแนนต่ำสุดชนะ ในกรณีที่เสมอกันรหัสที่สั้นที่สุดจะเป็นผู้ชนะ
วิธีแก้ปัญหาเล็กน้อยเช่น"Hello, world!"
ในหลายภาษา (คะแนน 15) เป็นที่ยอมรับ แต่พวกเขาจะไม่ชนะ อย่างน้อยฉันก็พบวิธี Perl ด้วยคะแนน 4 ซึ่งฉันจะโพสต์ในที่สุด
UPDATE: ผู้ชนะอย่างเป็นทางการจะใช้ภาษาการเขียนโปรแกรมทัวริงสมบูรณ์และจะไม่ใช้กลไกที่กำหนดไว้ล่วงหน้าใด ๆ Hello, world!
ที่พิมพ์ ทรัพยากรภายนอกใด ๆ (นอกเหนือจากไลบรารีมาตรฐานสำหรับภาษาของคุณ) ที่ใช้นั้นถือเป็นส่วนหนึ่งของโปรแกรมของคุณและอยู่ภายใต้การลบ 1 ตัวอักษรเดียวกัน ข้อกำหนดเหล่านี้ติดอยู่ที่โต๊ะทำงานบนโน้ตโพสต์ - อิท ขอโทษถ้าคุณไม่เห็นพวกเขาในตอนแรก
อัปเดต 2:ใช่โปรแกรมของคุณจะต้องทำงานให้สำเร็จตามที่อธิบายไว้ข้างต้นเพื่อรับคะแนน! หมายความว่าควรพิมพ์สำเร็จHello, world!
อย่างน้อยหนึ่งครั้ง สิ่งนี้น่าจะชัดเจน สวิตช์บรรทัดคำสั่งและการตั้งค่าอื่น ๆ ที่เพิ่มฟังก์ชันการทำงานยังนับเป็นส่วนหนึ่งของโปรแกรมของคุณและอยู่ภายใต้การลบอักขระเดียว โปรแกรมจะต้องทำงานให้สำเร็จโดยที่ผู้ใช้ไม่ต้องป้อนข้อมูลใด ๆ ความล้มเหลวในการรวบรวมจำนวนในการนับความล้มเหลวของคุณ
การเขียนโปรแกรมที่มีความสุขและคุณอาจได้งาน แต่ถ้าคุณล้มเหลวคุณอาจไม่ต้องการทำงานให้เจ้านายชั่วร้ายคนนั้นอยู่ดี
สคริปต์ทดสอบ Perl:
use warnings;
use strict;
my $program = 'test.pl';
my $temp_file = 'corrupt.pl';
my $command = "perl -X $temp_file"; #Disabled warnings for cleaner output.
my $expected_result = "Hello, world!";
open my $in,'<',$program or die $!;
local $/; #Undef the line separator
my $code = <$in>; #Read the entire file in.
my $fails = 0;
for my $omit_pos (0..length($code)-1)
{
my $corrupt = $code;
$corrupt =~ s/^.{$omit_pos}\K.//s; #Delete a single character
open my $out,'>',$temp_file or die $!;
print {$out} $corrupt; #Write the corrupt program to a file
close $out;
my $result = `$command`; #Execute system command.
if ($result ne $expected_result)
{
$fails++;
print "Failure $fails:\nResult: ($result)\n$corrupt";
}
}
print "\n$fails failed out of " . length $code;
Hello, World!
ไม่ถูกพิมพ์นั้นเป็นความล้มเหลว