แปลรหัส oOo


46

รับอินพุตของโปรแกรมที่เขียนในoOo CODEให้เอาท์พุทรหัส BF ที่มันแทน

นี่เป็นคำอธิบายสั้น ๆ ว่า oOo CODE ทำงานอย่างไร:

  • ครั้งแรกตัวละครที่ไม่ใช่ตัวอักษรทั้งหมดจะถูกลบออก (ทุกอย่างไม่อยู่ในช่วง A-Za-z)

    ตัวอย่างเช่นใช้โปรแกรมPROgRam reVERsES giVeN iNPut sEqUENcE(ตัวอย่างที่ให้ไว้ในหน้า esolangs wiki ที่ทำสิ่งที่คุณต้องการ) PROgRamreVERsESgiVeNiNPutsEqUENcEหลังจากขั้นตอนแรกนี้ตอนนี้เรามี

  • ถัดไปแบ่งตัวอักษรที่เหลือทั้งหมดลงในกลุ่มของ 3 PRO,gRa,mre,VER,sES,giV,eNi,NPu,tsE,qUE,NcEตอนนี้เรามี หากมีกลุ่มต่อท้ายที่มี 1 หรือ 2 ตัวอักษรให้ทิ้งมัน

  • แปลงแต่ละกลุ่มของ 3 ตัวอักษรเป็นคำสั่ง BF ตามตารางต่อไปนี้:

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

    [นั่นคือถ้าตัวอักษรตัวแรกของกลุ่มเป็นตัวพิมพ์เล็กที่สองคือพิมพ์ใหญ่และสามเป็นตัวพิมพ์เล็กก็จะแปลคำสั่ง

    ด้วยตัวอย่างของเราในที่สุดสิ่งนี้จะกลายเป็นโปรแกรม BF ,[>,]<[.<]+ซึ่งจะทำการย้อนกลับอินพุตของมัน

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบ:

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

26
ฉันกำลังรอให้คนที่มีคำตอบใน OOO an ...
กลอร์ฟินเดล

คำตอบ:


127

oOo, 1569 1515 ไบต์

จะต้องทำ ลองได้ที่นี่

แข็งแรงเล่นกอล์ฟ:

oooooooooOoOoooooooooooooooOoOooooooOOOoOoooooooOoOOoOOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOoooOoOOoOOoOOoOOoOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooOoOooooOoOoooooOoOooOoOOoooOoOooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOoOoOoooooOoooOoooooOOooOooOoOOooOoOoOoooooooooOoOoooOOooOooOoOOooOoOoOooooOooOooOooOooOooOooOooOooOooOooOOoOoooooooooooooooooooooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooOooOooOooOooOooOooOooOooOOoOooooooooooooOoOoooooooooooooooooooooooooOoOoooOOooOooOooOooOoOOoOOooOoOoOooooooooooooOoOoooOOooOooOooOooOoOOooOooOooOooOooOooOooOoOoooooOooooooooooooooooOoOOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOOoOooOooOooOoOoooooOoooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOooooooOOooOoOooooOoOooooOooooOooooOooOOoooooOoooOOooOoOoooooooOoOooOooOOoooOOooOOoooOOooOOooooooOOooOoOooooOoOooooooooooooOoOOoOOoOOoOoOoooOOoOOoOOoOOoOoooOoooOOooOooOooOoOooooooooooOoOOoOOoOOoOOoOoOoooOOoOOoOOoOOoOOoOOoOoooOoooOOooOOoOooOoOooooOoOOoOooOooOOoooooOoooOOooOoOoOoooOOooOOooooooOOooOoOooooOoOooooOoooOOoooooOoooOOooOoOoooooooOoOOoOooOooOOoooOOooOOoooOOooOOoooOOOoOooooooooooooOOooOoOoooOOooOooOooOooOooOOooooOOooooOOoooOOoOOooooooooooooooooooooooooOoOooooooOOOoOO

แปลเป็น Brainfuck (พร้อม linebreaks เพื่อความชัดเจน):

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

ไม่พอใจกับคำอธิบาย:

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 ( ลิงก์ลองเต็มรูปแบบออนไลน์นั้นยาวเกินไปด้วยเหตุผลที่ชัดเจน)
Doorknob

1
Golfed / ปรับออกพวง ลิงก์ tryit ใหม่: goo.gl/ISjwLB
nneonneo

7
นี่คือสิ่งที่ดีที่สุดที่ฉันเคยเห็นบนเว็บไซต์นี้
9

15
@Texenox ในกรณีนี้ยินดีต้อนรับสู่ Programming Puzzles และ Code Golf! ฉันแน่ใจว่าคุณจะได้รับคำตอบอื่น ๆ อีกมากมายรอบ ๆ ที่จะต่อสู้เพื่อที่ว่า "สิ่งที่ดีที่สุดที่ผมเคยเห็น" จุดในใจของคุณ :)
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.

