Hello World Fault-Tolerant (còn gọi là Phỏng vấn)


66

Vào cuối cuộc phỏng vấn của bạn, Người phỏng vấn Ác ma nói với bạn: "Chúng tôi làm cho tất cả các ứng viên của chúng tôi thực hiện một bài kiểm tra mã hóa ngắn, để xem họ có thực sự biết họ đang nói gì không. Đừng lo lắng, thật dễ dàng. Và nếu bạn tạo ra một chương trình làm việc, tôi sẽ cung cấp cho bạn công việc ngay lập tức. " Anh ta ra hiệu cho bạn ngồi xuống một máy tính gần đó. "Tất cả những gì bạn phải làm là tạo ra một chương trình Hello World đang hoạt động. Nhưng" - và anh ta cười toe toét - "có một nhược điểm. Thật không may trình biên dịch duy nhất chúng ta có trên máy này có một lỗi nhỏ. Nó xóa ngẫu nhiên một ký tự khỏi tập tin mã nguồn trước khi biên dịch. Ok, hẹn gặp lại sau năm phút nữa! " Và anh bước ra khỏi phòng, huýt sáo sung sướng.

Bạn có thể đảm bảo rằng bạn sẽ nhận được công việc?

Nhiệm vụ

Viết chương trình sẽ in Hello, world!ra đầu ra tiêu chuẩn ngay cả sau khi một ký tự bị xóa khỏi bất kỳ vị trí nào trong tệp. Hoặc đến càng gần điều này càng tốt.

Những quy định

Không có đầu ra bên ngoài - Hello, world!phải là thứ duy nhất được in thành đầu ra tiêu chuẩn. Bạn có thể bao gồm các ký tự khác nếu chúng được tạo ra một cách tự nhiên bởi ngôn ngữ bạn chọn - chẳng hạn như một dòng mới hoặc thậm chí một cái gì đó giống như [1] "Hello, world!"(ví dụ nếu bạn đang sử dụng R), nhưng nó phải in chính xác mọi lúc. Nó không thể in Hello, world!Hello, world!hoặc Hello world!" && x==1một số thời gian, ví dụ. Cảnh báo, tuy nhiên, được cho phép.

Kiểm tra Để kiểm tra xác định điểm số của bạn, bạn phải kiểm tra từng hoán vị có thể có của chương trình: kiểm tra nó với từng ký tự được loại bỏ và xem liệu nó có tạo ra đầu ra chính xác không. Tôi đã bao gồm một chương trình Perl đơn giản cho mục đích này bên dưới, chương trình này sẽ hoạt động với nhiều ngôn ngữ. Nếu nó không phù hợp với bạn, vui lòng tạo một chương trình thử nghiệm và đưa nó vào câu trả lời của bạn.

Chấm điểm của bạn là số lần chương trình của bạn thất bại . Nói cách khác, số lượng vị trí riêng lẻ trong tệp của bạn trong đó việc xóa một ký tự sẽ ngăn chương trình của bạn hoạt động. Điểm số thấp nhất chiến thắng. Trong trường hợp hòa, mã ngắn nhất sẽ thắng.

Các giải pháp tầm thường như "Hello, world!"trong một số ngôn ngữ (điểm 15) có thể được chấp nhận, nhưng chúng sẽ không giành chiến thắng. Ít nhất tôi đã tìm thấy một giải pháp Perl với số điểm là 4, cuối cùng tôi sẽ đăng.

Cập nhật: Người chiến thắng chính thức sẽ sử dụng ngôn ngữ lập trình hoàn chỉnh Turing và sẽ không sử dụng bất kỳ cơ chế được xác định trước nào in Hello, world!. Bất kỳ tài nguyên bên ngoài nào (ngoài các thư viện chuẩn cho ngôn ngữ của bạn) được sử dụng đều được coi là một phần của chương trình của bạn và chịu cùng một thao tác xóa 1 ký tự. Những yêu cầu này đã được dán vào bàn trên một ghi chú sau đó. Xin lỗi nếu bạn không nhìn thấy chúng lúc đầu.

Cập nhật 2: Có, chương trình của bạn phải thực sự hoàn thành nhiệm vụ được mô tả ở trên để nhận được điểm số! Có nghĩa là nó nên in thành công Hello, world!ít nhất một lần. Điều này nên được hiển nhiên. Các công tắc dòng lệnh và các cài đặt khác có thêm chức năng cũng được tính là một phần của chương trình của bạn và có thể bị xóa một ký tự. Chương trình phải hoàn thành nhiệm vụ của mình mà không cần bất kỳ đầu vào của người dùng. Một thất bại để biên dịch đếm trong số thất bại của bạn.

Chúc mừng lập trình, và có thể bạn sẽ có được công việc. Nhưng nếu bạn thất bại, có lẽ bạn không muốn làm việc cho ông chủ độc ác đó.

