มาเล่นกอล์ฟตัวถอดรหัส BIBABOBU กันเถอะ


53

ในขณะที่ผมกำลังเดินทางไปในอนาคตผมสังเกตเห็นเกมที่ตลกในหมู่เด็กประมาณ 2275. เมื่อพวกเขาไม่ต้องการให้พ่อแม่ที่ดีที่ดีดีที่ดีที่ยิ่งใหญ่ของพวกเขาที่จะเข้าใจสิ่งที่พวกเขากำลังจะบอกว่าพวกเขาใช้BIBABOBU พูด เห็นได้ชัดว่าฉันไม่เข้าใจอะไรเลยด้วยสมองพรีไซบอร์ยุคก่อนและฉันก็รู้สึกว่า (หรือในทางเทคนิค: ฉันจะรู้สึก ) โง่จริงๆ ดังนั้นฉันต้องการตัวถอดรหัสสำหรับการเยี่ยมชมครั้งต่อไปของฉัน

BIBABOBU?

แม้ว่าจะเลิกใช้มาเป็นเวลานาน แต่ ASCII ยังคงใช้กันอย่างแพร่หลายในวัฒนธรรมป๊อปที่ 2275 และภาษานี้มีพื้นฐานมาจากมัน

สตริงที่เข้ารหัสแบบ BIBABOBU:

  • แปลงอักขระทั้งหมดเป็นรหัส ASCII
  • ใช้การแทนค่าเลขฐานสิบหก 2 หลักของแต่ละรหัสและแปลงโดยใช้ตารางต่อไปนี้:

    0: BI  4: BIDI  8: BADI  C: BODI
    1: BA  5: BIDA  9: BADA  D: BODA
    2: BO  6: BIDO  A: BADO  E: BODO
    3: BU  7: BIDU  B: BADU  F: BODU
    

ตัวอย่าง

"Hello!" → 48 65 6C 6C 6F 21 → "BIDIBADI BIDOBIDA BIDOBODI BIDOBODI BIDOBODU BOBA"

อย่างไรก็ตามการป้อนข้อมูลที่สอดคล้องกันจะได้รับโดยไม่มีช่องว่างใด ๆ ที่จะเลียนแบบน้ำเสียงที่น่าเบื่อที่เด็ก ๆ ใช้เพื่อทำให้สิ่งนี้ยิ่งยากที่จะเข้าใจโดยไม่ต้องปลูกถ่าย:

"BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBA"

คำอธิบายและกฎ

  • จำไว้ว่าฉันต้องการตัวถอดรหัสไม่ใช่ตัวเข้ารหัส
  • ตัวอักษรถอดรหัสจะรับประกันว่าจะอยู่ในช่วง[32 ... 126]
  • อินพุตรับประกันว่าจะมีตัวเลขฐานสิบหกที่เข้ารหัสด้วย BIBABOBU จำนวนคู่
  • คุณสามารถป้อนข้อมูลด้วยตัวพิมพ์เล็กเต็มหรือตัวพิมพ์ใหญ่เต็ม ไม่อนุญาตให้ใช้กรณีผสม
  • เนื่องจากการโยนบิตเป็นเรื่องธรรมดาในระหว่างการเดินทางข้ามเวลานี่คือเพื่อลดความเสี่ยง

กรณีทดสอบ

หมายเหตุ: Linefeeds ใช้ด้านล่างเพื่อวัตถุประสงค์ในการจัดรูปแบบเท่านั้น คุณไม่ควรจัดการกับมัน

Input:
BIDABIDIBIDOBIDABIDUBUBIDUBIDI

Output:
Test

Input:
BIDABIDUBIDOBIDABIDOBODIBIDOBUBIDOBODUBIDOBODABIDOBIDABOBIBIDUBIDIBIDOBODUBOBIBUBOBUBOBUBI
DUBUBIDABOBA

Output:
Welcome to 2275!

Input:
BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBODIBOBIBIDABIDIBIDOBADABIDOBODABIDOBIDABOBIBIDA
BIDIBIDUBOBIDOBABIDUBIDOBIDOBIDABIDOBODIBIDOBIDABIDUBOBOBABOBIBIDABADABIDOBODUBIDUBIDABOBI
BIDOBODIBIDOBODUBIDOBODUBIDOBADUBOBIBIDUBUBIDOBODUBOBIBIDOBIDOBIDUBIDABIDOBODOBIDOBODOBIDU
BADABOBA

Output:
Hello, Time Traveler! You look so funny!

