Hataya Dayanıklı Merhaba Dünyası (aka Röportaj)


66

Röportajınızın sonunda, Evil Mülakatçısı size şunları söylüyor: “Tüm başvuru sahiplerimize ne hakkında konuştuklarını gerçekten bilip bilmediklerini görmek için kısa bir kodlama testi yaptırıyoruz. Endişelenmeyin; kolay. Bir çalışma programı, size hemen işi sunacağım. " Size yakındaki bir bilgisayarda oturmanız için işaret ediyor. "Yapmanız gereken tek şey çalışan bir Hello World programı oluşturmak. Ama" - ve geniş sırıttı - "bir yakalama var. Maalesef bu makinede sahip olduğumuz tek derleyicide küçük bir hata var. Rastgele bir karakteri siler. derlemeden önce kaynak kod dosyası. Tamam, beş dakika sonra görüşmek üzere! " Ve odadan çıkıp mutlu bir şekilde ıslık çalıyor.

İşi alacağını garanti eder misin?

Görev

Hello, world!Tek bir karakter dosyadaki herhangi bir konumdan çıkarıldıktan sonra bile standart çıktıya yazdıracak bir program yazın . Veya buna mümkün olduğunca yaklaşın.

Kurallar

Harici Çıkış Yok - Hello, world!standart çıkışa yazdırılan tek önemli şey olmalıdır. Seçtiğiniz dilde doğal olarak üretildiyse, sondaki yeni satır gibi bir karakter [1] "Hello, world!"(örneğin R kullanıyorsanız) gibi başka karakterler de dahil etmek uygundur , ancak her seferinde aynı şeyi basması gerekir. Bu baskı olamaz Hello, world!Hello, world!ya Hello world!" && x==1örneğin zamanının bir kısmını,. Ancak uyarılara izin verilir.

Test Etme Puanınızı belirlemek için, programın olası her bir permütasyonunu test etmeniz gerekir: kaldırılan her karakter ile test edin ve doğru çıktı üretip üretmediğine bakın. Aşağıda, bu amaçla birçok dilde çalışması gereken basit bir Perl programı ekledim. Sizin için işe yaramazsa, lütfen bir test programı oluşturun ve cevabınıza ekleyin.

Puanlama Puanınız, programınızın başarısız olma sayısıdır . Başka bir deyişle, bir karakterin silinmesinin programınızın çalışmasını engellediği, dosyanızdaki bireysel konumların sayısı. En düşük puan kazanır. Beraberlik durumunda, en kısa kod kazanır.

"Hello, world!"Birkaç dilde olduğu gibi (15 puan) önemsiz çözümler kabul edilebilir, ancak kazanamayacaklar. En azından 4'lü bir Perl çözümü buldum ve sonunda göndereceğim.

Güncelleme: Resmi kazanan, Turing-complete bir programlama dili kullanacak ve yazdırılan önceden tanımlanmış herhangi bir mekanizma kullanmayacak Hello, world!. Kullanılan herhangi bir harici kaynak (kendi diliniz için standart kütüphaneler dışında) programınızın bir parçası olarak kabul edilir ve aynı 1 karakterli silme işlemine tabi tutulur. Bu şartlar, bir not üzerine masaya yapışmıştı. Onları ilk başta görmediyseniz özür dilerim.

Güncelleme 2: Evet, programınız bir puan almak için yukarıda açıklanan görevi yerine getirmek zorunda! Yani Hello, world!en az bir kere başarıyla basmalı. Bu açık olmalıydı. Komut satırı anahtarları ve işlevsellik ekleyen diğer ayarlar da programınızın bir parçası olarak sayılır ve tek karakter silme işlemine tabi tutulur. Program, herhangi bir kullanıcı girişi olmadan görevini yerine getirmelidir. Derleme hatası, başarısızlık sayınıza dahil edilir.

Mutlu programlama ve işi alabilir misiniz? Ama başarısız olursan, muhtemelen o kötü patron için çalışmak istemedin.

Perl testi betiği:

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;

1
Silinen karakter programın derlenmemesine neden olabilir mi? Hala işe yaramadı mı?
lochok

@lochok, evet, bu bir başarısızlık olarak sayılır. Hello, World!Yazdırılmamasına yol açan silinmiş herhangi bir karakter bir başarısızlıktır.


