目標は、Barney Stinsonの最良の規則を出力するプログラム(明示的なBrainfuck以外のすべて)を作成することです。
新しいものは常に優れています。
正常に解釈されるとき、しかし
Legen ...それを待って...日陰だ!
Brainfuckインタープリターで処理される場合。
最も人気のある仲間が勝つように。伝説になるまで72時間あります。
目標は、Barney Stinsonの最良の規則を出力するプログラム(明示的なBrainfuck以外のすべて)を作成することです。
新しいものは常に優れています。
正常に解釈されるとき、しかし
Legen ...それを待って...日陰だ!
Brainfuckインタープリターで処理される場合。
最も人気のある仲間が勝つように。伝説になるまで72時間あります。
回答:
それで、私はもう少し...エントリーで創造的になることに決めました。Brainfuckコードはさまざまな演算子としてC#に埋め込まれます(コメントやハードコードされた文字列ではなく)整数としての個々の文字は、印刷時にそれをcharにキャストします)。
これをもっとエレガントにすることはできたと思いますが、それがそのまま終わるのに十分な時間がかかりました。
Cal HendersonによるこのJavaScript BrainfuckインタープリターとVisual Studo 2012のC#コンパイラー(.NET framework v4.0を対象とする)ですべてがテストされました。
using System;
namespace Polyglot
{
internal static class Program
{
private static void Main()
{
var a = new short[50];
short _1 = 72;
short _2 = 0;
short _3 = 0;
short _4 = 0;
short _5 = 0;
short _6 = 0;
short _7 = 97;
short _8 = 0;
short _9 = 0;
short _10 = 0;
short _11 = 0;
short _12 = 0;
short _13 = 0;
short _14 = 0;
short _15 = 0;
short _16 = 46;
short _19 = 0;
short _20 = 0;
short _21 = 0;
if( 0 >= 0 )
{
++_1;
++_1;
++_1;
++_1;
}
a[ -1 < 0 ? 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 : 0 + 1 > 1 ? 0 : 0 ] = 9001;
if( 7 < 42 )
{
++_1;
++_1;
}
Console.Write( (char)_1 );
_2 = 101;
_1 += 1 + 1 + 1 + 1 + 1;
_3 = 42 > 7 ? 110 + 9 : 1 + 1;
a[ -1 < 0 ? 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 : 0 > 0 ? 0 : 0 ] = 9001;
if( 1 < 2 )
_4 = 32;
Console.Write( (char)_2 );
++_1;
_5 = 105;
Console.Write( (char)_3 );
--_1;
_6 = 115;
Console.Write( (char)_4 );
++_1;
++_1;
++_1;
_1 += 1 + 1 + 5;
Console.Write( (char)_5 );
--_1;
--_1;
if( 42 > 41 )
{
++_1;
++_1;
++_1;
}
a[ -1 < 0 ? 0 : 10 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 > 5 ? 0 : 0 ] = 9001;
if( 42 < 9001 )
Console.Write( (char)_6 );
Console.Write( (char)_4 );
Console.Write( (char)_7 );
if( 12 > 11 && 11 > 10 )
{
_8 = 108;
_9 = _3;
}
else
{
++_1;
++_1;
++_1;
}
a[ -1 < 0 ? 1 + 1 + 1 + 1 + 1 + 1 : 1 > 2 ? 0 : 0 ] = 9001;
if( _4 < _1 )
{
++_1;
Console.Write( (char)_8 );
}
else if( _4 > _19 && _2 > _20 )
{
++_21;
++_21;
++_21;
++_21;
++_21;
_21 += (short)( _21 + 36 );
}
a[ -7 < 9 ? 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 : 4 > 8 ? 9 : 9 ] = (short)( 12 < 10 ? -_4 : _9 );
Console.Write( (char)_9 );
if( _4 > _9 )
{
++_1;
++_1;
++_1;
}
a[ -9 < 7 ? 10 - 1 - 1 - 1 - 1 : 6 > 7 ? 0 : 0 ] = _21;
if( 1 < 0 )
return;
else
{
++_1;
Console.Write( (char)_7 );
}
_10 += 5 + 4 + 1 + 2 + 8 + 9 + 1 + 91;
Console.Write( (char)_10 );
if( 10 > _4 ) ++_21; else a[ -0 < 0 ? 5 + 6 + 1 + 2 + 3 + 9 : 1 > 2 ? 0 : 9 ] = 50;
if( _21 <= _4 )
_11 = 58 + 57;
Console.Write( (char)_11 );
if( _2 <= _8 )
Console.Write( (char)_4 );
else if( 1 >= 2 )
return;
else if( 42 >= _4 )
_1 += ++_21;
else
{
a[ -99 < --_1 ? --_1 - _1 : 44 > 12 ? 9 : 7 ] = (short)( _2 < _4 ? _21 : 6 );
throw new Exception();
}
switch( _4 )
{
case 32:
var x = (char)( (short)( _4 + 66 ) );
Console.Write( x );
break;
default: break;
}
_12 += (short)( ++_12 + ( ++_1 ) + 1 + 1 + 1 );
Console.Write( (char)_12 );
_13 += (short)( 39 + 38 + 39 );
Console.Write( (char)_13 );
if( _12 < _13 )
Console.Write( (char)_13 );
if( _13 >= _4 )
{
_14 = (short)( 500 - ( - ( 50 ) ) - ( --_1 ) - 90 - ( -4 ) - 267 );
Console.Write( (char)_14 );
}
switch( _1 )
{
case 52:
_15 += (short)( ++_1 + ( ++_21 ) );
break;
default:
_15 += (short)( 15 + ( ++_1 ) + 2 );
break;
}
Console.Write( (char)_15 );
if( _16 <= 3521 && _21 < _4 )
Console.WriteLine( (char)_16 );
_16 = (short)( Int16.Parse( "54" ) % 2 );
_20 = (short)( Int16.Parse( "99" ) / ( _1 > _4 ? 3 : 0 ) );
_1 = (short)( 02.23 );
if( _16 > 9 || _20 >= 52 )
_1 += (short)( ( ++_1 ) + _21 );
a[ -0 < 0 ? -52 - ( --_20 ) : 1 > 0 ? 1 : 2 ] = (short)( _12 < _19 ? Int16.Parse( "19" ) : 44 );
_12 -= (short)f( --_19 / 19.467d );
if( _12 > _14 )
_19 += (short)( _19 + 1 + _3 + 5 );
a[ -904 < 409 ? 4 + ( ++_4 ) + 4 : 49 > 50 ? 49 : 50 ] = (short)( 50 < 99 ? _4 + 669.2452 : 0 );
if( 44 > ++_4 )
a[ -9 < 6 ? 6 + ( ++_4 ) : 9 > 2 ? 44 : 8 ] = 3;
}
private static double f( double x )
{
return x < 12 ? x + 13.22 : x < 6 ? x + 90.45 : 5555;
}
}
}
これは、このチャレンジのために書いたオリジナルのBrainfuckコードです。
> +++++ +++
[ - < +++++ ++++ > ]
< ++++ .
+++++
> ++
[ - < +++++ +++++ > ]
< . ++ . -- . +++++ ++++ .
----
> +++++ +
[ - < ----- ----- > ]
< ... >>
+++++ +
[ - < +++++ > ]
< ++ . >>
+++++ +++++ ++
[ - < +++++ +++++ > ] <
- . >
+++++ +
[ - < ---- > ] <
++ . +++++ +++ .
> ++
[ - < +++++ > ]
< + . < . >>
+++
[ - < ----- > ] <
+ . +++++ ++++ . +++ .
< . > ----- ---- . +++++ +++++ + .
<< ... > . >>
++++
[ - < ---- > ] < .
--- . >
++++
[ - < ++++ > ]
< + .
> ++
[ - < +++ > ]
< + . < + .
Brainfuckインタープリターを介してC#コードを実行すると、次のコマンドが実行されます(先頭に角かっこが追加されていることに注意してください。これらは配列宣言からのもので、メモリポインターの下のセルは配列は既に0です):
[] > +++++ +++
[ - < +++++ ++++ > ]
< ++++ .
+++++
> ++
[ - < +++++ +++++ > ]
< . ++ . -- . +++++ ++++ .
----
> +++++ +
[ - < ----- ----- > ]
< ... >>
+++++ +
[ - < +++++ > ]
< ++ . >>
+++++ +++++ ++
[ - < +++++ +++++ > ] <
- . >
+++++ +
[ - < ---- > ] <
++ . +++++ +++ .
> ++
[ - < +++++ > ]
< + . < . >>
+++
[ - < ----- > ] <
+ . +++++ ++++ . +++ .
< . > ----- ---- . +++++ +++++ + .
<< ... > . >>
++++
[ - < ---- > ] < .
--- . >
++++
[ - < ++++ > ]
< + .
> ++
[ - < +++ > ]
< + . < + .
"adding adding all the time"
"1+1+1+1+1+1+1+1+1+1+1" "is not fine"
"more to come / going far"
"+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1"
"all that work for a single char"
"happy me / a loop to start"
"[>++>+++>++++>+++++<<<<-]"
"was it code or just a fart?"
"adding adding / thats not fine"
"+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1"
">>+" 'New is always better.' "shall I " print
">+.++.--.+++++++++.----------.<<----...<+++++++"
"the garbage here gives us no hint"
".>>+++++++++++.>---.++++++++"
"hurray a change to stop the pain"
".>---------.<<<<.>>"
"the author now has in his brain"
"-----------------.>>-----.+++.<<<<.>>>.>++."
"We all agree the time is here"
"<<<...<.>>--.>--------.>--.+++++++.<<<<."
"to finish this and have a beer"
ワークスペースに入力して「doIt」を押すか、BFに送信します。他のポスターから盗まれたBF-ありがとう。
それはコードゴルフコンテストではないので、非ゴルフバージョン:
var outputString='';
'+++++++@++++[>++@/+@@>@/+@+@++>++++++@/+>+@++@/+@@+++++@/>@+@+++++@/+++@+<@/<<<<-]>>>@-.>++.+@/+@@.--.>.<-@/.@<@<++...<-.@/>>>>+++++@++++.<-@/-@-.@+@/+@+@+++++@/.>-@--@/.<<<<.>>>@---.>---@/-@@-@/.@+@++.<<<@/<@.@>>>+++@/.@@>@/+@+@.<<<@/...<@.>>>--@/---.---.>--.+++++++.<<<<+.<'
.split('/')
.forEach(function(e) {
var matched=e.match(/[^@]*@/g);
if (matched) {
var asciiCode=0;
for(var i=0;i<matched.length;i++) {
asciiCode=matched[i-0].length-1+10*asciiCode;
}
outputString+=String.fromCharCode(asciiCode);
}
});
alert(outputString);
それは私がBFを学ぶ機会であり、それは楽しかったです:)
困難はBFがユーザー入力としてそれを解釈するので決して使用せず、配列の要素にアクセスするため,
に使用[]
する前にバイトが0であることを確認することでした。
JSエンコーディングは非常にシンプルで、各文字列は文字を/
エンコードする前、各文字列の長さ@
はASCIIコードを10進数で定義します。(+++++++@++++[>++@
= 78
= N
)
ここでBrainfuckをテストできます:http : //copy.sh/brainfuck/
+5+1/1+5+3@6:2/1+5+5+1@6+2@6:5/1+3@6:5+1/1+5+5+1@6:5+2/1+5+5+2@6:5/1+3@6:5+2/1+5+5@6:5+5+2@6:2/1+5+53[@6>:5+2/1+5+5@6>:4/1+5+5+3@6+>:5+2/1+55+2@6:5/1+3@6>:5+3/1+55@6>:2/1+551@6<<<<<-]>:5+3./1+552-@66>+.:2/1+5+51.@6--.>:5+1/1+5+5+2@6:1/1+5@6+++++.>----...>+++++++.<<+++++++++.<----.++++++++.>---.>>.<<<---.>-----.+++.>>.<<<+++.>++.>...>.<<<-----.---.>--.+++++++.>>+.
(Cubicallyの言語変更を説明するために17年8月4日更新)
基本的に、これは、キュービックプログラムで使用できる限り多くのBFプログラムの文字を使用し、その後、BFプログラムの残りをその最後に貼り付けます。Cubicallyプログラムで&
/を使用E
して強制終了する必要はありません。
ClémentRenaudの削除された回答から取ったBrainF ** kコード。
編集 -最初のヌル文字は印刷されなくなりました。
t='++++++++++_+++++++|^+++++++|+[>++>+++%>++++>+++++<<<<-||]+++++++++++|*+++++++++++++@+>>+.>+||.++.|--.+++++++++.--|^--------.<<----..._<+++++|++.>|>+++++&++++++.>---.+=+++++++|.>---------.<<^<<.>>--||-----|--~-----|---.>>-----~.+++.<<<<.>|>>.*>++.<<<...<.>>--._>|--------|.>-^-.+++++++.<<<<!!!'
print ''.join((chr(93+len(x))if x else' ')for x in t.split('|'))
非常に簡単なトリックを使用|
します-BFプログラムに文字が追加され、それらの間の距離はPythonで印刷された文字列をエンコードします。Pythonコードは、BFによってほとんど無視されます。
.join
追加されていることに気付きましたが.
、害はありませんでした(\0
目に見えないため)。これ+
で問題あり.split
ません-オリジナルからキャラクターを削除しました。
code-golf
この課題に最適なタグかどうかはわかりません。私見popularity-contest
は良いでしょう。