自然のままの世界のプログラミング


87

そのままのプログラムを、それ自体にエラーはないが、N文字の連続する部分文字列を削除して修正するとエラーになるプログラムとして定義してみましょう1 <= N < program length

たとえば、3文字のPython 2プログラム

`8`

長さ1の部分文字列を削除した結果、すべてのプログラムでエラーが発生するため(実際には構文エラーですが、あらゆるタイプのエラーが発生するため)、初期のプログラムありがとう、Spです。

8`
``
`8

また、長さ2の部分文字列を削除した結果、すべてのプログラムがエラーを引き起こします。

`
`

たとえば、エラーのない`8プログラムであった場合、部分文字列の削除の結果はすべてエラーに`8`なるため、初期状態ではありません。

このチャレンジでのあなたの仕事は、入力を一切受け取らず、次の5つの単語のいずれか1つを出力する、できるだけ短い原始的なプログラムを作成することです。

world
earth
globe
planet
sphere

どの言葉を選ぶかはあなた次第です。唯一の単語とオプションの末尾の改行を標準出力(または言語の最も近い代替)に印刷する必要があります。バイト単位の最短プログラムが優先されます。

ノート:

  • 機能ではなく、スタンドアロンプ​​ログラムが必要です。
  • 単語は大文字と小文字が区別されます。出力WorldまたはEARTH許可されていません。
  • コンパイラの警告はエラーとしてカウントされません。
  • エラーが発生したサブプログラムは、常に最終的にエラーが発生する限り、入力を取得したり、出力を提供したり、その他の処理を実行したりできます。

これは、潜在的に原始的なプログラムでエラーが発生する必要があるプログラムをリストするスタックスニペットです。

<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>function go() { var s = $('#i').val(), e = []; for (var i = 1; i < s.length; i++) { for (var j = 0; j <= s.length - i; j++) { e.push(s.substring(0, j) + s.substring(j + i)); } } $('#o').val(e.join('\n---\n')); }</script>Program:<br><textarea id='i' rows='16' cols='80'>`8`</textarea><br><button onclick='go()' type='button'>Go</button><br><br>Programs that should error: (--- separated)<br><textarea id='o' rows='16' cols='80'></textarea><br>


1
@geokavelはい。例外をキャッチすると、それはもはやエラーではないことを意味します。
カルビンの趣味

33
削除済みの回答と同じ数の削除済み回答。それは成果です!
DLosc

1
プログラムは独自のソースコードを読むことができますか?
Shelvacu

2
「近いが葉巻はない」という答えとそのコメントの墓場をどこで見ることができますか?
Vi。

1
@Vi。削除された投稿表示できるように、2,000人の担当者を獲得します。
ThisSuitIsBlackNot

回答:


46

レール、24バイト

$'main'    #
 -[world]o/

これはうまくいくと思う。そして、それは短くて読みやすいです(Railsに関する限り)。

  • 削除された部分文字列に$'main'getの一部が含まれる場合Internal Error: Crash: No 'main' function found
  • 削除された部分文字列にが含まれている場合、#プログラムを正常に終了する方法がないため、常にで終了しCrash: No valid moveます。トラックが有効な(無限の)ループを形成するような部分文字列を削除することは不可能だと思います。
  • 削除された部分文字列がの前にある#場合、線路の端から切断されるため、列車はクラッシュします(上記と同じエラーが発生します)。
  • 削除された部分文字列がの後にある場合、トラックの最後から(および潜在的にエントリポイントからトラックの先頭まで#も)切断します。再び同じエラー。#$

実際のプログラムに関しては、すべてのRailプログラムには$'main'、関数へのエントリポイントとして(または、より長いバリエーションがありますが、ここではゴルフをしている)必要があり、列車は$南東から出発します。ただし、最初の行のすべてがトラックの一部になる可能性があるため'main'、トラックを削除することは次のとおりです。

$          #
 -[world]o/

-そして/単に私たちは列車が、これらの45°ターンを取るようにする必要があり、レールの部分です。

[world]文字列worldをプッシュしてo印刷します。#トラックの終わりを示します-Railプログラムを安全に終了する唯一の方法です。

興味深いことに、このソリューションは、レールが線路を通過できるためにのみ可能ですmain-それが不可能な場合#は最初の改行の後になり、コードは常に

$'main'
 #

これは何もしない有効なプログラムです。(間の非空白文字'とは、#その影響を与えません。)

また非常に興味深い:印刷するタスクをゴルフしただけでworldは、それほど短くも単純でもなかったでしょう。

$'main'
 -[world]o#

4
[と]の間の文字を削除するとどうなりますか?
マーティンリュッケ

@MartinLütkeそれが切断されます/から#
マーティンエンダー

2
@MartinLütke角かっこは連続していないため、削除できませんでした。
カルビンの趣味

2行の間の改行を削除するとどうなりますか?
Vi。

1
@Vi。これ$により、線路の始点との接続が切断されるため、列車はすぐにクラッシュします(レールは線路が南東部に続くことを期待しています$)。
マーティンエンダー

43

機能(UTF-16で186 136バイト)

╔══════════════╗
║19342823075080╟
║88037380718711║
╚══════════════╝

このプログラムは「world」を出力します。

これから削除するほとんどの部分文字列は、完全なボックスになるのを防ぎ、パーサーは文句を言います。完全なボックスを残す唯一の可能な削除は次のとおりです。

 ╔══════════════╗
|║19342823075080╟  (remove this whole line)
|║88037380718711║
 ╚══════════════╝
 ╔══════════════╗
 ║|19342823075080╟   ← substring starts at | here
 ║|88037380718711║   ← substring ends at | here
 ╚══════════════╝
... ↕ or anything in between these that removes a whole line’s worth ↕ ...
 ╔══════════════╗
 ║19342823075080|╟   ← substring starts at | here
 ║88037380718711|║   ← substring ends at | here
 ╚══════════════╝
 ╔══════════════╗
|║19342823075080╟
 ║88037380718711║  (both lines entirely)
|╚══════════════╝
 ╔══════════════╗
 ║19342823075080╟
|║88037380718711║  (remove this whole line)
|╚══════════════╝

これらのほとんどは、出力コネクタであるボックスの右上にあるぶら下がり端を削除します。このゆるい終わりがなければ、ボックスは単なるコメントです。

╔══════════════╗
║88037380718711║
╚══════════════╝

パーサーは、出力が1つだけのプログラムを予期するため、これはもはや有効なプログラムではありません。

エラー:ソースファイルにはプログラムが含まれていません(プログラムには出力が必要です)。

出力コネクタを残す唯一の可能性は、上記の最後の1つであり、これはこれを残します:

╔══════════════╗
║19342823075080╟
╚══════════════╝

ただし、この番号はFuncitonの難解なUTF-21で有効なUnicode文字列をエンコードしません。これを実行してみてください:

未処理の例外:System.ArgumentOutOfRangeException:有効なUTF32値は0x000000〜0x10ffffであり、サロゲートコードポイント値(0x00d800〜0x00dfff)を含むべきではありません。

したがって、このプログラムは手付かずです。


3
最後のケースでラッキーになった気がします(誤って有効なUnicodeシーケンスを取得するのはそれほど簡単ではありませんが、それでも...)
Esolanging Fruit

34

Visual C ++- 96 95バイト

#include<iostream>
#define I(a,b)a<<b
int main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}

プロパティ:

  1. int main()コンパイルエラーなしでの一部を削除することはできません。
  2. あなたは、削除、AT ALLマクロ展開を変更、削除することはできませんaすべての手段でmain()取得することはありません{削除、bすべての私たちの行がで終わっていないこと;、取り除く<手段と、std::cout<'w'エラーが発生し、削除<<の原因std::cout'w''w''o'など、
  3. マクロ定義または呼び出しからパラメーターを削除することはできません。定義の有効な名前はのみで、一致することI(a)I(b)なくI、前に展開され(ます。一方、使用I(,原因<<<<、及び,)セミコロン(他のエラーがなければ)が低下します。
  4. std::cout先頭のにぶつからない限り、すべての一部を削除することはできません。<<したがって#include<iostream>、コンパイルエラーが発生しない限り、先頭のいずれも削除できません。
  5. 単一の文字の一部を削除することはできません。''空の文字エラー'w,などがあります。すべてを1つの文字にしようとします。
  6. マクロの左側/右側を削除することはできません。多すぎる)(、反対側に残しておく必要がありますI('w',I('r'。たとえば、などの操作はできません。

Visual C ++を使用してオンラインでコンパイルします。

繰り返しますが、これは完全な証拠ではありません。セクションがなくても機能すると思う場合は、必ずお知らせください。

以前のバージョンはかなり異なるアプローチを使用し、初期の状態ではないことが証明されたため、これらのスコアを削除しました。


検証:

次のプログラムは、このバージョンがclVisual C ++ 2010のコンパイラーを使用した初期状態であることを確認しています。

#include <fstream>
#include <iostream>
char *S = "#include<iostream>\n#define I(a,b)a<<b\nint main()I({std::cout,I('w',I('o',I('r',I('l','d';)))))}";
//uncomment to print source code before compile
// #define prints
int main(){
   for(int i=0; i<95; i++)
      for(int j=i; j<95; j++){
         std::fstream fs;
         fs.open ("tmptst.cpp",std::fstream::out);
         for(int k=0; k<95; k++)
         if(k<i || k>j){
            fs << S[k];
            #ifdef prints
               std::cout<<S[k];
            #endif
         }
         fs.close();
         #ifdef prints
            std::cout<<'\n';
         #endif
         //Compile and surpress/pipe all output
         //if it doesn't compile we get a nonzero errorlevel (i.e.true) from system.
         if(!system("cl -nologo tmptst.cpp >x"))
            return 0;
      }
      std::cout<<"PRISTINE!";
}

1
これはこのコンパイラでは元々のものですが、すべてのコンパイラでそうではありません。
ジョシュア

1
たとえば....教えてください
ライナス

3
一部のコンパイラでは、空のC ++プログラムは何もしないプログラムを生成します。iostreamの実装によっては、#include <iostream>もコンパイルされる場合があります。
ジョシュア

5
@Joshua長さ1以上のサブプログラムのみが重要であるため、空のプログラムが何をするかは関係ありません。
ThisSuitIsBlackNot

2
@Comintern、そうでもない。実行可能ファイルを実行するためのチェックボックスをオンにしない場合、/cオプションは自動的に含まれ、コンパイルされます(プログラムではなくライブラリを作成するかのように)。サイトに含まれていない実行ボックスを/cオンにすると、成功メッセージは表示されず、代わりに自然な「LINK:致命的なエラーLNK1561:エントリポイントを定義する必要があります」が見つかります。
ライナス

32

Python 3、79 33

if 5-open(1,'w').write('world'):a

open(1,'w')標準出力を開き、文字列を出力します。write書き込まれた文字数を返します。これは、部分文字列の削除を強化するために使用されます。文字列の一部を削除すると、5以外が返され、その値から5を引いた値がtrueと評価されます。しかし、それはif-bodyを実行させ、a未定義です。

これは、Anders Kaseorgの巧妙な原始的なクインに基づいています

検証する必要があるのは1つのステートメントのみであるため、これは古いソリューションよりもはるかに短いですが、一般的ではありません。

古いソリューション:

try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r

本当に初期のプログラムであることを確認するには:

w=r'''try:
 q="print('world');r=None"
 if exec('e=q')==eval(q[17:]):exec(e)
finally:r'''
exec(w)
for j in range(1,len(w)):
 for i in range(len(w)+1-j):
  e=w[:i]+w[i+j:]
  try:exec(e,{});print('WORKED',e)
  except:pass

いくつかのキーポイント:

  • 実行されたステートメントはすべて削除できます。q実行されたことを確認するには、以外のステートメントが必要ですqtryきれい、少なくとも二つの文を要求することによって、どちらも完全に削除することができる解決します。
  • 最後にq評価rすることにより、実行されたことを確認します。
  • すなわち、ベリファイqすることによって達成される変更されなかったeval(q[17:])と評価するように持っている、Noneのためにq実行することができます。
  • if条件は、権利を取得する少しトリッキーです。それは設定の素敵な副作用がある評価されたことを確認するためにe設定するために必要とされます、r。(expr関数が式レベルの副作用を不思議に思うので、これがPython 3を使用した理由です。)

削除しないと構文エラーになるという課題はありませんか?実行時エラーを引き起こすようです。
マーティンリュッケ

5
@MartinLütkeどのタイプのエラーでも問題ありません。
カルビンの趣味

1
ええと、これは79バイトではありませんか?
マット

@TheMattうん?もう一度数えたところ、あなたは正しいようです。たぶん過去の私はCRLF改行を数えた...なんて恥ずかしい。ありがとう!
フィリップ

25

ハスケル、61

x=uncurry(:)
main=putStr$x('w',x('o',x('r',x('l',x('d',[])))))

どんな種類のエラーでも構いませんか?その場合:

ハスケル、39

main=putStr$take 5$(++)"world"undefined

これは、いずれかの文字を削除しても機能しますか?
リトシアスト

実行中にクラッシュします。未定義の評価を試みるためです。
マーティンリュトケ

これは素晴らしいです。遅延評価FTW、それが表示されます!
DLosc

1
。私はその後:(前奏曲だった'INITS'希望:メイン= putStr $ "世界" INITS !! 5(27バイト)
マーティンLütke

16

JavaScript、74 73 35バイト

if((alert(a="world")?x:a)[4]!="d")x

答えは思ったよりもずっと簡単だったことがわかりました...

説明

if(
  (
    alert(a="world") // throws a is not defined if '="world"' is removed
        ?x           // throws x is not defined if 'alert' or '(a="world")' is removed
        :a           // throws a is not defined if 'a="world"' or 'a=' is removed
  )
  [4]!="d"           // if "world" is altered fifth character will not be "d"
                     // if 'd' is removed it will compare "world"[4] ("d") with ""
                     // if '[4]' is removed it will compare "world" with "d"
                     // if '(alert(a="world")?x:a)' is removed it will compare [4] with "d"
                     // if '?x:a' is removed [4] on alert result (undefined[4]) will error
                     // if '[4]!="d"' is removed the if will evaluate "world" (true)
                     // if '!', '!="d"' or '(alert...[4]!=' is removed the if will
                     //     evaluate "d" (true)
)x                   // throws x is not defined if reached

// any other combination of removing substrings results in a syntax error

以外のすべてを削除しa="world"、エラーはありません
anOKsquirrel

3
@anOKsquirrel削除できるサブストリングは1つだけです。
デニス

4
「これを削除できますか?いいえ、このエラーが発生します。削除できますか?さて、この他のエラーの原因になると思います。Aha!それらの文字は削除できます!ちょっと待ってください...」+1
ETHproductions

if(a="world")["bol"+a[4]]エラーはありません。
anOKsquirrel

4
聖なる牛、今では二倍の印象です!私は...再び+1ことがしたい
ETHproductions

15

Java 8、301バイト

すべての質問にはJavaの答えが必要だからです。

class C{static{System.out.print(((((w='w')))));System.out.print((((o='o'))));System.out.print(((r='r')));System.out.print((l='l'));System.out.print(d='d');e=(char)((f=1)/((g=8)-C.class.getDeclaredFields()[h=0].getModifiers()));}public static void main(String[]a){}static final char w,o,r,l,d,e,f,g,h;}

拡大

class C {
    static {
        System.out.print(((((w = 'w')))));
        System.out.print((((o = 'o'))));
        System.out.print(((r = 'r')));
        System.out.print((l = 'l'));
        System.out.print(d = 'd');
        e = (char) ((f = 1) / ((g = 8) - C.class.getDeclaredFields()[h = 0].getModifiers()));
    }

    public static void main(String[] a) { }

    static final char w, o, r, l, d, e, f, g, h;
}

説明

  • public static main(String[]a){} 必要とされている。
  • フィールド宣言が削除された(または非静的にされた)場合、最初の静的ブロックはそれらを見つけることができません。
  • 静的ブロックが削除される(または非静的にされる)場合、フィールドは初期化されません。

一番難しい部分:

  • 場合はfinalキーワードが削除され、2行目は、と評価された1/(8-8)原因と、/ by zero例外を。

印刷ステートメントの内部を削除できないのはなぜですか?
ニックハートリー

2
@QPaysTaxes空のSystem.out.print()メソッドはありません。がありますが、println()ではありませんprint()。したがって、削除d='d'するとThe method print(boolean) in the type PrintStream is not applicable for the arguments ()エラーとして表示されます(削除d=するとThe blank final field d may not have been initializedエラーとして表示されます)。
ケビンCruijssen

15

機能143 142 136バイト

UTF-16は(BOMにより)2バイト大きくなるため、スコアは通常のUTF-8で表されます。

╔══════════╗
║1934282307║╔╗
║5080880373╟╚╝
║80718711  ║
╚══════════╝

だから、私はしばらくの間Funcitonの答えを熟考してきましたが、それは不可能だと思っていました。なぜなら、あなたは常に完全な行を削除でき、コードは依然として有効なブロックを形成するからです。それから私はそれについてTimwiに話しました、そして、彼はそれを取り除くと出力コネクタの欠如のためにプログラムを壊すように、あなたはただ1行に数全体を入れることができるとわかりました

しかし、単一の行にリテラルは悪名高く、両方のために、より大きな文字カウントの高価でかつので、非ASCII文字のより多くの。そして、「空のコメント」ブロックの彼の言及は、私に考えさせられました...

それで、空のコメントブロックを追加して使用するこのより効率的なソリューションを思いつきました。

  • 出力コネクタを削除するため、3行目を削除することはできません。
  • 2行目を削除すると、コメントブロックの上端が失われ、破損します。

それには2つのオプションがあります(指摘してくれたSteveに感謝します)。

  • 4行目を削除します。これにより、両方のボックスがそのままになります。ただし、結果の整数19342823075080880373がデコードされると、対応する文字列には0x18D53B有効なUnicode文字ではないコードポイントが含まれ、でSystem.Char.ConvertFromUtf32クラッシュしますArgumentOutOfRangeException
  • 右上隅から始まる行全体を削除します。繰り返しますが、両方のボックスはそのまま残りますが、結果の整数508088037380718711には2つの無効なコードポイント0x1B0635とが含ま0x140077れ、同じ例外が発生します。

空のコメントブロックがない場合でも、2行目を削除するとコードポイントが無効になることに注意してください。ただし、コメントブロックにより、2番目の行の内側から行を取得して、次のような整数を取得できなくなります。193428037380718711たとえばエラーを引き起こさないことができなくなります。


出力コネクタの後の文字で始まり、正確に1行後に終了する部分文字列を削除するとどうなりますか?つまり、コメントブロックの中央の行とメインブロックの「80718711」を含む行を削除しますが、両方のボックスの角はそのまま残します。
スティーブ

@スティーブそのケースをカバーするために答えを修正しました。少し調べてみると、実際には2文字/ 6バイトを節約できました。
マーティンエンダー

10

ルビー、36

eval(*[(s="planet")[$>.write(s)^6]])

を割り当てs="planet"、その文字列をSTDOUTに書き込みます。これは、書き込まれた文字数を返します。それを6でxorし、6文字以外が書き込まれた場合、ゼロ以外の整数を取得します。次にs、そのインデックスでスライスします。s有効なコード文字列(no-op)は、「p」の0番目の文字のみです。をeval使用して、(*[argument])(argument)メソッド呼び出し以外では有効でないことを除いて、それと同等構文をます。

Ruby 1.9.3および2.2でプログラムで検証された清らかさ


神聖ながらくた。これは素晴らしいです。
クラップ

を削除するとどうなり*ますか?
LegionMammal978

次に、ArgumentErrorである文字列ではなくevalに配列を渡します。
histocrat

9

C位、128の 118 101バイト

連続した部分文字列ルールを悪用する考え。

コード

class h{static void Main()=>System.Console.Write(new char[1
#if!i
*5]{'w','o','r','l','d'
#endif
});}

なぜ機能するのか

  1. class hそしてstatic void Main()必要とされます。
  2. 'w','o','r','l','d'文字配列をlengthで初期化するため、文字を削除するとエラーが発生します1*5
  3. 部分はプリプロシージャで区切られているため、連続する文字ルールに違反せずにMain()内のコンテンツを削除することはできません。(下記参照)

ゴルフと分離の前に

class h
{
    static void Main() =>
        System.Console.Write(new char[1 * 5]{'w','o','r','l','d'});
}

検証済み

https://ideone.com/wEdB54

編集:

  • #if !x代わりに使用して、いくつかのバイトを保存しました#if x #else
  • =>func構文を使用しました 。#if!xの代わりに#if !x。@JohnBotへのクレジット。
  • =>func構文により、余分なpreproc条件を削除できます。

こんにちはヘリックス!あなたの答えがもう少しうまくいく方法と理由を説明できると思いますか?
isaacg

@isaacg編集。フォローする証拠。
Helix Quar

staticon なしでは実行できませんMain
ジョンボット

@Johnbotうん。誤ってコピーしたに違いありません。一定。
Helix Quar

Expression-bodied関数のメンバーを作成Mainし、プリプロセッサ条件の前にスペースを削除してさらに2を作成すると、キャラクターを保存できます。私のカウントでは115です。class h{static void Main()=>System.Console.Write(new char[1\n#if!l\n*5]{'w','o','r','l','d'\n#if!o\n});\n#endif\n}\n#endif
ジョンボット

9

MATLAB、37 36 33バイト

feval(@disp,reshape('world',1,5))

ans =も出力できるかどうかわからないので、適切な方法で出力するための回避を見つける必要がありました。fprintfを単独で使用しても機能しませんでした。何を試したとしてもエラーを拒否したからです。dispを単独で使用することはオプションではありません。1つの引数のみを取り、その引数自体も明らかにエラーなしで実行されます。

出力にans =を含めても問題ない場合、MATLABは20バイトで実行できます

reshape('world',1,5)

私は本当に組み込み関数についてもっと学ぶ必要があります(+1)//あなたのプログラムが20を記録している間
Abr001am

2
それは、ルールの厳格さに大きく依存します。彼らは、と述べているだけので、それは33バイトですが、「世界」(+オプションの末尾の改行)が印刷されなければなりません。
slvrbld

ええ、これを33として数えます。理解してくれてありがとう:)
カルビンの趣味

9

> <>、17バイト

e"ooooo7-c0pBhtra

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

「earth」を印刷します。

><>プログラムがエラーなしで終了する唯一の方法は、;文字を実行することです。これは、その前にあるすべての文字を削除できるため問題となります;。つまり、最初の文字が実行されます。代わりにpコマンドを使用してプログラムを変更し、;実行中に含めることで回避できます。コードのセクションを削除すると、;無効な命令Bhおよびt、スタックアンダーフロー、および無限ループによりエラーが発生し、最終的にメモリ不足になります。私は、すべての無限ループがスタックを満たし続けることを確認するだけでした。

すべてのバリアントは、次のPythonスニペットを使用してテストされました。

code = 'e"ooooo7-c0pBhtra'
count = {"invalid":0, "underflow":0, "memory":0}
for l in range(1, len(code)):
    for x in range(0, len(code)-l+1):
        print(code[:x] + code[x+l:], "\t\t", end='')
        try:
            interp = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,1000):
                interp.move()
            print(len(interp._stack), "< ", end='')
            interp2 = Interpreter(code[:x]+code[x+l:])
            for _ in range(0,2000):
                interp2.move()
            print(len(interp2._stack))
            count["memory"] += 1
        except Exception as e:
            print(e)
            if str(e) == "pop from empty list": count["underflow"] += 1
            else: count["invalid"] += 1
print(count) 
#don't judge me

公式fish.pyに(わずかに修正されたバージョン)が追加されました> <>の作成者によって、インタープリター。152個の可能なサブプログラムのうち、92個が無効な命令でエラーが発生し、18個がスタックアンダーフローで、42個がメモリ不足でエラーが発生しました。

面白い事実として、この最初のバージョンには、無効な命令の代わりにe"ooooo6-c0pAhtraputコマンドを使用し[てスタックをクリアするaを配置することができた、いくつかの異常なサブプログラムがありましたA。また、「earth」は、このメソッドで機能する唯一のフレーズです。なぜなら、最初の文字eはで有効な指示だから><>です。それ以外の場合は、"コマンドをプログラムの先頭に配置する必要があり、有効なサブプログラムは"単独で存在する可能性があります。


8

ルビー、34

eval(*[($>.write("world")-1).chr])

これにはいくつかのコンポーネントがあります。

eval(*[ expr ])histocratのanswerから借用されておりexprの戻り値がエラーのない有効なrubyプログラムであることを確認するだけでなく、初期状態でもあります。method(*arr)は、引数としてのmethod値で呼び出すルビー構文ですarr。ここでこれが必要な理由は、メソッドのパラメーターとしてのみ有効であるため、eval削除されると(*[expr])構文エラーになるためです。exprが削除された場合、eval十分な引数がないと文句を言う

$>.write("world")-1文字列内と減算を除き、マングルすることはできません。$>.write("world")「world」をSTDOUTに書き込み、書き込まれた文字数を返し、1を減算します。したがって、プログラムがマングルされていない場合、値は正確に4になります。マングル-1されている場合(が削除されるか、文字列が短縮される)、- 1、0、1、2、3、または5のいずれかを返します。その他のマングリングは構文エラーになります。

chr番号を呼び出すと、その番号で表される文字が返されます。したがって、上記の例の結果で呼び出されると、-1でエラーが発生し、それ以外の場合は1文字の文字列が返されます。

私は実際にこれがなぜなのかわかりませんが、ルビー\x04は空白文字として解釈されるようです。つまり、式は有効です(空のルビープログラムは何もしません)。ただし、他の文字(\x00- \x03および\x05)はいずれもになりInvalid char '\x01' in expressionます。これは、返された数値に対して可能な数学を単純に反復することで見つけました。以前は私が使用していた

$>.write("planet
")*16

ここで、「planet」と改行は7文字で、16を掛けて112を取得pします。これは、デフォルトで定義されているrubyの唯一の文字関数です。引数を与えない場合、事実上何もしません


名誉ある言及:$><<"%c"*5%%w(w o r l d)非常に近いが、手付かずではない。削除"%c"*5%してもエラーは発生しません。簡単な説明:

$>は標準出力であり、その<<上で呼び出される関数です。"%c"*5は、フォーマット文字列を生成します"%c%c%c%c%c"。その後%、配列:%w(w o r l d)の短いバージョンである配列によってフォーマット()しようとし['w','o','r','l','d']ます。配列内の要素が少なすぎるか多すぎて、フォーマット文字列と一致しない場合、エラーが発生します。アキレス腱はそれ"%c"*5であり、%w(w o r l d)両方とも独立して存在することができ$><<、どちらかの引数のみが必要です。そのため、このプログラムをエラーのないいとこに変換するいくつかの異なる方法があります。


これを使用して検証:

s = 'eval(*[($>.write("world")-1).chr])'
puts s.size
(1...s.length).each do |len| #how much to remove
  (0...len).each do |i| #where to remove from
    to_test = s.dup
    to_test.slice!(i,len)
    begin #Feels so backwards; I want it to error and I'm sad when it works.
      eval(to_test)
      puts to_test
      puts "WORKED :("
      exit
    rescue SyntaxError
      #Have to have a separate rescue since syntax errors
      #are not in the same category as most other errors
      #in ruby, and so are not caught by default with 
      #a plain rescue
    rescue
      #this is good
    end
  end
end

歴史家の答えの線に沿った説明はいいでしょう。あなたは同じ基本的なアプローチを使用しているようですが、Rubyを知らないので、詳細を理解できません。
ThisSuitIsBlackNot

@ThisSuitIsBlackNot私のベスト、あなたが理解していないことは何ですか?
Shelvacu

素晴らしい説明、ありがとう!
ThisSuitIsBlackNot

6

Python 3、43バイト

for[]in{5:[]}[open(1,"w").write("world")]:a

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

使い方

部分文字列の削除を防ぐため、open(1,"w").write代わりにを使用しますprint。Python 3ではwrite、書き込まれた文字の数を返します。これ5は、文字列の一部が削除されていないことを確認するためのものです。これを行うには、辞書{5:[]}で戻り値を検索し、結果をfor[]in…:aでループします。空のイテラブルが取得されなかった場合、またはforステートメントが削除された場合は失敗します。


4

Javascript(Node.js)、93 95バイト

if(l=arguments.callee.toString().length,l!=158)throw l;console.log("world");if(g=l!=158)throw g

独自のサイズを2回チェックして、文字が欠落している場合はエラーがスローされるようにします。Node.js function (exports, require, module, __filename, __dirname) {が実行時にコードの先頭に追加されるため、長さは156 です。

エラーを指摘してくれたMartinBüttnerに感謝します。修正されました。


4

Perl 5.10以降、71 63バイト

(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

world末尾に改行を付けて印刷します。次のように実行します。

perl -M5.010 file

これは、ソースコードのバイトカウントに依存しているためfile、上記のコードのみを含む必要があります(シバン、末尾の改行なし)。Perl 5.10+がsaydefined-or演算子に必要です//


Perlで初期のプログラムを作成するのは非常に困難です。

  • 任意の裸の単語識別子は、(例えばfooa_)を持つ有効なステートメントですno strict 'subs';(デフォルト)。これは、プログラムが文字、数字、またはアンダースコアで開始も終了もできないことを意味します。

  • 以下のようtchristは説明し、「シンボリックデリファレンスを介して指定識別子は持っていない全く全く制限を自分の名前に。」これは、プログラムがシギルのいずれかで始めることができないことを意味し$@%、または*すべてが、最初と最後の文字を削除すると、常に有効な変数名を残すであろうから、。

  • 多くの組み込み関数(出力を生成できるほとんどの関数を含む)は$_デフォルトで機能するため、引数を削除しても(例say"world":)呼び出しはしばしば機能しますsay

使い方

このソリューションは、NaouakのNode.js answerに触発され、独自の長さをチェックして文字が削除されていないことを確認します。

プログラムには2つのセクションがあり、1つは括弧内に、もう1つはブロック内にあります。

(...);{...}

最初のセクションはソースファイルを読み取り、長さが63文字未満の場合は終了します。2番目のセクションでは、read正常に実行されたことを確認します。どちらかのセクションが削除された場合(括弧または中括弧の有無にかかわらず)、他のセクションは例外をスローします。

プログラムの中央または左側または右側を削除すると、括弧や中括弧のバランスが崩れ、構文エラーが発生します。

最初は場合die(に変更されdedide、又はie、全ての有効な識別子である)、長チェックは次のようになります。

@{\(read(0,$a,63)!=63?di:@_)};

次のように評価されます。

@{\'di'};

これは、文字列への参照を受け取り、それを配列として逆参照しようとし、エラーを生成します。

Not an ARRAY reference

他のステートメントが変更された場合、長さチェックは失敗し、プログラムは終了します。


次のプログラムで初期状態を確認しました。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use File::Temp;
use List::MoreUtils qw(uniq);

sub delete_substr {
    my ($str, $offset, $len) = @_;

    my $tmp = $str;
    substr($tmp, $offset, $len) = '';

    return $tmp;
}

sub generate_subprograms {
    my ($source) = @_;

    my $tot_len = length $source;
    my @subprograms;                                             

    foreach my $len (1 .. $tot_len - 1) { 
        foreach my $offset (0 .. $tot_len - $len) {
            push @subprograms, delete_substr($source, $offset, $len);
        }                                                        
    }                                                            

    return uniq @subprograms;                                    
}                                                                

chomp(my $source = <DATA>);                                                                                                       
my $temp = File::Temp->new;                                                                                        

foreach my $subprogram ( generate_subprograms($source) ) {       
    print $temp $subprogram;

    my $ret = system(qq{/usr/bin/perl -M5.010 $temp > /dev/null 2>&1});
    say($subprogram), last if $ret == 0;

    truncate $temp, 0;
    seek $temp, 0, 0;
}

__DATA__
(${open 0;@{\(read(0,$a,63)!=63?die:@_)};say"world"});{$a//die}

4

Ruby + coreutils、33 27 26バイト

`base#{$>.write"world
"}4`

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

