Al final de su entrevista, Evil Interviewer le dice: "Hacemos que todos nuestros solicitantes tomen una breve prueba de codificación, para ver si realmente saben de qué están hablando. No se preocupen; es fácil. Y si crea un programa de trabajo, te ofreceré el trabajo de inmediato ". Él te indica que te sientes frente a una computadora cercana. "Todo lo que tiene que hacer es crear un programa Hello World que funcione. Pero", y él sonríe ampliamente, "hay un problema. Lamentablemente, el único compilador que tenemos en esta máquina tiene un pequeño error. Elimina aleatoriamente un personaje del archivo de código fuente antes de compilar. Ok, ¡nos vemos en cinco minutos! " Y sale de la habitación, silbando alegremente.
¿Puede garantizar que obtendrá el trabajo?
La tarea
Escriba un programa que imprima Hello, world!
a la salida estándar incluso después de que se elimine un solo carácter de cualquier posición en el archivo. O acércate lo más posible a esto.
Las normas
Sin salida extraña : Hello, world!
debe ser lo único sustantivo impreso en la salida estándar. Está bien incluir otros caracteres si el idioma de su elección los produce naturalmente, como una nueva línea final o incluso algo así [1] "Hello, world!"
(por ejemplo, si estaba usando R), pero debe imprimir exactamente lo mismo cada vez. No se puede imprimir Hello, world!Hello, world!
o Hello world!" && x==1
parte del tiempo, por ejemplo. Las advertencias, sin embargo, están permitidas.
Pruebas Para poder determinar su puntaje, debe probar cada posible permutación del programa: pruébelo con cada carácter eliminado y vea si produce la salida correcta. He incluido un simple programa Perl para este propósito a continuación, que debería funcionar para muchos idiomas. Si no funciona para usted, cree un programa de prueba e inclúyalo en su respuesta.
Puntaje Su puntaje es la cantidad de veces que su programa falla . En otras palabras, el número de posiciones individuales en su archivo donde eliminar un carácter impide que su programa funcione. La puntuación más baja gana. En caso de empate, gana el código más corto.
Las soluciones triviales como "Hello, world!"
en varios idiomas (puntaje de 15) son aceptables, pero no van a ganar. Al menos he encontrado una solución Perl con un puntaje de 4, que eventualmente publicaré.
Actualización: el ganador oficial utilizará un lenguaje de programación completo de Turing y no utilizará ningún mecanismo predefinido que imprima Hello, world!
. Cualquier recurso externo (que no sean las bibliotecas estándar para su idioma) que se utiliza se considera parte de su programa y está sujeto a la misma eliminación de 1 carácter. Estos requisitos estaban pegados al escritorio en una nota adhesiva. Disculpas si no los viste al principio.
Actualización 2: Sí, ¡su programa tiene que cumplir la tarea descrita anteriormente para recibir una puntuación! Lo que significa que debería imprimirse correctamente Hello, world!
al menos una vez. Esto debería haber sido obvio. Los interruptores de línea de comandos y otras configuraciones que agregan funcionalidad también cuentan como parte de su programa y están sujetos a la eliminación de un solo carácter. El programa debe cumplir su tarea sin ninguna intervención del usuario. Una falla en la compilación cuenta en su cuenta de fallas.
Programación feliz, y que consigas el trabajo. Pero si fracasas, probablemente no quieras trabajar para ese jefe malvado de todos modos.
Script de prueba de 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!
no se imprima es un error.