ผนวกค่าและละทิ้งก้อนสุดท้าย: ฉลาด!
Luis Mendo เมื่อ

Ahh นั่นฉลาดจริงๆ
Adnan

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ว่างเปล่าซึ่งเกิดขึ้นเฉพาะกับการป้อนข้อมูลที่ว่างเปล่าและส่งกลับสตริงที่ว่างเปล่าอยู่แล้ว)


Nice หนึ่งไบต์บันทึกด้วย: '0b'+a-0vs +`0b${a}`and+("0b"+a)
andlrc

ดังนั้นreplaceชนะหลังจากทั้งหมด!
Neil

@Neil ใช่จ้ะที่นำคุณลงmatchเส้นทาง ...
andlrc

รุ่นล่าสุดมีปัญหากับตัวอักษรที่ไม่ใช่ตัวอักษร?
Neil

@Neil คุณพูดถูก โชคดีที่ฉันจัดการเล่นกอล์ฟด้วยไบต์ที่ไม่ได้ใช้งานโดยใช้กลลวงที่ไม่ทำงาน
ETHproductions

8

05AB1E , 35 32 ไบต์

รหัส:

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

ใช้เคล็ดลับที่ฉลาดมากจาก Martin Büttnerจากคำตอบนี้ คำอธิบาย:

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

ลองออนไลน์!

ใช้การเข้ารหัสCP-1252


8

เรติน่า , 79 75 71 70 ไบต์

ขอบคุณ randomra สำหรับการบันทึก 1 ไบต์

i`[^a-z]

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

ลองออนไลน์!

คำอธิบาย

i`[^a-z]

เราเริ่มต้นด้วยการลบทุกอย่างที่ไม่ใช่ตัวอักษร

M!`...

สิ่งนี้จะแยกสตริงออกเป็นส่วน ๆ ของอักขระสามตัวโดยส่งคืนการจับคู่ 3 ตัวอักษร (ไม่ทับซ้อน) ทั้งหมด สิ่งนี้จะละทิ้งส่วนต่อท้ายที่ไม่สมบูรณ์ใด ๆ โดยอัตโนมัติ

m`^
;

เติม a ;ไปยังแต่ละบรรทัด เราจะใช้สิ่งนี้เป็นเครื่องหมายสำหรับการแปลงฐาน 2 การพูดที่เราก็จะรักษาตัวอักษรบนกรณีเป็นและลดกรณีตัวอักษรเป็น10

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

นี่เป็นฐานที่ตลก 2 ถึงการแปลงเอก ในแต่ละขั้นตอนเราเพียงแค่เพิ่มตัวละครที่ด้านซ้ายของ;และเลื่อน;ไปทางขวา ทำไมจึงใช้งานได้ โปรดจำไว้ว่าเราจะตีความกรณีที่ต่ำกว่าเป็นและเป็นกรณีบน0 1เมื่อใดก็ตามที่เราประมวลผลจดหมายเราก็แค่เพิ่มยอดรวมเป็นสองเท่า (ด้านซ้าย) จนถึง - ตัวอักษรตัวเล็กสองตัวเป็นเพียง2*0=0ดังนั้นพวกเขาสามารถถูกละเว้นได้อย่างสมบูรณ์และตัวอักษรตัวพิมพ์ใหญ่เป็นตัวแทนของเลขฐานสอง สิ่งที่เราต้องการ จากนั้นเราจะเพิ่มตัวอักษรปัจจุบันไปยังผลรวมการวิ่งที่แสดงถึง0หรือ1สอดคล้องกัน