Input:
BIDIBABIDOBODOBIDOBIDIBOBIBIDUBADABIDOBODUBIDUBIDABOBIBIDOBIDIBIDOBODUBIDOBODOBOBIDUBIDUBI
DIBOBIBIDUBIDABIDOBODOBIDOBIDIBIDOBIDABIDUBOBIDUBUBIDUBIDIBIDOBABIDOBODOBIDOBIDIBOBIBIDUBI
DUBIDOBADIBIDOBABIDUBIDIBOBIBIDIBADABOBIDUBIDOBODABOBIBIDUBUBIDOBABIDUBADABIDOBADABIDOBODO
BIDOBIDUBOBODIBOBIBIDOBIDIBIDOBODUBOBIBIDUBADABIDOBODUBIDUBIDABUBODUBOBIBIDIBADIBIDOBABOBI
BIDOBADIBIDOBABOBIBIDOBADIBIDOBABOBA

Output:
And you don't understand what I'm saying, do you? Ha ha ha!

4
@StewieGriffin เด็กเหี้ยเหล่านี้มีความซุกซน ... : - /
Arnauld

12
โดยวิธีการที่ฉันพบว่าเรื่องจริงไม่น่าจริง ๆ ! ฉันจะไม่แปลกใจถ้ามันเป็นแค่ความฝันที่คุณมี ... คุณอาจมีการรั่วไหลของ CO ในบ้านของคุณ?
Stewie Griffin

12
อ่า ... นั่นจะอธิบายม้าที่ขี่สายรุ้งในห้องนั่งเล่นของข้าด้วย
Arnauld

9
หนึ่งสามารถยืนยันว่ารหัส golfed เพิ่มความรุนแรงของบิตพลิก (ซ้ำซ้อนน้อยกว่าในรหัส) แม้ว่าจะลดความถี่ของบิตพลิก ... แต่สิ่งที่ :) - ดีท้าทาย!
JayCe

4
@JayCe True ฉันคิดมากขึ้นตามเส้น: ยิ่งรหัสน้อยลงเท่าไหร่คุณก็ยิ่งมีความซ้ำซ้อนมากขึ้นโดยการเก็บสำเนาหลายชุด
Arnauld

คำตอบ:


15

05AB1E , 36 35 33 ไบต์

บันทึก 1 ไบต์ขอบคุณMr.Xcoder
บันทึก 2 ไบต์ขอบคุณKevinCruijssen

ć©¡®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJ

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

ć©¡                                 # extract the head ("B") and split input on it
   ®ì                              # prepend "B" to each
     ®D                            # push 2 copies of "B"
       …IAO©â                      # cartesian product with "IAO"
             'D«                   # append "D" to each
                ‚˜                 # add the leftover "B" to the list
                  ®'U«â            # cartesian product with "IAOU"
                       J           # join each to string
                        sk         # get the index of each word of the input in this list
                          h        # convert each to hex
                           2ôJ     # format as pairs of chars
                              H    # convert to int
                               çJ  # convert from ascii-codes to string

ฉันเชื่อว่าใช้'B©¡¦®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJงานได้ 35 ไบต์
Mr. Xcoder

@ Mr.Xcoder: อ่าแน่นอน ©นำมาใช้ใหม่ที่ดีของ ขอบคุณ :)
Emigna

-2 ไบต์เปลี่ยนผู้นำ'Bไปสู่ćและลบ¦เนื่องจากอินพุตจะเริ่มต้นด้วย 'B' เสมอ
Kevin Cruijssen

@KevinCruijssen: Ooh ความคิดที่ดี ćผมไม่ได้รับการพิจารณา ขอบคุณ!
Emigna

9
ทีนี้ลองกลับไปที่เด็กเหล่านั้นและดูว่าพวกเขาเข้าใจหรือไม่
แอรอน

14

เยลลี่ , 26 24 23 22 20 17 15 ไบต์

ṣḢO^1%9%4Ḅḅ⁴b⁹Ọ

ลองออนไลน์!

มันทำงานอย่างไร

ṣḢO^1%9%4Ḅḅ⁴b⁹Ọ  Main link. Argument: s (string)

 Ḣ               Head; remove and yield the first character of s.
