Pada akhir wawancara Anda, Pewawancara Jahat memberi tahu Anda, "Kami membuat semua pelamar kami mengikuti tes koding singkat, untuk melihat apakah mereka benar-benar tahu apa yang mereka bicarakan. Jangan khawatir; itu mudah. Dan jika Anda membuat program kerja, saya akan segera menawarkan pekerjaan itu kepada Anda. " Dia memberi isyarat agar Anda duduk di depan komputer. "Yang harus Anda lakukan adalah membuat program Hello World yang berfungsi. Tapi" - dan dia nyengir lebar - "ada tangkapan. Sayangnya satu-satunya kompiler yang kami miliki di mesin ini memiliki bug kecil. Secara acak menghapus satu karakter dari file kode sumber sebelum kompilasi. Oke, sampai jumpa dalam lima menit! " Dan dia berjalan keluar ruangan, bersiul dengan gembira.
Bisakah Anda menjamin bahwa Anda akan mendapatkan pekerjaan itu?
Tugas
Tulis program yang akan mencetak Hello, world!
ke output standar bahkan setelah satu karakter dihapus dari posisi apa pun dalam file. Atau sedekat mungkin dengan ini.
Aturan
No Output Ekstran - Hello, world!
harus menjadi satu-satunya hal substantif yang dicetak ke output standar. Tidak apa-apa untuk memasukkan karakter lain jika mereka secara alami diproduksi oleh bahasa pilihan Anda - seperti baris baru atau bahkan sesuatu seperti [1] "Hello, world!"
(misalnya jika Anda menggunakan R), tetapi harus mencetak hal yang sama persis setiap saat. Itu tidak dapat dicetak Hello, world!Hello, world!
atau Hello world!" && x==1
beberapa waktu, misalnya. Peringatan, bagaimanapun, diizinkan.
Pengujian Untuk menguji menentukan skor Anda, Anda harus menguji setiap permutasi yang mungkin dari program: mengujinya dengan setiap karakter dihapus, dan melihat apakah itu menghasilkan output yang benar. Saya telah memasukkan program Perl sederhana untuk tujuan ini di bawah ini, yang seharusnya berfungsi untuk banyak bahasa. Jika tidak berhasil untuk Anda, buatlah program uji dan sertakan dalam jawaban Anda.
Mencetak skor Anda adalah berapa kali program Anda gagal . Dengan kata lain, jumlah posisi individual dalam file Anda di mana menghapus karakter mencegah program Anda bekerja. Skor terendah menang. Dalam hal seri, kode terpendek menang.
Solusi Sepele seperti "Hello, world!"
dalam beberapa bahasa (skor 15) dapat diterima, tetapi mereka tidak akan menang. Saya setidaknya telah menemukan solusi Perl dengan skor 4, yang akhirnya akan saya posting.
Pembaruan: Pemenang resmi akan menggunakan bahasa pemrograman Turing-lengkap dan tidak akan menggunakan mekanisme yang telah ditentukan yang mencetak Hello, world!
. Sumber daya eksternal apa pun (selain perpustakaan standar untuk bahasa Anda) yang digunakan dianggap sebagai bagian dari program Anda dan tunduk pada penghapusan 1 karakter yang sama. Persyaratan ini tertempel di meja pada catatan tempel. Permintaan maaf jika Anda tidak melihatnya pada awalnya.
Pembaruan 2: Ya, program Anda harus benar-benar menyelesaikan tugas yang dijelaskan di atas untuk menerima skor! Berarti itu harus berhasil mencetak Hello, world!
setidaknya sekali. Ini seharusnya sudah jelas. Sakelar baris perintah dan pengaturan lain yang menambah fungsionalitas juga dihitung sebagai bagian dari program Anda dan tunduk pada penghapusan satu karakter. Program harus menyelesaikan tugasnya tanpa input pengguna. Kegagalan untuk mengkompilasi jumlah dalam kegagalan Anda.
Selamat pemrograman, dan semoga Anda mendapatkan pekerjaan. Tetapi jika Anda gagal, Anda mungkin tidak ingin bekerja untuk bos jahat itu.
Skrip uji 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!
tidak dicetak adalah kegagalan.