bfcat-ファイルをbrainf ***プログラムとしてエンコードします


18

チャレンジ

文字列を指定して、Brainfuckとしてコンパイルおよび実行すると、その文字列を返す有効なBrainfuckプログラムを返すプログラムまたは関数を作成します。

  1. すべての入力がASCIIとしてエンコードされていると仮定します。

  2. 出力されたBFプログラムは、無限のテープがある環境で実行されると仮定します。

  3. ポインターがセル0から始まり、すべてのセルがゼロの値に初期化されると仮定します。

  4. 以下の各例は、指定された入力に対する1つの可能な正しい出力を表しています。特に、例には人間が読みやすいように余分な改行とスペースが含まれています。ソリューションは、出力されたBFコードを任意の方法でフォーマットできます。

  5. テープは二重に無限です。

  6. インタープリターによって提供されるすべてのセルは、正確に8ビットのセルです。オーバーフローとアンダーフローは、予測可能で健全な問題に包まれます。

スペース文字列

入力が与えられると、プログラム/関数は以下を返すことができます:

+++++ +++++
+++++ +++++
+++++ +++++
++ .

感嘆符

入力が与えられると、!プログラム/関数は以下を返すことができます:

+++++ +++++
+++++ +++++
+++++ +++++
+++
.

二文字

入力が与えられると、hiプログラム/関数は以下を返すことができます:

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++

++++
.
+
.

これはであるため、バイト数が最小のコードが優先されます。幸運を。


10
もっとテストケースをお願いします。
リーキー修道女

1
リビジョン9で言及されているガイドラインは正確に何ですか?
user8397947

4
これを再開します。ピーターの懸念に対処し、重複と見なされるものについてかなり明確なコンセンサスを持っていると思いますが、この課題はそれらの基準を満たしていません。
マーティンエンダー

「オーバーフローとアンダーフローは予測可能で健全な方法でラップします」-したがって、127 + 1は0にラップし、-128-1も0にラップしますか?これは、予測可能な正気な方法の1つです。
user253751

1
@immibisまさに。
user8397947

回答:


18

ゼリー、8 バイト

O”+ẋp“.>

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

サンプル実行

入力のhi場合、このプログラムは印刷します

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++>

(改行なし)、順番に印刷しhiます。

使い方

O”+ẋp“.>  Main link. Argument: s (string)

O         Ordinal; convert each character in s into its code point.
 ”+       Yield the character '+'.
   ẋ      Repeat '+' k times, for each k in the code points.
     “.>  Yield the string ".>".
    p     Take the Cartesian product of both results.

あなたのメモリは限られたメモリでは動作しませんが、私のメモリは動作しません。
リーキー修道女

5
あんまり。両方とも印刷前に出力全体をメモリに保存します。十分な大きさのテープを使用するBFインタープリターの場合、それはテープが実行されるずっと前に問題になります。
デニス

.>出力に表示されないのはなぜですか?

2
@cat デカルト積p)は、それぞれに追加する;€)より短いため。これらの出力プログラムは、印刷後および切り替え前にセルを2倍にします。セルを再訪することはないため、出力には影響しません。
デニス

@デニスああ、面白い。

55

Brainfuck、55 51バイト

,[>+++[>+++++++<-]>[<++>>+++<-]<+<[>.<-]>+++.>>-.,]

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

hi(改行なし)の出力例:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

説明

これは、プログラムの書き込み中にテープ上を移動します。周囲,[...,]は標準入力ループです。各文字に対して、4つのセルを使用します。

[... x a b c ...]

x入力を書き込むセルはどこにあります。

>+++[>+++++++<-]

この部分は、セルを使用してa書き込むために21細胞内にb標準の乗算を経由3して7

>[<++>>+++<-]

今、私たちはそれを使用21書くこと42aして63c乗じて2、および3それぞれ。次に、を(のコードポイント)に変えながら<+<セルに戻ります。要約:x4243+

[... x 43 21 63 ...]

次に、メイン出力ループ:

[>.<-]

つまり、デクリメントしながら、x1つ+ずつ印刷します。

>+++.

完了したら、giveに+追加3してセルを再利用します.

>>-.

最後に、に移動して63、それを62>)に減らし、同様に出力します。次の反復では、このセルをとして使用しxます。


5
もっと担当者がいたら、私はこれに報奨金を与えます。
user8397947

34

Brainfuck、39 33 32 31バイト

-[-[>]<--<--],[[>.<+]>+.--.+<,]

45をテープに配置するアルゴリズムは、EsolangのBrainfuck定数から取得されます。

この答えは、出力プログラムのインタープリターがラッピングされた境界セルを持っていることを前提としています。そして、それ,は現在のセルをゼロにします(出力プログラムが入力なしで実行されることを意味します)。オンラインでお試しください!

無条件に機能する(より長い)ソリューションについては、他の回答を参照しください。

テスト走行

入力のCode Golf場合、次の出力が生成されます。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------.,--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.,-------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------.,----------------------------------------------------------------------------------------------------------------------------------------------------------.,

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

使い方

まず、整数45(の文字コード-)をテープのセルに入れます。次のコードはこれを実現します。

-      Decrement cell 0, setting it to 255.
[      While the cell under the head in non-zero:
  [>]    Advance to the next zero cell.
  <--    Decrement the cell to its left.
  <--    Decrement the next cell to the left.
]

ループに入る前に、テープは次のようになります。

         v
000 000 255

これらの3つのセル--2-1、および0-は、このプログラムで使用する唯一のセルです。

ループの最初の各反復では、右端のセルが次の状態になり、そのセルと中央のセルが2回デクリメントされ、次の状態が残ります。

     v
000 254 252

次の126回の繰り返しで、最初-は中央のセルをデクリメント[>]<し、右端のセルにジャンプして--<--、中央と右のセルをデクリメントします。その結果、中央のセルから3が減算され(モジュロ256)、右端のセルから2が減算されます。

以来、254÷3(MOD 256)=(254 + 256)÷3 = 510÷3 = 170÷3 = 84 252は、右端のセルは、以下の状態を残して、真ん中の前にゼロにされます。

     v
000 132 000

ループの最初の反復と同様に、次の反復では、中央のセルから3を減算し、左端のセルから2を減算し、頭を左端のセルに配置します。

 v
254 129 000

後続の反復は、それらの前の126反復のように、左端のセルから3を減算し、右端のセルから2を減算します。

以来、254÷3(MOD 256)= 170129÷2(MOD 256)に定義されていない、これは、以下の状態を残して、170回行われています。

 v
000 045 000

頭の下のセルはゼロです。ループは終了します。

これで出力を生成する準備が整いました。

,      Read a character from STDIN and put it the leftmost cell.
[        While the leftmost cell is non-zero:
  [        While the leftmost cell is non-zero:
    >.     Print the content of the middle cell ('-').
    <-     Increment the leftmost cell.
  ]      If the leftmost cell held n, the above will print 256 - n minus signs
         which, when executed, will put n in cell 0 of the output program.
  >      Increment the middle cell, setting it to 46 ('.').
  .      Print its content ('.').
  --     Decrement the middle cell twice, setting it to 44 (',').
  .      Print its content (',').
         When executed, since the output program receives no input, the above
         will zero cell 0 of the output program.
  +      Increment the second cell, setting it back to 45 ('-').
  <,     Go back to the leftmost cell and read another character from STDIN.
]      Once EOF is reached, this will put 0 in the leftmost cell, ending the loop.

結果のBFが変換されて、入力文字列に戻されないのはなぜですか?これは私が使用しているインタープリターであり、他の回答でも機能します。
非常識な

2
そのインタープリターには多くの設定があります。32バイトバージョンの場合、動的メモリ入力の終わりが必要です\0
デニス

10

Brainfuck、35 13 43バイト

++[>+<------],[[>.>+<<-]>+++.->[<.>-]<--<,]