ṣ                Split s at occurrences of the result ('B').
  O              Ordinal; map "IAOUD" to A1 := [73, 65, 79, 85, 68].
   ^1            Bitwise XOR 1; map A1 to A2 := [72, 64, 78, 84, 69].
     %9          Modulo 9; map A2 to A3 := [0, 1, 6, 3, 6].
       %4        Modulo 4; map A3 to A4 := [0, 1, 2, 3, 2].
                 So far, we've mapped "BX" to [x] and "BXDY" to [x, 2, y],
                 where x/y = 0, 1, 2, 3 when X/Y = I, A, O, U.
         Ḅ       Unbinary; map [x] to x and [x, 2, y] to 4x + 2×2 + y = 4(x + 1) + y.
          ḅ⁴     Convert the resulting array from base 16 to integer.
            b⁹   Convert the resulting integer to base 256.
              Ọ  Unordinal; replace code points with their characters.

13

Perl 6 , 58 ไบต์

{S:g{(B.[D.]?)**2}=chr :16[$0».&{:2[.ords»³X%87 X%4]}]}

ลองออนไลน์!

แรงบันดาลใจจากสารละลาย Jelly ของเดนนิส ใช้ฟังก์ชั่นวิเศษที่แตกต่างกันx³ % 87 % 4ซึ่งยังแผนที่รหัส ASCII ของการIAOUBD012302

ตัวเลือกรุ่น75 74 ไบต์

-1 ไบต์ขอบคุณ Jo King

{pack('H',.trans((<B BID BAD BOD>X~ <I A O U>)=>(^16)».base(16))).decode}

ลองออนไลน์!

ทางเลือกรุ่น 85 ไบต์

{S:g[....]=chr :4(~$/)*2+|221+^:4(~$/)+^238}o{TR:d/UIAOBD/0123/}o{S:g[B.<![D]>]=0~$/}

ลองออนไลน์!


ประมาณ(^16)>>.base(16)1 ไบต์
Jo King



6

05AB1E (ดั้งเดิม), 68 65 60 59 ไบต์

.•5Ç¿ÆΓ•2ô.•1ÒKá ¸ΓìŸÆt`ô_zTºγ„KRI‰ι놽òι•4ô«I¬©¡®ìkh2ôJHçJ

อินพุตเป็นตัวพิมพ์เล็ก

-3 ไบต์โดยปริยายขอบคุณที่@Emignaเปลี่ยนไป'b¡εg>}s£'b©¡®ì

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

นอกจากนี้ยังสามารถตีกอล์ฟกับบางสิ่งที่ฉลาดกว่าสายบีบอัดขนาดใหญ่ จะดูอีกครั้งในภายหลัง @Emignaให้คำตอบที่สั้นกว่านี้แล้วดังนั้นอย่าลืมโหวตขึ้น!

คำอธิบาย:

.•5Ç¿ÆΓ•      # Compressed string "bibabobu"
        2ô    # Split in parts of 2
              #  → ["bi","ba","bo","bu"]
.•1ÒKá ¸ΓìŸÆt`ô_zTºγ„KRI‰ι놽òι•
              # Compressed string "bidibidabidobidubadibadabadobadubodibodabodobodu"
        4ô    # Split in parts of 4
              #  → ["bidi","bida","bido","bidu","badi","bada","bado","badu","bodi","boda","bodo","bodu"]
«             # Merge both lists together
              #  → ["bi","ba","bo","bu","bidi","bida","bido","bidu","badi","bada","bado","badu","bodi","boda","bodo","bodu"]
I¬©¡          # Take the input and split on the head (always 'b')
              #  i.e. "bidibadibidobidabidobodibidobodibidoboduboba"
              #   → ["idi","adi","ido","ida","ido","odi","ido","odi","ido","odu","o","a"]
    ®ì        # And prepend a 'b' to each item again
              #  i.e. ["idi","adi","ido","ida","ido","odi","ido","odi","ido","odu","o","a"] 
              #   → ["bidi","badi","bido","bida","bido","bodi","bido","bodi","bido","bodu","bo","ba"]
k             # Map each item to the index of the first list
              #   i.e. ["bidi","badi","bido","bida","bido","bodi","bido","bodi","bido","bodu","bo","ba"]
              #    → [4,8,6,5,6,12,6,12,6,15,2,1]
 h            # Convert everything to hexadecimal
              #  i.e. [4,8,6,5,6,12,6,12,6,15,2,1]
              #   → ["4","8","6","5","6","C","6","C","6","F","2","1"]
  2ôJ         # Split it in parts of 2 and join them together
              #  i.e. ["4","8","6","5","6","C","6","C","6","F","2","1"]
              #   → ["48","65","6C","6C","6F","21"]
     H        # Convert that from hexadecimal to an integer
              #  i.e. ["48","65","6C","6C","6F","21"] → [72,101,108,108,111,33]
      ç       # And take its ASCII value
              #  i.e. [72,101,108,108,111,33] → ["H","e","l","l","o","!"]
       J      # Then join everything together (and output implicitly)
              #  i.e. ["H","e","l","l","o","!"] → "Hello!"


