Fault-Tolerant Hello World (ตอนสัมภาษณ์)


66

ในตอนท้ายของการสัมภาษณ์ผู้สัมภาษณ์ที่ชั่วร้ายจะบอกคุณว่า "เราทำให้ผู้สมัครของเราทั้งหมดทำการทดสอบการเข้ารหัสสั้น ๆ เพื่อดูว่าพวกเขารู้จริง ๆ ว่าพวกเขากำลังพูดถึงอะไรอยู่อย่ากังวลมันเป็นเรื่องง่ายและถ้าคุณสร้าง โปรแกรมทำงานฉันจะเสนองานให้คุณทันที " เขาทำท่าให้คุณนั่งลงที่คอมพิวเตอร์ใกล้ ๆ "สิ่งที่คุณต้องทำคือสร้างโปรแกรม 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;

1
อักขระที่ถูกลบสามารถทำให้โปรแกรมไม่สามารถคอมไพล์ได้หรือไม่? นั่นยังนับว่าไม่ทำงานใช่ไหม
35818 Lochok

@lochok ใช่ว่าจะนับเป็นความล้มเหลว อักขระที่ถูกลบใด ๆ ซึ่งนำไปสู่การHello, World!ไม่ถูกพิมพ์นั้นเป็นความล้มเหลว

2
คำถามที่คล้ายกัน: codegolf.stackexchange.com/questions/4486/…
mowwwalker

@ Walerneo ขอบคุณ! ฉันค้นหาคำถามที่คล้ายกันและไม่พบคำถามนั้น ฉันคิดว่านี่แตกต่างกันอย่างมาก โดยเฉพาะอย่างยิ่งคำถามนั้นรับประกันได้ว่าจะต้องมีการจัดการเฉพาะการแก้ไขที่เกิดขึ้นในรหัสที่ถูกต้อง syntactically

คุณสามารถยกตัวอย่างของ "สวิตช์บรรทัดคำสั่งและการตั้งค่าอื่น ๆ ที่เพิ่มฟังก์ชันการทำงาน" ได้หรือไม่? คุณหมายถึงสวิตช์และการตั้งค่าที่กำหนดให้กับโปรแกรมเองหรือใช้สวิตช์และการตั้งค่าภายในสภาพแวดล้อมการสร้างหรือไม่
CasaDeRobison

คำตอบ:


129

Befunge คะแนน 0

ฉันคิดว่าฉันแตกมัน - ไม่มีการลบตัวอักษรเดียวที่จะเปลี่ยนผลลัพธ์
การลบอักขระใด ๆ จากบรรทัดที่ 1 จะไม่เป็นการเปลี่ยนแปลงอะไรเลย - มันยังคงลงที่เดิม
บรรทัดที่ 2 และ 3 ซ้ำซ้อน โดยปกติแล้วบรรทัดที่ 2 จะถูกดำเนินการ แต่ถ้าคุณลบอักขระออกจากนั้น<จะพลาดและบรรทัดที่ 3 จะมีค่าใช้จ่าย
การลบบรรทัดใหม่จะไม่ทำให้แตก (เช่นทำให้เวอร์ชันก่อนหน้าของฉันเสียหาย)
ไม่มีโปรแกรมทดสอบขอโทษ

แก้ไข : ทำให้ง่ายขึ้นมาก

                              vv
@,,,,,,,,,,,,,"Hello, world!"<<
@,,,,,,,,,,,,,"Hello, world!"<<

คำอธิบายสั้น ๆ เกี่ยวกับการไหล:

  1. Befunge เริ่มดำเนินการจากด้านบนซ้ายขยับไปทางขวา ช่องว่างไม่ทำอะไรเลย
  2. v เปลี่ยนการไหลของการประมวลผลลงดังนั้นมันจะลงหนึ่งบรรทัด
  3. < หมุนโฟลว์การประมวลผลไปทางซ้ายดังนั้นมันจะอ่านบรรทัดที่ 2 ในลำดับที่กลับกัน
  4. "Hello, world!"ดันสตริงไปยังสแต็ก มันผลักในลำดับที่กลับกันเพราะเราดำเนินการจากขวาไปซ้าย
  5. ,ปรากฏอักขระและพิมพ์ อักขระตัวสุดท้ายที่พุชถูกพิมพ์ก่อนซึ่งจะกลับสตริงอีกครั้ง
  6. @ ยุติโปรแกรม

