BIBABOBU kod çözücüyü golf yapalım


53

Gelecekte seyahat ederken, 2275 dolaylarında, çocuklar arasında eğlenceli bir oyun fark ettim. Büyük-büyük-büyük-büyük ebeveynlerinin ne söylediklerini anlamalarını istemiyorlarsa , BIBABOBU konuşmasını kullanırlar . Açıkçası, ya cyborg öncesi dönem beynimle hiçbir şey anlayamadım ve gerçekten aptalca hissettim (ya da teknik olarak: hissedeceğim ). Bu yüzden bir sonraki ziyaretim için bir kod çözücüye ihtiyacım var.

BIBABOBU?

Uzun süredir kullanımdan kaldırılmış olmasına rağmen, ASCII hala yaygın olarak 2275 pop kültüründe kullanılıyor ve bu dil ona dayanıyor.

Bir dize BIBABOBU-bu şekilde kodlanmış:

  • Tüm karakterleri ASCII kodlarına dönüştür.
  • Her kodun 2 basamaklı onaltılık gösterimini alın ve aşağıdaki tabloyu kullanarak bunları dönüştürün:

    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
    

Örnek

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

Bununla birlikte, karşılık gelen girdi , çocukların implant kullanmadan anlaşılmasını daha da zorlaştırmak için kullandıkları monoton tonlamayı taklit etmek için herhangi bir boşluk bırakmadan verilecektir:

"BIDIBADIBIDOBIDABIDOBODIBIDOBODIBIDOBODUBOBA"

Açıklamalar ve kurallar

  • Unutmayın, kod çözücüye değil kod çözücüye ihtiyacım var .
  • Kod çözülen karakterlerin [32 ... 126] aralığında olması garanti edilir .
  • Girişin, çift sayıda BIBABOBU kodlu onaltılık basamak içerdiği garanti edilir.
  • Girişi tam küçük harf veya tam büyük harf olarak alabilirsiniz. Karışık vakalara izin verilmez.
  • Bit klipleri bir zaman yolculuğu sırasında oldukça yaygın olduğundan , riskleri en aza indirmek için golfüdür.

Test durumları

Not: Satır beslemeleri aşağıda yalnızca biçimlendirme amaçlı kullanılmıştır. Sen edilir değil bunları işlemek gerekiyordu.

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 Bu kahrolası çocuklar yaramaz ...: - /
Arnauld

12
Bu arada, hikayeyi gerçekten pek olası bulmuyorum! Sadece bir rüya olsaydı ... evinizde CO sızıntısı olabilir mi?
Stewie Griffin

12
Ah ... Bu aynı zamanda oturma odamda gökkuşağı kullanan midillileri de açıklar!
Arnauld,

9
Biri golflü kodun biraz çevirme sıklığını azaltsa bile bit kodunun ciddiyetini (kod içinde daha az yedekleme) artırdığını iddia edebilir ... ama ne olursa olsun :) - Güzel zorluk!
JayCe

4
@JayCe Doğru. Çizgiler boyunca daha çok düşünüyordum: kod ne kadar küçükse, birden fazla kopyayı depolayarak o kadar fazlalık elde edersiniz.
Arnauld,

Yanıtlar:


15

05AB1E , 36 35 33 bayt

Mr.Xcoder sayesinde 1 bayt
kaydedildi KevinCruijssen ile 2 bayt kaydedildi

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

Çevrimiçi deneyin! veya Test Paketi olarak

açıklama

ć©¡                                 # 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çJ35 bayt için çalıştığını düşünüyorum .
Bay Xcoder

@ Mr.Xcoder: Ah, elbette. Yeniden güzel ©. Thanks :)
Emigna

Girdi her zaman 'B' ile başlayacağından -2 bayt öncüsü 'Bdeğiştirir ćve kaldırılır ¦.
Kevin Cruijssen

@KevinCruijssen: Ooh, iyi fikir. Düşünmedim ć. Teşekkürler!
Emigna

9
Şimdi şu çocuklara geri dönelim ve bakalım bunu anladılar mı!
Aaron,

14

Jöle , 26 24 23 22 20 17 15 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

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

Çevrimiçi deneyin!

Dennis'in Jelly çözümünden büyük ölçüde ilham aldı. Farklı sihirli işlevi kullanır x³ % 87 % 4ayrıca ASCII kodları haritalar IAOUBDiçin 012302.

Alternatif 75 74 bayt sürümü

Jo King sayesinde -1 bayt

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

Çevrimiçi deneyin!

Alternatif 85 bayt sürümü

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

Çevrimiçi deneyin!


(^16)>>.base(16)-1 bayt nasıl olur
Jo King



6

05AB1E (eski), 68 65 60 59 bayt

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

Giriş küçük harflidir.

