Dịch mã oOo


46

Đưa ra một đầu vào của một chương trình được viết bằng oOo CODE , xuất mã BF mà nó đại diện.

Dưới đây là một mô tả ngắn về cách oOo CODE hoạt động:

  • Đầu tiên, tất cả các ký tự không phải là chữ cái được loại bỏ (mọi thứ không nằm trong phạm vi A-Za-z).

    Ví dụ: lấy chương trình PROgRam reVERsES giVeN iNPut sEqUENcE(một ví dụ được đưa ra trên trang wiki esolangs thực hiện chính xác những gì bạn mong đợi). Sau bước đầu tiên này, bây giờ chúng ta có PROgRamreVERsESgiVeNiNPutsEqUENcE.

  • Tiếp theo, chia tất cả các ký tự còn lại thành các nhóm 3. Bây giờ chúng ta có PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcE. Nếu có một nhóm kéo dài 1 hoặc 2 ký tự, hãy loại bỏ nó.

  • Chuyển đổi từng nhóm 3 chữ cái thành lệnh BF dựa trên bảng sau:

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

    Nghĩa là, nếu chữ cái đầu tiên của một nhóm là chữ thường, chữ cái thứ hai là chữ hoa và chữ thứ ba là chữ thường, nó sẽ dịch sang lệnh [.

    Với ví dụ của chúng tôi, điều này cuối cùng trở thành chương trình BF ,[>,]<[.<]+, thực sự đảo ngược đầu vào của nó.

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Các trường hợp thử nghiệm:

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

26
Tôi đang đợi ai đó có câu trả lời trong oOo ...
Glorfindel

Câu trả lời:


127

oOo, 1569 1515 byte

Phải được thực hiện. Hãy thử nó ở đây .

Chơi gôn

oooooooooOoOoooooooooooooooOoOooooooOOOoOoooooooOoOOoOOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOoooOoOOoOOoOOoOOoOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooooooOoOoooOOooOooOoOOooOoOoOooooOooOooOooOooOooOooOooOooOooOooOOoOoooooooooooooooooooooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooOooOooOooOooOooOooOooOooOOoOooooooooooooOoOoooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOooOooOooOooOooOooOooOoOoooooOooooooooooooooooOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOooOooOoOoooooOoooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOooooooOOooOoOooooOoOooooOooooOooooOooOOoooooOoooOOooOoOoooooooOoOooOooOOoooOOooOOoooOOooOOooooooOOooOoOooooOoOooooooooooooOoOOoOOoOOoOoOoooOOoOOoOOoOOoOoooOoooOOooOooOooOoOooooooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOooooOoOOoOooOooOOoooooOoooOOooOoOoOoooOOooOOooooooOOooOoOooooOoOooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOoooOOooOOoooOOOoOooooooooooooOOooOoOoooOOooOooOooOooOooOOooooOOooooOOoooOOoOOooooooooooooooooooooooooOoOooooooOOOoOO

Được dịch sang Brainfuck (với các ngắt dòng cho rõ ràng):

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

Ung dung với lời giải thích:

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

Cảm ơn vì thử thách thú vị!


1
trời ơi ... Đây là sử thi! Làm tốt lắm.
Rɪᴋᴇʀ

11
... WOW. Tôi rất ấn tượng. Đối với người tò mò: goo.gl/vbh3h9 ( liên kết Thử trực tuyến đầy đủ quá dài vì lý do rõ ràng).
Doorknob

1
Golfed / tối ưu hóa ra một loạt các ký tự. Liên kết tryit mới: goo.gl/ISjwLB
nneonneo

7
ĐÂY LÀ ĐIỀU TỐT NHẤT TÔI ĐÃ XEM TRÊN TRANG WEB NÀY
chín

15
@Texenox Trong trường hợp đó, chào mừng bạn đến với Câu đố lập trình và Code Golf! Tôi chắc chắn bạn sẽ tìm thấy nhiều câu trả lời hơn xung quanh sẽ tranh luận về điểm "điều tốt nhất tôi từng thấy" trong tâm trí của bạn :)
Sp3000

15

CJam, 36 35 byte

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

Kiểm tra nó ở đây.

Giải trình

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.

Nối một giá trị và loại bỏ đoạn cuối: thông minh!
Luis Mendo