5

R , 141 135 ไบต์

function(x,y="I":"A":"O")intToUtf8(matrix(match(el(strsplit(gsub("D","",x),"B"))[-1],paste0(rep("":y,e=4),y:"U"))-1,,2,T)%*%16:1)
":"=c

ลองออนไลน์!

ขอบคุณJayCe ที่ประหยัด 6 ไบต์!

การใช้เวทย์มนตร์แบบแยกส่วนมีแนวโน้มที่จะสั้นกว่า แต่ฉันก็ค่อนข้างพอใจกับสิ่งนี้ในฐานะการผ่านครั้งแรกที่ไร้เดียงสา


1
เยี่ยมมาก! เคล็ดลับที่ฉันโปรดปรานช่วยประหยัด 6 ไบต์ - ได้แรงบันดาลใจจากความคิดเห็นของคุณเพื่อตอบคำถามเมื่อวันก่อน
JayCe

@ JayCe ดีมากและเรียบร้อย! แม้จะใช้มันด้วยความสำคัญเหนือกว่าที่%*%ฉันเห็น :-) คุณยังสามารถใส่`:`อาร์กิวเมนต์ของฟังก์ชันในกรณีที่คุณต้องการใช้ควบคู่กับสิ่งอื่น!
Giuseppe

ถูกต้อง - ฉันมักจะลืมเกี่ยวกับ backquotes
JayCe

5

Japté, 43 29 28 ไบต์

น่าแปลกใจที่พอร์ตของสารละลายของเดนนิสเจลลี่ทำงานได้สั้นกว่ามาก

ส่งออกอาร์เรย์ของตัวละคร

Åqbu)®¬®c ^1 %9%4Ãì2Ãò ®ìG d

ลองมัน


ดั้งเดิม 42 ไบต์

Åqb £`bbidbad¾d`ò3n)ï`ia`q)m¬bXibÃò ®ìG d

ลองมัน

คำอธิบาย

Åqb £`bbidbad¾d`ò3n)ï`ia`q)m¬bXibÃò ®ìG d
Å                                              :Slice off the first character
 qb                                            :Split on "b"
    £                                          :Map
     `bbidbad¾d`                               :  Compressed string "bbidbadbod"
                ò3n)                           :  Partition at every 3rd character from the end (["b","bid","bad","bod"])
                    ï                          :  Cartesian product
                     `ia`                      :   Compressed string "iaou"
                          q                    :   Split
                           )                   :  End Cartesian product
                            m                  :  Map
                             ¬                 :   Join
                              b                :  Index of
                               X               :   Current element
                                ib             :   Prepend "b"
                                  Ã            :End map
                                   ò           :Partition at every second element
                                     ®         :Map
                                      ìG       :  Convert from base-16 digit array to base-10 integer
                                         d     :  Get the character at that codepoint

5

C (gcc) , 181 138 136 ไบต์

หวังว่าจะมีคอมไพเลอร์ C ในอนาคตเพื่อรวบรวมสิ่งนี้! :-)

ขอบคุณ Max Yekhlakov และ ceilingcat สำหรับคำแนะนำ

v,t,c,d;f(char*s){for(v=t=c=0;d=*s++;)t+=d==66?v=v*16+t,++c>2?v=!putchar(v),c=1:0,-t:d-65?d-79?d-68?d-85?0:3:4+t*3:2:1;putchar(v*16+t);}

ลองออนไลน์!


ในกรณีที่คอมไพเลอร์ C แห่งอนาคตเข้าใจเฉพาะ ASCII BIBABOBU-ified :-)

