Olá, mundo tolerante a falhas (também conhecido como Entrevista)

66

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==1parte 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;
dkudriavtsev
fonte
11
O caractere excluído pode resultar na compilação do programa? Isso ainda é contado como não funcionando?
lochok
@ Lochok, sim, isso contaria como um fracasso. Qualquer caractere excluído que leva à Hello, World!não impressão é uma falha.
2
Semelhante pergunta: codegolf.stackexchange.com/questions/4486/...
mowwwalker
@Walkerneo, obrigado! Procurei perguntas semelhantes e não a encontrei. Eu acho que isso é significativamente diferente, no entanto. Em particular, essa pergunta garante que apenas as modificações que resultam em código sintaticamente válido tenham que ser manipuladas.
Você poderia dar um exemplo de "opções de linha de comando e outras configurações que adicionam funcionalidade"? Você quer dizer opções e configurações fornecidas ao próprio programa ou usando opções e configurações no ambiente de construção?
CasaDeRobison 18/02

Respostas:

129

Befunge, Pontuação 0

Eu acho que decifrei - nenhuma exclusão de caractere único mudará a saída.
A exclusão de qualquer caractere da linha 1 não muda nada - ele ainda diminui no mesmo local.
As linhas 2 e 3 são redundantes. Normalmente a linha 2 é executada, mas se você excluir um caractere dele, ele <será perdido e a linha 3 assumirá o comando.
A exclusão de novas linhas também não afeta (ele quebrou minha versão anterior).
Nenhum programa de teste, desculpe.

EDIT : muito simplificado.

                              vv
@,,,,,,,,,,,,,"Hello, world!"<<
@,,,,,,,,,,,,,"Hello, world!"<<

Uma breve explicação do fluxo:

  1. O Befunge começa a executar a partir do canto superior esquerdo, movendo-se para a direita. Os espaços não fazem nada.
  2. v vira o fluxo de execução para baixo, diminuindo uma linha.
  3. < vira o fluxo de execução para a esquerda e lê a linha 2 em ordem inversa.
  4. "Hello, world!"empurra a corda para a pilha. É empurrado na ordem inversa, porque estamos executando da direita para a esquerda.
  5. ,aparece um personagem e o imprime. O último caractere pressionado é impresso primeiro, o que reverte a sequência mais uma vez.
  6. @ finaliza o programa.
Ugoren
fonte
2
+1, ótima solução. Não acho que seja necessário um programa de teste, porque é óbvio que há apenas um pequeno número de exclusões potencialmente significativas.
4
Tão fácil de verificar e nenhuma discussão envolvida. Gênio!
Karma Fusebox
Parabéns por uma excelente solução.
2
Eu sei que isso não é código-golfe , mas aqui está uma versão em 66 bytes .
MD XF
42

Pontuação Perl, 0

(147 caracteres)

Aqui está a minha solução, que eu consegui obter de 4 a 0:

eval +qq(;\$_="Hello, world!";;*a=print()if length==13or!m/./#)||
+eval +qq(;\$_="Hello, world!";;print()if*a!~/1/||!m/./#)##)||
print"Hello, world!"

Ele deve aparecer todos em uma linha para funcionar; quebras de linha são apenas para "legibilidade".

Ele se beneficia da sintaxe patologicamente permissiva de Perl. Alguns destaques:

  • Palavras de barra que não são reconhecidas são tratadas como seqüências de caracteres. Portanto, quando evalse torna evl, isso não é um erro se uma string é permitida nesse ponto.
  • +Operador unário , que não faz nada além de desambiguar sintaxe em determinadas situações. Isso é útil com o exposto acima, porque function +argument(onde + é unário) se torna string + argument(adição) quando o nome de uma função é desconfigurado e se torna uma string.
  • Muitas maneiras de declarar cadeias de caracteres: uma cadeia de caracteres com aspas duplas qq( )pode se tornar uma cadeia de aspas simples q(); uma sequência delimitada por parênteses qq(; ... )pode se tornar uma sequência delimitada por ponto e vírgula qq; ... ;. #strings internas podem eliminar problemas de balanceamento convertendo coisas em comentários.

A extensão disso provavelmente pode ser um pouco reduzida, embora eu duvide que a solução da ugoren possa ser vencida.


fonte
13
+1 para quebras de linha são para facilitar a leitura única ...
Bakuriu
40

HQ9 +

Isso nunca deixará de produzir o resultado pretendido quando um personagem é excluído, obtendo uma pontuação zero.

HH

Quando eu começo?

skeevey
fonte
11
Produz "olá, mundo", mas não "olá, mundo!" como especificado.
Paul R
16
Nonsense, o idioma foi especificado apenas incorretamente no wiki esolang;)
skeevey
11
Bom para você, se eles têm um HQ9 + compilador no computador entrevista ... :)
Você pode escrever seu próprio compilador de buggy.
PyRulez
2
@ mbomb007 Este intérprete imprime Hello, world!para o Hcomando.
Dennis
12