T`l

ลบอักษร / เลขตัวเล็กทั้งหมดออก

.+
$.&

จับคู่แต่ละบรรทัดแล้วแทนที่ด้วยจำนวนอักขระ (ฐานสิบ) ในบรรทัดนั้น เนื่องจากสิ่ง;นี้จะเปลี่ยนตัวเลขที่มีค่าเป็นทศนิยมเทียบเท่า + 1

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

การทับศัพท์ที่ทดแทน 1-8 ด้วยคำสั่งที่เกี่ยวข้อง

ลบ linefeeds


นั่นเป็นวิธีที่ฉลาดที่จะแยกออกเป็นสามส่วน คุณเคยใช้สิ่งนี้มาก่อนหรือไม่
ETHproductions

@ ETHproductions ฉันคิดว่าฉันมี แต่ฉันไม่แน่ใจว่าอยู่ที่ไหน ฉันอาจนึกถึงcodegolf.stackexchange.com/a/69518/8478
Martin Ender

70 ไบต์และบิตน้อยสั้นกับฉันที่เพิ่มใหม่ความคิด Retina
randomra

@randomra ah ;ความคิดที่ดีสำหรับ ฉันจะแก้ไขในภายหลัง
Martin Ender

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``

เพียงแค่ลบที่ไม่ใช่ตัวอักษรแปลงตัวอักษรตัวพิมพ์ใหญ่เป็น 1s และตัวพิมพ์เล็กเป็น 0s แบ่งออกเป็นกลุ่มละสามกลุ่มละเว้นกลุ่มที่มีค่าเป็น 1 หรือ 2 และถอดรหัสกลุ่ม

แก้ไข: บันทึก 16 ไบต์ด้วย @ dev-null แม้ว่ารหัสจะไม่ทำงานอีกต่อไปเมื่อผ่านสตริงว่าง


@ dev-null ฮึฉันได้ลองmatch(/.../g).map().joinวิธีการแล้ว แต่ได้นับจำนวนไบต์และแม้ว่ามันจะไม่ได้ช่วยฉันเลยก็ตาม ขอบคุณสำหรับเคล็ดลับในนัดแรก
Neil

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
การใช้จุดจบอย่างนั้นช่างฉลาดจริงๆ ฉันไม่เคยเห็นแบบนั้นมาก่อน
Morgan Thrapp

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 # if d == toLower (d)
                              Z1 # 0 สำหรับตัวพิมพ์เล็ก 1 สำหรับตัวพิมพ์ใหญ่
                       c 3 # แยกออกเป็นชิ้น ๆ 3 องค์ประกอบสุดท้ายจะสั้นลงหากต้องการ
                 f # ตัวกรองด้วย T
                  ! # ตรรกะไม่
                   % lT3 # len (t) mod 3 -> เก็บเฉพาะองค์ประกอบของความยาว 3
  แผนที่ m # กับ d
              id2 # แปลงจากเลขฐานสองเป็นทศนิยม
   @ "> <[] - +.," # รับผลลัพธ์คำสั่ง BF
jk # เข้าร่วมกับสตริง

3

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

Ungolfed:

|=  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. แยกรายการด้วย combinator ที่ส่งออกแต่ละ 3 ตัวอักษรในเวลาหนึ่งไปยังรายการแทนที่ตัวพิมพ์เล็กด้วย '0' และตัวพิมพ์ใหญ่ด้วย '1'
  3. ส่งผลลัพธ์ไปที่ (หน่วย (เทปรายการ)) และบังคับให้แกะออกเพื่อให้ได้ผลลัพธ์การแยกวิเคราะห์ที่ยาวที่สุด
  4. แม็พเหนือรายการโดยแยกแต่ละกลุ่มราวกับว่าเป็นไบนารี
  5. ใช้แต่ละหมายเลขในรายการเป็นดัชนีลงในข้อความ '> <[] - +.,' และโยนรายการกลับออกไปเป็นเทป

ฮูนไม่ได้มีการแสดงออกที่เหมาะสมเพียงห้องสมุด combinator parser ดังนั้นมันค่อนข้าง verbose สวย ++ การสแกนก็ล้มเหลวเช่นกันหากสตรีมอินพุตทั้งหมดไม่ได้ถูกแยกวิเคราะห์ดังนั้นฉันต้องใช้ ++ โรสรวมเข้าด้วยกันเป็นหน่วยและแกะมันสำหรับค่า "แจงส่วนที่ไกลที่สุด" นอกจากนี้ยังทำให้การใช้งานเป็นอย่างมากสำหรับการ currying และการแมปผ่านรายการ (++ รอบ) ดังนั้นฉันจึงตั้งชื่อฟังก์ชันให้กับตัวแปรตัวอักษรหนึ่งตัว

Hoon เป็นภาษาการเขียนโปรแกรมสำหรับ Urbit ซึ่งเป็นโครงการปรับใช้กระดานชนวนที่สะอาดตา มันทำงานได้อย่างหมดจดพิมพ์แบบคงที่ไม่มีเสียงกระเพื่อมและคอมไพล์ให้ Nock Nock เป็น VM ที่ใช้ combinator ซึ่งทำงานอยู่ด้านบนของรูปแบบหน่วยความจำ bignum แบบไบนารีทรี

เมื่อคุณบู๊ต Urbit คุณจะถูกดร็อปเข้าใน: dojo เชลล์และ Hoon จะแทนที่ หากต้องการเรียกใช้ข้อมูลโค้ดเพียงพิมพ์:

%.  "PROgRam reVERsES giVeN iNPut sEqUENcE"

แล้ววางฟังก์ชันสแตนด์อโลนในบรรทัดถัดไป


ยินดีต้อนรับสู่ PPCG! คำตอบของคุณมีการอธิบายค่อนข้างดี แต่คุณสามารถลิงก์ในล่ามหรือสถานที่เพื่อลองออนไลน์ได้หรือไม่?
Addison Crump

ฉันเพิ่มลิงค์ไปยังหน้า GitHub ของ Urbit เนื่องจากการสร้างมันเป็นวิธีเดียวที่ค่อนข้างมาก เพียงพอหรือไม่
RenderSettings

อย่างแน่นอน : D ออกจากคำแนะนำเกี่ยวกับวิธีการใช้งานในโปรแกรมเต็มรูปแบบเช่นกันจะยอดเยี่ยม
Addison Crump

3

เยลลี่ , 27 ไบต์

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

ลองออนไลน์! โปรดทราบว่าแบ็กสแลชจำเป็นต้องใช้ Escape ในสตริงอินพุตสำหรับกรณีทดสอบครั้งที่สอง

Implicit input: string s (list of characters)

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

Input: string s' (list of letters)

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

2

Matlab ขนาด 98 ไบต์

function t(s);s=s(isletter(s));s=s(1:end-mod(end,3));r='><[]-+.,';r([4 2 1]*reshape(s<92,3,[])+1)
  1. สะอาด
  2. การตัดแต่ง
  3. เปลี่ยนรูปร่างเป็นเมทริกซ์ 3xn ด้วย 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'
,[>,]<[.<]+

ใช้ เคล็ดลับที่มีฐานที่ 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

Julia, 107 ไบต์

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

นี่คือฟังก์ชันที่ไม่ระบุชื่อที่ยอมรับสตริงและส่งคืนสตริง หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

Ungolfed:

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

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

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

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

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

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

1

Lua, 120 ไบต์

การใช้string.gsub()ที่นี่ขนาดใหญ่อีกครั้งอาจอนุญาตให้ฉันสร้างตัวชี้อักขระหนึ่งตัวบนฟังก์ชันนี้เพื่อให้ได้ไบต์บางตัว นอกจากนี้ยังเป็นโปรแกรม lua แรกของฉันโดยไม่มีช่องว่าง! : D

โปรแกรมนี้รับอินพุตผ่านอาร์กิวเมนต์บรรทัดคำสั่งและส่งออกโปรแกรม BrainFuck หนึ่งคำสั่งต่อบรรทัด

แก้ไข: บันทึกแล้ว 1 ไบต์ขอบคุณ @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 และคำอธิบาย

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)
Oleg V. Volkov

... หรือบางทีฉันก็อ่านผิดจำนวนไบต์บนรอยพับ การฝังยังคงใช้งานได้
Oleg V. Volkov

@ OlegV.Volkov ประหยัดไปกว่าค่าใช้จ่ายที่สั้นลงเศร้ามากขึ้นฉันลองแบบเดียวกัน ^^ และขอบคุณสำหรับการ inline ของ b ... ฉันไม่รู้ว่าทำไมฉันบันทึกไว้ใน var ...
Katenkyo


1

Mathematica ขนาด 192 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อที่ใช้สตริงที่ต้องการเป็นอาร์กิวเมนต์ ขั้นตอนในอัลกอริทึม (ค่อนข้างตรงไปตรงมา):

  1. ทำความสะอาดสายอักขระ
  2. แทนที่ UC -> "1", lc -> "0"
  3. เปลี่ยนสตริงเป็นรายการไบนารี่
  4. แบ่งพาร์ติชันออกเป็นสามส่วนและตีความแต่ละอันเป็นหมายเลขฐาน 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(/.../) chunk string เป็นกลุ่มละ 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

@daniero ขอบคุณ! ทำให้นี่เป็นคำตอบของชุมชน อย่าลังเลที่จะเปลี่ยนแปลง
FuzzyTree

1
tr(^a-zA-Z','').tr('a-zA-Z',?0*26+?1)สั้นกว่า
ไม่ใช่ Charles

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

Ungolfed

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 ไบต์

โปรแกรมเต็มรูปแบบ golfed (อ่านจากอินพุตมาตรฐาน):

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

ค่อนข้าง ungolfed:

#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 และเช่นเดียวกันสำหรับ...`az}




0

Pyke, 31 ไบต์, ไม่สามารถแข่งขันได้

Pyke นั้นเก่ากว่าความท้าทาย แต่ฉันได้เพิ่มฟีเจอร์บางอย่างเพื่อให้มีฟังก์ชั่นการแข่งขันที่มากขึ้น ฉันใช้เคล็ดลับเดียวกับ@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 ไบต์

อะไรนะไม่มีคำตอบแบบพื้นฐาน ถึงเวลาที่ฉันจะแก้ไขมัน!

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

การป้อนข้อมูลเป็นOOOAnsรหัสใน
เอาต์พุตเป็นโค้ดBF ที่แปลแล้ว

ตัวอย่าง:

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

Un-
golfed : (เพิ่มบรรทัดใหม่และความคิดเห็น)

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

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

หมายเหตุ:

  • TI-BASIC เป็นภาษาโทเค็น จำนวนตัวอักษรไม่เท่ากับจำนวนไบต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.