Перекласти oOo КОД


46

Враховуючи вхід програми, написаної в oOo CODE , виведіть BF-код, який він представляє.

Ось короткий опис того, як працює oOo КОД:

  • По-перше, всі не алфавітні символи видаляються (усе не в діапазоні A-Za-z).

    Наприклад, візьміть програму PROgRam reVERsES giVeN iNPut sEqUENcE(приклад, наведений на сторінці вікі esolangs, який робить саме те, що ви очікували). Після цього першого кроку ми маємо тепер 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  ,
    

    Тобто, якщо перша літера групи є малою, а друга - великою, а третя - малою, вона перекладається на команду [.

    З нашим прикладом це, нарешті, стає програмою BF ,[>,]<[.<]+, яка дійсно зворотно впливає.

Оскільки це , найкоротший код у байтах виграє.

Тестові приклади:

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

26
Я чекаю кого - то з відповіддю в ооо ...
Глорфіндел

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
... ОГО. Я перебуваю під враженням. Для допитливих: goo.gl/vbh3h9 (повне спробувати онлайн- посилання було занадто довгим із зрозумілих причин).
Дверна ручка

1
Гольф / оптимізував купу символів. Нове посилання на спробу: goo.gl/ISjwLB
nneonneo

7
Це найкраще, що я бачив на цьому Сайті
дев'ять

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 байт

Збережено 1 байт завдяки @ dev-null

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на вході. Ми встановлюємо aі bв ""на іншому кінці виклику функції, так як функція ігнорує всі параметри повз другого. aзбереже двійковий рядок для визначення того, який символ ми зараз створюємо, і bзбереже результат.

Тепер для заплутаною частини: перший, з (a+=+(c<'a')), ми приєднуємо 0до , aякщо cв верхньому регістрі; 1інакше. Цей вислів повертає нове значення a, тому ми можемо перевірити , якщо він досяг трьох символів довжини з перевіркою , якщо символ з індексом 2 існує: [2]?. Якщо ні, ми просто закінчуємо функцію :0.

Якщо aтепер три знаки в довжину, це двійкове число між 000і 111. Ми можемо перетворити це в десяткове число, додавши "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

Остання версія має проблеми з провідними буквами?
Ніл

@Neil Ти маєш рацію. На щастя, мені вдалося переграти байт з робочої версії, використовуючи трюк з непрацюючої.
ETHproductions

8

05AB1E , 35 32 байти

Код:

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

Використовуючи дуже розумну хитрість Мартіна Бюттнера, з цієї відповіді . Пояснення:

á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 байт.

i`[^a-z]

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

Спробуйте в Інтернеті!

Пояснення

i`[^a-z]

Почнемо з видалення всього, що не є буквою.

M!`...

Це розділяє рядок на шматки з трьох символів, повертаючи всі (не перекриваються) 3-символьні збіги. Це автоматично відкидає будь-який неповний проміжок часу.

m`^
;

Додайте а ;до кожного рядка. Ми будемо використовувати це як маркер для конверсії базової-2. Якщо говорити про це, ми просто розглянемо великі літери як, 1а малі 0.

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

Це робить смішну базу-2 для одинакового перетворення. На кожному кроці ми просто подвоюємо символи зліва від ;та переміщуємо ;один вправо. Чому це працює? Пам'ятайте, що ми будемо інтерпретувати нижній регістр як 0і верхній регістр як 1. Щоразу, коли ми обробляємо лист, ми просто подвоюємо поточний загальний (ліворуч) поки що - подвійні малі літери просто 2*0=0, тому їх можна повністю ігнорувати, а великі літери представляють двійкове число поки що, тому подвоєння їх є чого ми хочемо. Потім ми додаємо поточну букву до тієї загальної кількості, яка представляє 0або 1відповідно.

T`l

Видаліть всі малі літери / нулі.

.+
$.&

Зрівняйте кожен рядок і замініть його на (десяткову) кількість символів у цьому рядку. Завдяки ;цьому перетворюється одинарне число в його десятковий еквівалент + 1.

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

Транслітерація, яка замінює 1-8 відповідною командою.

Видаліть канали ліній.


Це розумний спосіб розділити на шматки трьох символів. Ви раніше цим користувалися?
ETHproductions

@ETHproductions Я думаю, що маю, але не знаю куди. Я, можливо, думаю про codegolf.stackexchange.com/a/69518/8478
Мартін Ендер

70 байт і трохи менше коротше з моїми нещодавно доданими ідеями Retina .
випадкова

@randomra ах приємна ідея для ;. Я відредагую це пізніше.
Мартін Ендер

7

MATL , 38 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, ділить на групи по три, ігнорує проміжну групу з 1 або 2 і декодує групи.

Редагувати: Збережено 16 байт завдяки @ dev-null, хоча код більше не працює, коли передається порожня рядок.


@ 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

Хм ... виглядає трохи довго, особливо другий рядок. b=[b,2*b+(c<'a')][c.isalpha()]трохи гірше, хоча.


2
Використовувати такий кінець справді розумно. Я ніколи цього не бачив.
Морган Трапп

3

Pyth, 40 байт

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

Спробуйте тут!

Не вдалося зберегти 2 байти, якщо я можу вивести результат у вигляді списку символів замість рядка.

Пояснення

Фільтрує всі не букви, перетворює великі регістри в 1 і малі на 0, розбиває на шматки 3, інтерпретує кожен фрагмент як двійкове число і використовує це як індекс у рядок, який містить усі команди BF.

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

                                fz # вхід фільтра з T
                                 ! # логічно немає
                                  rIT2 # T == swapcase (T), вірно, якщо T - не літера
                        m # результат фільтра карти з d
                         ? rId0 #, якщо d == вниз (d)
                              Z1 # 0 для малих літер, 1 для верхнього регістру
                       c 3 # Розділіть на шматки 3, останній елемент, якщо потрібно, коротший
                 f # фільтр з T
                  ! # логічно немає
                   % lT3 # len (t) mod 3 -> зберігати лише елементи довжиною 3
  м # карта з d
              id2 # Перетворити з двійкового в десятковий
   @ "> <[] - +.," # Отримати отриману команду BF
jk # Приєднайтесь до рядка

3

Джольф, 31 34 байт

Спробуйте тут! Замініть на \x10і з \x05. Оскільки я неправильно реалізував функцію chop, я отримую 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

Хун , 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. Передайте результат на (одиниця (стрічка списку)) і примусово розгортайте його, щоб отримати найдальший аналіз, щоб працювати лише з декількома трійками без збоїв.
  4. Мапуйте список, розбираючи кожну групу так, ніби вона є двійковою
  5. Використовуйте кожне число зі списку як покажчик до тексту '> <[] - +.,' І відкиньте список назад на стрічку.

У Hoon немає правильних регулярних виразів, лише бібліотека комбінаторів парсера, тому це, на жаль, досить багатослівне. Сканування ++ також виходить з ладу, якщо весь потік входу не буде проаналізований, тому я повинен використовувати ++ rose, примусити його до одиниці та відкрутити його для значення "найдальшого розбору". Він також широко використовує для отримання кривих та відображення списків (++ поворот), тому я псевдонімую назви функцій для однієї літерної змінної.

Hoon - це мова програмування для Urbit, проекту чистого вдосконалення шиферу. Це суто функціональний, статично набраний, невиразно схожий на шпильки, і компілюється в Нок. Нок - це VM на основі комбінатора, який працює на версії бінарної моделі пам'яті bignum.

Коли ви завантажуєте Urbit, ви потрапляєте у: доджо, оболонку та репліку Hoon. Щоб запустити фрагмент, просто введіть:

%.  "PROgRam reVERsES giVeN iNPut sEqUENcE"

а потім вставити окрему функцію в наступний рядок.


Ласкаво просимо до PPCG! Ви відповідаєте, досить добре пояснено, але чи можете ви зв’язатись у перекладача чи місця, щоб спробувати його в Інтернеті?
Addison Crump

Я додав посилання на сторінку github урбіта, оскільки побудувати його майже єдиним способом. Це достатньо?
Налаштування рендерів

Абсолютно. : D Залишати інструкції, як це використовувати в повній програмі, було б чудово.
Аддісон Кримп

3

Желе , 27 байт

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

Спробуйте в Інтернеті! Зауважте, що в другому останньому тестовому випадку слід зворотній косої риски пропускати у рядку введення.

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

Матлаб, 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. перекройте в матрицю 3xn m з UC = 1, lc = 0
  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

Луа, 120 байт

Велике використання string.gsub()тут, ще один раз міг би дозволити мені створити вказівник на один символ на цій функції, щоб отримати деякі байти. Крім того, це моя перша програма луа без пробілів! : D

Ця програма бере свій вхід через аргумент командного рядка і виводить програму BrainFuck, по одній команді на рядок.

Редагувати: Збережено 1 байт завдяки @Oleg В. Волкову

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

Унгольф і пояснення

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)

Ви можете зберегти один байт на вбудованому листі bта ще один на збереженні 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)
Волков Олег Васильович

... або, можливо, я неправильно прочитав байт на складання. Накладка все ще працює.
Олег Васильович Волков

@ Олег В.Волков Збереження на коротший вар коштує, на жаль, більше, я спробував те ж саме ^^. І дякую за вкраплення б ... Я не знаю, чому я
зберег

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

Математика, 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. Розділіть список на трійки та інтерпретуйте кожен фрагмент як базове число 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]} перетворити кожне двійкове число в символ

Ви не можете використовувати 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 байт). Змінено вхід з параметра командного рядка на stdin; виправили навколишні лапки у виході (але тепер у нього немає
зворотного

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

Зверніть увагу , що @A... Z[в ASCII, а також для `a... z}.




0

Пайк, 31 байт, неконкурентоспроможний

Пайк старший, ніж виклик, але я додав деякі функції, щоб зробити його більш конкурентоспроможним - функція куска. Я використав той самий трюк, що і @Martin Büttner .

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

Спробуйте тут!


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 - токенізована мова. Кількість символів не дорівнює кількості байтів.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.