OOo CODEを翻訳


46

oOo CODEで記述されたプログラムの入力が与えられると、それが表すBFコードを出力します。

oOo CODEの仕組みの簡単な説明を次に示します。

  • 最初に、アルファベット以外の文字がすべて削除されます(範囲外のすべて A-Za-z)。

    たとえば、プログラムを使用しますPROgRam reVERsES giVeN iNPut sEqUENcE(esolangs wikiページに記載されている、期待どおりの動作をする例)。この最初のステップの後、次のようになりました PROgRamreVERsESgiVeNiNPutsEqUENcE

  • 次に、残りのすべての文字を3つのグループに分割します PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE。1文字または2文字の末尾グループがある場合、それを破棄します。

  • 次の表に基づいて、3文字の各グループをBFコマンドに変換します。

    ooo  >
    ooO  <
    oOo  [
    oOO  ]
    Ooo  -
    OoO  +
    OOo  .
    OOO  ,
    

    つまり、グループの最初の文字が小文字、2番目が大文字、3番目が小文字の場合、コマンドに変換され [ます。

    この例では、これが最終的にBFプログラムになり、,[>,]<[.<]+実際に入力が逆になります。

これはであるため、バイト単位の最短コードが優先されます。

テストケース:

<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+

26
私はoOoで答えを誰かを待っています...-
Glorfindel

17
@Glorfindel:喜んで従う
-nneonneo

回答:


127

oOo、1569 1515バイト

やらなければならなかった。ここで試してみてください

ゴルフ:

oooooooooOoOoooooooooooooooOoOooooooOOOoOoooooooOoOOoOOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOoooOoOOoOOoOOoOOoOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooooooOoOoooOOooOooOoOOooOoOoOooooOooOooOooOooOooOooOooOooOooOooOOoOoooooooooooooooooooooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooOooOooOooOooOooOooOooOooOOoOooooooooooooOoOoooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOooOooOooOooOooOooOooOoOoooooOooooooooooooooooOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOooOooOoOoooooOoooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOooooooOOooOoOooooOoOooooOooooOooooOooOOoooooOoooOOooOoOoooooooOoOooOooOOoooOOooOOoooOOooOOooooooOOooOoOooooOoOooooooooooooOoOOoOOoOOoOoOoooOOoOOoOOoOOoOoooOoooOOooOooOooOoOooooooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOooooOoOOoOooOooOOoooooOoooOOooOoOoOoooOOooOOooooooOOooOoOooooOoOooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOoooOOooOOoooOOOoOooooooooooooOOooOoOoooOOooOooOooOooOooOOooooOOooooOOoooOOoOOooooooooooooooooooooooooOoOooooooOOOoOO

Brainfuckに翻訳(わかりやすくするために改行あり):

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

説明のないゴルフ:

this progrAm Translates ooo codE tO brainfUCK cOde. i guesS sINcE ThE ExAMpLE
tEXt WAs SeLf-doCUmENtINg, I ShOUlD PrOBaBLy Make This SElf-DOcUmeNtInG too.

oh, I shoUld menTIon ThaT i WRotE tHe OriginAl BrainFuCk code EnTirElY By haNd.
If you waNt TO sEE tHE bRAiNfUck cODe, RUn THiS PrOGrAm wiTh itSElf AS iNPuT!

baSiCaLly, thiS proGram seTS up MemOrY As fOlLoWs: the fIrSt thrEe Bytes aRe
"ValId" FLags (V0, v1, V2), theN tHErE'S a BArRIeR (A 1) fOLlOweD bY tHree
"vaLue" bIts (b0, b1, b2). THe rEst Of THe aRrAy Is basiCaLly juSt ScratcH
sPacE. tO Save SpAce, i'm slIdINg THe POiNTeR fOrwaRD bY OnE In EAcH ItEratIon
uNTil THe POiNteR hItS the baRrieR, at whiCH poInt ThE ProGrAm Prints out tHe
ConvERteD chArACteR.

tHe ProgrAm eXteNsiVelY usEs tHe cLevEr "gReaTEr-Than" comparison operator
described by dheeraj ram aT
hTtp://sTAckOveRflOw.cOm/QUeSTioNs/6168584/BrAinfuck-comparE-2-nUmbeRS. i hAppEn
tO reAlLY lIKe tHiS iMplemEntAtiOn bEcaUse It iS boTh cOMpAct and nestablE,
wHich is critical for my bf code tO wOrk pROpeRly.

I seT up ThE ReQUisItE sTructure, then pErForm A BunCh oF neSteD cOMpaRisOns
ThaT loOk rOugHlY like tHis:

    if(in >= 65 /* capital a */) {
        if(In <= 90 /* CApITaL Z */) {
            vI = 1
            Bi = 1
        } ELsE {
            iF(in >= 97 /* lOWeRCaSE a */) {
                IF(iN <= 122 /* LoWErCAsE z */) {
                    vi = 1
                }
            }
        }
    }

At thE End OF tHEsE coMpaRisOnS, if the V (valid) Bit iS Set, the ProgRAm sTePs
the poiNtER rIghTwaRDs. if IT hiTS the barRIer, It Then gOeS into A big sEt of
nEstED condiTionALs tHaT test the AcCumUlaTEd vaLUe bITs, anD ConSTruct thE
CorReSpondInG character to pRiNT oUT. tHEn It ReseTS bACk TO tHE iNitiAl stATe.

fInaLly, It Reads anotheR iNPuT ChARaCTeR aNd goES bACk TO lOOpINg.

SO tHere You hAVe iT - An Ooo To BrainFuCK cOnvErtER writtEn in OOo (aNd
BrAinfUCk, bY ExtensiON!). siNcE i havE a Few moRe chARacterS to sPAre In This
progRaM, HeRe's A coUPle oF StrESs teST paTTernS:

0123456789ABcDefghijklmnopQRstUvWxyzABcdEfgHijKlmNopQRstuvWXyz!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 
 ~}|{`_^]\[@?>=<;:/.-,+*)('&%$#"!zyXWvutSRqPOnmlkjihgfedcbazyxwvutsrqPoNmlkjihGFEdCBa9876543210

興味深いチャレンジをありがとう!


1
なんてこった...これは壮大です!よくやった。
Rɪᴋᴇʀ

11
... ワオ。私は感銘を受けて。好奇心For な人向け:goo.gl/vbh3h9(完全なTry itオンラインリンクは、明らかな理由で長すぎました)。
ドアノブ

1
たくさんのチャーをゴルフで/最適化した。新しいtryitリンク:goo.gl/ISjwLB
nneonneo

7
これは私が今まで本サイト上の見た中で最高のものです
9

15
@Texenoxその場合、プログラミングパズルとコードゴルフへようこそ!あなたの心の「私が今まで見た中で最高の」スポットを争うことになると、あなたはもっと多くの答えを見つけると確信しています:)
Sp3000

15

CJam、36 35バイト

l{el_eu-},'_f<0+3/W<2fb"><[]-+.,"f=

ここでテストしてください。

説明

l               e# Read input.
{el_eu-},       e# Discard all characters that don't change in a lower/upper case
                e# transformation, i.e. non-letters.
'_f<            e# Compare with '_' to determine case as 0 or 1.
0+              e# Append a zero.
3/              e# Split into chunks of 3.
W<              e# Discard last chunk.
2fb             e# Convert each chunk from base 2.
",.+-][<>"f=    e# Select the corresponding character for each chunk.

値を追加して最後のチャンクを破棄する:賢い!
ルイスメンドー

ああ、それは本当に賢いです
アドナン

9

JavaScript(ES6)、94 93 91 85 84 83バイト

@ dev-nullのおかげで1バイト節約

x=>x.replace(/[a-z]/gi,c=>(a+=c<'a'|0)[2]?b+="><[]-+.,"['0b'+a-(a="")]:0,a=b="")&&b

これの多くのバリエーションを試しましたが、これは最短のようです。空の入力でも動作します!

使い方

まず、でx.replace(/[a-z]/gi,c=>c入力の各文字を取得します。私たちは、セットabする""機能が第二の過去の任意のパラメータを無視するので、関数呼び出しのもう一方の端に。a現在作成している文字を特定するためのバイナリ文字列をb保存し、結果を保存します。

今、混乱の部分のために:最初に、と(a+=+(c<'a'))、私たちは、追加0a場合はc大文字です。1そうでなければ。この式はの新しい値を返すaため、インデックス2の文字が存在するかどうかを確認することで、3文字の長さに達しているかどうかを確認できます[2]?。そうでない場合、単に関数をで終了します:0

場合はa、今の長さの3つの文字で、それは間の二進数である000とは111。これを10進数に変換する"0b"には、先頭に追加してから、を使用してエンジンに強制的に数値として解析させ'0b'+a-0ます。

ただし、a空の文字列にリセットする必要があります。それは'0b'+(a="")-0、解析された文字列がただであることを意味するので、私たちはただすることができません0b。幸いなことに、数値として解析されると、空の文字列は0になるため、0で置き換えることができ(a="")ます。

今、私たちは私たちの番号を持っている、と私たちはただでそのインデックスに文字を追加することができます"><[]-+.,"しますb。置換が完了した後、&&b関数からそれを返すために使用します。(まあ、結果.replaceが空でない限り、空の入力でのみ発生し、とにかく空の文字列を返します。)


'0b'+a-0vs +`0b${a}`+("0b"+a)
andlrc

replace結局のところ、勝ちです!
ニール

あなたを導くために残念いや@Neil match道を...
andlrc

最新バージョンでは、主要な非文字に問題がありますか?
ニール

@ニールあなたは正しい。幸いなことに、私は正常に動作していないバージョンからのトリックを使用して、正常に動作するバージョンから1バイトをゴルフすることができました。
ETHproductions

8

05AB1E35 32バイト

コード:

á0«3÷\)vyS).uïJC",.+-][<>"Sr@?)\

この答えから MartinBüttnerの非常に巧妙なトリックを使用しています。説明:

á0«                               # Remove all non-alphabetic characters and append a zero
   3÷\                            # Split into pieces of 3 and discard the last one
      )v                          # Wrap everything into an array and map over it
        yS).uï                    # Is uppercase? Converts AbC to [1, 0, 1]
              JC                  # Join and convert from binary to int
                ",.+-][<>"        # Push this string
                          S       # Split the string
                           r@     # Reverse the stack and get the character from that index
                             ?    # Pop and print without a newline
                              )\  # Wrap everything into an array and pop

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

CP-1252エンコードを使用します。


8

網膜79 75 71 70バイト

1バイトを節約してくださったrandomraに感謝します。

i`[^a-z]

M!`...
m`^
;
+`(.*);(.)
$1$1$2;
T`l
.+
$.&
T`d`_><[]\-+.,
¶

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

説明

i`[^a-z]

手紙ではないものをすべて削除することから始めます。

M!`...

これは、すべての(重複しない)3文字の一致を返すことにより、文字列を3文字のチャンクに分割します。これにより、不完全な後続チャンクが自動的に破棄されます。

m`^
;

;各行の先頭にa を付けます。これを基数2の変換のマーカーとして使用します。そういえば、単に大文字を1、小文字をとして扱うだけ0です。

+`(.*);(.)
$1$1$2;

これは、面白いbase-2から単項への変換を行います。各ステップで、左の文字を2倍にして、右に;移動し;ます。なぜこれが機能するのですか?小文字をとして0、大文字をとして解釈することに注意してください1。文字を処理するたびに、これまでの実行合計(左側)を単純に2倍にします-二重小文字は単に2*0=0ですので、完全に無視でき、大文字はこれまで2進数を表します。私たちが欲しいもの。次に、現在の文字を、それを表す0または1それに対応する現在の合計に追加します。

T`l

すべての小文字/ゼロを削除します。

.+
$.&

各行を一致させ、その行の(10進数の)文字数で置き換えます。これにより;、単項数は10進数の+ 1に変わります。

T`d`_><[]\-+.,

対応するコマンドで1〜8を置き換える音訳。

改行を削除します。


これは、3つの文字のチャンクに分割する賢い方法です。これを以前に使用したことがありますか?
ETHproductions

@ETHproductions私は持っていると思いますが、どこにあるかわかりません。私はの思考かもしれないcodegolf.stackexchange.com/a/69518/8478
マーティン・エンダー

新しく追加されたRetinaアイデアで70バイトと少し短くなりました
-randomra

@randomraああ、いいアイデアだ;。後で編集します。
マーティンエンダー

7

MATL38 32バイト

'><[]-+.,'jt3Y2m)3ZCtAZ)92<!XBQ)

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

'><[]-+.,'      % push string with BF commands
j               % read input as a string
t               % duplicate
3Y2             % predefined literal: string 'A...Za...z'
m               % true for elements of input string that are letters
)               % index into input string to keep only letters
3ZC             % 2D array whose columns are non-overlapping slices of length 3.
                % The last column is padded with zeros if needed
tA              % duplicate. True for columns that don't contain zeros 
Z)              % keep those columns only. This removes padded column, if any
92<             % 1 for upper case letters, 0 for lower case letters in the 2D array
!               % transpose so each group of 3 is a row
XBQ             % convert each row from binary to decimal and add 1
)               % index into string containing the BF commands. Implicitly display

5

Japt、37 36バイト

Uo"%l" f'.³ £",><[]-+."gX®c ¤gJÃn2Ãq

オンラインでテストしてください!

使い方

Uo"%l" f'.³ £  ",><[]-+."gX®   c ¤  gJÃ n2Ã q
Uo"%l" f'.³ mX{",><[]-+."gXmZ{Zc s2 gJ} n2} q

Uo"%l"      // Get rid of all non-letter chars in U.
f'.³        // Take each set of three chars in U.
mX{      }  // Map each item X in this group to:
XmZ{     }  //  Map each letter Z in X to:
Zc s2 gJ    //   Take the char code of Z as a binary string, and take the first char.
            //   This maps each character to 1 if it's UC, or 0 if it's lc.
        n2  //  Interpret the result as a binary number.
",><[]-+."g //  Get the item at this index in this string.
q           // Concatenate the result and implicitly output.

4

JavaScript(ES6)、111 95バイト

s=>s.match(/[A-Z]/gi).map(c=>+(c<'a')).join``.match(/.../g).map(g=>'><[]-+.,'['0b'+g|0]).join``

単に非文字を削除し、大文字を1に、小文字を0に変換し、3つのグループに分割し、1または2の後続グループを無視し、グループをデコードします。

編集:@ dev-nullのおかげで16バイト保存されましたが、空の文字列を渡すとコードは機能しなくなります。


@ dev-null match(/.../g).map().joinうーん、私はアプローチを試みましたが、バイト数を誤ってカウントしましたが、それは私を何も救いませんでしたが。最初の試合のヒントをありがとう。
ニール

4

Python 3、91バイト

b=1
for c in input():
 b=-~c.isalpha()*b+c.isupper()
 if b>7:print(end="><[]-+.,"[b-8]);b=1

うーん...特に2行目は少し長く見えます。b=[b,2*b+(c<'a')][c.isalpha()]しかし、少し悪いです。


2
そのような終了の使用は本当に賢いです。私はそれを見たことがありません。
モーガンスラップ

3

Pyth、40バイト

jkm@"><[]-+.,"id2f!%lT3cm?rId0Z1f!rIT2z3

ここで試してみてください!

結果を文字列ではなく文字のリストとして出力できる場合、2バイト節約できます。

説明

すべての非文字を除外し、大文字を1に、小文字を0に変換し、3のチャンクに分割し、すべてのチャンクを2進数として解釈し、これをすべてのBFコマンドを含む文字列のインデックスとして使用します。

jkm @ "> <[]-+。、" id2f!%lT3cm?rId0Z1f!rIT2z3#z = input

                                fz#Tで入力をフィルター処理する
                                 !#論理的ではない
                                  rIT2#T == swapcase(T)、Tが文字でない場合はtrue
                        m#dでフィルター結果をマップ
                         ?rId0#d == toLower(d)の場合
                              Z1#小文字の場合は0、大文字の場合は1
                       c 3#3のチャンクに分割し、必要に応じて最後の要素を短くする
                 f#Tでフィルター
                  !#論理的ではない
                   %lT3#len(t)mod 3->長さ3の要素のみを保持
  m#d付きのマップ
              id2#2進数から10進数に変換
   @ "> <[]-+。、"#結果のBFコマンドを取得
jk#文字列に参加

3

Jolf、31 34バイト

ここで試してみてください!交換する\x10して\x05。チョップ機能を間違って実装したため、3バイト増加します。:(

►ΜZeZcAAρi♣Epu1pl033d."><[]-+.,"ΙH
        ρi♣E                        remove all space in input
       A    pu1                     replace all uppercase letters with 1
      A        pl0                  replace all lowercase letters with 0
    Zc            3                 chop into groups of three
  Ze               3                keep groups of length three
 Μ                  d               map
                              ΙH   parse element as binary
                     ."><[]-=.,"    and return a member of that
►                                  join by nothing

3

Hoon、212バイト

=+([v=turn c=curr q=cold k=tape] |=(t/k `k`(v (v `(list k)`(need ((unit (list k)) p:(rose (murn t (c rush alf)) (star (stun [3 3] ;~(pose (q '0' low) (q '1' hig))))))) (c scan bin)) (c snag (rip 3 '><[]-+.,')))))

ゴルフをしていない:

|=  t/tape
^-  tape
%+  turn
  %+  turn  ^-  (list tape)
  %-  need  %-  (unit (list tape))
    =+  t=(murn t (curr rush alf))
    p:(rose t (star (stun [3 3] ;~(pose (cold '0' low) (cold '1' hig)))))
  (curr scan bin)
(curr snag (rip 3 '><[]-+.,'))
  1. ++ murnを使用して、「alf」(アルファベット)で解析できない入力のすべての文字を取り除きます
  2. 一度に3文字ずつリストに出力するコンビネーターでリストを解析し、小文字を「0」に、大文字を「1」に置き換えます
  3. 結果を(ユニット(リストテープ))にキャストし、強制的にラップを解除して、最も解析された結果を取得し、クラッシュせずに3の倍数だけで動作します
  4. リストにマップし、各グループをバイナリであるかのように解析します
  5. リスト内の各番号をテキスト「> <[]-+。、」へのインデックスとして使用し、リストをテープに戻します。

Hoonには適切な正規表現がなく、パーサーコンビネータライブラリしかないため、悲しいことにかなり冗長です。入力ストリーム全体が解析されない場合、++ scanもクラッシュするため、++ roseを使用してユニットに強制し、「最も遠い解析」値のためにラップを解除する必要があります。また、リストのカリー化とマッピング(++ turn)に多用されるため、関数名を1文字の変数にエイリアスします。

Hoonは、スレートの再実装プロジェクトであるUrbitのプログラミング言語です。純粋に機能的で、静的に型付けされ、漠然とLispに似ており、Nockにコンパイルされます。Nockは、バイナリツリーのbignumメモリモデルの上で実行されるコンビネータベースのVMです。

Urbitを起動すると、:dojo、シェル、Hoon replにドロップされます。スニペットを実行するには、単に次を入力します。

%.  "PROgRam reVERsES giVeN iNPut sEqUENcE"

次に、スタンドアロン関数を次の行に貼り付けます。


PPCGへようこそ!答えはかなりよく説明されていますが、通訳やオンラインで試してみる場所にリンクできますか?
アディソンクランプ

Urbitのgithubページへのリンクを追加しました。それは、ビルドすることがほとんど唯一の方法だからです。それで十分ですか?
-RenderSettings

絶対に。:D完全なプログラムでこれを使用する方法についての指示を残すことは素晴らしいことです。
アディソンクランプ

3

ゼリー、27 バイト

=Œs¬Tịµ=Œu;0s3ṖḄ€ị“<[]-+.,>

オンラインでお試しください!最後の2番目のテストケースでは、バックスラッシュを入力文字列でエスケープする必要があることに注意してください。

Implicit input: string s (list of characters)

=Œs             Compare with swapcase
¬               Not - this gives 1 for letters, 0 otherwise
Tị              Take characters at truthy indices
µ               Start a new monadic chain

Input: string s' (list of letters)

=Œu             Compare with uppercase
;0              Append 0
s3              Split into chunks of length 3
Ṗ               Pop last chunk
Ḅ€              Apply convert-from-binary to each chunk
ị“<[]-+.,>      For each number, 1-based index cyclically into the string "<[]-+.,>"

2

Matlab、98バイト

function t(s);s=s(isletter(s));s=s(1:end-mod(end,3));r='><[]-+.,';r([4 2 1]*reshape(s<92,3,[])+1)
  1. 掃除
  2. トリム
  3. UC = 1、lc = 0で3xn行列mに再形成する
  4. (4 2 1)* m + 1の結果、インデックスリストが作成されます
  5. 正しい文字へのインデックス

1

Perl、76 73 72 + 1 = 73バイト

$a.=y+A-Z++dfor/[A-Z]/gi;print substr"><[]-+.,",oct"0b$_",1for$a=~/.../g

-nフラグが必要です:

$ perl -n oOo.pl <<< 'PROgRamr{}\eVERsESgiVeNiNPutsEqUENcE'
,[>,]<[.<]+

base-2変換でのトリックの使用 。

使い方:

                          # '-n' auto read first line into `$_`
            for/[A-Z]/gi; # Iterate over all letters a-z
$a.=y/A-Z//d              # Count number of uppercase letters (1 or 0)

                                  for$a=~/.../g # Split $b into hunks of 3 characters. And
                                                # remove any potential trailing characters.
      substr"><[]-+.,",oct"0b$_",1              # `oct("0b$binary")` will convert binary
                                                # to decimal.
print

1

ジュリア、107バイト

s->"><[]-+.,"[map(j->parse(Int,j,2)+1,[map(i->i<'_'?'1':'0',m)for m=matchall(r"\w{3}",filter(isalpha,s))])]

これは、文字列を受け入れて文字列を返す匿名関数です。呼び出すには、変数に割り当てます。

ゴルフをしていない:

function f(s)
    # Brainfuck commands
    bf = "><[]-+.,"

    # Filter out non-alphabetic characters from the input
    chars = filter(isalpha, s)

    # Get all non-overlapping groups of three characters
    groups = matchall(r"\w{3}", chars)

    # Construct binary strings by comparing to _
    binary = [map(i -> i < '_' ? '1' : '0', m) for m = groups]

    # Parse each binary string as an integer and add 1
    indices = map(j -> parse(Int, j, 2) + 1, binary)

    # Return the Brainfuck commands at the indices
    return bf[indices]
end

1

Lua、120バイト

string.gsub()ここで大きな用途があるので、もう一度この関数に1文字のポインターを作成して、いくつかのバイトを取得することができました。また、スペースのない最初のluaプログラムです!:D

このプログラムは、コマンドライン引数を介して入力を受け取り、BrainFuckプログラムを1行に1コマンド出力します。

編集:@Oleg V. Volkovのおかげで1バイト保存

arg[1]:gsub("[%A]",""):gsub("%l",0):gsub("%u",1):gsub("...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)

Ungolfと説明

arg[1]:gsub("[%A]","")    -- replace the non-letter character by an empty string
                          -- %A matches all the character not in %a (letters)
:gsub("%l",0)             -- replace lower case letters by 0s
:gsub("%u",1)             -- replace upper case letters by 1s
:gsub("...",function(c)   -- iterate over all groupe of 3 characters
  x=tonumber(c,2)+1       -- convert the 3-letter group from binary to decimal
  print(("><[]-+.,")      -- output the corresponding brainfuck command
             :sub(x,x))   
end)

あなたは、インライン化に1つのバイトを保存することができますb保存にと1よりstring.gsub短いVARにして、手動での最初の引数を折る:g=("").gsub g(g(g(g(arg[1],"[%A]",""),"%l",0),"%u",1),"...",function(c)x=1+tonumber(c,2)print(("><[]-+.,"):sub(x,x))end)
オレグV.ボルコフは、

...または、折り畳みのバイトカウントを読み間違えた可能性があります。インライン化は引き続き機能します。
オレグV.ボルコフ

@ OlegV.Volkov短いvarコストで保存すると、悲しいことに、もっと、同じことを試してみました^^。そして、bのインライン化に感謝します...なぜvarに保存したのかわかりません...
Katenkyo

1

Python 2、112バイト

''.join('><[]-+.,'[int('%d'*3%tuple(map(str.isupper,y)),2)]for y in zip(*[iter(filter(str.isalpha,input()))]*3))

もっとゴルフしてみます。


1

Mathematica、192バイト

StringJoin[FromDigits[#,2]&/@Partition[ToCharacterCode@#-48,3]&[StringDelete[#,a_/;!LetterQ[a]]~StringReplace~{_?UpperCaseQ->"1",_?LowerCaseQ->"0"}]/.Thread[0~Range~7->Characters@"><[]-+.,"]]&

目的の文字列を引数として受け取る匿名関数。(非常に簡単な)アルゴリズムの手順:

  1. ひもをきれいにする
  2. UC-> "1"、lc-> "0"を置き換えます
  3. 文字列をバイナリリストに変換します
  4. リストを3つに分割し、各チャンクを基数2の数値として解釈します
  5. 数字を適切な記号に置き換えて、結合して文字列に戻します。

1

ルビー117 114 113 111 86 79のバイト

gets.tr(?^+m='a-zA-Z','').tr(m,?0*26+?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
  • tr(?^+m='a-zA-Z','')mを設定し'a-zA-Z'、非文字を削除します
  • .tr(m,?0*26+?1) 小文字を0に、大文字を1に変換します
  • .scan(/.../) 文字列を3つのグループにチャンクし、3未満の場合は最後のグループを破棄します
  • {$><<"><[]-+.,"[$&.t‌​o_i 2]} 各2進数を文字に変換します

使えないのtr("a-zA-Z","01")?またはtr("A-Za-z",10)
andlrc

@ dev-null "AAz".tr("a-zA-Z","01")が与える111
-FuzzyTree

1
ここで多くのことができます。これがスタートです:gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}(86バイト)。入力をコマンドラインオプションから標準入力に変更しました。出力の周囲の引用符を修正しました(ただし、現在は末尾に改行がありません)
-daniero

@danieroありがとう!これをコミュニティの回答にしました。気軽に変更して
ください-FuzzyTree

1
tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)短い
チャールズ

1

Perl 6、81バイト

これはおそらくもっと良くできますが、これは私の目標です

{m:g/:i<[a..z]>/;[~] ("><[]-+.,".comb[:2[$_]]for (+(91>$_.ord)for |$/).rotor(3))}

使用法

> my &f = {m:g/:i<[a..z]>/;[~] ("><[]-+.,".comb[:2[$_]]for (+(91>$_.ord)for |$/).rotor(3))}
-> ;; $_? is raw { #`(Block|149805328) ... }
> f("PROgRamreVERsESgiVeNiNPutsEqUENcE")
,[>,]<[.<]+