@Walkerneo, teşekkürler! Benzer soruları aradım ve bulamadım. Bence, bunun önemli ölçüde farklı olduğunu düşünüyorum. Özellikle, bu soru yalnızca sözdizimsel olarak geçerli kodla sonuçlanan değişikliklerin yapılması gerektiğini garanti eder.

"Komut satırı anahtarları ve işlevsellik ekleyen diğer ayarlar" hakkında bir örnek verebilir misiniz? Programın kendisine verilen anahtarları ve ayarları mı, yoksa oluşturma ortamı içindeki anahtarları ve ayarları mı kullanıyorsunuz?
CasaDeRobison

Yanıtlar:


129

Befunge, Skor 0

Sanırım kırdım - hiçbir karakter silme çıktısını değiştirmeyecek.
Satır 1'den herhangi bir karakter silmek hiçbir şeyi değiştirmez - aynı yerde kalır.
Satır 2 ve 3 gereksizdir. Normalde 2. satır yürütülür, ancak ondan bir karakter silerseniz <, cevapsız kalır ve 3. satır şarj olur.
Yeni satırları silmek onu da bozmaz (önceki sürümümü bozdu).
Test programı yok, üzgünüm.

EDIT : çok basitleştirilmiş.

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

Akışın kısa bir açıklaması:

  1. Befunge, üst soldan sağa hareket etmeye başlar. Uzay hiçbir şey yapmaz.
  2. v yürütme akışını aşağıya doğru döndürür, böylece bir satır aşağı doğru gider.
  3. < yürütme akışını sola döndürür, böylece satır 2'yi ters sırada okur.
  4. "Hello, world!"dizeyi yığına iter. Tersine doğru ilerledi, çünkü sağdan sola doğru ilerliyoruz.
  5. ,bir karakter çıkar ve yazdırır. Basılan son karakter önce basılır, bu da dizgiyi bir kez daha tersine çevirir.
  6. @ programı sonlandırır.

2
+1, harika bir çözüm. Bir test programının gerekli olduğunu düşünmüyorum çünkü çok az sayıda potansiyel olarak önemli silme olduğu açık.

4
Doğrulaması çok kolay ve tartışma dahil değil. Genius!
Karma Fusebox

Mükemmel bir çözüm için tebrikler.

2
Bunun kod golf olmadığını biliyorum , ama işte 66 baytlık bir sürüm .
MD XF,

42

Perl, Puan 0

(147 karakter)

İşte 4'ten 0'a kadar kazanmayı başardığım çözümüm:

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

Çalışması için tek bir satırda görünmesi gerekir; Satır sonları sadece "okunabilirlik" içindir.

Perl'in patolojik olarak izin verilen sözdiziminden faydalanır. Bazı önemli noktalar:

  • Tanınmayan korkaklar dizeleri olarak kabul edilir. Yani evalolur evlbir dize bu noktada izin verilir ise, bu bir hata değildir.
  • Unary +operatörü, bazı durumlarda açık sözdizimi dışında hiçbir şey yapmaz. Bu, yukarıdakilerle kullanışlıdır, çünkü bir işlev adı yönetildiğinde ve bir dize olduğunda function +argument(+ 'nın tek olduğu) string + argument(ekleme) olur.
  • Dizeleri bildirmenin birçok yolu: Çift tırnaklı bir dize qq( )tek tırnaklı bir dize olabilir q(); Parantezlerle ayrılmış qq(; ... )bir dize, noktalı virgülle ayrılmış bir dize haline gelebilir qq; ... ;. #İçteki dizeler, şeyleri yorumlara dönüştürerek dengeleme sorunlarını ortadan kaldırabilir.

Bunun uzunluğu muhtemelen biraz azaltılabilir, ancak Ügoren'in çözümünün yenilebilir olduğundan şüpheliyim.


13
Satır sonları için +1 yalnızca okunabilirlik içindir ...
Bakuriu

40

HQ9 +

Bu, bir karakter silindiğinde istenen sonucu vermede asla başarısız olmaz, bu nedenle sıfır puan alır.

HH

Ne zaman başlıyorum?


1
"Merhaba dünya!" Olmasa da "merhaba dünyayı" üretir. belirtildiği gibi.
Paul R,

16
Saçma, dil sadece esolang wiki;) üzerinde yanlış bir şekilde belirtildi;)
skeevey

