フォールトトレラントハローワールド(別名インタビュー)


66

インタビューの最後に、悪のインタビュアーは次のように語っています。「すべての応募者に短いコーディングテストを行って、彼らが話していることを本当に知っているかどうかを確認します。心配しないでください。実用的なプログラムです。すぐに仕事を提供します。」彼はあなたが近くのコンピューターに座るようにジェスチャーします。「あなたがしなければならないのは、有効なHello Worldプログラムを作成することです。しかし」-そして彼は広く笑います-「キャッチです。残念ながら、このマシンにある唯一のコンパイラには小さなバグがあります。ソースコードファイルをコンパイルする前に。OK、5分でお会いしましょう!」そして彼は部屋から出て、喜んで口whiを吹く。

あなたが仕事を得ることを保証できますか?

タスク

Hello, world!ファイル内の任意の位置から単一の文字が削除された後でも、標準出力に印刷するプログラムを作成します。または、できるだけこれに近づいてください。

ルール

無関係な出力なし - Hello, world!標準出力に印刷される唯一の実質的なものでなければなりません。選択した言語によって自然に生成される他の文字を含めることは問題ありません -末尾の改行やそのようなもの[1] "Hello, world!"(たとえば、Rを使用している場合)でも、毎回まったく同じものを印刷する必要あります。たとえば、 印刷できないHello, world!Hello, world!場合がありますHello world!" && x==1。ただし、警告は許可されます。

テストスコアをテストするために、プログラムの各可能な順列をテストする必要があります。各文字を削除してテストし、正しい出力が生成されるかどうかを確認します。この目的のために、多くの言語で機能するはずの簡単なPerlプログラムを以下に示しました。うまくいかない場合は、テストプログラムを作成して回答に含めてください。

採点あなたのスコアはあるプログラムが失敗した回数。言い換えると、文字を削除するとプログラムが機能しなくなるファイル内の個々の位置の数です。最低スコアが勝ちます。同点の場合、最短のコードが優先されます。

"Hello, world!"いくつかの言語(15のスコア)などの単純なソリューションは受け入れられますが、勝つことはできません。少なくともスコア4のPerlソリューションを見つけましたが、最終的に投稿します。

更新: 公式の勝者はチューリング完全なプログラミング言語を使用し、印刷する定義済みのメカニズムを使用しませんHello, world!。使用される外部リソース(言語の標準ライブラリ以外)はプログラムの一部と見なされ、同じ1文字の削除の対象となります。 これらの要件は、ポストイットノートでデスクに貼り付けられていました。最初に表示されなかった場合はおologiesび申し上げます。

アップデート2:はい、あなたのプログラムは実際にスコアを受け取るために上記のタスクを達成しなければなりません!つまりHello, world!、少なくとも1回は正常に印刷されるはずです。これは明らかなはずです。機能を追加するコマンドラインスイッチおよびその他の設定もプログラムの一部としてカウントされ、単一文字の削除の対象となります。プログラムは、ユーザー入力なしでタスクを実行する必要があります。コンパイルに失敗すると、失敗カウントにカウントされます。

幸せなプログラミング、そして仕事を手に入れてください。しかし、あなたが失敗した場合、おそらくその邪悪なボスのために働きたくなかったでしょう。

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;

1
削除されたキャラクターは、プログラムをコンパイルできませんか?それはまだ機能していないとカウントされますか?
lochok

@lochok、はい、それは失敗としてカウントされます。Hello, World!印刷されないことにつながる削除された文字はすべて失敗です。


@Walkerneo、ありがとう!同様の質問を検索しましたが、見つかりませんでした。ただし、これは大きく異なると思います。特に、その質問は、構文的に有効なコードをもたらす変更のみを処理する必要があることを保証します。

「機能を追加するコマンドラインスイッチおよびその他の設定」の例を挙げていただけますか?プログラム自体に与えられたスイッチと設定、またはビルド環境内でスイッチと設定を使用するということですか?
CasaDeRobison 14

回答:


129

Befunge、スコア0

私はそれをクラックしたと思う-単一の文字の削除は出力を変更しません。
行1から任意の文字を削除しても何も変わりません。同じ場所で引き続きダウンします。
2行目と3行目は冗長です。通常、2行目が実行されますが、そこから文字を削除すると、<行方不明になり、3行目が処理されます。
改行を削除しても、改行は削除されません(以前のバージョンは削除されました)。
テストプログラムはありません。申し訳ありません。

編集:多くの簡素化。

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

フローの簡単な説明:

  1. Befungeは左上から実行を開始し、右に移動します。スペースは何もしません。
  2. v 実行フローを下向きにするため、1行下に移動します。
  3. < 実行フローを左に変えるので、行2を逆の順序で読み取ります。
  4. "Hello, world!"文字列をスタックにプッシュします。右から左に実行しているため、逆の順序でプッシュされます。
  5. ,文字をポップして印刷します。最後にプッシュされた文字が最初に印刷され、文字列がもう一度反転されます。
  6. @ プログラムを終了します。