非ゴルフ

sub oOo ($_) {
    m:g/:i<[a..z]>/;  # Match all letters and put them in $/

    my @digits = (                
        for |$/ -> $c {           # For all $c in $/
            +(91>$c.ord)          # 1 if $c.ord < 91 else 0
        }
    );
    @digits.=rotor(3);            # Split the digits into chunks of 3

    my @chars = (
        for @digits -> @l {
            "><[]-+.,".comb[:2[@l]] # Take the character from "><[]-+.,"
                                    # at an index given by converting 
                                    # @l (a list of 3 binary digits)
                                    # from base 2 to base 10
        }
    );
    @chars.join # Join the list of chars into a string and return
}

1

C ++、173 167バイト

完全なプログラム、ゴルフ(標準入力から読み取り):

#include <cstdio>
main(){for(char*a="@[`{>-[.<+],",c,o=0,t=1;(c=getchar())>0;)if(c=c>*a&&c<a[1]?2:c>a[2]&&c<a[3]?1:0){o|=c>1?t:0;t*=2;if(t>4)putchar(a[o+4]),o=0,t=1;}}

やや自由:

#include <cstdio>
main(){
    for(char*a="@[`{>-[.<+],",c,o=0,t=1;(c=getchar())>0;)
        if(c=c>*a&&c<a[1]?2:c>a[2]&&c<a[3]?1:0){
            o|=c>1?t:0;
            t*=2;
            if(t>4)putchar(a[o+4]),o=0,t=1;            
        }
}