2
+1 ทางออกที่ดี ฉันไม่คิดว่าจำเป็นต้องมีโปรแกรมทดสอบเพราะเห็นได้ชัดว่ามีการลบที่สำคัญเพียงเล็กน้อยเท่านั้น

4
ง่ายต่อการตรวจสอบและไม่เกี่ยวข้องกับการสนทนา Genius!
Karma Fusebox

ขอแสดงความยินดีกับทางออกที่ยอดเยี่ยม

2
ฉันรู้ว่านี้ไม่ได้เป็นรหัสกอล์ฟแต่นี่เป็นรุ่นใน66 ไบต์
MD XF

42

Perl, คะแนน 0

(147 ตัวอักษร)

นี่คือทางออกของฉันซึ่งฉันได้รับจาก 4 ลงไปที่ 0:

eval +qq(;\$_="Hello, world!";;*a=print()if length==13or!m/./#)||
+eval +qq(;\$_="Hello, world!";;print()if*a!~/1/||!m/./#)##)||
print"Hello, world!"

มันจะต้องปรากฏขึ้นทั้งหมดในหนึ่งบรรทัดเพื่อทำงาน; การแบ่งบรรทัดสำหรับ "การอ่าน" เท่านั้น

มันได้รับประโยชน์จากไวยากรณ์อนุญาตของพยาธิวิทยา Perl ไฮไลท์บางส่วน:

  • Barewords ที่ไม่ได้รับการยอมรับจะถือว่าเป็นสตริง ดังนั้นเมื่อevalกลายเป็นevlนั่นไม่ใช่ข้อผิดพลาดหากอนุญาตให้ใช้สตริงได้ ณ จุดนั้น
  • +ตัวดำเนินการเอกนารีซึ่งไม่ทำอะไรเลยนอกจากสร้างความสับสนให้กับไวยากรณ์ในบางสถานการณ์ สิ่งนี้มีประโยชน์กับข้อมูลข้างต้นเพราะfunction +argument(โดยที่ + เป็นเอกภาพ) จะกลายเป็นstring + argument(เพิ่มเติม) เมื่อชื่อฟังก์ชั่น mangled และกลายเป็นสตริง
  • มีหลายวิธีในการประกาศสตริง: สตริงที่ยกมาสองครั้งqq( )สามารถกลายเป็นสตริงที่ยกมาเดี่ยวq(); สตริงคั่นด้วยวงเล็บสามารถกลายเป็นสตริงที่คั่นด้วยเครื่องหมายอัฒภาคqq(; ... ) สตริงภายในสามารถขจัดปัญหาการทรงตัวโดยการแปลงสิ่งต่าง ๆ เป็นความคิดเห็นqq; ... ;#

ความยาวของสิ่งนี้อาจลดลงบ้าง แต่ฉันสงสัยว่าวิธีการแก้ปัญหาของ ugoren นั้นสามารถถูกตีได้


13
+1 สำหรับการขึ้นบรรทัดใหม่มีไว้เพื่อให้อ่านได้เท่านั้น ...
Bakuriu

40

HQ9 +

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

HH

ฉันจะเริ่มเมื่อไหร่


1
มันสร้าง "สวัสดีโลก" แต่ไม่ใช่ "สวัสดีโลก!" ตามที่ระบุไว้.
พอล R

16
เรื่องไร้สาระภาษาถูกระบุไว้อย่างไม่ถูกต้องบน esolang wiki;)
skeevey

11
ดีสำหรับคุณถ้าพวกเขามีคอมไพเลอร์ HQ9 + บนคอมพิวเตอร์สัมภาษณ์ ... :)

คุณสามารถเขียนคอมไพเลอร์บั๊กกี้ของคุณเอง
PyRulez

2
@ mbomb007 นี้ล่ามพิมพ์Hello, world!สำหรับHคำสั่ง
เดนนิส

12

Befunge-98 , คะแนน 0, 45 ไบต์

20020xx""!!ddllrrooww  ,,oolllleeHH""cckk,,@@

