Hãy chơi bộ giải mã BIBABOBU


53

Trong khi tôi đi du lịch trong tương lai, tôi nhận thấy một trò chơi vui nhộn giữa những đứa trẻ vào khoảng năm 2275. Khi chúng không muốn cha mẹ vĩ đại của chúng hiểu những gì chúng nói, chúng sử dụng BIBABOBU nói . Rõ ràng, tôi không thể hiểu bất cứ điều gì với bộ não thời tiền cyborg của tôi và tôi cảm thấy (hoặc về mặt kỹ thuật: tôi sẽ cảm thấy ) thực sự ngớ ngẩn. Vì vậy, tôi cần một bộ giải mã cho lần truy cập tiếp theo.

BIBABOBU?

Mặc dù nó đã bị từ chối trong một thời gian dài, ASCII vẫn được sử dụng phổ biến trong văn hóa nhạc pop năm 2275 và ngôn ngữ này dựa trên nó.

Một chuỗi được mã hóa BIBABOBU theo cách đó:

  • Chuyển đổi tất cả các ký tự thành mã ASCII của họ.
  • Lấy biểu diễn thập lục phân 2 chữ số của mỗi mã và chuyển đổi chúng bằng bảng sau:

    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
    

Thí dụ

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

Tuy nhiên, đầu vào tương ứng sẽ được cung cấp mà không có bất kỳ khoảng trống nào để bắt chước ngữ điệu đơn điệu mà trẻ em đang sử dụng để làm cho điều này thậm chí khó hiểu hơn nếu không cấy ghép:

"BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBA"

Làm rõ và quy tắc

  • Hãy nhớ rằng tôi cần một bộ giải mã , không phải là một bộ mã hóa.
  • Các ký tự được giải mã được đảm bảo nằm trong phạm vi [32 ... 126] .
  • Đầu vào được đảm bảo chứa số chẵn các chữ số thập lục phân được mã hóa BIBABOBU.
  • Bạn có thể nhập đầu vào bằng chữ thường hoặc chữ hoa đầy đủ. Trường hợp hỗn hợp không được phép.
  • Bởi vì các cú lật bit khá phổ biến trong một chuyến du hành thời gian, đây là để giảm thiểu rủi ro.

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

NB: Nguồn cấp dữ liệu được sử dụng dưới đây cho mục đích định dạng. Bạn không cần phải xử lý chúng.

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 Những đứa trẻ chết tiệt này thật tinh quái ...: - /
Arnauld

12
Nhân tiện, tôi thấy câu chuyện thực sự không thể xảy ra! Tôi sẽ không ngạc nhiên nếu đó chỉ là một giấc mơ mà bạn có ... bạn có thể bị rò rỉ CO trong nhà không?
Stewie Griffin

12
À ... Điều đó cũng sẽ giải thích cho những chú ngựa con cưỡi cầu vồng trong phòng khách của tôi!
Arnauld

9
Người ta có thể lập luận rằng mã đánh gôn làm tăng mức độ nghiêm trọng của lật bit (ít dư thừa trong mã) ngay cả khi nó giảm tần suất lật bit ... nhưng bất cứ điều gì :) - Thử thách tuyệt vời!
JayCe

4
@JayCe Đúng. Tôi đã suy nghĩ nhiều hơn dọc theo dòng: mã càng nhỏ, bạn càng có thể nhận được nhiều hơn bằng cách lưu trữ nhiều bản sao.
Arnauld

Câu trả lời:


15

05AB1E , 36 35 33 byte

Đã lưu 1 byte nhờ Mr.Xcoder
Đã lưu 2 byte nhờ KevinCruijssen

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

ć©¡                                 # 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

Tôi tin rằng 'B©¡¦®ì®D…IAO©â'D«‚˜®'U«âJskh2ôJHçJhoạt động cho 35 byte.
Ông Xcoder

@ Mr.Xcoder: À, tất nhiên rồi. Tái sử dụng tốt đẹp của ©. Cảm ơn :)
Emigna

-2 byte thay đổi dẫn 'Bđến ćvà loại bỏ ¦, vì đầu vào sẽ luôn bắt đầu bằng 'B'.
Kevin Cruijssen

@KevinCruijssen: Ồ, ý kiến ​​hay đấy. Tôi đã không cân nhắc ć. Cảm ơn!
Emigna

9
Bây giờ chúng ta hãy quay lại với những đứa trẻ đó và xem chúng có hiểu điều đó không!
Aaron

14

Thạch , 26 24 23 22 20 17 15 byte

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

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

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

ṣḢ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 byte

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

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

Lấy cảm hứng mạnh mẽ từ giải pháp Dennis 'Jelly. Sử dụng một chức năng ma thuật khác nhau x³ % 87 % 4cũng ánh xạ mã ASCII IAOUBDtới 012302.

Phiên bản thay thế 75 74 byte

-1 byte nhờ Jo King

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

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

Phiên bản 85 byte thay thế

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

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


Còn về (^16)>>.base(16)-1 byte
Jo King



6

05AB1E (di sản), 68 65 60 59 byte

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

