Terjemahkan oOo CODE

46

Diberikan input dari sebuah program yang ditulis dalam OOo CODE , output kode BF yang diwakilinya.

Berikut ini adalah deskripsi singkat tentang cara kerja oOo CODE:

  • Pertama, semua karakter non-alfabet dihapus (semuanya tidak ada dalam jangkauan A-Za-z).

    Misalnya, ambil program PROgRam reVERsES giVeN iNPut sEqUENcE(contoh yang diberikan pada halaman wiki esolangs yang melakukan persis seperti yang Anda harapkan). Setelah langkah pertama ini, sekarang kita miliki PROgRamreVERsESgiVeNiNPutsEqUENcE.

  • Selanjutnya, bagi semua karakter yang tersisa ke dalam kelompok 3. Kita sekarang miliki PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE. Jika ada grup tambahan 1 atau 2 karakter, buanglah.

  • Ubah setiap grup yang terdiri dari 3 huruf menjadi perintah BF berdasarkan tabel berikut:

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

    Yaitu, jika huruf pertama grup adalah huruf kecil, yang kedua adalah huruf besar, dan yang ketiga adalah huruf kecil, itu akan menerjemahkan ke perintah [.

    Dengan contoh kita, ini akhirnya menjadi program BF ,[>,]<[.<]+, yang memang membalikkan inputnya.

Karena ini adalah , kode terpendek dalam byte akan menang.

Kasus uji:

<empty string> -> <empty string>
A -> <empty string>
Ab -> <empty string>
Abc -> -
AbcD -> -
AbcDe -> -
AbcDef -> --
1A_b%c*D[]e\\\f! -> --
PROgRamreVERsESgiVeNiNPutsEqUENcE -> ,[>,]<[.<]+
Gagang pintu
sumber
26
Saya menunggu seseorang dengan jawaban di ...
Glorfindel
17
@ Glorfindel: Senang menuruti.
nneonneo

Jawaban:

127

oOo, 1569 1515 byte

Harus dilakukan. Coba di sini .

Golf:

oooooooooOoOoooooooooooooooOoOooooooOOOoOoooooooOoOOoOOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOoooOoOOoOOoOOoOOoOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooooooOoOoooOOooOooOoOOooOoOoOooooOooOooOooOooOooOooOooOooOooOooOOoOoooooooooooooooooooooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooOooOooOooOooOooOooOooOooOOoOooooooooooooOoOoooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOooOooOooOooOooOooOooOoOoooooOooooooooooooooooOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOooOooOoOoooooOoooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOooooooOOooOoOooooOoOooooOooooOooooOooOOoooooOoooOOooOoOoooooooOoOooOooOOoooOOooOOoooOOooOOooooooOOooOoOooooOoOooooooooooooOoOOoOOoOOoOoOoooOOoOOoOOoOOoOoooOoooOOooOooOooOoOooooooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOooooOoOOoOooOooOOoooooOoooOOooOoOoOoooOOooOOooooooOOooOoOooooOoOooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOoooOOooOOoooOOOoOooooooooooooOOooOoOoooOOooOooOooOooOooOOooooOOooooOOoooOOoOOooooooooooooooooooooooooOoOooooooOOOoOO

Diterjemahkan ke Brainfuck (dengan linebreak untuk kejelasan):

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

Tidak digabungkan dengan penjelasan:

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

Terima kasih atas tantangan yang menarik!

nneonneo
sumber
1
oh tuhan ... Ini epik! Kerja bagus.
Rɪᴋᴇʀ
11
... WOW. Saya terkesan. Untuk yang penasaran: goo.gl/vbh3h9 (tautan Try it online lengkapnya terlalu panjang untuk alasan yang jelas).
Gagang Pintu
1
Golf / dioptimalkan banyak karakter. Tautan tryit baru: goo.gl/ISjwLB
nneonneo
7
INI ADALAH HAL TERBAIK YANG PERNAH SAYA LIHAT DI SITUS INI
sembilan
15
@Texenox Dalam hal ini, selamat datang di Programming Puzzles dan Code Golf! Saya yakin Anda akan menemukan lebih banyak jawaban di sekitar yang akan bersaing untuk tempat "hal terbaik yang pernah saya lihat" dalam benak Anda :)
Sp3000
15

