Hello World Fault-Tolerant (alias Wawancara)

66

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==1beberapa 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;
dkudriavtsev
sumber
1
Bisakah karakter yang dihapus menghasilkan program tidak dikompilasi? Apakah itu masih dianggap tidak berfungsi?
lochok
@lochok, ya, itu akan dianggap gagal. Setiap karakter yang dihapus yang mengarah ke Hello, World!tidak dicetak adalah kegagalan.
2
Pertanyaan serupa: codegolf.stackexchange.com/questions/4486/…
mowwwalker
@ Walkalko, terima kasih! Saya mencari pertanyaan serupa dan tidak menemukan itu. Saya pikir ini sangat berbeda. Secara khusus, pertanyaan itu menjamin bahwa hanya modifikasi yang menghasilkan kode yang valid secara sintaksis yang harus ditangani.
Bisakah Anda memberi contoh "sakelar baris perintah dan pengaturan lain yang menambah fungsionalitas"? Apakah maksud Anda sakelar dan pengaturan yang diberikan pada program itu sendiri, atau menggunakan sakelar dan pengaturan dalam lingkungan build?
CasaDeRobison

Jawaban:

129

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.

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

Penjelasan singkat tentang aliran:

  1. Befunge mulai mengeksekusi dari kiri atas, bergerak ke kanan. Spasi tidak melakukan apa pun.
  2. v mengubah aliran eksekusi ke bawah, sehingga turun satu baris.
  3. < membelokkan aliran eksekusi ke kiri, sehingga membaca baris 2 dalam urutan terbalik.
  4. "Hello, world!"mendorong string ke tumpukan. Ini didorong dalam urutan terbalik, karena kami mengeksekusi kanan ke kiri.
  5. ,muncul karakter dan mencetaknya. Karakter terakhir yang didorong dicetak terlebih dahulu, yang membalikkan string sekali lagi.
  6. @ mengakhiri program.
ugoren
sumber
2
+1, solusi hebat. Saya tidak berpikir program uji diperlukan, karena jelas bahwa hanya ada sejumlah kecil penghapusan yang berpotensi signifikan.
4
Sangat mudah diverifikasi dan tidak ada diskusi yang terlibat. Jenius!
Karma Fusebox
Selamat atas solusi luar biasa.
2
Saya tahu ini bukan kode-golf , tapi ini versi dalam 66 byte .
MD XF
42

Perl, Skor 0

(147 karakter)

Inilah solusi saya, yang berhasil saya dapatkan dari 4 ke 0:

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

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:

  • Bareword yang tidak dikenali diperlakukan sebagai string. Jadi ketika evalmenjadi evl, 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, karena function +argument(di mana + adalah unary) menjadi string + argument(penambahan) ketika nama fungsi hancur dan menjadi string.
  • Banyak cara untuk mendeklarasikan string: string yang dikutip ganda qq( )dapat menjadi string yang dikutip tunggal q(); string yang dibatasi oleh tanda kurung qq(; ... )dapat menjadi string yang dibatasi oleh tanda titik koma qq; ... ;. #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
13
+1 untuk jeda baris hanya untuk dibaca ...
Bakuriu
40

HQ9 +

Ini tidak akan pernah gagal untuk menghasilkan hasil yang diinginkan ketika sebuah karakter dihapus sehingga mendapat skor nol.

HH

Kapan saya mulai?

skeevey
sumber
1
Ini menghasilkan "halo, dunia", bukan "halo, dunia!" seperti yang ditentukan.
Paul R
16
Omong kosong, bahasa itu hanya salah ditentukan pada esolang wiki;)
skeevey
11
Baik untuk Anda jika mereka memiliki kompiler HQ9 + di komputer wawancara ... :)
Anda bisa menulis kompiler kereta Anda sendiri.
PyRulez
2
@ mbomb007 Penerjemah ini mencetak Hello, world!untuk Hperintah.
Dennis
12

Befunge-98 , skor 0, 45 byte

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

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 20020xxandal mengatur delta (langkah-langkah dari penunjuk instruksi di antara kutu) (2,0)sehingga mulai dari yang pertama x, hanya setiap perintah lainnya dieksekusi. Lihat jawaban ini untuk penjelasan terperinci tentang mengapa ini berhasil. Setelah itu, kode tersebut hanyalah:

"!dlrow ,olleH"ck,@

Kami pertama-tama mendorong semua kode karakter yang relevan ke stack "!dlrow ,olleH". Kemudian ck,berarti cetak bagian atas tumpukan ( ,), 13 ( cditambah 1) kali ( k). @mengakhiri program.

Martin Ender
sumber
11

J, 7 poin

Memilih setiap huruf dengan posisi aneh:

   _2{.\'HHeellllo,,  wwoorrlldd!!'
Hello, world!
randomra
sumber
5
Hal yang sama dalam skrip golf adalah 4 poin:'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box
@ cardboard_box Jangan ragu untuk mengirimkannya. :)
randomra
Putus asa karena saya memahaminya, dan rasanya tidak selingkuh.
Michael Stern
3

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.

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

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 mencapai vmengarahkannya 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 vperintah 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".

James Holderness
sumber
0

Gol> <> , skor 0, 38 byte

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

Bahasa ini dirilis setelah tantangan.

jimmy23013
sumber