Pod koniec twojego wywiadu Evil Interviewer mówi: „Sprawiamy, że wszyscy nasi kandydaci biorą krótki test kodowania, aby sprawdzić, czy naprawdę wiedzą, o czym mówią. Nie martw się; to łatwe. A jeśli stworzysz działający program, natychmiast zaoferuję ci pracę ”. Gestem nakazuje ci usiąść przy pobliskim komputerze. „Wszystko, co musisz zrobić, to stworzyć działający program Hello World. Ale” - i uśmiecha się szeroko - „jest pewien haczyk. Niestety jedyny kompilator, który mamy na tym komputerze, ma mały błąd. Losowo usuwa jedną postać z plik kodu źródłowego przed kompilacją. Ok, do zobaczenia za pięć minut! ” I wychodzi z pokoju, gwiżdżąc radośnie.
Czy możesz zagwarantować, że dostaniesz pracę?
Zadanie
Napisz program, który wydrukuje Hello, world!
na standardowe wyjście nawet po usunięciu jednego znaku z dowolnej pozycji w pliku. Lub zbliżyć się do tego tak blisko, jak to możliwe.
Zasady
Brak zewnętrznych wyników - Hello, world!
musi być jedyną istotną rzeczą wydrukowaną na standardowe wyjście. Można dodawać inne znaki, jeśli są one naturalnie tworzone przez wybrany język - na przykład końcowy znak nowej linii lub nawet coś podobnego [1] "Hello, world!"
(na przykład, jeśli używasz R), ale musi drukować dokładnie to samo za każdym razem. Na przykład nie można drukować Hello, world!Hello, world!
ani przez Hello world!" && x==1
pewien czas. Ostrzeżenia są jednak dozwolone.
Testowanie Aby przetestować swój wynik, musisz przetestować każdą możliwą permutację programu: przetestuj go przy każdym usuniętym znaku i sprawdź, czy daje on poprawny wynik. Poniżej zamieściłem prosty program Perla do tego celu, który powinien działać w wielu językach. Jeśli to nie działa, utwórz program testowy i dołącz go do swojej odpowiedzi.
Punktacja Twój wynik to liczba niepowodzeń programu . Innymi słowy, liczba pojedynczych pozycji w pliku, w których usunięcie znaku uniemożliwia działanie programu. Najniższy wynik wygrywa. W przypadku remisu wygrywa najkrótszy kod.
Trywialne rozwiązania, takie jak "Hello, world!"
w kilku językach (15 punktów) są dopuszczalne, ale nie wygrywają. Znalazłem przynajmniej rozwiązanie Perla z wynikiem 4, które ostatecznie opublikuję.
Aktualizacja: Oficjalny zwycięzca użyje języka programowania Turing-complete i nie użyje żadnego predefiniowanego mechanizmu drukowania Hello, world!
. Wszelkie używane zasoby zewnętrzne (inne niż standardowe biblioteki dla twojego języka) są uważane za część programu i podlegają temu samemu jednoznakowemu usunięciu. Wymagania te zostały przyklejone do biurka na karteczce samoprzylepnej. Przepraszam, jeśli na początku ich nie widziałeś.
Aktualizacja 2: Tak, twój program musi faktycznie wykonać zadanie opisane powyżej, aby otrzymać wynik! Oznacza to, że powinien pomyślnie wydrukować Hello, world!
co najmniej raz. To powinno być oczywiste. Przełączniki wiersza polecenia i inne ustawienia, które zwiększają funkcjonalność, również liczą się jako część programu i podlegają usunięciu pojedynczego znaku. Program musi wykonać swoje zadanie bez udziału użytkownika. Niepowodzenie kompilacji liczy się w liczbie niepowodzeń.
Miłego programowania i obyś dostał pracę. Ale jeśli ci się nie uda, prawdopodobnie i tak nie chciałeś pracować dla tego złego szefa.
Skrypt testowy Perla:
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!
braku wydruku, jest błędem.