この答えは、出力プログラムのインタープリターに関する仮定を行いませんオンラインでお試しください!

より短いソリューション(一部のインタープリターでのみ機能します)については、他の回答を参照しください。

テスト走行

入力のCode Golf場合、次の出力が生成されます。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.----------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++.--------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.-----------------------------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.---------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------------++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.------------------------------------------------------------------------------------------------------+++++++++++++++++++++++++++++++++.---------------------------------

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

使い方

まず、テープの2番目のセルに整数43(の文字コード+)を入れます。次のコードはこれを実現します。

++         Increment the first cell twice, setting it to 2.
[          While the first cell in non-zero:
  >+         Increment the second cell.
  <------    Decrement the first cell six times.
]

これは基本的にモジュラー除算2÷6(mod 256)を実行します。以来(2 + 256)÷6 = 258÷6 = 43、結果は43意図したとおり、。

これで出力を生成する準備が整いました。

,      Read a character from STDIN and put it the first cell.
[        While the first cell is non-zero:
  [        While the first cell is non-zero:
    >.     Print the content of the second cell ('+').
    >+     Increment the third cell.
    <<-    Decrement the first cell.
  ]      If the first cell held n, the above prints n plus signs
         and puts n in the third cell.
  >+++   Add three to the second cell, setting it to 46 ('.').
  .      Print its content ('.').
  -      Decrement, setting it to 45 ('-').
  >      Advance to the third cell.
  [      While the third cell is non-zero:
    <.     Print the content of the second cell ('-').
    >-     Decrement the third cell.
  ]      If the first cell held n, the above prints n minus signs,
         thus negating the plus signs and zeroing the cell of the output program.
  <--    Subtract 2 from the second cell, setting it back to 43.
  <,     Go back to the first cell and read another character from STDIN.
]      Once EOF is reached, ',' will put 0 in the first cell, ending the loop.

ああ、男!取り消し線の44-is-44のミームを破ることはできません、さあ!とにかくそれを打ち負かすあなたの試みは見当たらないので惨めに失敗しました、それは私のスクリーンにいくらかの汚れがあるように見えます(PHP、おそらく?):P
cat

2
そのコメントを避けるために何か
デニス


4

05AB1E、12 11バイト

vyÇ`'+ׄ.>J

説明した

v             # for each char in input string
 yÇ`          # convert to its ascii value
    '+×       # push the char '+' that many times
       „.>J   # push string ".>" and join with the plus signs
              # implicitly print combined string

オンラインで試す

@Adnanのおかげで1バイト節約


'+×F'+}バイトを保存する代わりに。
アドナン

1
@アドナン:ありがとう!「繰り返し」コマンドを探していました。
エミグナ

4

Java、98バイト

class a{String A(char[]b){String z="";for(char B:b){for(int c=B;c-->0;)z+="+";z+=".>";}return z;}}

Stringsはchar[]、多数のユーティリティメソッドを持つ不変のsにすぎないので、配列を使用しましょう。

ゴルフをしていない:

class a {
    void A(char[] b) {
        for (char B : b) {
            for (int c = B; c-- > 0;)
                 System.out.print('+');
            System.out.print(".>");
        }
    }
}

138バイト長の同等のスタンドアロンプ​​ログラム:

interface a{static void main(String[]A){for(char b:A[0].toCharArray()){for(int B=b;B-->0;)System.out.print('+');System.out.print(".>");}}}

ボーナス:

interface a{static void main(String[]A){for(char b:new java.util.Scanner(new java.io.File(A[0])).useDelimiter("\\Z").next().toCharArray()){for(int B=b;B>0;B--)System.out.print('+');System.out.print(".>");}}}

この207バイトのアプリは、タイトルで述べたように、実際にファイルをBFプログラムとしてエンコードします。


2
それは私だけですか、またはインゴルティングされていないプログラムが素晴らしいように見えますか?
user8397947

私が答えを出すのは、基本的にあなたのゴルフバージョンです。
非常識な

2

Vitsy、19 17バイト