rubyのバックティックは、その内部でコマンドを実行し、プログラムがSTDOUTに入力したものを文字列として返します。この#{expr}構文により、文字列とバックティックに式を埋め込むことができます。このプログラムは次のように書き換えられます(非正規)。

system("base" + (STDOUT.write("world\n")).to_s + "4")

IO#write書き込まれたバイト数を返します。したがって、文字列が短縮された場合、正しい数にはなりません。#{}埋め込みにより、数値は自動的に文字列になります。一部が削除され、構文エラーが発生しない場合、間違ったコマンドが実行されます。の一部"world"が削除されると、base04throughのいずれかがbase54実行されます。

文字列の内外にかかわらず、改行が必要です。それ以外の場合、最初の5文字(`base)を削除して、行全体をコメントにすることができます。また、最初のバックティックとの間に1つ以上の文字が必要です#。そうでない場合は{、全体をシェルコメントにするために削除できます。


exec(*[(s="ec%co earth")%s[10]])

exec現在のrubyプロセスを指定されたコマンドに置き換えます。構文の説明とその必要性については、他の回答を参照しくださいmeth(*[])

(s="ec%co earth")文字列「ec%co earth」を変数に割り当てますs。割り当ては割り当てられたものを返すため、文字列も返されます。

"format string %d" % 5はの構文糖ですがsprintf("format string %d",5)、周囲のスペースは必要%ありません。

s[10]インデックス10の文字列の文字を取得します。マングル解除されていない場合、この文字は文字列の最後の文字「h」です。ただし、文字列内の文字を削除すると、文字列が短くなるため、インデックス10に文字がないため、をs[10]返しnil"%c" % nilエラーが発生します。

場合は%s[10]削除され、その後、ルビーは、コマンドを実行しようとec%co earth動作しません。

またはに変更10すると、不明なコマンド(または)になります。完全に削除することは、文字列のメソッドを呼び出すため、技術的には構文エラーではありませんが、引数が不足していることを訴えます。10eceoecco#[]


一般的にこれを解決する際の注意:純粋なままで、抽象的な意味で内部のコードを検証するラッパーが必要です。たとえばblablabla/somevar、部門をいつでも削除できるため()、最後に部門があるプログラム()は機能しませんblablabla。これらは私がこれまで使用したそのようなラッパーです:

  • eval(*[])histocratと私の最初の回答で使用されるコード。出力が有効なrubyプログラムであることを検証します
  • exec(*[])上記で使用したコードは、応答が有効なコマンドであることを検証します
  • `#{ コード }`

バックティック構文もコマンドを実行します(したがって、有効なコマンドであることを検証します)が、STDOUTは親プロセス(Rubyの)STDOUTとして出力されるのではなく、文字列としてキャプチャされます。このため、私はこの答えにそれを使用することができませんでした、編集:私はそれを機能させました。上記の制限。

編集:いくつかの欠陥を指摘してくれた@histocratに感謝


クールなアプローチ!write文字列と文字列の先頭との間のスペースを削除できます(したがって削除する必要があります)。また、私のマシンでbase64は入力を待ってハングしますが、これはルールに反する可能性があります。
-histocrat

@histocratうわー、私はそれがうまくいくことに驚いてい$>.write"world"ます、ありがとう!入力待ちのbase64については、システムによって異なるようです。TIOは正常に動作します。これにより、ルールに従うかどうかがさらに曖昧になります。
-Shelvacu

3

PowerShell、(97バイト+プログラム名の5)= 102バイト

"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a

自分自身を破壊する前に自分自身をチェックします... 2回。

c.ps1ローカルディレクトリとして保存され、ローカルディレクトリから実行されることが期待されます。
PS C:\Tools\Scripts\Golfing\> .\c.ps1ます

エイリアスgcはファイルの読み取り(この場合は実行パス)の略でGet-Contentあり、似たようなものです。ファイルを取得し、に設定し、で97に等しくないかどうかを確認します。等しい場合(つまり、プログラムが変更されていない場合)、で出力し、無効なコマンドを実行します。これにより、が強制的に有効になり、再度確認することができます。今回、コードが97に等しくない場合、無効なコマンドをスローするため、プログラムはエラーテキストを出力し、エラーテキストを出力します。その後、通常どおりエラーが発生します。cat.\c.ps1.Length$a-eq97"world"acatchclear()exit

どちらかのifステートメントが改ざんされた場合、もう一方のステートメントにエラーがあることは明らかです。の一部"world";が改ざんされている場合、最初の部分がifエラーになります。連続している必要があるため、両方のifステートメントを削除することはできません。真ん中の文字列は、括弧の不一致になるか、2番目の文字列{a}が実行されます。try/は、catch最初からエラーをキャッチすることですif声明それ私たちはきちんと明確にすることができます。外側は"$( )"、文字列が両端から切り取られるのを防ぎます。最後;aは、真ん中の部分が切り取られて有効なプログラムになることを防ぐことです(たとえば、"it}a)";a印刷it}a)してからエラーになる)。