CJam, 36 35 byte

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

Uji di sini.

Penjelasan

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.
Martin Ender
sumber
Tambahkan nilai dan buang potongan terakhir: pintar!
Luis Mendo
Ahh, itu benar-benar pintar
Adnan
9

JavaScript (ES6), 94 93 91 85 84 83 byte

Disimpan 1 byte berkat @ dev-null

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

Saya sudah mencoba banyak varian ini, tetapi ini tampaknya yang terpendek. Juga berfungsi pada input kosong!

Bagaimana itu bekerja

Pertama, dengan x.replace(/[a-z]/gi,c=>, kita temukan ambil setiap huruf cdalam input. Kami mengatur adan bke ""di ujung lain dari panggilan fungsi, karena fungsi mengabaikan parameter melewati yang kedua. aakan menyimpan string biner untuk menentukan karakter yang sedang kita buat, dan bakan menyimpan hasilnya.

Sekarang untuk bagian membingungkan: pertama, dengan (a+=+(c<'a')), kita tambahkan sebuah 0ke ajika cadalah huruf besar; 1jika tidak. Ungkapan ini mengembalikan nilai baru a, sehingga kemudian kita dapat memeriksa jika telah mencapai tiga karakter panjang dengan dengan memeriksa jika karakter pada indeks 2 ada: [2]?. Jika tidak, kita cukup mengakhiri fungsinya dengan :0.

Jika asekarang panjangnya tiga karakter, itu adalah angka biner antara 000dan 111. Kita dapat mengonversinya menjadi angka desimal dengan menambahkan "0b"ke awal, lalu memaksa mesin untuk menguraikannya sebagai angka '0b'+a-0.

Namun, kita masih perlu mengatur ulang ake string kosong. Kita tidak bisa begitu saja melakukannya '0b'+(a="")-0karena itu berarti string yang diurai itu adil 0b. Untungnya, ketika diuraikan sebagai angka, string kosong menjadi 0, jadi kita bisa mengganti 0dengan (a="").

Sekarang kita memiliki nomor kita, dan kita dapat menambahkan karakter pada indeks itu "><[]-+.,"ke b. Setelah penggantian selesai, kami gunakan &&buntuk mengembalikannya dari fungsi. (Ya, kecuali jika hasilnya .replacekosong, yang hanya terjadi pada input kosong dan mengembalikan string kosong.)

Produksi ETH
sumber
Simpan satu byte yang bagus dengan: '0b'+a-0vs +`0b${a}`dan+("0b"+a)
andlrc
Jadi, replacemenanglah!
Neil
@Neil Yea maaf telah membimbing Anda match...
andlrc
Versi terbaru memiliki masalah dengan memimpin non-huruf?
Neil
@Neil Anda benar. Untungnya, saya berhasil memindah byte dari versi yang berfungsi menggunakan trik dari yang tidak berfungsi.
Produk ETH
8

05AB1E , 35 32 byte

Kode:

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

Menggunakan trik yang sangat pintar dari Martin Büttner, dari jawaban ini . Penjelasan:

á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

Cobalah online!

Menggunakan pengodean CP-1252 .

Adnan
sumber
8

Retina , 79 75 71 70 byte

Berkat randomra untuk menghemat 1 byte.

i`[^a-z]

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

Cobalah online!

Penjelasan

i`[^a-z]

Kami mulai dengan menghapus semua yang bukan surat.

M!`...

Ini membagi string menjadi potongan-potongan dari tiga karakter dengan mengembalikan semua 3-karakter yang cocok (tidak tumpang tindih). Ini secara otomatis membuang potongan trailing yang tidak lengkap.

m`^
;

Sertakan a ;ke setiap baris. Kami akan menggunakan ini sebagai penanda untuk konversi basis-2. Omong-omong, kami hanya akan memperlakukan huruf besar sebagai 1huruf kecil 0.

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

Ini melakukan konversi base-2 ke unary yang lucu. Pada setiap langkah kami cukup menggandakan karakter kiri ;dan memindahkan ;satu ke kanan. Mengapa ini bekerja? Ingat kami akan menafsirkan huruf kecil sebagai 0dan huruf besar sebagai 1. Setiap kali kami memproses surat, kami cukup menggandakan total running (di sebelah kiri) sejauh ini - huruf kecil lebih rendah 2*0=0, jadi mereka dapat sepenuhnya diabaikan dan huruf besar mewakili angka biner sejauh ini, jadi menggandakannya adalah apa yang kita mau. Kemudian kami menambahkan huruf saat ini ke total yang berjalan yang mewakili 0atau 1sesuai.

T`l

Hapus semua huruf kecil / nol.

.+
$.&

Cocokkan setiap baris dan ganti dengan jumlah karakter (desimal) di baris itu. Karena ;ini mengubah angka unary menjadi setara desimal + 1.

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

Transliterasi yang menggantikan 1-8 dengan perintah yang sesuai.

Hapus umpan baris.

Martin Ender
sumber
Itu cara cerdas untuk memecah menjadi tiga chars. Sudahkah Anda menggunakan ini sebelumnya?
Produk ETH
@ ETHproductions Saya pikir saya punya tapi saya tidak yakin di mana. Saya mungkin berpikir tentang codegolf.stackexchange.com/a/69518/8478
Martin Ender
70 byte dan sedikit lebih pendek dengan ide Retina saya yang baru ditambahkan .
randomra
@randomra ah ide yang bagus untuk ;. Saya akan mengeditnya nanti.
Martin Ender
7

MATL , 38 32 byte

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

Cobalah online!

'><[]-+.,'      % 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
Luis Mendo
sumber
5

Japt, 37 36 byte

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

Uji secara online!

Bagaimana itu bekerja

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.
Produksi ETH
sumber
4

JavaScript (ES6), 111 95 byte

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

Cukup menghapus non-huruf, mengubah huruf besar menjadi 1s dan huruf kecil menjadi 0s, membaginya menjadi kelompok tiga, mengabaikan kelompok tertinggal 1 atau 2, dan menerjemahkan kelompok.

Sunting: Disimpan 16 byte berkat @ dev-null, meskipun kode tidak lagi berfungsi saat melewati string kosong.

Neil
sumber
@ dev-null Ugh, saya telah mencoba match(/.../g).map().joinpendekatan tetapi salah menghitung jumlah byte dan meskipun itu tidak menyelamatkan saya apa pun. Terima kasih atas tip pada pertandingan pertama.
Neil
4

Python 3, 91 byte

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

Hmm ... terlihat agak panjang, terutama baris kedua. b=[b,2*b+(c<'a')][c.isalpha()]sedikit lebih buruk.

Sp3000
sumber
2
Menggunakan ujung seperti itu benar-benar cerdas. Saya belum pernah melihat itu sebelumnya.
Morgan Thrapp
3

Pyth, 40 byte

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

Coba di sini!

Bisa menghemat 2 byte jika saya bisa menampilkan hasilnya sebagai daftar karakter, bukan string.

Penjelasan

Memfilter semua non-huruf, mengubah huruf besar menjadi 1 dan huruf kecil menjadi 0, terbagi menjadi bilangan 3, menafsirkan setiap potongan sebagai angka biner dan menggunakan ini sebagai indeks ke dalam string yang berisi semua perintah BF.

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

                                fz # filter input dengan T
                                 ! # tidak logis
                                  rIT2 # T == swapcase (T), benar jika T bukan huruf
                        m # hasil filter peta dengan d
                         ? rId0 # if d == toLower (d)
                              Z1 # 0 untuk huruf kecil, 1 untuk huruf besar
                       c 3 # Dibagi menjadi potongan 3, elemen terakhir lebih pendek jika diperlukan
                 filter f # dengan T
                  ! # tidak logis
                   % lT3 # len (t) mod 3 -> hanya menyimpan elemen dengan panjang 3
  m # map dengan d
              id2 # Konversi dari biner ke desimal
   @ "> <[] - +.," # Dapatkan perintah BF yang dihasilkan
jk # Gabung ke sebuah string
Denker
sumber
3

Jolf, 31 34 byte

Coba di sini! Ganti dengan \x10dan dengan \x05. Karena saya mengimplementasikan fungsi chop yang salah, saya memperoleh 3 byte. :(

►Μ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
Conor O'Brien
sumber
3

Hoon , 212 byte

=+([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 '><[]-+.,')))))

Tidak Disatukan:

|=  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. gunakan ++ murn untuk menyingkirkan semua karakter dalam input yang tidak dapat diuraikan dengan "alf" (alfabet)
  2. parsing daftar dengan kombinator yang menampilkan masing-masing 3 karakter sekaligus ke daftar, mengganti huruf kecil dengan '0' dan huruf besar dengan '1'
  3. Keluarkan hasilnya ke (unit (list tape)) dan paksa membukanya untuk mendapatkan hasil parsing terjauh, untuk bekerja dengan hanya beberapa dari tiga tanpa menabrak
  4. Peta di atas daftar, parsing setiap grup seolah-olah biner
  5. Gunakan setiap angka dalam daftar sebagai indeks ke dalam teks '> <[] - +.,', Dan masukkan kembali daftar itu ke kaset.

Hoon tidak memiliki ekspresi reguler yang benar, hanya parser combinator library, jadi sayangnya cukup bertele-tele. Pemindaian ++ juga macet jika seluruh aliran input tidak diuraikan, jadi saya harus menggunakan ++ rose, memaksanya menjadi sebuah unit, dan membuka bungkusnya untuk nilai "parse terjauh". Itu juga membuat penggunaan berat untuk currying dan pemetaan daftar (++ turn), jadi saya alias nama fungsi ke satu variabel huruf.

Hoon adalah bahasa pemrograman untuk Urbit, proyek implementasi ulang yang bersih. Ini murni fungsional, diketik secara statis, samar-samar mirip lisp, dan dikompilasi ke Nock. Nock adalah VM berbasis kombinator yang berjalan di atas model memori bignum pohon biner.

Ketika Anda mem-boot Urbit Anda masuk ke: dojo, shell dan Hoon repl. Untuk menjalankan cuplikan cukup ketik:

%.  "PROgRam reVERsES giVeN iNPut sEqUENcE"

dan kemudian tempel fungsi mandiri di baris berikutnya.

Pengaturan rendering
sumber
Selamat datang di PPCG! Jawaban Anda dijelaskan dengan cukup baik, tetapi dapatkah Anda menghubungkan penerjemah atau tempat untuk mencobanya secara online?
Addison Crump
Saya menambahkan tautan ke halaman github Urbit, karena membangunnya cukup satu-satunya cara. Apakah itu cukup?
RenderSettings
Benar. : D Meninggalkan instruksi tentang cara menggunakan ini dalam program lengkap juga akan sangat bagus.
Addison Crump
3

Jelly , 27 byte

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

Cobalah online! Perhatikan bahwa garis miring terbalik perlu keluar dalam string input untuk kasus uji terakhir kedua.

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 "<[]-+.,>"
Sp3000
sumber
2

Matlab, 98 byte

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. Bersih
  2. Memangkas
  3. membentuk kembali menjadi Matriks 3xn m dengan UC = 1, lc = 0
  4. (4 2 1) * m + 1 menghasilkan daftar indeks
  5. Indeks ke karakter yang tepat
Jonas
sumber
1

Perl, 76 73 72 + 1 = 73 byte

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

Membutuhkan -nbendera:

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

Menggunakan trik dengan konversi basis-2 .

Bagaimana itu bekerja:

                          # '-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
andlrc
sumber
1

Julia, 107 byte

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

Ini adalah fungsi anonim yang menerima string dan mengembalikan string. Untuk menyebutnya, tetapkan ke variabel.

Tidak Disatukan:

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
Alex A.
sumber
1

Lua, 120 Bytes

Penggunaan besar di string.gsub()sini, sekali lagi bisa memungkinkan saya untuk membuat pointer satu karakter pada fungsi ini untuk mendapatkan beberapa byte. Juga, ini adalah program lua pertamaku tanpa spasi! : D

Program ini mengambil inputnya melalui argumen baris perintah dan mengeluarkan program BrainFuck, satu perintah per baris.

Sunting: Disimpan 1 Byte berkat @Oleg V. Volkov

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

Ungolf dan penjelasan

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)
Katenkyo
sumber
Anda dapat menyimpan satu byte pada inlining bdan satu lagi pada tabungan string.gsubke var pendek dan secara manual melipat argumen pertama untuk itu: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)
Oleg V. Volkov
... atau mungkin saya salah membaca byte pada lipat. Inlining masih berfungsi.
Oleg V. Volkov
@ OlegV.Volkov Menghemat biaya var yang lebih pendek, sayangnya, lebih, saya mencoba hal yang sama ^^. Dan terima kasih untuk inlining ... Saya tidak tahu mengapa saya menyimpannya dalam var ...
Katenkyo
1

Python 2, 112 byte

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

Akan mencoba golf lebih banyak.

Grifon
sumber
1

Mathematica, 192 byte

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

Fungsi anonim yang mengambil string yang diinginkan sebagai argumen. Langkah-langkah dalam algoritma (sangat mudah):

  1. Bersihkan talinya
  2. Ganti UC -> "1", lc -> "0"
  3. Ubah string menjadi daftar biner
  4. Partisi daftar menjadi tiga dan tafsirkan setiap potongan sebagai nomor basis-2
  5. Ganti angka dengan simbol yang sesuai dan gabungkan kembali menjadi string.
hYPotenuser
sumber
1

Ruby 117 114 113 111 86 79 Bytes

gets.tr(?^+m='a-zA-Z','').tr(m,?0*26+?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
  • tr(?^+m='a-zA-Z','')set m ke 'a-zA-Z'dan menghapus non-huruf
  • .tr(m,?0*26+?1) mengkonversi huruf kecil ke 0, huruf besar ke 1
  • .scan(/.../) potong string menjadi grup 3 dan buang grup terakhir jika memiliki kurang dari 3
  • {$><<"><[]-+.,"[$&.t‌​o_i 2]} konversi setiap nomor biner menjadi karakter
FuzzyTree
sumber
Tidak dapat Anda gunakan tr("a-zA-Z","01")? atau bahkantr("A-Za-z",10)
andlrc
@ dev-null "AAz".tr("a-zA-Z","01")memberikan111
FuzzyTree
1
Begitu banyak yang bisa dilakukan di sini. Ini awal: gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}(86 byte). Mengubah input dari opsi baris perintah ke stdin; memperbaiki tanda kutip di output (tapi sekarang tidak memiliki baris baru)
daniero
@daniero terima kasih! menjadikan ini jawaban komunitas. jangan ragu untuk melakukan perubahan
FuzzyTree
1
tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)lebih pendek
Bukan berarti Charles
1

Perl 6, 81 byte

Ini mungkin bisa dilakukan dengan lebih baik, tetapi ini adalah tugas saya

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

Pemakaian

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

Tidak disatukan

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
}
Tombol cepat
sumber
1

C ++, 173 167 byte

Program lengkap, golf (dibaca dari input standar):

#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;}}

Agak tidak terserang:

#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;            
        }
}

Perhatikan bahwa @A... Z[dalam ASCII, dan juga untuk `a... z}.