ASCIIの@A... Z[および同様に`a...に注意してくださいz}





0

JavaScript、148バイト

function a(s){function b(c){return c.charCodeAt()&32}return (l=(s=s.replace(/[^a-z]/gi)).substr(3))?",.+-][<>"[b(s[0])*4+b(s[1])*2+b(s[2])]+a(l):""}

0

TI-BASIC、311 288バイト

TI-BASICの答えは何ですか?それを修正する時間です!

Ans→Str1:" →Str2:" →Str6:"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str4:For(S,1,length(Str1:sub(Str1,S,1:If inString(Str4+"abcdefghijklmnopqrstuvwxyz",Ans:Str2+Ans→Str2:End:sub(Str2,2,length(Str2)-1→Str2:For(B,1,.1+3⁻¹length(Str2:sub(Str2,3B-2,3→Str3:1+sum({4,2,1}seq(0≠inString(Str4,sub(Str3,X,1)),X,1,3→L₁(B:End:For(C,1,.1+dim(L₁:Str6+sub("><[]-+.,",L₁(C),1→Str6:End:sub(Str6,2,length(Str6)-1→Str6

入力はのoOoコードですAns
出力は、変換されたBFコードです。

例:

"AbcDef
AbcDef
prgmCDGF18
--
"PROgRam reVERsES giVeN iNPut sEqUENcE
PROgRam reVERsES giVeN iNPut sEqUENcE
prgmCDGF18
.[>,]<[.<]+
"AbcDe
AbcDe
prgmCDGF18
-

ゴルフ
禁止:(改行とコメントが追加されました)

Ans→Str1                                                   ;store the input in "Str1"
" →Str2                                                    ;set "Str2" and "Str6" to a
" →Str6                                                    ; space character
                                                           ; (needed b/c TI-BASIC doesn't
                                                           ;  like concatenating empty
                                                           ;  strings)

"ABCDEFGHIJKLMNOPQRSTUVWXYZ→Str4                           ;store the uppercase alphabet
                                                           ; in "Str4"
For(S,1,length(Str1                                        ;loop over the input string
sub(Str1,S,1                                               ;get the current character
If inString(Str4+"abcdefghijklmnopqrstuvwxyz",Ans          ;if the character is in either
                                                           ; the uppercase or lowercase
                                                           ; alphabet
Str2+Ans→Str2                                              ;add it to "Str2", the code
                                                           ; string
End
sub(Str2,2,length(Str2)-1→Str2                             ;remove the space added earlier
For(B,1,.1+3⁻¹length(Str2                                  ;loop over each 3-char substring
                                                           ; and skip any extra chars
                                                           ; (.1 is added to force one
                                                           ;  loop)
sub(Str2,3B-2,3→Str3                                       ;store said substring in "Ans"
1+sum({4,2,1}seq(0≠inString(Str4,sub(Str3,X,1)),X,1,3→L₁(B ;convert to the respective
                                                           ; index in "><[]-+.,"
                                                           ; (1-indexed)
End
For(C,1,.1+dim(L₁                                          ;loop over each index
                                                           ; (.1 is added to force one
                                                           ;  loop)
Str6+sub("><[]-+.,",L₁(C),1→Str6                           ;add the char to the translation
                                                           ; string
End
sub(Str6,2,length(Str6)-1→Str6                             ;remove the added space and
                                                           ; store the result in "Str6"
                                                           ; and "Ans"
                                                           ;implicit print of "Ans"

ノート:

  • TI-BASICはトークン化された言語です。文字数がバイト数と等しくありませ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.