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;
źródło
Hello, World!
braku wydruku, jest błędem.Odpowiedzi:
Befunge, wynik 0
Myślę, że go złamałem - żadne usunięcie pojedynczego znaku nie zmieni wyniku.
Usunięcie dowolnego znaku z wiersza 1 nic nie zmienia - nadal spada w tym samym miejscu.
Linie 2 i 3 są zbędne. Zazwyczaj linia 2 jest wykonywana, ale jeśli usuniesz z niej znak,
<
zostanie pominięty, a linia 3 przejmie kontrolę.Usunięcie nowego wiersza też go nie zepsuło (zepsuło moją poprzednią wersję).
Niestety, nie ma programu testowego.
EDYCJA : bardzo uproszczone.
Krótkie wyjaśnienie przepływu:
v
obraca przepływ wykonania w dół, więc idzie w dół o jedną linię.<
obraca przepływ wykonania w lewo, więc odczytuje wiersz 2 w odwrotnej kolejności."Hello, world!"
wypycha ciąg do stosu. Przesunięty jest w odwrotnej kolejności, ponieważ wykonujemy od prawej do lewej.,
wyskakuje postać i drukuje ją. Ostatni wypychany znak jest drukowany jako pierwszy, co ponownie odwraca ciąg.@
kończy program.źródło
Perl, wynik 0
(147 znaków)
Oto moje rozwiązanie, które udało mi się uzyskać z 4 do 0:
Musi się pojawić wszystko w jednej linii, aby działać; podziały wierszy służą wyłącznie do „czytelności”.
Korzysta z patologicznie dopuszczalnej składni Perla. Niektóre najważniejsze:
eval
staje sięevl
, nie jest to błędem, jeśli w tym momencie dopuszczalny jest łańcuch.+
operator, który w pewnych sytuacjach nie robi nic poza jednoznaczną składnią. Jest to przydatne w powyższym przypadku, ponieważfunction +argument
(gdzie + jest jednoargumentowy) staje sięstring + argument
(dodawanie), gdy nazwa funkcji jest zniekształcona i staje się łańcuchem.qq( )
może stać się łańcuchem pojedynczymq()
; ciąg rozdzielony nawiasamiqq(; ... )
może stać się ciągiem oddzielonym średnikiemqq; ... ;
.#
wewnątrz ciągów można wyeliminować problemy z równoważeniem, przekształcając rzeczy w komentarze.Długość tego można prawdopodobnie nieco zmniejszyć, choć wątpię, czy uda się pokonać rozwiązanie ugorena.
źródło
HQ9 +
To nigdy nie zakończy się uzyskaniem zamierzonego wyniku, gdy postać zostanie usunięta, więc otrzyma wynik zero.
Kiedy zaczynam?
źródło
Hello, world!
dlaH
polecenia.Befunge-98 , wynik 0, 45 bajtów
Wypróbuj online!
Chociaż już znaleziono optymalne rozwiązanie (i nie ma rozstrzygającego remisu), pomyślałem, że pokażę, że można to znacznie uprościć w Befunge 98.
Wyjaśnienie
20020xx
Niezawodnie ustawia Delta (etapy wskaźnik instrukcji między kleszcze), aby(2,0)
tak, że począwszy od pierwszegox
, tylko co drugi komenda jest wykonywana. Zobacz tę odpowiedź, aby uzyskać szczegółowe wyjaśnienie, dlaczego to działa. Następnie kod jest po prostu:Najpierw umieszczamy wszystkie odpowiednie kody znaków na stosie za pomocą
"!dlrow ,olleH"
. Następnieck,
oznacza drukowanie górnej części stosu (,
), 13 (c
plus 1) czas (k
).@
kończy program.źródło
J, 7 punktów
Wybieranie każdej litery o nieparzystej pozycji:
źródło
'HHeelllloo,, wwoorrlldd!!'2%
Befunge-93, wynik 0 (63 bajtów)
Wiem, że to nie jest wyzwanie do gry w golfa, ale pomyślałem, że byłoby interesujące sprawdzić, czy istniejące rozwiązanie Befunge-93 można ulepszyć pod względem wielkości. Pierwotnie opracowałem tę technikę do zastosowania w podobnym wyzwaniu Error 404 , ale potrzeba owijania ładunku w tym przypadku sprawiła, że rozwiązanie 3-liniowe było bardziej optymalne.
To nie jest tak dobre, jak odpowiedź Martina Befunge-98, ale nadal jest dość znaczącą redukcją zwycięskiego rozwiązania Befunge-93.
Wypróbuj online!
Wyjaśnienie
Istnieją dwie wersje ładunku. W przypadku niezmienionego programu, pierwszy
<
powoduje, że program wykonuje się od prawej do lewej, owijając się do końca linii, dopóki nie dojdzie dov
przekierowania go do drugiej linii i<
kierując go od lewej do prawej wersji ładunku.Błąd w drugim wierszu powoduje
<
przesunięcie finału w lewo i zastąpienie go>
kierunkiem przepływu w prawo. Polecenie#
(most) nie ma nic do przeskoczenia, więc kod jest kontynuowany, dopóki nie zostanie zawinięty i nie osiągnie^
początku linii, kierując go do pierwszej linii, a następnie>
kierując go w prawo do pozostawiono ładunek.Większość błędów w pierwszym wierszu powoduje po prostu
v
przesunięcie ostatnich poleceń o jeden, ale nie zmienia to głównego przepływu kodu.<
Jednak usunięcie pierwszego jest nieco inne - w takim przypadku ścieżka wykonania przepływa bezpośrednio do ładunku od lewej do prawej w pierwszym wierszu.Innym szczególnym przypadkiem jest usunięcie przerwy w linii. Kiedy kod zawija się do końca linii, w tym przypadku jest to koniec czegoś, co kiedyś było drugą linią. Gdy napotka
#
polecenie z prawej strony, przeskakuje on>
i tym samym przechodzi bezpośrednio do ładunku od prawej do lewej.W razie jakichkolwiek wątpliwości przetestowałem również skrypt Perla i potwierdziło, że „0 z 63 nie powiodło się”.
źródło
Gol> <> , zdobądź 0, 38 bajtów
Język jest uwalniany po wyzwaniu.
źródło