Değişen @Emigna sayesinde -3 bayt dolaylı 'b¡εg>}s£olarak 'b©¡®ì.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Ayrıca, kesinlikle büyük sıkıştırılmış tellerden daha akıllıca bir şeyle golf oynayabilir. Daha sonra başka bir göz atacağım. @Emigna tarafından zaten verilen kısa cevap , bu yüzden onu oyladığına emin ol!

Açıklama:

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

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

Çevrimiçi deneyin!

JayCe'ye 6 byte tasarruf ettiğin için teşekkürler !

Bazı modüler sihir kullanmak daha kısa olabilir, ancak saf bir ilk geçiş olarak bundan çok memnunum.


1
Güzel ! Favori numaram 6 bayttan tasarruf ediyor - yorumunuzdan esinlenerek geçen günkilerin cevabını aldım.
JayCe

@JayCe çok güzel ve temiz! %*%Gördüğümden daha öncelikli olsa bile . :-) Bunu `:`başka bir şeyle birlikte kullanmak istemeniz durumunda, bir fonksiyon argümanı olarak da kullanabilirsiniz!
Giuseppe

Bu doğru - Ben her zaman geri dönüşleri unutmaya meyilliyim.
JayCe

5

Japt, 43 29 28 bayt

Şaşırtıcı olmayan bir şekilde, bir Dennis 'Jelly çözümü limanı çok daha kısa sürede sonuçlanıyor .

Bir karakter dizisi çıkarır.

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

Dene


Orijinal, 42 bayt

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

Dene

açıklama

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

Umarım gelecekte bunu derlemek için bir C derleyicisi olacaktır! :-)

Önerileriniz için Max Yekhlakov ve ceilingcat'e teşekkürler.

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

Çevrimiçi deneyin!


Geleceğin C derleyicisinin sadece BIBABOBU-ified ASCII :-) 'ı anlaması durumunda

BIDUBIDOBOBODIBIDUBIDIBOBODIBIDOBUBUBADUBIDOBIDOBOBADIBIDOBUBIDOBADIBIDOBABIDUBOBOBADOBIDUBUBOBADABIDUBADUBIDOBIDOBIDOBODUBIDUBOBOBADIBIDUBIDOBUBODABIDUBIDIBUBODABIDOBUBUBODABUBIBUBADUBOBADOBIDUBUBUBADUBIDUBUBOBADUBOBADUBOBADABIDUBIDIBOBADUBUBODABOBADOBIDUBUBUBODABUBODABUBIDOBUBIDOBUBODUBIDUBIDOBUBODABIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBODIBOBADUBOBADUBIDOBUBUBODOBUBOBUBODUBIDUBIDOBUBODABOBABIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADABOBODIBIDOBUBUBODABUBABUBADOBUBIBOBODIBOBODABIDUBIDIBUBADOBOBADOBIDUBUBOBODABUBIDOBUBIDABUBODUBOBADOBIDUBUBOBODABUBIDUBUBADABUBODUBOBADOBIDUBUBOBODABUBIDOBUBADIBUBODUBOBADOBIDUBUBOBODABUBADIBUBIDABUBODUBUBIBUBADOBUBUBUBADOBUBIDIBOBADUBIDUBIDIBOBADOBUBUBUBADOBUBOBUBADOBUBABUBADUBIDUBIBIDUBIDABIDUBIDIBIDOBUBIDOBADIBIDOBABIDUBOBOBADIBIDUBIDOBOBADOBUBABUBIDOBOBADUBIDUBIDIBOBADABUBADUBIDUBODA

(Enkoder Çevrimiçi deneyin! )



Öner c=printf(&v),v=0yerinev=!putchar(v),c=1
ceilingcat

4

JavaScript (Node.js) , 131 128 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Alternatif sürüm, ayrıca 131 bayt:

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Düzenleme: @Shaggy sayesinde 3 bayt kaydeder.


1
Kullanımı unescape()güzel bir fikir.
Arnauld

indexOf-> searchbir bayt kaydetmek için.
Shaggy

Ayrıca, RegEx'i atamanız gerektiği gibi görünmüyor r.
Shaggy

@Shaggy Whoops, bu önceki bir yinelemeden kalan bir şey. Teşekkürler!
Neil,


4

Scala , 305 bayt

Bunun golfle atılabileceğinden eminim. Ama yine de var. Küçük harf girişi yapar. fsonucu stdout ile yazdırır.

EDIT: -8 karakter artık benim aptal olmamam sayesinde (boşluklar); Krater2150 sayesinde -13 karakter

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

Çevrimiçi deneyin!


Sen yerini alabilir dropRight(1)ile init, Seq("").drop(1)birlikte Seq[String]()ve map(b=>a+b)birliktemap(a+_)
crater2150

