No final da sua entrevista, o Evil Interviewer diz a você: "Fazemos com que todos os nossos candidatos façam um pequeno teste de codificação, para ver se eles realmente sabem do que estão falando. Não se preocupe; é fácil. E se você criar um programa de trabalho, oferecerei o trabalho imediatamente ". Ele gesticula para você se sentar em um computador próximo. "Tudo o que você precisa fazer é criar um programa Hello World em funcionamento. Mas" - e ele sorri amplamente - "há um problema. Infelizmente, o único compilador que temos nesta máquina tem um pequeno bug. Ele exclui aleatoriamente um caractere do arquivo de código-fonte antes de compilar. Ok, vejo você em cinco minutos! " E ele sai da sala, assobiando alegremente.
Você pode garantir que conseguirá o emprego?
A tarefa
Escreva um programa que será impresso Hello, world!
na saída padrão, mesmo após a remoção de um único caractere de qualquer posição no arquivo. Ou chegue o mais perto possível disso.
As regras
Sem saída estranha - Hello, world!
deve ser a única coisa substantiva impressa na saída padrão. Não há problema em incluir outros caracteres se eles forem produzidos naturalmente pelo seu idioma de escolha - como uma nova linha à direita ou algo parecido [1] "Hello, world!"
(por exemplo, se você estiver usando R), mas ele sempre deve imprimir exatamente a mesma coisa. Ele não pode imprimir Hello, world!Hello, world!
ou em Hello world!" && x==1
parte do tempo, por exemplo. Avisos, no entanto, são permitidos.
Teste Para testar a sua pontuação, você deve testar cada permutação possível do programa: teste-o com cada caractere removido e verifique se ele produz a saída correta. Incluí abaixo um programa Perl simples para esse fim, que deve funcionar para muitos idiomas. Se não funcionar, crie um programa de teste e inclua-o na sua resposta.
Pontuação Sua pontuação é o número de vezes que seu programa falha . Em outras palavras, o número de posições individuais em seu arquivo em que a exclusão de um caractere impede que seu programa funcione. Menor pontuação ganha. Em caso de empate, o código mais curto vence.
Soluções triviais , como "Hello, world!"
em vários idiomas (pontuação de 15), são aceitáveis, mas não vão ganhar. Eu encontrei pelo menos uma solução Perl com uma pontuação de 4, que postarei eventualmente.
Atualização: O vencedor oficial usará uma linguagem de programação completa de Turing e não usará nenhum mecanismo predefinido impresso Hello, world!
. Qualquer recurso externo (exceto as bibliotecas padrão para o seu idioma) usado é considerado parte do seu programa e sujeito à mesma exclusão de 1 caractere. Esses requisitos estavam presos à mesa em um post-it. Desculpas se você não os viu primeiro.
Atualização 2: Sim, seu programa precisa realizar a tarefa descrita acima para receber uma pontuação! Isso significa que ele deve ser impresso com êxito Hello, world!
pelo menos uma vez. Isso deveria ter sido óbvio. Opções de linha de comando e outras configurações que adicionam funcionalidade também contam como parte do seu programa e estão sujeitas à exclusão de um único caractere. O programa deve realizar sua tarefa sem nenhuma entrada do usuário. Uma falha na compilação conta na sua contagem de falhas.
Boa programação, e você pode conseguir o emprego. Mas se você falhar, provavelmente não queria trabalhar para aquele chefe malvado.
Script de teste 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!
não impressão é uma falha.