Kịch bản kiểm tra 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
Nhân vật bị xóa có thể dẫn đến chương trình không biên dịch? Điều đó vẫn được tính là không hoạt động?
lochok

@lochok, vâng, điều đó sẽ được coi là một thất bại. Bất kỳ ký tự bị xóa dẫn đến Hello, World!không được in là một thất bại.


@Walkerneo, cảm ơn! Tôi đã tìm kiếm các câu hỏi tương tự và không tìm thấy câu hỏi đó. Tôi nghĩ rằng điều này là khác nhau đáng kể, mặc dù. Cụ thể, câu hỏi đó đảm bảo rằng chỉ những sửa đổi dẫn đến mã hợp lệ về mặt cú pháp phải được xử lý.

Bạn có thể cho một ví dụ về "công tắc dòng lệnh và các cài đặt khác có thêm chức năng" không? Bạn có nghĩa là các công tắc và cài đặt được cung cấp cho chính chương trình, hoặc sử dụng các công tắc và cài đặt trong môi trường xây dựng?
CasaDeRobison

Câu trả lời:


129

Befunge, Điểm 0

Tôi nghĩ rằng tôi đã bẻ khóa nó - không xóa một ký tự nào sẽ thay đổi đầu ra.
Xóa bất kỳ ký tự nào khỏi dòng 1 không thay đổi gì - nó vẫn đi xuống ở cùng một vị trí.
Dòng 2 và 3 là dự phòng. Thông thường dòng 2 được thực thi, nhưng nếu bạn xóa một ký tự khỏi nó, dòng <bị bỏ lỡ và dòng 3 sẽ mất phí.
Xóa các dòng mới cũng không phá vỡ nó (nó đã phá vỡ phiên bản trước của tôi).
Không có chương trình kiểm tra, xin lỗi.

EDIT : đơn giản hóa rất nhiều.

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

Một lời giải thích ngắn về dòng chảy:

  1. Befunge bắt đầu thực hiện từ trên cùng bên trái, di chuyển sang phải. Không gian không làm gì cả.
  2. v biến dòng thực thi đi xuống, vì vậy nó đi xuống một dòng.
  3. < xoay luồng thực hiện sang trái, để nó đọc dòng 2 theo thứ tự đảo ngược.
  4. "Hello, world!"đẩy chuỗi vào ngăn xếp. Nó được đẩy theo thứ tự đảo ngược, bởi vì chúng tôi đang thực hiện từ phải sang trái.
  5. ,bật một ký tự và in nó. Ký tự cuối cùng được đẩy được in trước, đảo ngược chuỗi một lần nữa.
  6. @ chấm dứt chương trình.

2
+1, giải pháp tuyệt vời. Tôi không nghĩ rằng một chương trình thử nghiệm là cần thiết, vì rõ ràng là chỉ có một số lượng nhỏ có khả năng xóa đáng kể.

4
Vì vậy, dễ dàng để xác minh và không có thảo luận liên quan. Thiên tài!
Karma Fusebox

Chúc mừng một giải pháp tuyệt vời.

2
Tôi biết đây không phải là môn đánh gôn , nhưng đây là phiên bản có 66 byte .
MD XF

42

Perl, Điểm 0

(147 ký tự)

Đây là giải pháp của tôi, mà tôi đã quản lý để có được từ 4 xuống 0:

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

Nó phải xuất hiện tất cả trên một dòng để làm việc; ngắt dòng chỉ dành cho "khả năng đọc".

Nó được hưởng lợi từ cú pháp cho phép bệnh lý của Perl. Một số điểm nổi bật:

  • Barewords không được công nhận được coi là chuỗi. Vì vậy, khi evaltrở thành evl, đó không phải là một lỗi nếu một chuỗi được cho phép tại thời điểm đó.
  • Unary +nhà điều hành, mà không làm gì khác hơn là cú pháp disambiguate trong những tình huống nhất định. Điều này hữu ích với ở trên, bởi vì function +argument(trong đó + là unary) trở thành string + argument(bổ sung) khi một tên hàm được đọc sai và trở thành một chuỗi.
  • Nhiều cách để khai báo chuỗi: một chuỗi trích dẫn kép qq( )có thể trở thành một chuỗi trích dẫn đơn q(); một chuỗi được phân tách bằng dấu ngoặc đơn qq(; ... )có thể trở thành một chuỗi được phân cách bằng dấu chấm phẩy qq; ... ;. #bên trong chuỗi có thể loại bỏ các vấn đề cân bằng bằng cách chuyển đổi mọi thứ thành bình luận.

Độ dài của điều này có lẽ có thể giảm đi phần nào, mặc dù tôi nghi ngờ giải pháp của ugoren có thể bị đánh bại.


13
+1 cho ngắt dòng chỉ dành cho khả năng đọc ...
Bakuriu