I\[&'>.+'i1-\Du]Z

I                     Get the length of the input stack.
 \[            ]      Pop n, repeat this block of code n times.
   &                  Push a new stack and move to it.
    '>.+'             Push the string '+.>' to the stack.
         i            Pop an item from the input stack and push it to the current
                      program stack.
          1-          Subtract one from the top program stack item.
            \D        Duplicate the '+' in the stack that many times.
              u       Merge the current program stack with the previous.
                Z     Output the entire current stack as a string.

この答えは、私が今まで使用してきたことを数回の一つであることに注意してくださいIu。:D

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


2

O、13バイト

i{'+n#*".>"}d

説明:

i              Read standard input into a string and push it onto the stack.
 {         }d  For each character in the string...
  '+           Push "+".
    n#         Convert the character (n) to its ASCII code.
      *        Multiply the "+" by the character code to get the number of +'s needed.
       ".>"    Push the string ".>".
               In O, the stack is printed after execution, so this prints out the result.

2

K6、16バイト

,/{|">.",x#"+"}'

使用法

,/{|">.",x#"+"}'"some string"

説明

  {           }'  For each character in the string...
         x#"+"    Repeat "+" as many times as the character's ASCII code.
        ,         Combine that with...
    ">."          The code to print it and move on.
   |              But we put the string together backwards...so now it gets reversed.
,/                Combine all the substrings into one BIG string.

説明plz:D
アディソンクランプ

@VTCAKAVSMoACE完了!:)
kirbyfan64sos

2

Python 3、43バイト

lambda s:''.join('+'*ord(c)+'.>'for c in s)

Pythonは、各文字のASCIIコードに相当するいくつかのプラス記号を追加し、その後.>に印刷して次のセルに移動します。Brainfuckは正しい値まで増加し、印刷して、次のセルに移動します。

出力hi(わかりやすくするために改行を使用):

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

そのプログラムの出力:

hi

2

Perl、25バイト

s/./"+"x ord($&).".>"/eg

使用法

echo -n hi | perl -pe 's/./"+"x ord($&).".>"/eg'

説明

正規表現の置換操作を使用して、標準入力で指定されたすべての行のすべての文字を+、その文字の順序値から計算された数で置き換え、出力.>して次の文字に進みます。

perl -pフラグを使用して、入力を自動的に読み取り、結果を出力し、バイトカウントに1を追加します。


2

Java、91バイト

String b(char[] f){String k="";for(char b:f){for(int u=b;u>0;u--)k+="+";k+=".>";}return k;}

それに私を打つためのドルカハンの小道具:)


定型文を削除して変数のすべての名前を変更し、それを新しい回答として主張することはできません。
リーキー修道女

@LeakyNunしませんでしたが、もし望むならできました。
非常識な

この回答は、リンク先の回答とどのように異なりますか?
リーキー修道女

@LeakyNunダウン投票して先に進む
非常識な

2

C、72 64 60バイト

main(c){for(;c=~getchar();)for(;printf(~c++?"+":".>")^2;);}

ゴルフされていないバージョン:

main( c )
{
    for ( ; c = ~getchar( ); )
        for ( ; printf( ~c++ ? "+" : ".>" ) ^ 2; );
}

コンパイルとテスト:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt

結果


なぜcビット反転がのビット反転であるのはgetchar、特に反転を再度反転するだけの場合は特にですか?

@catはでc = ~getchar( )0と評価されEOFます。c = ~getchar( )そして、~c++単純に比べて短くなっている~( c = getchar( ) )c--
Jacajack

2

CJam、12バイト

各文字をASCII値に変換し、現在のセルをその回数だけインクリメントしてから印刷します。無限のテープがあるため、各文字を処理した後に右に移動できます。

q{i'+*'.'>}%

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


2

Lua、67 66 61バイト

引数内の各文字を単純に反復処理し、n +sに続けてASCIIテーブル内のこの文字の値が.>どこにあるかを1行ずつ出力しnます。

gsubソリューションで1バイトを節約するためのコメントで推奨されている@LeakyNunとしてgmatchを使用します。

for c in(...):gmatch"."do print(("+"):rep(c:byte())..".>")end

gsubを使用した古いソリューション

(...):gsub(".",function(c)print(c.rep("+",c:byte())..".>")end)

古い67

(...):gsub(".",function(c)print(string.rep("+",c:byte())..".>")end)

実行するには、ファイルとして保存し(golf.luaたとえば)、で実行しlua golf.lua "hi"ます。についてはhi、出力する必要があります

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

これはどのように使用しますか?ただ、REPLでそれを貼り付けることはできますattempt to index a nil valueし、f = ...同じを与え、function f ... end与えunexpected symbol near ':'

@catファイルに保存してとして実行するだけでlua file.lua "argument"、指示を与えるために投稿を更新します。
かてんきょう

それはどのように機能しますか?は...argvの識別子ですか?

1
@catに...は、展開されたテーブルの値が含まれますarg。つまりarg[1]、関数呼び出しで最後のパラメーターとして使用しない限り、常に対応することになり、その後消費されます。
かてんきょう

n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end48バイトのために
漏れ修道女

1

J、28バイト

[:;[:('.>',~'+'#~])"0[:]3&u:

簡単です。3&u:文字を文字コードに変換します。残りは'+'その回数だけ繰り返さ.>れ、各行の最後で連結され;、結果がフラット化されます。

いくつかの結果

   bf =: [:;[:('>.',~'+'#~])"0[:]3&u:
   bf 'hi'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>.
   bf ' !'
++++++++++++++++++++++++++++++++>. +++++++++++++++++++++++++++++++++>.
   bf ' ~'
++++++++++++++++++++++++++++++++>.
                 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>.


1

実際には、13バイト

O`'+*".>"@`MΣ

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

ここで使用される戦略は、他の多くのソリューションと同じです。各文字について+、ゼロで初期化されたセルを適切なASCII序数にインクリメントし、で出力し、で出力.し、で次のセルに移動し>ます。

説明:

O`'+*".>"@`MΣ
O              list of ordinals (technically this is Unicode code points, but code points 0-127 are the same for Unicode and ASCII)
 `'+*".>"@`M   for each ordinal:
  '+*            push a string containing that many +s
     ".>"@       push ".>" and swap (putting it before the +s)
            Σ  concatenate all the strings (if "[", "]", and "," weren't meaningful characters in BF, this technically wouldn't be necessary)

1

Mouse-2002、27バイト

(?'l:l.^(l.^"+"l.1-l:)".>")

これは理論的に動作し、言語のマニュアルによると、しかし、マウスの通訳のリファレンス実装では、文字列の入力が追加バグを持っていると思われる'ためので、aこの出力

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++.>

順番に出力しますa'。それは大丈夫かもしれないし、そうでないかもしれないので、ここにこれまでに 出力しないため、おそらくより無効な39バイト長のものがあります。'

(?'l:l.39=l.0=+0=^(l.0>^"+"l.1-l:)".>")

これは、参照実装で正しい出力を提供します。がない限り':)

説明:

(              ~ while (true) {
  ?' l:        ~   l = getchar() 
  l. ^         ~   if (! (l) ) { break }
  (            ~   while (true) {
    l. ^       ~     if (! (l) ) { break }
    "+"        ~     puts("+")
    l. 1 - l:  ~     l-- // l = l - 1
  )            ~   }
  ".>"         ~   puts(".>")
)              ~ }

1

ファクター、58バイト

[ [ [ 43 ] ""replicate-as ".>"append ] { } map-as ""join ]

のような作品:

[ 
  [ 
    [ 43 ] "" replicate-as  ! ``+'' * code point, clone-like a string ""
    ".>" append             ! append ".>"
  ] 
  { } map-as                ! for each char in string and clone-like an array { }
  "" join                   ! join array of str into str by ""
]

FactorにはBrainfuckインタープリターが付属しているため、テストは簡単です。

bfcat.factor

USING: sequences ;
IN: bfcat

: string>brainfuck ( s -- bf )
  [ [ 43 ] "" replicate-as ".>" append ]
  { } map-as "" join ;

bfcat-tests.factor

USING: tools.test bfcat brainfuck ;
IN: bfcat.tests

{ "a"  } [ "a"  string>brainfuck get-brainfuck ] unit-test
{ "ab" } [ "ab" string>brainfuck get-brainfuck ] unit-test
{ "+++++++++++++" } [ "+++++++++++++" string>brainfuck get-brainfuck ] unit-test
{ "Code Golf" } [ "Code Golf" string>brainfuck get-brainfuck ] unit-test

出力

Unit Test: { { "a" } [ "a" string>brainfuck get-brainfuck ] }
Unit Test: { { "ab" } [ "ab" string>brainfuck get-brainfuck ] }
Unit Test: {
    { "+++++++++++++" }
    [ "+++++++++++++" string>brainfuck get-brainfuck ]
}
Unit Test: {
    { "Code Golf" }
    [ "Code Golf" string>brainfuck get-brainfuck ]
}

わーい!彼らはすべて合格します。


1

ルビー、 40 38バイト

gets.chop.each_byte{|o|puts"+"*o+".>"}

私はルビーを知らないが、私はあなたが使用することができます知っていますputs代わりにしprint、出力のフォーマットがあれば、有効なbrainfuckとbrainfuckであるように、他の文字を気にしないように重要ではないとして、

@catああ、私はbfが他の文字を無視することを知りませんでした、ありがとう!
CocoaBean

1

Sidef、38バイト

ねえ、Rubyと同じ長さ!SidefがRubyではないというだけです:D

read().bytes.each{|c|say"+"*c;say".>"}

いくつかの文字を読んでから、各バイトごとにそれを行います。


1

GNU Bash、100 85バイト

while IFS= read -rn1 c;do printf '+%.0s' $(seq 1 $(printf %d \'$c));echo '.>';done<$1

15バイト節約してくれた@catに感謝します!

ポストランブル

  1. 入力文字列は、最初の引数として渡されたファイル内でそのまま表現されていると仮定します。
  2. 使用法: bash bfcat.sh <path to file containing string>
  3. 使用法(名前付きパイプを使用): bash bfcat.sh <(echo -n '<string>')

非ゴルフ

while IFS= read -r -n1 c # Read file byte by byte [1]
do
    n=$(printf "%d" \'"$c") # `ord` of a char in bash [2]
    printf '+%.0s' $(seq 1 $n) # emit character $n times [3]
    echo '.>' # Emit output and shift command for bf. I love infinite memory.
done <"$1"

Ungolfedバージョンの参照

  1. バイト単位でファイルを読み取る

  2. ord bashのcharの

  3. 文字を$ n回出力します


1
回答の書式設定と内容を改善し、リンクから冗長な情報を削除しました。気に入らない場合は、元に戻してください。また、GNU / LinuxのようなGNU / Bashではなく、GNU Bashです。:)

1
ゴルフのヒント(私は、bashのゴルファーだん): read -rn1、後にスペースを取り除く;にスペースを取り除く、done <"$1"9バイトの合計保存する

1
@catすごいですね!編集->
プレビュー

1

ES6、119の 115バイト

f=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}

@Leibrugのおかげで4バイト節約


1
charCodeAtvarに割り当てて(たとえばc)、次のように使用できます:s[c](i)1バイト短縮し、いくつかの文字を削除する(i found 3:space before [...s]、論理ORをbitwise one、およびsemicolon before return)。
ライブルグ


0

ルビー、26バイト

gsub(/./){?+*$&.ord+'.>'}

+ pコマンドラインオプション用の1バイト。たとえば、ABC xyz実行可能なBrainfuckコードを取得するには

$ ruby -p -e 'gsub(/./){?+*$&.ord+".>"}' <<< "ABC xyz"

そして得る

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.>

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