Am Ende Ihres Interviews sagt Ihnen der Evil Interviewer: "Wir veranlassen alle unsere Bewerber, einen kurzen Codierungstest durchzuführen, um festzustellen, ob sie wirklich wissen, wovon sie sprechen. Machen Sie sich keine Sorgen, es ist einfach. Und wenn Sie erstellen Als Arbeitsprogramm biete ich Ihnen den Job sofort an. " Er weist Sie an, sich an einen Computer in der Nähe zu setzen. "Alles, was Sie tun müssen, ist, ein funktionierendes Hello World-Programm zu erstellen. Aber" - und er grinst breit - "es gibt einen Haken. Leider hat der einzige Compiler, den wir auf diesem Computer haben, einen kleinen Fehler. Er löscht zufällig ein Zeichen aus dem Quellcode-Datei vor dem Kompilieren. Ok, wir sehen uns in fünf Minuten! " Und er geht aus dem Raum und pfeift glücklich.
Können Sie garantieren, dass Sie den Job bekommen?
Die Aufgabe
Schreiben Sie ein Programm, das Hello, world!
auch nach dem Entfernen eines einzelnen Zeichens von einer beliebigen Position in der Datei auf die Standardausgabe gedruckt wird . Oder kommen Sie dem so nahe wie möglich.
Die Regeln
Keine überflüssige Ausgabe - Hello, world!
muss das einzige Wesentliche sein, das auf die Standardausgabe gedruckt wird. Es ist in Ordnung, andere Zeichen einzuschließen, wenn diese von der Sprache Ihrer Wahl erzeugt werden - wie z. B. eine abschließende Zeile oder etwas Ähnliches [1] "Hello, world!"
(z. B. wenn Sie R verwendet haben), aber es muss jedes Mal genau das Gleiche gedruckt werden. Es kann zum Beispiel nicht Hello, world!Hello, world!
oder zeitweise gedruckt werden Hello world!" && x==1
. Warnungen sind jedoch zulässig.
Testen Um Ihre Punktzahl zu testen, müssen Sie jede mögliche Permutation des Programms testen: Testen Sie es mit jedem entfernten Zeichen und prüfen Sie, ob es die richtige Ausgabe liefert. Ich habe ein einfaches Perl-Programm für diesen Zweck unten aufgeführt, das für viele Sprachen funktionieren sollte. Wenn es bei Ihnen nicht funktioniert, erstellen Sie bitte ein Testprogramm und fügen Sie es Ihrer Antwort bei.
Bewertung Ihre Punktzahl gibt an, wie oft Ihr Programm fehlschlägt . Mit anderen Worten, die Anzahl der einzelnen Positionen in Ihrer Datei, an denen ein Zeichen gelöscht wird, verhindert, dass Ihr Programm funktioniert. Die niedrigste Punktzahl gewinnt. Bei einem Gleichstand gewinnt der kürzeste Code.
Triviale Lösungen wie "Hello, world!"
in mehreren Sprachen (Punktzahl 15) sind akzeptabel, aber sie werden nicht gewinnen. Ich habe zumindest eine Perl-Lösung mit einer Punktzahl von 4 gefunden, die ich irgendwann posten werde.
Update: Der offizielle Gewinner wird eine Programmiersprache von Turing-complete verwenden und keinen vordefinierten Mechanismus verwenden, der gedruckt wird Hello, world!
. Alle externen Ressourcen (mit Ausnahme der Standardbibliotheken für Ihre Sprache), die verwendet werden, werden als Teil Ihres Programms betrachtet und unterliegen derselben 1-Zeichen-Löschung. Diese Anforderungen wurden auf einem Post-It-Zettel an den Schreibtisch geklebt. Entschuldigung, wenn Sie sie zuerst nicht gesehen haben.
Update 2: Ja, Ihr Programm muss die oben beschriebene Aufgabe erfüllen, um eine Punktzahl zu erhalten! Das heißt, es sollte Hello, world!
mindestens einmal erfolgreich gedruckt werden. Das hätte offensichtlich sein müssen. Befehlszeilenoptionen und andere Einstellungen, die Funktionen hinzufügen, gehören ebenfalls zu Ihrem Programm und unterliegen der Löschung einzelner Zeichen. Das Programm muss seine Aufgabe ohne Benutzereingabe erfüllen. Ein Fehler beim Kompilieren zählt in Ihrer Fehleranzahl.
Viel Spaß beim Programmieren und mögt ihr den Job bekommen. Aber wenn du versagst, wolltest du wahrscheinlich sowieso nicht für diesen bösen Boss arbeiten.
Perl-Testskript:
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!
nicht gedruckt wird, ist ein Fehler.