Đầu vào là chữ thường.

-3 byte hoàn toàn nhờ vào @Emigna thay đổi 'b¡εg>}s£thành 'b©¡®ì.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Ngoài ra, chắc chắn có thể được chơi golf với một cái gì đó thông minh hơn so với các chuỗi nén lớn. Sẽ có một cái nhìn khác sau này. Câu trả lời ngắn hơn đã được cung cấp bởi @Emigna , vì vậy hãy đảm bảo nâng cao anh ấy!

Giải trình:

.•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 byte

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

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

Cảm ơn JayCe vì đã tiết kiệm 6 byte!

Sử dụng một số phép thuật mô-đun có thể sẽ ngắn hơn, nhưng tôi khá hài lòng với điều này như một lần đầu tiên ngây thơ.


1
Đẹp ! Thủ thuật yêu thích của tôi tiết kiệm 6 byte - lấy cảm hứng từ nhận xét của bạn cho câu trả lời của tôi vào ngày khác.
JayCe

@JayCe rất đẹp và gọn gàng! Ngay cả việc sử dụng nó với quyền ưu tiên hơn %*%tôi thấy. :-) Bạn cũng có thể đặt `:`làm đối số hàm trong trường hợp bạn muốn sử dụng song song với thứ khác!
Giuseppe

Điều đó đúng - tôi luôn có xu hướng quên đi các backquote.
JayCe

5

Japt, 43 29 28 byte

Không có gì đáng ngạc nhiên, một cổng của giải pháp Dennis 'Jelly hoạt động ngắn hơn nhiều.

Xuất ra một mảng các ký tự.

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

Thử nó


Bản gốc, 42 byte

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

Thử nó

Giải trình

Å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 byte

Hy vọng sẽ có một trình biên dịch C trong tương lai để biên dịch cái này! :-)

Cảm ơn Max Yekhlakov và trần nhà cho những gợi ý.

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

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


Trong trường hợp trình biên dịch C của tương lai chỉ hiểu ASCII của BIBABOBU :-)

BIDUBIDOBOBODIBIDUBIDIBOBODIBIDOBUBUBADUBIDOBIDOBOBADIBIDOBUBIDOBADIBIDOBABIDUBOBOBADOBIDUBUBOBADABIDUBADUBIDOBIDOBIDOBODUBIDUBOBOBADIBIDUBIDOBUBODABIDUBIDIBUBODABIDOBUBUBODABUBIBUBADUBOBADOBIDUBUBUBADUBIDUBUBOBADUBOBADUBOBADABIDUBIDIBOBADUBUBODABOBADOBIDUBUBUBODABUBODABUBIDOBUBIDOBUBODUBIDUBIDOBUBODABIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBODIBOBADUBOBADUBIDOBUBUBODOBUBOBUBODUBIDUBIDOBUBODABOBABIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADABOBODIBIDOBUBUBODABUBABUBADOBUBIBOBODIBOBODABIDUBIDIBUBADOBOBADOBIDUBUBOBODABUBIDOBUBIDABUBODUBOBADOBIDUBUBOBODABUBIDUBUBADABUBODUBOBADOBIDUBUBOBODABUBIDOBUBADIBUBODUBOBADOBIDUBUBOBODABUBADIBUBIDABUBODUBUBIBUBADOBUBUBUBADOBUBIDIBOBADUBIDUBIDIBOBADOBUBUBUBADOBUBOBUBADOBUBABUBADUBIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBADABUBADUBIDUBODA

(Bộ mã hóa Hãy thử trực tuyến! )



Đề xuất c=printf(&v),v=0thay vìv=!putchar(v),c=1
trần mèo

4

JavaScript (Node.js) , 131 128 byte

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,'%$&'))

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Phiên bản thay thế, cũng có 131 byte:

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,'%$&'))

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Chỉnh sửa: Lưu 3 byte nhờ @Shaggy.


1
Sử dụng unescape()là một ý tưởng tốt đẹp.
Arnauld

indexOf-> searchđể lưu một byte.
Xù xì

Ngoài ra, có vẻ như bạn không cần gán RegEx cho r.
Xù xì

@Shaggy Rất tiếc, đó là phần còn lại từ lần lặp trước. Cảm ơn!
Neil


4

Scala , 305 byte

Chà, tôi khá chắc chắn rằng điều này có thể được đánh ra. Nhưng nó vẫn tồn tại. Mất chữ thường. fin ra kết quả trong thiết bị xuất chuẩn.

EDIT: -8 chars nhờ tôi không bị câm nữa (dấu cách); -13 ký tự nhờ vào miệng núi lửa 2150

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

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


Bạn có thể thay thế dropRight(1)bằng init, Seq("").drop(1)bằng Seq[String]()map(b=>a+b)bằngmap(a+_)
crater2150

@ crater2150 cảm ơn! trình biên dịch của tôi không muốn map(a+_)làm việc nhưng tôi biết tôi có thể làm điều đó. cảm ơn vì những lời khuyên khác
V. Courtois




3

APL Dyalog, 74 72 byte

