В конце вашего интервью Злой Интервьюер говорит вам: «Мы заставляем всех наших кандидатов пройти короткий тест на кодирование, чтобы увидеть, действительно ли они знают, о чем говорят. Не волнуйтесь, это легко. И если вы создадите рабочая программа, я сразу предложу тебе работу. Он жестом просит вас сесть за соседний компьютер. «Все, что вам нужно сделать, - это создать работающую программу 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!
. Любой используемый внешний ресурс (кроме стандартных библиотек для вашего языка) считается частью вашей программы и подлежит удалению одним и тем же символом. Эти требования были прикреплены к столу на заметке. Извиняюсь, если вы не видели их сначала.
Обновление 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!
не печатается, является ошибкой.