40

HQ9 +

Điều này sẽ không bao giờ thất bại trong việc tạo ra kết quả như mong muốn khi một nhân vật bị xóa để có điểm 0.

HH

Khi nao tôi băt đâu?


1
Nó tạo ra "xin chào, thế giới", chứ không phải "Xin chào, thế giới!" theo quy định.
Paul R

16
Vô nghĩa, ngôn ngữ chỉ được xác định không chính xác trên wiki esolang;)
hoài nghi

11
Tốt cho bạn nếu họ có trình biên dịch HQ9 + trên máy tính phỏng vấn ... :)

Bạn có thể viết trình biên dịch lỗi của riêng bạn.
PyRulez

2
@ mbomb007 Trình thông dịch này in Hello, world!cho Hlệnh.
Dennis

12

Befunge-98 , điểm 0, 45 byte

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

Hãy thử trực tuyến!

Mặc dù đã tìm thấy một giải pháp tối ưu (và không có bộ ngắt kết nối), tôi nghĩ tôi đã chứng minh rằng điều này có thể được đơn giản hóa đáng kể với Befunge 98.

Giải trình

Đáng 20020xxtin cậy đặt delta (các bước của con trỏ lệnh giữa các tick) để (2,0)bắt đầu từ đầu tiên x, chỉ mỗi lệnh khác được thực thi. Xem câu trả lời này để được giải thích chi tiết về lý do tại sao điều này hoạt động. Sau đó, mã chỉ là:

"!dlrow ,olleH"ck,@

Trước tiên chúng tôi đẩy tất cả các mã ký tự có liên quan lên ngăn xếp với "!dlrow ,olleH". Sau đó, ck,có nghĩa là in đỉnh của ngăn xếp ( ,), 13 ( ccộng 1) lần ( k). @chấm dứt chương trình.


11

J, 7 điểm

Chọn mỗi chữ cái có vị trí lẻ:

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

5
Điều tương tự trong golfscript sẽ là 4 điểm:'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box

@cardboard_box Vui lòng gửi nó. :)
Randomra

Nâng cao bởi vì tôi hiểu nó, và nó không cảm thấy như gian lận.
Michael Stern

3

Befunge-93, Điểm 0 (63 byte)

Tôi biết đây không phải là một thử thách chơi gôn, nhưng tôi nghĩ sẽ rất thú vị nếu xem giải pháp Befunge-93 hiện tại có thể được cải thiện về mặt kích thước hay không. Ban đầu tôi đã phát triển kỹ thuật này để sử dụng trong thử thách Lỗi 404 tương tự , nhưng nhu cầu tải trọng gói trong trường hợp đó làm cho giải pháp 3 dòng tối ưu hơn.

Điều này không hoàn toàn tốt như câu trả lời Befunge-98 của Martin, nhưng nó vẫn là một mức giảm khá đáng kể đối với giải pháp Befunge-93 chiến thắng.

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

Hãy thử trực tuyến!

Giải trình

Có hai phiên bản của tải trọng. Đối với một chương trình chưa được thay đổi, lần đầu tiên <khiến chương trình thực hiện từ phải sang trái, quấn quanh đến cuối dòng, cho đến khi nó chuyển vhướng xuống dòng thứ hai và chuyển <hướng từ trái sang phải sang phiên bản từ trái sang phải của tải trọng.

Một lỗi trên dòng thứ hai làm cho trận chung kết <bị dịch chuyển sang trái và được thay thế bằng một >luồng trực tiếp thay thế. Lệnh #(cầu) không có gì để nhảy qua, vì vậy mã chỉ tiếp tục cho đến khi nó quấn quanh và đạt đến ^điểm bắt đầu của dòng, hướng nó đến dòng đầu tiên, và sau đó chuyển >nó sang phải từ phải sang phải tải trọng trái.

Hầu hết các lỗi trên dòng đầu tiên chỉ khiến các vlệnh cuối cùng thay đổi theo một, nhưng điều đó không làm thay đổi luồng chính của mã. Tuy nhiên, việc xóa cái đầu tiên <hơi khác một chút - trong trường hợp đó, đường dẫn thực thi chỉ chảy trực tiếp vào trọng tải từ trái sang phải trên dòng đầu tiên.

Trường hợp đặc biệt khác là loại bỏ ngắt dòng. Khi mã kết thúc ở cuối dòng, trong trường hợp này, bây giờ nó là kết thúc của dòng thứ hai. Khi nó gặp #lệnh từ bên phải, nó sẽ nhảy qua >và do đó tiếp tục trực tiếp vào trọng tải từ phải sang trái.

Trong trường hợp có bất kỳ nghi ngờ nào, tôi cũng đã thử nghiệm với tập lệnh perl và nó đã xác nhận rằng "0 không thành công trong số 63".


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.