Giải pháp cấp độ mới bắt đầu trong Dyalog APL (mới bắt đầu học cách này vài ngày trước!). Xác định một dfn có một đối số đúng (đầu vào). 72 ký tự, 72 byte khi sử dụng mã hóa dyalog. Dựa trên giải pháp của Emigna trong 05AB1E.

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

Chào mừng bạn đến với PPCG và đến với thế giới golf APL. Điều này thật tuyệt vời chỉ sau vài ngày học APL. Bạn có thể thưởng thức các mẹo chơi golf APL . Hãy tham gia vào APL Orchard !
Adám


2

Brain-Flak , 178 byte

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

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

Giải trình

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

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

Câu trả lời Jelly điên rồ của @Dennis (chỉ với các nội dung ít thuận tiện hơn). Vì vậy, hãy chắc chắn để nâng cao anh ấy!

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

ć¡             # 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"

Tự hỏi làm thế nào bạn bắn tỉa 3 điểm emignas. Jeebus đây là +1 phức tạp cho nỗ lực trên cổng-- chưa bao giờ sử dụng XOR hoặc chuyển đổi cơ sở đó trước đây! Sẽ ghi nhớ từ bây giờ!
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Vâng, câu trả lời của Dennis là điều mà tôi sẽ không bao giờ tự nghĩ ra .. Và trong Jelly, điều này được thực hiện hiệu quả hơn, vì câu trả lời của anh ấy là 15 byte và của tôi là 30. Tuy nhiên, chỉ cần tìm ra nó cũng đáng để đăng. mặc dù đó là một cổng. Tôi chỉ sử dụng XOR một lần và chuyển đổi cơ sở khá thường xuyên.
Kevin Cruijssen

2

Java (JDK 10) , 199 byte

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());}

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

Tín dụng


1
Bạn có thể sử dụng -~dthay vì (d+1)?
Arnauld

Đúng, cảm ơn! Tôi đã có những cái đó trong phiên bản đầu tiên của mình, sau đó tôi chơi đùa với ý tưởng sử dụng chars và khi tôi trở lại phiên bản đầu tiên của mình, tôi hoàn toàn quên nó một lần nữa. ;)
Olivier Grégoire

2

VBA (Excel), với 322 244 byte tuyệt vời

Vâng, và tôi YÊU thập lục phân. (Hiện tại chưa có phông chữ châm biếm, vì vậy tôi đang sử dụng chữ nghiêng) Tôi sẽ thêm nhận xét nếu ai đó muốn, nhưng tôi nghĩ đó là tự giải thích. Chơi golf đã xảy ra.

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

Với nhận xét:

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

Tôi thực sự đã cố gắng đưa cái này vào Cửa sổ ngay lập tức VB, nhưng dường như nó không hoạt động ở đó ... nó sẽ cắt giảm 11 ký tự mà tôi nghĩ. Tôi cũng muốn đặt câu lệnh Match vào ngoặc, nhưng điều đó gây ra lỗi im lặng mọi lúc. Trợ giúp được đánh giá cao: D


Chào mừng đến với PPCG!
Arnauld

Cảm ơn! Tôi đã ở đây được một thời gian, chưa bao giờ có thể đăng bất cứ điều gì :)
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 byte

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("");}

Không phải là tên hàm thư viện chuẩn nhất, quá lớn :(

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


1

Bình thường, 35 byte

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

Đầu ra dưới dạng một danh sách các ký tự.
Hãy thử nó ở đây

Giải trình

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

Than , 36 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

FS≡ι

Lặp lại từng ký tự đầu vào và chuyển đổi.

B⊞υ⁰

Nếu đó là một Bđẩy thì 0vào danh sách trống được xác định trước.

D⊞υ×⁴⊕⊟υ

Nếu đó là một Dgiá trị cuối cùng, hãy tăng giá trị đó, nhân lên 4và đẩy nó một lần nữa.

⊞υ⁺⊟υ⊕⌕AOUι

Mặt khác, tìm chỉ mục trong chuỗi AOU, tăng nó và thêm vào giá trị cuối cùng.

⭆⪪υ²℅↨ι¹⁶

Chia danh sách thành các cặp giá trị, giải mã làm cơ sở 16, chuyển đổi sang ASCII và in ngầm.


1

Sạch , 145 134 byte

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

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

Giải thích:


1

PHP, 119 byte

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;

giả sử đầu vào chữ hoa. Chạy như ống với -nRhoặc thử trực tuyến .

yêu cầu PHP 7.1
cho PHP cũ hơn, sử dụng substr($m,-3,1)substr($m,-1)thay vì $m[-<x>](+16 byte);
cho trẻ PHP, đặt B, XIAOIAOUtrong dấu ngoặc kép để tránh các cảnh báo (10 byte).



0

PHP, 163 byte

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

Gọi f(string $s)với chuỗi ký tự được mã hóa bibabobu thích hợp và nó sẽ in chuỗi được giải mã.


0

Python 3, 199 byte

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

Không phải là ngắn nhất nhưng không có vòng lặp.

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.