Наприкінці вашого інтерв'ю Злий інтерв'юер каже вам: "Ми змушуємо всіх наших претендентів пройти короткий тест кодування, щоб побачити, чи дійсно вони знають, про що говорять. Не хвилюйтесь; це легко. І якщо ви створите робочу програму, я запропоную вам роботу негайно ". Він жестикулює вам сісти за сусідній комп’ютер. "Все, що вам потрібно зробити, - це створити робочу програму 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!
недруку, є помилкою.