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;
fonte
Hello, World!
não impressão é uma falha.Respostas:
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.
Uma breve explicação do fluxo:
v
vira o fluxo de execução para baixo, diminuindo uma linha.<
vira o fluxo de execução para a esquerda e lê a linha 2 em ordem inversa."Hello, world!"
empurra a corda para a pilha. É empurrado na ordem inversa, porque estamos executando da direita para a esquerda.,
aparece um personagem e o imprime. O último caractere pressionado é impresso primeiro, o que reverte a sequência mais uma vez.@
finaliza o programa.fonte
Pontuação Perl, 0
(147 caracteres)
Aqui está a minha solução, que eu consegui obter de 4 a 0:
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:
eval
se tornaevl
, 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, porquefunction +argument
(onde + é unário) se tornastring + argument
(adição) quando o nome de uma função é desconfigurado e se torna uma string.qq( )
pode se tornar uma cadeia de aspas simplesq()
; uma sequência delimitada por parêntesesqq(; ... )
pode se tornar uma sequência delimitada por ponto e vírgulaqq; ... ;
.#
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
HQ9 +
Isso nunca deixará de produzir o resultado pretendido quando um personagem é excluído, obtendo uma pontuação zero.
Quando eu começo?
fonte
Hello, world!
para oH
comando.Befunge-98 , pontuação 0, 45 bytes
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
20020xx
delta é configurado com segurança (as etapas do ponteiro da instrução entre os ticks) para(2,0)
que, começando no primeirox
, 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:Primeiro, colocamos todos os códigos de caracteres relevantes na pilha com
"!dlrow ,olleH"
. Entãock,
significa imprimir a parte superior da pilha (,
), 13 (c
mais 1) vezes (k
).@
finaliza o programa.fonte
J, 7 pontos
Selecionando cada letra com posição ímpar:
fonte
'HHeelllloo,, wwoorrlldd!!'2%
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.
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 av
direcioná-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
v
comandos 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".
fonte
Gol> <> , pontuação 0, 38 bytes
O idioma é lançado após o desafio.
fonte