BIDUBIDOBOBODIBIDUBIDIBOBODIBIDOBUBUBADUBIDOBIDOBOBADIBIDOBUBIDOBADIBIDOBABIDUBOBOBADOBIDUBUBOBADABIDUBADUBIDOBIDOBIDOBODUBIDUBOBOBADIBIDUBIDOBUBODABIDUBIDIBUBODABIDOBUBUBODABUBIBUBADUBOBADOBIDUBUBUBADUBIDUBUBOBADUBOBADUBOBADABIDUBIDIBOBADUBUBODABOBADOBIDUBUBUBODABUBODABUBIDOBUBIDOBUBODUBIDUBIDOBUBODABIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBODIBOBADUBOBADUBIDOBUBUBODOBUBOBUBODUBIDUBIDOBUBODABOBABIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADABOBODIBIDOBUBUBODABUBABUBADOBUBIBOBODIBOBODABIDUBIDIBUBADOBOBADOBIDUBUBOBODABUBIDOBUBIDABUBODUBOBADOBIDUBUBOBODABUBIDUBUBADABUBODUBOBADOBIDUBUBOBODABUBIDOBUBADIBUBODUBOBADOBIDUBUBOBODABUBADIBUBIDABUBODUBUBIBUBADOBUBUBUBADOBUBIDIBOBADUBIDUBIDIBOBADOBUBUBUBADOBUBOBUBADOBUBABUBADUBIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBADABUBADUBIDUBODA

(เข้ารหัสลองออนไลน์! )



แนะนำc=printf(&v),v=0แทนv=!putchar(v),c=1
ceilingcat

4

JavaScript (Node.js) , 131 128 ไบต์

s=>unescape(s.replace(/B.(D.)?/g,(f,s)=>(-~g(f[1])*4*!!s+g((s||f)[1])).toString(16),g=c=>'IAOU'.search(c)).replace(/../g,'%$&'))

ลองออนไลน์! ลิงค์มีกรณีทดสอบ รุ่นทางเลือก 131 ไบต์เช่นกัน:

s=>unescape(s.replace(/B.(D.)?/g,s=>(-~g(s[1])*4*!!s[3]+g(s[3]||s[1])).toString(16),g=c=>'IAOU'.search(c)).replace(/../g,'%$&'))

ลองออนไลน์! ลิงค์มีกรณีทดสอบ แก้ไข: บันทึก 3 ไบต์ด้วย @Shaggy


1
การใช้unescape()เป็นความคิดที่ดี
Arnauld

indexOf-> searchเพื่อบันทึกไบต์
ขนดก

นอกจากนี้ก็ดูไม่เหมือนที่คุณจำเป็นต้องกำหนด RegEx rไป
ขนดก

@Shaggy อ๊ะนั่นเป็นส่วนที่เหลือจากการทำซ้ำครั้งก่อน ขอบคุณ!
Neil


4

สกาลา , 305 ไบต์

ฉันค่อนข้างมั่นใจว่านี่สามารถเล่นกอล์ฟได้ แต่ก็ยังมีอยู่ ใช้ตัวพิมพ์เล็ก fพิมพ์ผลลัพธ์ใน stdout

แก้ไข: -8 ตัวอักษรต้องขอบคุณฉันไม่โง่อีกต่อไป (ช่องว่าง); -13 ตัวอักษรขอบคุณ crater2150

var k=Seq("bi","ba","bo","bu")
k++=k.init.flatMap(a=>Seq("di","da","do","du").map(a+_))//Putting "bu" here instead of at line 1, and in place of using init, would be interesting... if it did not cause a typing problem
var m=Seq[String]()
def g(a:Seq[String],b:Int)=k.indexOf(a(b)).toHexString
def f(a:String){a.split('b').drop(1).foreach(x=>m:+="b"+x)
var i=0
while(i<m.length){print(Integer.parseInt(g(m,i)+g(m,i+1),16).toChar)
i+=2}}

ลองออนไลน์!


คุณสามารถแทนที่dropRight(1)ด้วยinit, Seq("").drop(1)มีSeq[String]()และmap(b=>a+b)มีmap(a+_)
crater2150

@ crater2150 ขอบคุณ! คอมไพเลอร์ของฉันไม่ต้องการmap(a+_)ทำงาน แต่ฉันรู้ว่าฉันสามารถทำได้ ขอบคุณสำหรับเคล็ดลับอื่น ๆ !
V. Courtois




3

Dyalog APL, 74 72 ไบต์

โซลูชันระดับเริ่มต้นใน Dyalog APL (เพิ่งเริ่มเรียนรู้สิ่งนี้เมื่อสองสามวันก่อน!) กำหนด dfn ที่รับอาร์กิวเมนต์หนึ่งตัว (อินพุต) 72 ตัวอักษร 72 ไบต์เมื่อใช้การเข้ารหัส dyalog ขึ้นอยู่กับโซลูชันของ Emigna ใน 05AB1E

{⎕UCS 16⊥¨(1 0⍴⍨≢t)⊂1-⍨(,('B',('B'∘.,'IAO'),¨'D')∘.,'IAOU')⍳t←('B'⍷⍵)⊂⍵}