いくつかの特別な状況があります。

  • の場合gcgc<space>またはgc .\削除され、プログラムは最終的にいくつかの(繰り返し自己実行コールのために)メモリエラーのうちの風味とおそらくクラッシュシェル(そしておそらくコンピュータ)を用いてエラーになります。未検証。
  • もし<space>.\c.ps1または.\c.ps1削除され、プログラムが停止し、ユーザーの入力を求めるプロンプトが表示されます。ユーザーが何を入力しても、サイズのカウントが間違っているため、プログラムは引き続きエラーになります。
  • で始まり$、最後の文字列の前で終わる部分文字列"が切り取られた場合、プログラムは残っているものを出力し、a無効であるためエラーを出力します。

以下で検証済み:

$x='"$(try{if(($a=(gc .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yy='"$(try{if(($a=( .\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyy='"$(try{if(($a=(.\c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'
$yyyy='"$(try{if(($a=(c.ps1).Length)-eq97){"world";a}}catch{if($a-ne97){a}$error.clear();exit}a)";a'

for($i=1;$i-lt$x.Length;$i++){
  for($j=0;$j-lt($x.Length-$i);$j++){
    $y=($x[0..$j]+$x[($i+$j+1)..$x.Length])-join''
    $y>.\c.ps1
    $error.clear()
    if(!($y-in($yy,$yyy,$yyyy))){try{.\c.ps1}catch{};if(!($error)){exit}}
    $q++;
    write-host -n "."
    if(!($q%150)){""}
  }
}
"No success."

(彼の広範な支援に感謝します!)


3

C(gcc)(Linux、-Werror=undef)、66バイト

main(a){a
=
1
/
(puts("world")/
6);
#if(7^__LINE__)
#else
}
#endif

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

素晴らしい挑戦です!これは一見難しいことでしたが、今では有効なプログラムを持っていると確信しています!

プリプロセッサコマンドを使用して、改行を削除できmainないようにし__LINE__==6ます。閉じ括弧が含まれるのはの場合のみであるためです。またmain#endifフローティング状態のままになるため、完全にクリアすることもできません(したがって、の#endif外側にあることが重要ですmain)。

私が使用し#else、私は何のバージョンがないかなり確信になったので、__LINE__==6それは両方のために、部分文字列を削除していると、まだ本当のことはできません6し、__LINE__自分自身ではtruthyあります。また-Werror=undef、のようなもの#ifdef(LINE__)がfalseと評価されないように使用しますが、エラーです。

(少なくともLinuxでは)gcc putsを使用すると、印刷された文字数(末尾の改行を含む)がputs("...")/6返される0ため、文字列の一部を削除するとreturn が1/0発生し、浮動小数点例外が発生します。この例外は1/0、何かに割り当てられていない限り発生しないため、a=必須です。

エラー(通常は構文エラーまたはリンクエラー)を作成せずに、行の他の部分を削除することはできません。

ボーナスとして、これは単なる追加かなり自明++、Cのための86バイトのソリューション提供します#include <cstdio>と宣言しaてをintオンラインでお試しください!(C ++)


間違っていない限り1/、改行を残したまま削除することができ、それでも実行されます。
ガストロプナー

@gastropnerそうですね。1私は信じている前の行に想定されていました。
クリス

悲しいことに、同じことが当てはまります。その後、削除でき=1ます。1を1行に単独で配置する必要があると思います。
ガストロプナー

@gastropnerあなたは正しいと思う。後で詳しく見ていきます。ありがとう!
クリス

2

PHP、73バイト

<?=call_user_func(($p='ns')|(($f="u{$p}erialize"))?$f:'','s:5:"world"');

説明

デフォルトのphp.ini構成を想定しています。したがって、short_tagsは無効になります。これは、削除できないことを意味します=、開始タグからを。

これは基本的に <?=unserialize('s:5:"world"');です。

シリアル化された文字列の一部を削除すると、エラーが発生します。

削除するだけunserializeで、スクリプトはシリアル化された文字列を出力するだけです。これを克服するために使用しますcall_user_func。いずれかのパラメーターを削除すると、エラーが発生します。

'<?=call_user_func('unserialize','s:5:"world"');

ただし、を削除unしてserialize関数を呼び出すことができます。そこで、「ns」を取り出します。文字を削除しても、誤った関数名になることはありません。

<?=call_user_func(($p='ns')&&($f="u{$p}erialize")?$f:'','s:5:"world"');

出力タグで変数の割り当てを使用する場合は、インラインを使用します。&&使用する代わりに、「|」を使用します 単一の&削除または$f割り当ての削除を防ぐため

削除='ns')&&($f="u{$p}erialize"して終了する可能性があり($p)?$f:''ます。そのため、の周りに余分な括弧を追加し$f="u{$p}erialize"ます。

注意

技術的には、エラーを発生させることなく開始タグを削除できます。しかし、これはもはやPHPスクリプトではなく、単なるテキストファイルです。


2
最後のメモについては、プレーンテキストファイルは依然として有効なPHPプログラムです。したがって、これが有効かどうかわかりません。
カルビンの趣味

もはやPHPではなく、プレーンテキスト/ htmlであるため、有効なphpプログラムではありません。
Martijn

1

Matlab(77)

bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),'world',1:5)

それを試してみてください

注意:

CPRまたは何かを設計するという@Optimiserのアドバイスに従って、削除されたときにコンパイルエラーが発生しない予期しないサブストリングに直面しました。例:arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),この前の編集から削除して feval(@(a)arrayfun(@(x)a(x),prod(b,ismember(4,1:5))),'world')もバグは発生しません!また、最近の同じエディションでは、出力コンソールでそれらを見つけたときに私がどうだったかを尋ねるbsxfun(@(a,b)arrayfun(@(x)(x),prod(b,ismember(4,b))),'world',1:5)bsxfun(@(a,b)a,'world',1:5)、私は赤ん坊のように泣いたので、ここにプログラムがあります:

b=0;string='bsxfun(@(c,b)arrayfun(@(x)getfield(c,{x}),conv(b,ismember(4,b))),''world'',1:5)'
for u=1:numel(string),for j=u:numel(string)-2,try a=eval([string(1:u) string(j+2:end)]);catch(b); a=0;end; if a~=0, ['here is it : ' string(1:u) string(j+2:end)],end;end;end

非純正のプログラムの例

編集:

私の以前のコード(エラーではない)を指摘してくれた@Martin以外のみんなに感謝します。


1

SmileBASIC、63バイト

REPEAT
A=1/(PRGSIZE(0,1)==63)?"world
UNTIL 1/(PRGSIZE(0,1)==63)

1

ナシの木、17バイト

このプログラムには、上位ビットが設定されたバイト(有効なUTF-8ではないため、TIOにポストできないバイト)が含まれているため、xxd可逆のhexdumpがあります。

00000000: 7072 696e 7427 776f 726c 6427 23cd 4290  print'world'#.B.
00000010: bf                                       .

説明

これだけ print'world'、チェックサムが追加されています。可能な削除のいずれも有効なチェックサムをプログラムに与えないことを総当たりで検証したため、可能な削除の後にエラーが発生します。

かなり退屈ですが、現在のリーダーを結びつけるので、投稿する価値があると感じました。

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