@ crater2150 teşekkürler! derleyicim map(a+_)çalışmak istemedi ama yapabileceğimi biliyordum. diğer ipuçları için teşekkürler!
V. Courtois




3

Dyalog APL, 74 72 bayt

Dyalog APL'de başlangıç ​​seviyesinde çözüm (bunu birkaç gün önce öğrenmeye başladım!). Bir doğru argüman alan bir dfn tanımlar (giriş). Dyalog kodlamasını kullanırken 72 karakter, 72 bayt. Emigna'nın 05AB1E'deki çözümüne dayanmaktadır.

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

PPCG'ye ve APL golf dünyasına hoş geldiniz. APL'yi öğrendikten sadece birkaç gün sonra bu şaşırtıcı. APL golf ipuçlarının tadını çıkarabilirsiniz . APL Orchard'a da katılmaktan çekinmeyin !
Adám


2

Brain-Flak , 178 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Port @Dennis 'deli Jelly cevap (sadece daha az elverişli yerleşikleri ile). Bu yüzden onu hak ettiğinden emin ol!

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

ć¡             # 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 puanını nasıl attığını merak ettim. Jeebus bu limandaki çaba için karmaşık + 1'dir - daha önce hiç XOR ya da bu temel dönüşümü kullanmadı! Bundan sonra akılda tutacak!
Magic Octopus Urn

@MagicOctopusUrn Evet, Dennis'in cevabı asla kendimle elde edemediğim bir şeydi .. Ve Jelly'te bu daha verimli bir şekilde yapılıyor, çünkü cevabı 15 bayt ve benimki 30. bir liman olmasına rağmen. XOR’u sadece bir kere kullandım, üstelik dönüşüm de oldukça sık oldu
Kevin Cruijssen

2

Java (JDK 10) , 199 bayt

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

Çevrimiçi deneyin!

Kredi


1
Eğer kullanabilir misiniz -~dyerine (d+1)?
Arnauld

Evet, teşekkürler! İlk versiyonumda olanlar vardı, sonra charyerine s kullanma fikrini kullandım ve ilk versiyonuma döndüğümde, tekrar unuttum. ;)
Olivier Grégoire

2

VBA (Excel), inanılmaz bir 322 244 bayt ile

Evet ve ben onaltılık seviyorum . (Henüz alaycı bir yazı tipi yok, bu yüzden şu an için italik kullanıyorum) Birisi isterse yorumlar ekleyeceğim, ancak bunun açıklayıcı olduğunu düşünüyorum. Golf oldu.

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

Yorumlarla:

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

Bunu VB Acil Durum Penceresine almaya çalıştım, ama sanırım orada işe yaramadı ... sanırım 11 karakter kesecek. Ayrıca Match deyimini parantez içine almak istedim, ancak bu her zaman sessiz bir hataya neden oluyor. Yardım takdir edilir: D


PPCG'ye Hoşgeldiniz!
Arnauld

Teşekkürler! Bir süredir buradayım, hiç bir şey gönderemedim :)
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")ve Not IsError(c)->IsError(c)=0
Taylor Scott

1

Haxe , 228 bayt

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

En iyisi değil, standart kütüphane fonksiyon adları çok büyük :(

Çevrimiçi deneyin!


1

Pyth, 35 bayt

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

Karakter listesi olarak çıktı verir.
Burada dene

açıklama

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

Kömür , 36 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

FS≡ι

Her giriş karakterinin üzerine gelin ve geçin.

B⊞υ⁰

E? Er bir Bsonra itme 0önceden tanımlanmış boş listeye.

D⊞υ×⁴⊕⊟υ

Eğer öyleyse D, son değeri girin, artırın, çarpın 4ve tekrar itin.

⊞υ⁺⊟υ⊕⌕AOUι

Aksi halde dizgede dizini bulun AOU, arttırın ve son değere ekleyin.

⭆⪪υ²℅↨ι¹⁶

Listeyi bir değer çiftine ayırın, 16 tabanını kodlayın, ASCII'ye dönüştürün ve örtük olarak yazdırın.


1

Temiz , 145 134 bayt

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

Çevrimiçi deneyin!

Açıklaması:


1

PHP, 119 bayt

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;

büyük harf girişi yapar. Pipe ile çalıştırın -nRveya çevrimiçi deneyin .


eski PHP için PHP 7.1 gerektirir , kullanın substr($m,-3,1)ve substr($m,-1)kullanın $m[-<x>](+16 bayt);
genç PHP, koyun B, XIAOve IAOUtırnak içinde uyarı mesajları (10 bayt) önlemek için.



0

PHP, 163 bayt

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

Çağrı f(string $s)bibabobu kodlanmış karakterlerin uygun dize ile ve deşifre dize yazdırılır.


0

Python 3, 199 bayt

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

En kısa değil ama döngüsüz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.