Alla fine della tua intervista, il Male Interviewer ti dice: "Facciamo in modo che tutti i nostri candidati facciano un breve test di codifica, per vedere se sanno davvero di cosa stanno parlando. Non preoccuparti, è facile. E se crei un programma di lavoro, ti offrirò immediatamente il lavoro ". Ti indica di sederti a un computer vicino. "Tutto quello che devi fare è creare un programma Hello World funzionante. Ma" - e sorride ampiamente - "c'è un problema. Sfortunatamente l'unico compilatore che abbiamo su questa macchina ha un piccolo bug. Elimina casualmente un carattere dal file di codice sorgente prima della compilazione. Ok, ci vediamo tra cinque minuti! " E esce dalla stanza, fischiettando allegramente.
Potete garantire che otterrete il lavoro?
L'obiettivo
Scrivi un programma che stamperà Hello, world!
sullo standard output anche dopo che un singolo carattere è stato rimosso da qualsiasi posizione nel file. O vieni il più vicino possibile a questo.
Le regole
Nessuna uscita estranea : Hello, world!
deve essere l'unica cosa sostanziale stampata sull'output standard. Va bene includere altri personaggi se sono prodotti naturalmente dalla tua lingua preferita - come una nuova riga finale o anche qualcosa di simile [1] "Hello, world!"
(ad esempio se stavi usando R), ma deve stampare sempre la stessa cosa ogni volta. Non è possibile stampare Hello, world!Hello, world!
o Hello world!" && x==1
alcune volte, ad esempio. Sono tuttavia ammessi avvisi.
Test Per verificare il tuo punteggio, devi testare ogni possibile permutazione del programma: testalo con ogni carattere rimosso e vedi se produce l'output corretto. Di seguito ho incluso un semplice programma Perl per questo scopo, che dovrebbe funzionare in molte lingue. Se non funziona per te, crea un programma di test e includilo nella tua risposta.
Punteggio Il tuo punteggio è il numero di volte in cui il tuo programma fallisce . In altre parole, il numero di posizioni individuali nel file in cui l'eliminazione di un carattere impedisce al programma di funzionare. Il punteggio più basso vince. In caso di pareggio, vince il codice più corto.
Trivial Solutions come "Hello, world!"
in diverse lingue (punteggio di 15) sono accettabili, ma non vinceranno. Ho almeno trovato una soluzione Perl con un punteggio di 4, che posterò alla fine.
Aggiornamento: il vincitore ufficiale utilizzerà un linguaggio di programmazione completo di Turing e non utilizzerà alcun meccanismo predefinito di stampa Hello, world!
. Qualsiasi risorsa esterna (diversa dalle librerie standard per la tua lingua) utilizzata viene considerata parte del programma e soggetta alla stessa cancellazione di 1 carattere. Questi requisiti erano fissati alla scrivania su un post-it. Mi scuso se non li hai visti all'inizio.
Aggiornamento 2: Sì, il tuo programma deve effettivamente eseguire l'attività descritta sopra per ricevere un punteggio! Ciò significa che dovrebbe essere stampato con successo Hello, world!
almeno una volta. Questo avrebbe dovuto essere ovvio. Anche le opzioni della riga di comando e altre impostazioni che aggiungono funzionalità fanno parte del programma e sono soggette all'eliminazione di singoli caratteri. Il programma deve svolgere il proprio compito senza alcun input da parte dell'utente. Un errore nella compilazione conta nel conteggio errori.
Buona programmazione e che tu possa ottenere il lavoro. Ma se fallisci, probabilmente non volevi lavorare per quel boss malvagio comunque.
Script di prova 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 essere stampato è un errore.