Befunge-98 , pontuação 0, 45 bytes

20020xx""!!ddllrrooww  ,,oolllleeHH""cckk,,@@

Experimente online!

Embora uma solução ótima já tenha sido encontrada (e não haja desempate), pensei em mostrar que isso pode ser simplificado consideravelmente com o Befunge 98.

Explicação

O 20020xxdelta é configurado com segurança (as etapas do ponteiro da instrução entre os ticks) para (2,0)que, começando no primeiro x, apenas todos os outros comandos sejam executados. Veja esta resposta para uma explicação detalhada de por que isso funciona. Depois, o código é apenas:

"!dlrow ,olleH"ck,@

Primeiro, colocamos todos os códigos de caracteres relevantes na pilha com "!dlrow ,olleH". Então ck,significa imprimir a parte superior da pilha ( ,), 13 ( cmais 1) vezes ( k). @finaliza o programa.

Martin Ender
fonte
11

J, 7 pontos

Selecionando cada letra com posição ímpar:

   _2{.\'HHeellllo,,  wwoorrlldd!!'
Hello, world!
randomra
fonte
5
A mesma coisa em golfscript seria 4 pontos:'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box
@cardboard_box Sinta-se livre para enviá-lo. :)
randomra
Voto positivo porque eu o entendo e não parece trapaça.
Michael Stern
3

Befunge-93, Pontuação 0 (63 bytes)

Sei que este não é um desafio do código-golfe, mas achei interessante ver se a solução Befunge-93 existente poderia ser aprimorada em termos de tamanho. Originalmente, eu desenvolvi essa técnica para uso no desafio semelhante ao Erro 404 , mas a necessidade de uma carga útil de empacotamento nesse caso tornou a solução de 3 linhas mais ideal.

Isso não é tão bom quanto a resposta do Martin Befunge-98, mas ainda é uma redução bastante significativa na solução vencedora do Befunge-93.

<>>  "!dlrow ,olleH">:#,_@  vv
  ^^@_,#!>#:<"Hello, world!"<<>#

Experimente online!

Explicação

Existem duas versões da carga útil. Para um programa inalterado, o primeiro <faz com que o programa seja executado da direita para a esquerda, contornando o final da linha, até chegar a vdirecioná-lo para a segunda linha e <direcioná-lo para a versão da esquerda para a direita da carga útil.

Um erro na segunda linha faz com que a final <seja deslocada para a esquerda e substituída por uma >direcionando o fluxo para a direita. O #comando (bridge) não tem nada para pular; portanto, o código continua até que ele se aproxime e atinja um ^no início da linha, direcionando-o para a primeira linha e, em seguida, >direcionando-o para a direita para a direita. carga útil esquerda.

A maioria dos erros na primeira linha apenas faz com que os vcomandos finais se alterem em um, mas isso não altera o fluxo principal do código. A exclusão da primeira <é um pouco diferente - nesse caso, o caminho da execução flui diretamente para a carga útil da esquerda para a direita na primeira linha.

O outro caso especial é a remoção da quebra de linha. Quando o código se aproxima do final da linha, nesse caso, agora é o fim do que costumava ser a segunda linha. Quando ele encontra o #comando da direita, ele salta sobre >e continua diretamente na carga útil da direita para a esquerda.

Caso haja alguma dúvida, também testei com o script perl e confirmou que "0 falhou em 63".

James Holderness
fonte
0

Gol> <> , pontuação 0, 38 bytes

<<H"Hello, world!"/
H"Hello, world!" <

O idioma é lançado após o desafio.

jimmy23013
fonte