tucuxi
sumber
148 byte
ceilingcat
1

Japt v2.0a0 -P, 27 byte

r\L ò3 l3 Ëmè\A Íg"><[]-+.,

Disimpan 3 byte berkat @Shaggy

Cobalah

Perwujudan Ketidaktahuan
sumber
29 byte
Shaggy
0

Pyke, 31 byte, tidak kompetitif

Pyke lebih tua dari tantangan, tetapi saya menambahkan beberapa fitur untuk membuatnya lebih kompetitif - fungsi chunk. Saya menggunakan trik yang sama seperti @Martin Büttner digunakan.

#~l{)\`Lm<0+3cFb2"><[]-+.,"@)st

Coba di sini!

Biru
sumber
0

JavaScript, 148 byte

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):""}
Naruyoko
sumber
0

TI-BASIC, 311 288 byte

Apa, tidak ada jawaban TI-BASIC? Saatnya bagi saya untuk memperbaikinya!

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

Input adalah kode oOo di Ans.
Output adalah kode BF yang diterjemahkan .

Contoh:

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

Batalkan
golf : (Baris baru dan komentar ditambahkan)

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"

Catatan:

  • TI-BASIC adalah bahasa tokenized. Jumlah karakter tidak sama dengan jumlah byte.
Tau
sumber