À la fin de votre entretien, l’interviewer pour le mal vous dit: «Nous demandons à tous nos candidats de passer un bref test de codage pour savoir s’ils savent vraiment de quoi ils parlent. Ne vous inquiétez pas; c’est facile. Et si vous créez un programme de travail, je vais vous offrir le travail immédiatement. " Il vous fait signe de vous asseoir devant un ordinateur à proximité. "Tout ce que vous avez à faire est de créer un programme Hello World qui fonctionne. Mais" - et il sourit largement - "il ya un problème. Malheureusement, le seul compilateur que nous avons sur cette machine a un petit bogue. Il supprime de manière aléatoire un caractère du fichier de code source avant la compilation. Ok, on se voit dans cinq minutes! " Et il sort de la pièce en sifflant joyeusement.
Pouvez-vous garantir que vous obtiendrez le travail?
La tâche
Ecrivez un programme qui imprimera Hello, world!
sur la sortie standard même après la suppression d'un seul caractère de n'importe quelle position du fichier. Ou venez aussi près que possible de cela.
Les règles
Pas de sortie étrangère - Hello, world!
doit être la seule chose importante imprimée sur la sortie standard. Il est correct d’inclure d’autres caractères s’ils sont générés naturellement par la langue de votre choix, par exemple un fin de nouvelle ligne ou même quelque chose comme [1] "Hello, world!"
(par exemple si vous utilisiez R), mais il doit imprimer exactement la même chose à chaque fois. Il ne peut pas imprimer Hello, world!Hello, world!
ou Hello world!" && x==1
de temps en temps, par exemple. Les avertissements sont toutefois autorisés.
Test Pour pouvoir déterminer votre score, vous devez tester chaque permutation possible du programme: testez-la à chaque caractère supprimé et vérifiez si le résultat obtenu est correct. J'ai inclus un programme Perl simple à cet effet ci-dessous, qui devrait fonctionner dans de nombreuses langues. Si cela ne fonctionne pas pour vous, veuillez créer un programme de test et l'inclure dans votre réponse.
Scoring Votre score est le nombre d'échecs de votre programme . En d'autres termes, le nombre de positions individuelles dans votre fichier où la suppression d'un caractère empêche votre programme de fonctionner. Le score le plus bas gagne. En cas d'égalité, le code le plus court l'emporte.
Des solutions triviales telles que "Hello, world!"
plusieurs langues (score de 15) sont acceptables, mais elles ne vont pas gagner. J'ai au moins trouvé une solution Perl avec un score de 4, que je posterai éventuellement.
Mise à jour: le gagnant officiel utilisera un langage de programmation complet de Turing et n'utilisera aucun mécanisme prédéfini qui imprime Hello, world!
. Toute ressource externe (autre que les bibliothèques standard de votre langue) utilisée est considérée comme faisant partie de votre programme et sujette à la même suppression d'un caractère. Ces exigences étaient collées au bureau sur un post-it. Toutes mes excuses si vous ne les avez pas vues au début.
Mise à jour 2: Oui, votre programme doit effectivement accomplir la tâche décrite ci-dessus afin de recevoir un score! Ce qui signifie qu'il devrait réussir à imprimer Hello, world!
au moins une fois. Cela aurait dû être évident. Les commutateurs de ligne de commande et les autres paramètres qui ajoutent des fonctionnalités sont également pris en compte dans votre programme et sont sujets à la suppression d'un caractère. Le programme doit accomplir sa tâche sans aucune intervention de l'utilisateur. Un échec de la compilation compte dans votre nombre d'échecs.
Bonne programmation, et pouvez-vous obtenir le travail. Mais si vous échouez, vous ne voudriez probablement pas travailler pour ce méchant patron de toute façon.
Script de test 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!
non-impression est un échec.