ยินดีต้อนรับสู่ PPCG และสู่โลกแห่งการเล่นกอล์ฟของ APL นี่เป็นสิ่งที่น่าอัศจรรย์หลังจากเรียนรู้ APL เพียงสองสามวัน คุณอาจจะสนุกกับเคล็ดลับ APL เล่นกอล์ฟ อย่าลังเลที่จะเข้าร่วมในThe APL Orchardด้วย!
Adám


2

Brain-Flak , 178 ไบต์

{(([((((()()()()){}){}){}()){}]{}){{}<>(({}){}){}(<>)}{}<({}(<>))(<>)((()()()())({})()){{(({})){({}[()])<>}{}}<>({}<>)<>{}}{}><>{}{})<>}<>([]){{}({}(((({}){}){}){}){}<>)<>([])}<>

ลองออนไลน์!

คำอธิบาย

# Step 1: convert to hex.
# For each pair of letters in the input:
{

  (

    # Compare first letter to B
    ([((((()()()()){}){}){}()){}]{})

    # If not B, pop previous output, multiply by 4, and put on third stack.
    # 4 is added automatically from pushing/popping the difference
    # between the letters B and D.
    {{}<>(({}){}){}(<>)}{}

    <

      # Push second letter in pair to other stack
      ({}(<>))

      # Push 4 and 9
      (<>)((()()()())({})())

      # Compute 3-((8-(n mod 9)) mod 4)
      # (same as (n-1) mod 9 mod 4)
      {{(({})){({}[()])<>}{}}<>({}<>)<>{}}{}

    >

    # Add result to third stack (either 0 or 4*previous+4)
    <>{}{}

  # Push onto second stack
  )

<>}

# Step 2: Pair up hex digits.
# While digits remain on right stack:
<>([]){{}

  # Push top of stack + 16*second on stack to left stack
  ({}(((({}){}){}){}){}<>)<>

([])}

# Switch to left stack for output.
<>

2

05AB1E , 30 ไบต์

ć¡Ç1^9%4%εDg≠i421øP]€OžvβžzвçJ

คำตอบของ Jelly @บ้าของพอร์ต@Dennis (มีในตัวที่สะดวกน้อยกว่า) ดังนั้นอย่าลืมโหวตให้เขา!

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ć¡             # Split the input-string on its first character ('B')
               #  i.e. "BIDABIDIBIDOBIDABIDUBUBIDUBIDI"
               #   → ["IDA","IDI","IDO","IDA","IDU","U","IDU","IDI"]
  Ç            # Convert each character to it's ordinal value
               #  → [[73,68,65],[73,68,73],[73,68,79],[73,68,65],[73,68,85],85,[73,68,85],[73,68,73]]
   1^          # XOR it by 1
               #  → [[72,69,64],[72,69,72],[72,69,78],[72,69,64],[72,69,84],84,[72,69,84],[72,69,72]]
     9%        # Take modulo-9
               #  → [[0,6,1],[0,6,0],[0,6,6],[0,6,1],[0,6,3],3,[0,6,3],[0,6,0]]
       4%      # Take Modulo-4
               #  → [[0,2,1],[0,2,0],[0,2,2],[0,2,1],[0,2,3],3,[0,2,3],[0,2,0]]
ε         ]    # Now map it to:
 Dgi          # If the length is not 1:
               #  i.e. [0,2,1] → 3 → 1 (truthy)
               #  i.e. 3 → 1 → 0 (falsey)
     421øP     # Multiply the first number by 4, second by 2, and third by 1
               #  i.e. [0,2,1] and [4,2,1] → [[0,4],[2,2],[1,1]] → [0,4,1]
           O  # Then sum every inner list
               #  [[0,4,1],[0,4,0],[0,4,2],[0,4,1],[0,4,3],3,[0,4,3],[0,4,0]]
               #   → [5,4,6,5,7,3,7,4]
žvβ            # Convert this list from base-16 to base-10
               #  → 1415934836
   žzв         # Convert this integer from base-10 to base-256
               #  → [84,101,115,116]
      ç        # Convert this number to ASCII characters
               #  → ["T","e","s","t"]
       J       # Join the characters together (and output implicitly)
               #  → "Test"

สงสัยว่าคุณตัดคะแนน emignas ได้ 3 คะแนนอย่างไร Jeebus นี่คือ +1 ที่ซับซ้อนสำหรับความพยายามในพอร์ต - ไม่เคยใช้ XOR หรือการแปลงฐานมาก่อน! จะเก็บไว้ในใจจากนี้ไป!
Magic Octopus Urn