Ahh, điều đó thực sự thông minh
Adnan

9

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

Đã lưu 1 byte nhờ @ dev-null

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

Tôi đã thử nhiều biến thể của cái này, nhưng cái này có vẻ là ngắn nhất. Cũng hoạt động trên đầu vào trống!

Làm thế nào nó hoạt động

Đầu tiên, với x.replace(/[a-z]/gi,c=>, chúng tôi tìm thấy lấy từng chữ cái ctrong đầu vào. Chúng tôi thiết lập abđể ""ở đầu kia của cuộc gọi chức năng, vì chức năng bỏ qua bất kỳ thông số quá khứ thứ hai. asẽ lưu trữ một chuỗi nhị phân để xác định ký tự nào chúng ta hiện đang tạo và bsẽ lưu trữ kết quả.

Bây giờ đối với phần khó hiểu: đầu tiên, với (a+=+(c<'a')), chúng tôi nối thêm 0vào anếu clà chữ hoa; 1nếu không thì. Biểu thức này trả về giá trị mới của a, do đó chúng ta có thể kiểm tra xem nó có đạt đến ba ký tự độ dài hay không bằng cách kiểm tra xem ký tự ở chỉ số 2 có tồn tại không : [2]?. Nếu không, chúng ta chỉ cần kết thúc chức năng với :0.

Nếu abây giờ là ba ký tự dài, nó là một số nhị phân giữa 000111. Chúng ta có thể chuyển đổi số này thành số thập phân bằng cách thêm "0b"vào đầu, sau đó buộc động cơ phân tích nó thành số '0b'+a-0.

Tuy nhiên, chúng ta vẫn cần thiết lập lại achuỗi trống. Chúng ta không thể làm '0b'+(a="")-0vì điều đó có nghĩa là chuỗi được phân tích cú pháp 0b. May mắn thay, khi được phân tích cú pháp dưới dạng số, chuỗi trống trở thành 0, vì vậy chúng ta có thể thay thế 0bằng (a="").

Bây giờ chúng tôi có số của chúng tôi, và chúng tôi chỉ có thể thêm các nhân vật tại chỉ số đó trong "><[]-+.,"để b. Sau khi thay thế xong, chúng tôi sử dụng &&bđể trả về từ hàm. (Chà, trừ khi kết quả .replacelà trống, điều này chỉ xảy ra với đầu vào trống và trả về chuỗi trống nào.)


Tiết kiệm một byte tuyệt vời với: '0b'+a-0vs +`0b${a}`+("0b"+a)
andlrc

Vì vậy, replacechiến thắng sau tất cả!
Neil

@Neil Yea xin lỗi vì đã dẫn bạn xuống matchđường mòn ...
andlrc

Phiên bản mới nhất có vấn đề với hàng đầu không chữ?
Neil

@Neil Bạn nói đúng. May mắn thay, tôi đã xoay sở để loại bỏ một byte khỏi phiên bản làm việc bằng cách sử dụng một mẹo từ phiên bản không hoạt động.
Sản xuất ETH

8

05AB1E , 35 32 byte

Mã số:

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

Sử dụng một mẹo rất thông minh từ Martin Büttner, từ câu trả lời này . Giải trình:

á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

Hãy thử trực tuyến!

Sử dụng mã hóa CP-1252 .


8

Võng mạc , 79 75 71 70 byte

Nhờ Randomra để tiết kiệm 1 byte.

i`[^a-z]

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

Hãy thử trực tuyến!

Giải trình

i`[^a-z]

Chúng tôi bắt đầu bằng cách loại bỏ mọi thứ không phải là một lá thư.

M!`...

Điều này phân tách chuỗi thành các khối gồm ba ký tự bằng cách trả về tất cả các kết quả khớp 3 ký tự (không chồng chéo). Điều này tự động loại bỏ bất kỳ đoạn cuối không hoàn chỉnh.

m`^
;

Chuẩn bị một ;cho mỗi dòng. Chúng tôi sẽ sử dụng điều này như một điểm đánh dấu cho chuyển đổi cơ sở 2. Nói về điều này, chúng ta chỉ đơn giản coi các chữ cái viết hoa là 1và các chữ cái viết thường như 0.

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

Điều này thực hiện một chuyển đổi cơ bản-2 sang unary vui nhộn. Ở mỗi bước, chúng ta chỉ cần nhân đôi các ký tự bên trái ;và di chuyển ;cái sang phải. Tại sao điều này làm việc? Hãy nhớ rằng chúng tôi sẽ giải thích chữ thường 0và chữ hoa là 1. Bất cứ khi nào chúng tôi xử lý một chữ cái, chúng tôi chỉ cần tăng gấp đôi tổng số đang chạy (ở bên trái) cho đến nay - gấp đôi các chữ cái viết thường 2*0=0, vì vậy chúng có thể bị bỏ qua hoàn toàn và các chữ cái viết hoa đại diện cho số nhị phân cho đến nay, do đó nhân đôi chúng là những gì chúng ta muốn. Sau đó, chúng tôi thêm chữ cái hiện tại vào tổng số đang chạy tương ứng 0hoặc 1tương ứng.

T`l

Xóa tất cả các chữ cái / chữ thường

.+
$.&

Ghép từng dòng và thay thế nó bằng số ký tự (thập phân) trong dòng đó. Do ;điều này biến số đơn vị thành số thập phân tương đương + 1.

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

Chuyển ngữ mà thay thế 1-8 bằng lệnh tương ứng.

Loại bỏ các nguồn cấp dữ liệu.


Đó là một cách thông minh để chia thành ba khối. Bạn đã sử dụng điều này trước đây?
Sản phẩm ETH

@ETHproductions Tôi nghĩ rằng tôi có nhưng tôi không chắc chắn ở đâu. Tôi có thể nghĩ về codegolf.stackexchange.com/a/69518/8478
Martin Ender

70 byte và ngắn hơn một chút với các ý tưởng Retina mới được thêm vào của tôi .
ngẫu nhiên

@randomra ah ý tưởng hay cho ;. Tôi sẽ chỉnh sửa nó sau.
Martin Ender

7

MATL , 38 32 byte

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

Hãy thử trực tuyến!

'><[]-+.,'      % 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 byte

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

Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

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 byte

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

Đơn giản chỉ cần xóa các chữ cái không, chuyển đổi chữ in hoa thành 1 và chữ thường thành 0, chia thành các nhóm ba, bỏ qua một nhóm theo dõi 1 hoặc 2 và giải mã các nhóm.

Chỉnh sửa: Đã lưu 16 byte nhờ @ dev-null, mặc dù mã không còn hoạt động khi truyền chuỗi trống.


@ dev-null Ugh, tôi đã thử match(/.../g).map().joincách tiếp cận nhưng đã tính sai số byte và mặc dù nó không giúp tôi tiết kiệm được gì. Cảm ơn các mẹo về trận đấu đầu tiên mặc dù.
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 ... có vẻ hơi dài, đặc biệt là dòng thứ hai. b=[b,2*b+(c<'a')][c.isalpha()]là hơi tồi tệ hơn mặc dù.


2
Sử dụng kết thúc như thế là thực sự thông minh. Tôi chưa bao giờ thấy điều đó trước đây.
Morgan Thrapp

3

Bình thường, 40 byte

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

Hãy thử nó ở đây!

Có thể lưu 2 byte nếu tôi có thể xuất kết quả dưới dạng danh sách các ký tự thay vì chuỗi.

Giải trình

Lọc tất cả các chữ cái không, chuyển đổi chữ hoa thành 1 và chữ thường thành 0, chia thành các khối 3, diễn giải mọi khối như số nhị phân và sử dụng chỉ số này thành một chuỗi chứa tất cả các lệnh BF.

jkm @ "> <[] - +.," id2f!% lT3cm? rId0Z1f! rIT2z3 # z = đầu vào

                                đầu vào bộ lọc fz # với T
                                 ! # logic không
                                  rIT2 # T == hoán đổi (T), đúng nếu T không phải là một chữ cái
                        m # kết quả lọc bản đồ với d
                         ? rId0 # nếu d == toLower (d)
                              Z1 # 0 cho chữ thường, 1 cho chữ hoa
                       c 3 # Chia thành các phần 3, phần tử cuối cùng ngắn hơn nếu cần
                 bộ lọc f # với T
                  ! # logic không
                   % lT3 # len (t) mod 3 -> chỉ giữ lại các yếu tố có độ dài 3
  bản đồ m # với d
              id2 # Chuyển đổi từ nhị phân sang thập phân
   @ "> <[] - +.," # Nhận lệnh BF kết quả
jk # Tham gia chuỗi

3

Jolf, 31 34 byte

Hãy thử nó ở đây! Thay thế bằng \x10bằng \x05. Bởi vì tôi đã thực hiện chức năng chop sai, tôi đạt được 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

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

Ung dung:

|=  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. sử dụng ++ murn để loại bỏ tất cả các ký tự trong đầu vào không thể được phân tích cú pháp bằng "alf" (bảng chữ cái)
  2. phân tích danh sách bằng một bộ kết hợp xuất ra mỗi 3 ký tự vào một danh sách, thay thế chữ thường bằng '0' và chữ hoa bằng '1'
  3. Truyền kết quả tới (đơn vị (băng danh sách)) và buộc phải hủy kết quả để có kết quả được phân tích cú pháp xa nhất, để làm việc chỉ với nhiều bộ ba mà không gặp sự cố
  4. Ánh xạ qua danh sách, phân tích từng nhóm như thể nó là nhị phân
  5. Sử dụng mỗi số trong danh sách dưới dạng một chỉ mục vào văn bản '> <[] - +.,' Và bỏ danh sách ra một băng.

Hoon không có các biểu thức chính quy thông thường, chỉ có một thư viện kết hợp trình phân tích cú pháp, vì vậy thật đáng buồn. Quá trình quét ++ cũng gặp sự cố nếu toàn bộ luồng đầu vào không được phân tích cú pháp, vì vậy tôi phải sử dụng ++ rose, ép buộc nó thành một đơn vị và mở khóa cho giá trị "phân tích cú pháp xa nhất". Nó cũng sử dụng nhiều cho việc currying và ánh xạ qua các danh sách (lần lượt ++), vì vậy tôi đặt bí danh cho các tên hàm thành một biến chữ cái.

Hoon là ngôn ngữ lập trình cho Urbit, một dự án tái hiện rõ ràng. Nó hoàn toàn có chức năng, được gõ tĩnh, giống như mơ hồ, và biên dịch thành Nock. Nock là một VM dựa trên tổ hợp chạy trên mô hình bộ nhớ nhị phân cây nhị phân.

Khi bạn khởi động Urbit, bạn sẽ rơi vào: dojo, shell và Hoon thay thế. Để chạy đoạn mã, chỉ cần gõ:

%.  "PROgRam reVERsES giVeN iNPut sEqUENcE"

và sau đó dán chức năng độc lập trên dòng tiếp theo.


Chào mừng đến với PPCG! Bạn trả lời được giải thích khá tốt, nhưng bạn có thể liên kết trong một thông dịch viên hoặc một nơi để thử trực tuyến không?
Addison Crump

Tôi đã thêm một liên kết đến trang github của Urbit, vì việc xây dựng nó là cách duy nhất. Như vậy đã đủ chưa?
Kết xuất cài đặt

Chắc chắn rồi. : D Để lại hướng dẫn về cách sử dụng điều này trong một chương trình đầy đủ cũng sẽ rất tuyệt vời.
Addison Crump

3

Thạch , 27 byte

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

Hãy thử trực tuyến! Lưu ý rằng dấu gạch chéo ngược cần thoát trong chuỗi đầu vào cho trường hợp thử nghiệm cuối cùng thứ hai.

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 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. Dọn dẹp
  2. Cắt
  3. định hình lại thành Ma trận 3xn với UC = 1, lc = 0
  4. (4 2 1) * m + 1 kết quả trong danh sách chỉ mục
  5. Chỉ mục vào ký tự bên phải

1

Perl, 76 73 72 + 1 = 73 byte

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

Yêu cầu -ncờ:

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

Sử dụng thủ thuật với chuyển đổi cơ sở 2 .

Làm thế nào nó hoạt động:

                          # '-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

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))])]

Đây là một hàm ẩn danh chấp nhận một chuỗi và trả về một chuỗi. Để gọi nó, gán nó cho một biến.

Ung dung:

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 byte

Sử dụng lớn string.gsub()ở đây, một lần nữa có thể cho phép tôi tạo một con trỏ một ký tự trên hàm này để thu được một số byte. Ngoài ra, đây là chương trình lua đầu tiên của tôi mà không có bất kỳ khoảng trống nào! :CƯỜI MỞ MIỆNG

Chương trình này lấy đầu vào của nó thông qua đối số dòng lệnh và xuất ra chương trình BrainFuck, một lệnh trên mỗi dòng.

Chỉnh sửa: Đã lưu 1 Byte nhờ @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 và giải thích

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ạn có thể lưu một byte khi nội tuyến bvà thêm một byte khi lưu string.gsubvào var ngắn hơn và tự gấp các đối số đầu tiên vào nó: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

... hoặc có lẽ tôi đã đọc sai số byte khi gấp. Nội tuyến vẫn hoạt động.
Oleg V. Volkov

@ OlegV.Volkov Tiết kiệm chi phí var ngắn hơn, đáng buồn thay, tôi đã thử điều tương tự ^^. Và cảm ơn vì nội tuyến của b ... Tôi không biết tại sao tôi lại lưu nó trong một 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))

Sẽ cố gắng để chơi nó nhiều hơn.


1

Toán học, 192 byte

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

Hàm ẩn danh lấy chuỗi mong muốn làm đối số. Các bước trong thuật toán (khá đơn giản):

  1. Làm sạch chuỗi
  2. Thay thế UC -> "1", lc -> "0"
  3. Biến chuỗi thành một danh sách nhị phân
  4. Phân vùng danh sách thành ba và giải thích mỗi đoạn là một số cơ sở 2
  5. Thay thế các số bằng các ký hiệu thích hợp của chúng và nối lại thành một chuỗi.

1

Ruby 117 114 113 111 86 79 byte

gets.tr(?^+m='a-zA-Z','').tr(m,?0*26+?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}
  • tr(?^+m='a-zA-Z','')đặt m thành 'a-zA-Z'và loại bỏ các chữ cái không
  • .tr(m,?0*26+?1) chuyển đổi chữ thường thành 0, viết hoa thành 1
  • .scan(/.../) xâu chuỗi thành các nhóm 3 và loại bỏ nhóm cuối cùng nếu nó có ít hơn 3
  • {$><<"><[]-+.,"[$&.t‌​o_i 2]} chuyển đổi mỗi số nhị phân thành một ký tự

Bạn không thể sử dụng tr("a-zA-Z","01")? hoặc thậm chítr("A-Za-z",10)
andlrc

@ dev-null "AAz".tr("a-zA-Z","01")đưa ra111
FuzzyTree

1
Rất nhiều điều có thể được thực hiện ở đây. Đây là một sự khởi đầu: gets.delete('^a-zA-Z').tr("a-z",?0).tr("^0",?1).scan(/.../){$><<"><[]-+.,"[$&.to_i 2]}(86 byte). Thay đổi đầu vào từ tùy chọn dòng lệnh thành stdin; đã sửa các trích dẫn xung quanh trong đầu ra (nhưng hiện tại nó không có dòng mới nào)
daniero

@daniero cảm ơn! làm cho điều này một câu trả lời của cộng đồng. thoải mái thực hiện các thay đổi
FuzzyTree

1
tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)ngắn hơn
Không phải Charles

1

Perl 6, 81 byte

Điều này có thể được thực hiện tốt hơn, nhưng đây là bước đi của tôi

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

Sử dụng

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

Ung dung

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 byte

Chương trình đầy đủ, được đánh gôn (đọc từ đầu vào tiêu chuẩn):

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

Hơi vô dụng:

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

Lưu ý rằng @A... Z[trong ASCII, và tương tự như vậy cho `a... z}.





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

0

TI-BASIC, 311 288 byte

Gì, không có câu trả lời TI-BASIC? Thời gian để tôi sửa nó!

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

Đầu vào là mã oOo trong Ans.
Đầu ra là mã BF được dịch .

Ví dụ:

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

Un-golfed:
(Đã thêm dòng mới và nhận xét)

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"

Ghi chú:

  • TI-BASIC là một ngôn ngữ được mã hóa. Số lượng ký tự không bằng số byte.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.