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==1
mộ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;
Hello, World!
không được in là một thất bại.