@ MagicOctopusUrn ใช่คำตอบของเดนนิสเป็นสิ่งที่ฉันไม่เคยคิดมาก่อนเลย .. และในเยลลี่นี่เป็นวิธีที่มีประสิทธิภาพมากกว่าเนื่องจากคำตอบของเขาคือ 15 ไบต์และของฉันคือ 30 เพียงแค่คิดว่ามันคุ้มค่าที่จะโพสต์ด้วย แม้ว่าจะเป็นพอร์ตก็ตาม ฉันใช้แฮคเกอร์เพียงครั้งเดียวเท่านั้นและการแปลงเบสบ่อยครั้งมาก
Kevin Cruijssen

2

Java (JDK 10) , 199 ไบต์

s->{var z="";for(var x:s.substring(1).split("B")){int d=-1;for(var y:x.split("D"))d=-~d*4+"IAOU".indexOf(y);z+=(char)(d>9?d+55:d+48);}return new String(new java.math.BigInteger(z,16).toByteArray());}

ลองออนไลน์!

เครดิต

  • -2 ไบต์ขอบคุณArnauld

1
คุณสามารถใช้-~dแทน(d+1)?
Arnauld

อ๋อขอบคุณ! ฉันมีสิ่งเหล่านั้นในรุ่นแรกของฉันจากนั้นฉันก็เล่นกับความคิดในการใช้งานcharของ s แทนและเมื่อฉันกลับมาที่รุ่นแรกของฉันฉันก็ลืมมันทั้งหมดอีกครั้ง ;)
Olivier Grégoire

2

VBA (Excel) ด้วยขนาด322 244 ไบต์ที่น่าทึ่ง

ใช่และฉันรักเลขฐานสิบหก (ตอนนี้ยังไม่มีตัวอักษรประชดประชันดังนั้นฉันจึงใช้ตัวเอียงในตอนนี้) ฉันจะเพิ่มความคิดเห็นหากมีคนต้องการ แต่ฉันคิดว่ามันเป็นคำอธิบายตัวเอง การเล่นกอล์ฟเกิดขึ้น

Sub b(s)
For Each c In Split(Replace(s,"D",""),"B")
c=Application.Match(c,Array("I","A","O","U","II","IA","IO","IU","AI","AA","AO","AU","IO","OA","OO","OU"),0)
If Not IsError(c)Then d=d &c-1:If Len(d)=2Then e=e &Chr("&h"&d):d=""
Next
Debug.?e
End Sub

ด้วยความคิดเห็น:

Sub b(s)
  'For each string between B's (Remove the D's first)
  For Each c In Split(Replace(s,"D",""),"B")
    'Get the index of the element in the array (Can cause error if empty)
    c = Application.Match (c,Array("I","A","O","U","II","IA","IO","IU","AI","AA","AO","AU","IO","OA","OO","OU"),0)
    'If c isn't an error
    If Not IsError(c) Then
      'Subtract 1 from c and add to d  --> Array index is 1 based
      d = d & (c-1)
      'If d is 2 characters
      If Len(d)=2 Then
        'Add the char from the hex value of d   --> &h forces Hex
        e = e & Chr("&h" & d)
        'Reset d
        d = ""
      End if
    End if
  Next
  'Print the output
  Debug.Print e
End Sub

ฉันพยายามที่จะนำสิ่งนี้เข้าสู่หน้าต่าง VB ทันที แต่ดูเหมือนจะไม่ทำงานที่นั่น ... ซึ่งจะลดตัวละคร 11 ตัวที่ฉันคิด ฉันต้องการใส่คำสั่งจับคู่ไว้ในวงเล็บ แต่นั่นทำให้เกิดข้อผิดพลาดเงียบทุกครั้ง ความช่วยเหลือได้รับการชื่นชม: D


ยินดีต้อนรับสู่ PPCG!
Arnauld

ขอบคุณ! ผมอยู่ที่นี่ในขณะที่ก็ไม่เคยรับสามารถที่จะโพสต์อะไร :)
seadoggie01

Array("I","A","O","U","II","IA","IO","IU","AI","AA","AO","AU","IO","OA","OO","OU")-> Split("I A O U II IA IO IU AI AA AO AU IO OA OO OU")และNot IsError(c)->IsError(c)=0
Taylor Scott เมื่อ

1

Haxeขนาด 228 ไบต์

