Наприкінці вашого інтерв'ю Злий інтерв'юер каже вам: "Ми змушуємо всіх наших претендентів пройти короткий тест кодування, щоб побачити, чи дійсно вони знають, про що говорять. Не хвилюйтесь; це легко. І якщо ви створите робочу програму, я запропоную вам роботу негайно ". Він жестикулює вам сісти за сусідній комп’ютер. "Все, що вам потрібно зробити, - це створити робочу програму Hello World. Але" - і він широко посміхається - "є улов. На жаль, єдиний у нас компілятор на цій машині має невелику помилку. Він випадковим чином видаляє одного символу з файл вихідного коду перед компілюванням. Добре, побачимось через п’ять хвилин! " І він виходить із кімнати, радісно свистячи.
Чи можете ви гарантувати, що ви отримаєте роботу?
Задача
Напишіть програму, яка надрукує Hello, world!стандартний вихід навіть після того, як один символ буде видалений з будь-якого місця у файлі. Або підійти якомога ближче до цього.
Правила
Ніякого стороннього виходу - Hello, world!повинна бути єдиною істотною справою, надрукованою на стандартному виході. Добре включати інших символів, якщо вони природним чином створені вашою обраною мовою - наприклад, зворотний новий рядок або навіть щось на зразок [1] "Hello, world!"(наприклад, якщо ви використовували R), але він повинен друкувати абсолютно те саме, щоразу. Наприклад, він не може друкувати Hello, world!Hello, world!або Hello world!" && x==1якийсь час. Однак попередження дозволені.
Тестування Для того, щоб тест визначив ваш рахунок, ви повинні протестувати кожну можливу перестановку програми: протестувати її з кожним видаленим символом та побачити, чи він дає правильний вихід. Для цієї мети нижче я включив просту програму Perl, яка повинна працювати для багатьох мов. Якщо це не працює для вас, створіть програму тестування та включіть її у свою відповідь.
Зарахування балів - це кількість разів, коли ваша програма виходить з ладу . Іншими словами, кількість окремих позицій у вашому файлі, де видалення символу заважає вашій програмі працювати. Виграє найнижчий рахунок. У разі вирівнювання виграє найкоротший код.
Тривіальні рішення, такі як "Hello, world!"декілька мов (оцінка 15), є прийнятними, але перемогти не збираються. Я принаймні знайшов рішення Perl з оцінкою 4, яке я опублікую в підсумку.
Оновлення: Офіційний переможець використовуватиме мову програмування, заповнену Тьюрінгом, і не буде використовувати жодного заздалегідь визначеного механізму, який друкує 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!недруку, є помилкою.