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;
sumber
Hello, World!
tidak dicetak adalah kegagalan.Jawaban:
Di luar, Skor 0
Saya pikir saya telah memecahkannya - tidak ada penghapusan karakter tunggal akan mengubah output.
Menghapus karakter apa pun dari baris 1 tidak akan mengubah apa pun - karakter tetap turun di tempat yang sama.
Baris 2 dan 3 berlebihan. Biasanya baris 2 dieksekusi, tetapi jika Anda menghapus satu karakter dari karakter tersebut, karakter
<
tersebut terlewatkan, dan baris 3 membutuhkan biaya.Menghapus baris baru juga tidak merusaknya (itu merusak versi saya sebelumnya).
Tidak ada program pengujian, maaf.
EDIT : banyak disederhanakan.
Penjelasan singkat tentang aliran:
v
mengubah aliran eksekusi ke bawah, sehingga turun satu baris.<
membelokkan aliran eksekusi ke kiri, sehingga membaca baris 2 dalam urutan terbalik."Hello, world!"
mendorong string ke tumpukan. Ini didorong dalam urutan terbalik, karena kami mengeksekusi kanan ke kiri.,
muncul karakter dan mencetaknya. Karakter terakhir yang didorong dicetak terlebih dahulu, yang membalikkan string sekali lagi.@
mengakhiri program.sumber
Perl, Skor 0
(147 karakter)
Inilah solusi saya, yang berhasil saya dapatkan dari 4 ke 0:
Itu harus muncul semua pada satu baris untuk bekerja; jeda baris hanya untuk "keterbacaan" saja.
Ini mendapat manfaat dari sintaksis permisif patologis Perl. Beberapa hal penting:
eval
menjadievl
, itu bukan kesalahan jika string diizinkan pada saat itu.+
Operator unary , yang tidak melakukan apa pun selain sintaksis disambiguasi dalam situasi tertentu. Ini berguna dengan hal di atas, karenafunction +argument
(di mana + adalah unary) menjadistring + argument
(penambahan) ketika nama fungsi hancur dan menjadi string.qq( )
dapat menjadi string yang dikutip tunggalq()
; string yang dibatasi oleh tanda kurungqq(; ... )
dapat menjadi string yang dibatasi oleh tanda titik komaqq; ... ;
.#
string di dalam dapat menghilangkan masalah keseimbangan dengan mengonversi hal-hal menjadi komentar.Panjang ini mungkin bisa agak berkurang, meskipun saya ragu solusi ugoren dapat dikalahkan.
sumber
HQ9 +
Ini tidak akan pernah gagal untuk menghasilkan hasil yang diinginkan ketika sebuah karakter dihapus sehingga mendapat skor nol.
Kapan saya mulai?
sumber
Hello, world!
untukH
perintah.Befunge-98 , skor 0, 45 byte
Cobalah online!
Meskipun solusi optimal telah ditemukan (dan tidak ada tie breaker), saya pikir saya akan menunjukkan bahwa ini dapat disederhanakan dengan Befunge 98.
Penjelasan
Yang
20020xx
andal mengatur delta (langkah-langkah dari penunjuk instruksi di antara kutu)(2,0)
sehingga mulai dari yang pertamax
, hanya setiap perintah lainnya dieksekusi. Lihat jawaban ini untuk penjelasan terperinci tentang mengapa ini berhasil. Setelah itu, kode tersebut hanyalah:Kami pertama-tama mendorong semua kode karakter yang relevan ke stack
"!dlrow ,olleH"
. Kemudianck,
berarti cetak bagian atas tumpukan (,
), 13 (c
ditambah 1) kali (k
).@
mengakhiri program.sumber
J, 7 poin
Memilih setiap huruf dengan posisi aneh:
sumber
'HHeelllloo,, wwoorrlldd!!'2%
Befunge-93, Skor 0 (63 byte)
Saya tahu ini bukan tantangan kode-golf, tapi saya pikir akan menarik untuk melihat apakah solusi Befunge-93 yang ada dapat ditingkatkan dalam hal ukuran. Saya awalnya mengembangkan teknik ini untuk digunakan dalam tantangan Kesalahan 404 yang serupa , tetapi kebutuhan untuk pembungkus muatan dalam kasus itu membuat solusi 3 baris lebih optimal.
Ini tidak sebagus jawaban Befunge-98 milik Martin, tetapi itu masih merupakan pengurangan yang cukup signifikan pada solusi Befunge-93 yang menang.
Cobalah online!
Penjelasan
Ada dua versi payload. Untuk program yang tidak diubah, yang pertama
<
menyebabkan program untuk mengeksekusi kanan ke kiri, membungkus ke akhir baris, sampai mencapaiv
mengarahkannya ke baris kedua, dan<
mengarahkannya ke kiri ke versi kanan-ke-kanan dari muatan.Kesalahan pada baris kedua menyebabkan final
<
bergeser ke kiri dan diganti dengan>
mengarahkan aliran ke kanan sebagai gantinya. Perintah#
(jembatan) tidak memiliki apa pun untuk melompati, sehingga kode hanya berlanjut sampai membungkus dan mencapai^
pada awal baris, mengarahkannya ke baris pertama, dan kemudian>
mengarahkannya langsung ke kanan ke payload kiri.Sebagian besar kesalahan pada baris pertama hanya menyebabkan
v
perintah terakhir bergeser satu per satu, tetapi itu tidak mengubah aliran utama kode. Menghapus yang pertama<
sedikit berbeda, dalam hal ini jalur eksekusi langsung mengalir ke muatan kiri-ke-kanan pada baris pertama.Kasus khusus lainnya adalah penghapusan jeda baris. Ketika kode membungkus hingga akhir baris, dalam hal ini sekarang menjadi akhir dari apa yang dulunya adalah baris kedua. Ketika bertemu
#
perintah dari kanan, ini melompati>
dan dengan demikian terus langsung ke muatan kanan-ke-kiri.Jika ada keraguan, saya juga telah menguji dengan skrip perl dan mengkonfirmasi bahwa "0 gagal dari 63".
sumber
Gol> <> , skor 0, 38 byte
Bahasa ini dirilis setelah tantangan.
sumber