ลองออนไลน์!

แม้ว่าวิธีการแก้ปัญหาที่ดีที่สุดได้ถูกค้นพบแล้ว (และไม่มีไทเบรกเกอร์) ฉันคิดว่าฉันแสดงให้เห็นว่าสิ่งนี้สามารถลดความซับซ้อนลงได้อย่างมากด้วย Befunge 98

คำอธิบาย

การ20020xxตั้งค่าเดลต้าที่เชื่อถือได้ (ขั้นตอนของตัวชี้คำแนะนำระหว่างเห็บ) เพื่อ(2,0)ให้เริ่มต้นที่ครั้งแรกxเท่านั้นทุกคำสั่งอื่น ๆ จะถูกดำเนินการ ดูคำตอบนี้สำหรับคำอธิบายโดยละเอียดว่าทำไมงานนี้ หลังจากนั้นรหัสเป็นเพียง:

"!dlrow ,olleH"ck,@

"!dlrow ,olleH"ครั้งแรกที่เราผลักดันทุกรหัสอักขระที่เกี่ยวข้องลงบนสแต็คที่มี จากนั้นck,หมายถึงพิมพ์ด้านบนของสแต็ก ( ,), 13 ( cบวก 1) ครั้ง ( k) @ยุติโปรแกรม


11

J, 7 คะแนน

การเลือกตัวอักษรทุกตัวที่มีตำแหน่งคี่:

   _2{.\'HHeellllo,,  wwoorrlldd!!'
Hello, world!

5
สิ่งเดียวกันใน golfscript คือ 4 คะแนน:'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box

@cardboard_box อย่าลังเลที่จะส่งมัน :)
randomra

การขึ้นลงเพราะฉันเข้าใจและไม่รู้สึกอยากโกง
Michael Stern

3

Befunge-93, คะแนน 0 (63 bytes)

ฉันรู้ว่านี่ไม่ใช่ความท้าทายของ code-golf แต่ฉันคิดว่ามันน่าสนใจที่จะดูว่าโซลูชัน Befunge-93 ที่มีอยู่สามารถปรับปรุงได้ในแง่ของขนาดหรือไม่ ตอนแรกฉันได้พัฒนาเทคนิคนี้เพื่อใช้ในข้อผิดพลาด 404 ที่คล้ายกันแต่ความจำเป็นในการห่อข้อมูลในกรณีนั้นทำให้โซลูชัน 3 บรรทัดดีที่สุด

นี่ยังไม่ดีเท่าคำตอบของมาร์ติน Befunge-98 แต่ก็ยังลดลงอย่างเห็นได้ชัดสำหรับโซลูชั่น Befunge-93 ที่ชนะ

<>>  "!dlrow ,olleH">:#,_@  vv
  ^^@_,#!>#:<"Hello, world!"<<>#

ลองออนไลน์!

คำอธิบาย

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

ข้อผิดพลาดในบรรทัดที่สองทำให้สุดท้าย<ถูกเลื่อนไปทางซ้ายและแทนที่ด้วย>ทิศทางที่ถูกต้องแทน #(สะพาน) คำสั่งมีอะไรที่จะกระโดดข้ามดังนั้นรหัสเพียงอย่างต่อเนื่องจนกว่าจะล้อมรอบและถึง^จุดเริ่มต้นของเส้นกำกับมันขึ้นอยู่กับบรรทัดแรกและจากนั้น>ผู้กำกับมันขวาเข้าขวา-to- น้ำหนักบรรทุกที่เหลืออยู่

ข้อผิดพลาดส่วนใหญ่ในบรรทัดแรกทำให้vคำสั่งสุดท้ายเลื่อนไปทีละตัว แต่นั่นไม่ได้ทำให้การไหลของรหัสหลัก การลบอันแรก<นั้นแตกต่างกันเล็กน้อย - ในกรณีนั้นพา ธ การประมวลผลจะไหลเข้าสู่ส่วนของข้อมูลจากซ้ายไปขวาในบรรทัดแรกโดยตรง

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

ในกรณีที่มีข้อสงสัยฉันได้ทดสอบด้วยสคริปต์ Perl และยืนยันว่า "0 ล้มเหลวจาก 63"


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