2
+1、優れたソリューション。潜在的に重要な削除が少数しかないことは明らかなので、テストプログラムは必要ないと思います。

4
検証が簡単で、議論は必要ありません。天才!
カルマFusebox

すばらしいソリューションをおめでとうございます。

2
私はこれがコードゴルフではないことを知っていますが、これは66バイトのバージョンです。
MD XF

42

Perl、スコア0

(147文字)

これが私のソリューションで、4から0になりました。

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

動作するには、すべて1行で表示される必要があります。改行は「読みやすさ」のみを目的としています。

Perlの病理学的に寛容な構文の恩恵を受けます。いくつかのハイライト:

  • 認識されないベアワードは文字列として扱われます。そのため、evalevlになったとき、その時点で文字列が許可されていればエラーではありません。
  • 単項+演算子。特定の状況で構文を明確にすること以外は何もしません。これは、関数名がマングルされて文字列になったときに(function +argument+は単項)がstring + argument(追加)になるため、上記の場合に便利です。
  • 文字列を宣言する多くの方法:二重引用符で囲まれた文字列qq( )は、単一引用符で囲まれた文字列になりq()ます。括弧で区切られqq(; ... )た文字列は、セミコロンで区切られた文字列になりますqq; ... ;#文字列の内部では、物事をコメントに変換することでバランスの問題を解消できます。

この長さはおそらくいくらか短くなる可能性がありますが、私はウゴレンの解決策に打ち勝つことができるとは思いません。


13
改行の +1は読みやすさのみを目的としています
...-バクリウ

40

HQ9 +

これにより、キャラクターが削除されたときに意図した結果が得られず、スコアがゼロになります。

HH

いつ始めますか?


1
「hello、world!」ではなく「hello、world!」を生成します。指定どおり。
ポールR

16
ナンセンス、言語は
esolang

11
インタビュー用のコンピューターにHQ9 +コンパイラーがある場合に役立ちます... :)

バグのある独自のコンパイラを作成できます。
PyRulez 14

2
@ mbomb007 このインタープリターHello, world!Hコマンドを出力します。
デニス

12

Befunge-98、スコア0、45バイト

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

オンラインでお試しください!

最適な解決策は既に見つかっています(タイブレーカーはありません)が、Befunge 98でこれをかなり簡略化できることを示すと思いました。

説明

20020xx確実にデルタ(ダニ間の命令ポインタのステップ)を設定する(2,0)最初から始まるようにx、唯一の他のすべてのコマンドが実行されます。これが機能する理由の詳細な説明については、この回答を参照してください。その後のコードは次のとおりです。

"!dlrow ,olleH"ck,@

まず、関連するすべての文字コードをでスタックにプッシュし"!dlrow ,olleH"ます。次にck,、スタックの上部(,)を13(cプラス1)回(k)印刷します。@プログラムを終了します。


11

J、7ポイント

奇数の位置を持つすべての文字を選択する:

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

5
golfscriptで同じことが4点になります:'HHeelllloo,, wwoorrlldd!!'2%
cardboard_box

@cardboard_box自由に提出してください。:)
randomra

私はそれを理解しているので、賛成します、そしてそれは不正行為のように感じません。
マイケルスターン14

3

Befunge-93、スコア0(63バイト)

これはコードゴルフの挑戦ではないことは知っていますが、既存のBefunge-93ソリューションをサイズの面で改善できるかどうかを確認するのは興味深いと思いました。私はもともと、同様のエラー404チャレンジで使用するためにこの手法を開発しましたが、その場合のラッピングペイロードの必要性により、3ラインソリューションがより最適になりました。

これは、MartinのBefunge-98の回答ほどではありませんが、それでも優勝したBefunge-93ソリューションのかなり大幅な削減です。

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

オンラインでお試しください!

説明

ペイロードには2つのバージョンがあります。変更されていないプログラムの場合、最初<のプログラムは、プログラムを右から左に実行し、行の終わりまで折り返しv、2行目に下って行き<、左から右バージョンに左に移動するようにします。ペイロードの。

2行目のエラーにより、ファイナル<が左にシフトされ、>代わりにフローを右に方向付けるように置き換えられます。#(ブリッジ)コマンドが飛び越えるには何もしていますので、コードはちょうどそれがラップアラウンドするまで継続して到達した^行の先頭に、最初の行にそれを指示した後、>右、右対にそれを向けます左ペイロード。

最初の行のほとんどのエラーは、最後のvコマンドを1つだけシフトさせますが、コードのメインフローは変更されません。<ただし、最初の削除はわずかに異なります-その場合、実行パスは最初の行の左から右のペイロードに直接流れます。

もう1つの特殊なケースは、改行の削除です。コードが行の終わりまで折り返すと、この場合は、2行目であったものの終わりになります。#右からコマンドに遭遇すると、これは飛び越え>て、右から左へのペイロードに直接続きます。

疑問がある場合は、perlスクリプトでもテストし、「63は0で失敗しました」ことを確認しました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.