11
Mülakat bilgisayarında HQ9 + derleyici varsa sizin için iyi ... :)

Kendi buggy derleyicinizi yazabilirsiniz.
PyRulez

2
@ mbomb007 Bu tercüman komut Hello, world!için yazdırır H.
Dennis,

12

Befunge-98 , skor 0, 45 bayt

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

Çevrimiçi deneyin!

Her ne kadar optimal bir çözüm bulunmuş olsa da (ve hiçbir bağ kırıcı olmasa da), bunun Befunge 98 ile oldukça kolaylaştığını gösterebileceğimi düşündüm.

açıklama

20020xxGüvenilir delta (keneler arasındaki talimat ibrenin adım) için ayarlar (2,0)böylece ilk başlayan bu x, sadece her komut yürütülür. Bunun neden işe yaradığının ayrıntılı bir açıklaması için bu cevaba bakınız . Daha sonra, kod yalnızca:

"!dlrow ,olleH"ck,@

İlk önce ilgili tüm karakter kodlarını yığına itiyoruz "!dlrow ,olleH". Sonra ck,, yığının üst kısmını ( ,), 13 ( cartı 1) kez ( k) yazdırmak anlamına gelir . @programı sonlandırır.


11

J, 7 puan

Tek harfli her harfi seçmek:

   _2{.\'HHeellllo,,  wwoorrlldd!!'
Hello, world!

5
Golf komut dosyasında aynı şey 4 puan olur:'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box

@cardboard_box Göndermekten çekinmeyin. :)
randomra

İyileştirme çünkü bunu anlıyorum ve hile yapmak gibi gelmiyor.
Michael Stern

3

Befunge-93, Puan 0 (63 bayt)

Bunun kod-golf mücadelesi olmadığını biliyorum, ancak mevcut Befunge-93 çözümünün boyut açısından iyileştirilip geliştirilemeyeceğini görmenin ilginç olacağını düşündüm. Orijinal olarak benzer Hata 404 mücadelesinde kullanılmak üzere bu tekniği geliştirmiştim , ancak bu durumda bir ambalaj taşıma yüküne olan ihtiyaç 3 hat çözümünü daha optimum hale getirdi.

Bu, Martin Befunge-98'in cevabı kadar iyi değil, ama hala kazanan Befunge-93 çözümünde oldukça önemli bir azalma.

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

Çevrimiçi deneyin!

açıklama

Yükün iki versiyonu var. Değiştirilmemiş bir program için birincisi <, programın sağdan sola çalışmasına, satırın sonuna kadar sarılmasına, onu vikinci satıra <yönlendirmesine ve sola-sağa sürümüne yönlendirmesini sağlamasına neden olur. yükü.

İkinci satırdaki bir hata, finalin <sola kaydırılmasına ve >bunun yerine akışı sağa yönlendirerek değiştirilmesine neden olur . #(Köprü) komutu üzerinden atlamak ilgisi yoktur, bu nedenle etrafında sarar ve bir ulaşıncaya kadar kod sadece devam ^sonra ilk satırda için o kadar yönlendirerek, satır başındaki ve >sağ sağ-to- yonlendirilmesıni kalan yük.

İlk satırdaki hataların çoğu son vkomutların birer birer kaymasına neden olur , ancak bu kodun ana akışını değiştirmez. İlkini silmek <biraz farklı olsa da - bu durumda yürütme yolu doğrudan ilk satırdaki soldan sağa yüke doğrudan akar.

Diğer özel durum ise, satır kopmasının giderilmesidir. Kod satırın sonuna geldiğinde, bu durumda şimdi kullanılan ikinci satırın sonu. #Sağdan komutla karşılaştığında , bu üstüne atlar >ve böylece doğrudan sağdan sola taşıma yüküne doğru devam eder.

Herhangi bir şüphe durumunda, perl betiği ile de test ettim ve "0'dan 63'ün başarısız olduğunu" doğruladı.


0

Gol> <> , puan 0, 38 bayt

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

Dil mücadeleden sonra serbest bırakılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.