s->{var l=(u,i)->((i=u.charCodeAt(i))&8==8?0:1)|((i>>1)&2),p=s.split("B"),i=-1,q,o;[while((i+=2)<p.length)String.fromCharCode(l(q=p[i+1],o=q.length-1)+((o>1?l(q,0)+1:0)+((l(q=p[i],o=q.length-1)+o*(l(q,0)+1)*2)*4))*4)].join("");}

ชื่อฟังก์ชันไลบรารีมาตรฐานที่ไม่ดีที่สุดนั้นใหญ่เกินไป :(

ลองออนไลน์!


1

Pyth, 35 ไบต์

mCid16cm+4imx"IAOU"k.[N2d4tc-Q\D\B2

เอาต์พุตเป็นรายการของอักขระ
ลองที่นี่

คำอธิบาย

mCid16cm+4imx"IAOU"k.[N2d4tc-Q\D\B2
                          tc-Q\D\B   Get the vowels associated with each digit.
       m            .[N2d            Pad with a quote.
           mx"IAOU"k                 Find each character's position.
        +4i              4           Convert to base 4 and add 4.
      c                           2  Split the result into pairs.
mCid16                               Get the associated ASCII characters.

1

ถ่าน , 36 ไบต์

FS≡ιB⊞υ⁰D⊞υ×⁴⊕⊟υ⊞υ⁺⊟υ⊕⌕AOUι⭆⪪υ²℅↨ι¹⁶

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

FS≡ι

วนรอบตัวอักขระอินพุตและสวิตช์แต่ละตัว

B⊞υ⁰

หากเป็นรายการBให้กด0ไปที่รายการว่างที่กำหนดไว้ล่วงหน้า

D⊞υ×⁴⊕⊟υ

หากเป็นค่าDป๊อปอัพให้เพิ่มค่าคูณด้วย4และผลักดันอีกครั้ง

⊞υ⁺⊟υ⊕⌕AOUι

มิฉะนั้นค้นหาดัชนีในสตริงAOUเพิ่มขึ้นและเพิ่มค่าสุดท้าย

⭆⪪υ²℅↨ι¹⁶

แยกรายการเป็นคู่ของค่าถอดรหัสเป็นฐาน 16 แปลงเป็น ASCII และพิมพ์โดยนัย


1

ทำความสะอาด , 145 134 ไบต์

import StdEnv                   // import things like addition and comparison
?c=(743rem(toInt c))/16         // magical formula that maps ['IAOU'] to [0,1,2,3]
@[_,b,'D',d:t]=[?d+ ?b*4+4: @t] // convert B#D#
@[_,b:t]=[?b: @t]               // convert "B#"
@_=[]                           // handle base case
$[u,v:t]=[u<<4+v: $t]           // turn the digits into 2-digit numbers
$e=e                            // handle base case

toString o$o@                   // convert to string (make numbers (make digits))

ลองออนไลน์!

อธิบาย:


1

PHP, 119 ไบต์

foreach(explode(B,$argn)as$i=>$m)($v=$v*16+4*strpos(XIAO,$m[-3]?:B)+strpos(IAOU,$m[-1]?:B))?$i&1||print chr($v&=255):0;

ถือว่าอินพุตเป็นตัวพิมพ์ใหญ่ ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

ต้องการ PHP 7.1
สำหรับ PHP รุ่นเก่าใช้substr($m,-3,1)และsubstr($m,-1)แทน$m[-<x>](+16 ไบต์)
สำหรับน้อง PHP, วางB, XIAOและIAOUในเครื่องหมายคำพูดเพื่อหลีกเลี่ยงข้อความเตือน (10 bytes)



0

PHP, 163 ไบต์

function f($s){$t=[I=>0,A=>1,O=>2,U=>3];for($q=explode(B,$s);$a=&$q[++$i];){$a=($a[1]?($t[$a[0]]+1)*4:0)+$t[$a[2*($a[1]==D)]];$i%2?:print(chr(($q[$i-1]<<4)+$a));}}

โทรf(string $s)ด้วยสตริงที่เหมาะสมของอักขระที่เข้ารหัส bibabobu และมันจะพิมพ์สตริงที่ถอดรหัส


0

Python 3, 199 ไบต์

import re
lambda s:''.join(eval(re.sub(r'(\d+), (\d+)',r'chr(16*\1+\2)',str(eval(s.replace('I','1').replace('A','2').replace('O','3').replace('U','4').replace('B',',-1+').replace('D','*4+')[1:])))))

ไม่ใช่สั้นที่สุด แต่ไม่มีลูป

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