Bleeeet Bleeeet Bl Bleet!


18

(Anlamı: İngilizceyi Bleet'e Dönüştür)

Keçileri yıllardır tanrı olarak övüyoruz.

Fakat İngilizceyi Keçi Tanrısı'nın dili olan “Bleet” e çeviremezsek onlarla iletişim kuramayız.

Böylece, onlarla iletişim kurmak için keçilerin faaliyetlerini araştırdık ve dilin çekirdeği olan bu örüntüyü elde ettik.

Her kelimenin uzunluğu için 'Bleet' deyin. Bu, 3 harften daha uzun kelimeler için 'e'nin (uzunluk-3) olması gerektiği anlamına gelir.' Blt 'den daha kısa kelimeler için' Bleet 'i kesmelisiniz. Örneğin, 'be' 'bl' olur, ancak 'cat' ve 'boat' 'blt' ve 'blet' olur.

Göründüğü gibi, aslında alfabe dışı karakterleri 'Bleet' olarak değiştirmezler. Araştırmalarımız 'Merhaba, Dünya!' Bleet'e 'Bleet, Bleet!' 'Bleeet Bleeet' değil. Ayrıca, keçiler o kadar zeki değil (suç yok), bu yüzden ascii olmayan karakterleri veya aksanları hiç anlamıyorlar.

Şimdi, keçi tanrılarıyla iletişim kurmak için bir çevirmen yapma zamanı.

Bleeeeet (Anlamı: Örnekler)

Hello, World! => Bleet, Bleet!
lorem ipsum dolor sit amet. => Bleet Bleet Bleet Blt Blet.
We praise the Goat God! => Bl Bleeet Blt Blet Blt!
I have a pen => B Blet B Blt
0123456789_ => 0123456789_
0te_st1 => 0Bl_Bl1


1
Kesme işareti içeren kelimeler ne olacak? Will it'shaline Bltya Bl'tya Bl'B?
Kevin Cruijssen

3
Bu size bağlı, ama eğer tutarsanız her cevaplayanı bilgilendiririm. (Onları geçmek: Ben olsaydım ben muhtemelen herhangi davranışına izin düşünüyorum Jimmy's: Bleee't, kelime ayırmaları olarak onları tedavi) ( Jimmy's: Bleet'B) ya da kelimelerin parçası olarak onları tedavi ( Jimmy's: Bleeeet). Birini seçmek zorunda olsaydım, 6 cevaplama yaptığı için ayırıcı seçeneği ile giderdim.
Jonathan Allan

2
Bu gerçekten iyi bir meydan okuma, daha çok böyle olmalıyız.
Downgoat

2
@Downgoat kalite açısından mı yoksa keçi açısından mı?
Matthew Roh

Yanıtlar:


13

Retina , 31 bayt

T`lL`e
(?<!e)e
B
Be
Bl
e(?!e)
t

Çevrimiçi deneyin!

açıklama

T`lL`e

Tüm harfleri es'ye çevirin .

(?<!e)e
B

eHer koşuda ilkini çevirin B.

Be
Bl

Çevirin Beiçine Bl.

e(?!e)
t

eHer koşuda sonuncuyu dönüştürün t.


T1LTsahne size böyle tüm harfleri çevirmek, böylece çeviri çiftleri "sarar"e
Conor O'Brien

@ ConorO'Brien Aslında bir küçük harf ldeğil 1, ama "şal" ile ne demek istediğinden emin değilim. Transliterasyon sadece öyleydi eğer öyleyse, hedef desende son karakteri tekrarlar T`lL`ef, eşlemek istiyorum aiçin eve tüm diğer harfler fdeğil dönüşümlü, eve f.
Martin Ender

kötü bir şakaydı. Üzgünüz
Conor O'Brien

4

JavaScript (ES6), 79 77 74 bayt

s=>s.replace(/[A-Z]+/gi,x=>x.replace(/./g,(_,i)=>'Bl'[i]||'et'[+!x[i+1]]))

Alternatif yaklaşım, şu anda 83 78 bayt:

s=>s.replace(/[A-Z]+/gi,x=>`Bl${'e'.repeat((l=x.length)>3&&l-3)}t`.slice(0,l))

Özyinelemeyle yapabileceğim en iyi şey 88 bayt idi:

f=([c,...s],i=0,q=/^[A-Z]/i)=>c?q.test(c)?('Bl'[i]||'te'[+q.test(s)])+f(s,i+1):c+f(s):''

Ben geldim 'Blet'[i>1?2+!x[i+1]:i]ama ne yazık ki aynı uzunlukta.
Neil

@Neil Evet, bu şekilde yapmanın mümkün olacağını düşündüm, ama yaptığımdan neredeyse daha kısa olduğuna şaşırdım.
ETHproductions 10:17

4

PHP, 115 88 86 77 75 bayt

preg_replace dizilerle (PHP 5.4 veya üstünü gerektirir)

echo preg_replace(["#[a-z]#i","#(?<!e)e#",_Be_,"#e(?!e)#"],[e,B,Bl,t],$argn);

Çevrimiçi olarak çalıştırın echo '<string>' | php -nR '<code>'veya test edin .

Yıkmak

SEARCH      EXPLANATION             REPLACE     EXAMPLE
            original string                     Hello
[a-z]       every letter            e           eeeee
(?<!e)e     first letter            B           Beeee
Be          first two letters       Bl          Bleee
e(?!e)      last letter if still e  t           Bleet

Revizyon 5: Martin Ender regex zinciri ile 9 bayt kurtardı .
(Bu aynı zamanda alfabetik olmayan kelime karakterleri = rakamlar / alt çizgiler içeren durumları da düzeltti.)


3

Haskell , 135128 bayt

b"e"="B"
b"ee"="Bl"
b('e':_:_:e)="Bl"++e++"t"
b e=e
e!(l:t)|elem l$['a'..'z']++['A'..'Z']=('e':e)!t|1<3=b e++l:""!t
e!_=[]
(""!)

Çevrimiçi deneyin! Kullanımı (""!) $ "some string". Regexes olmadan, bu oldukça uzun olduğu ortaya çıktı, belki başka bir yaklaşım daha kısadır. Düzenleme: @nimi sayesinde 7 bayt kaydedildi!


1
Fonksiyonunu yeniden adlandırma biçin asonuç dizesi inşa ve son atladığınızda hemen uygulayabilirsiniz size =<<: b!(l:t)|...|1<3=a b++l:""!t;b!_=a b;(""!).
nimi

It's Jimmy's testi için çevrimiçi çalışmıyor Bl'B Bleet'B'yi alıyorum
cleblanc

@cleblanc Bu gereksinim cevabımdan sonra eklendi ve mevcut cevapların çoğunu geçersiz kılıyor ... OP'ye sorayım.
Laikoni

@Laikoni Doğru. Bu oyuna geç geldim ve kesme işareti ele alınması özellikle zor bir istisnadır.
cleblanc

2

Perl 5 , 47 bayt

Martin Ender Retina cevabı ile aynı tekniği kullanarak 15 bayt tasarruf etti . (Bu cevap temel olarak cevabının bir limanıdır)

46 bayt kod + -pbayrak.

s/\pl/e/g;s/(?<!e)e/B/g;s/Be/Bl/g;s/e(?!e)/t/g

Çevrimiçi deneyin!


Eski versiyonlar: 62 bayt:

s/\pl+/$l=length$&;$_=Bl.e x($l-3).t;chop while$l<y%%%c;$_/ge

Ve 68 bayt:

s%\pl+%$_=$&;s/./B/;s/.\K./l/;s/(?<=..).(?=.)/e/g;s/..\K.$/t/;$_%ge

2

PHP, 84 Bayt

<?=preg_replace(["#[a-z]#i","#(?<!l)l#","#(?<=l)l#","#e(?!e)#"],[l,B,e,t],$argv[1]);

PHP, 117 Bayt

<?=preg_replace_callback("#[a-z]+#i",function($m){return substr(str_pad(Bl,-1+$l=strlen($m[0]),e).t,0,$l);},$argv[1]);

Bir byte ile -1+$l=...
Titus

@Titus güzel ve ben daha iyi bir çözüm buldum
Jörg Hülsermann 10:17

1
Zwei Dumme - ein Gedanke. :) Ama \blalfabetik olmayan kelime karakterleri için başarısız: _we_. Sen açık bir iddiayı gerekir: (?<!l)l. Aynı e\b-> e(?!e)(+7 bayt)
Titus

@Titus Bu arada, düşüncemin yanlış olduğunu kendim fark ettim. Ve Alman yorumunu seviyorum.
Jörg Hülsermann

2

Cı, 120 151 140 111 108 105 104 92 90 bayt

"Bu Jimmy's testi" için çalışıyor -> Bl'B Bleet'B Blet

j;f(char*m){for(;*m=!isalpha(*m++)?j=0,*(m-1):"*Blet"[isalpha(*m)?j^3?++j:j:j>1?4:++j];);}

Çıktı artık orijinal dizeyi yok ederek bir yan etkidir.

main(c,v)char**v;{
    char test[] = "The End is near Fellows!";
    f(test);puts(test);
    char test2[] = "We praise the Goat God!";
    f(test2);puts(test2);
    char test3[] = "It's Jimmy's test";
    f(test3);puts(test3);
    char test4[] = "0te_st1";
    f(test4);puts(test4);
    char test5[] = "I have a pen";
    f(test5);puts(test5);
    char test6[] = "_0123456789_";
    f(test6);puts(test6);
}

En azından şimdi doğru olduğunu düşünüyorum

Blt Blt Bl Blet Bleeeet!
Bl Bleeet Blt Blet Blt!
Bl'B Bleet'B Blet
0Bl_Bl1
B Blet B Blt
_012345678_


@DLosc Henüz kızmadım ve öldüm.
cleblanc

2

Python 2.7, 129 118 114 109 95 91 88 bayt

import re
s=re.sub
def f(i):print s(r"e\b","t",s("Be","Bl",s(r"\be","B",s("\w","e",i))))

Sadece bir re.subzincir

Adım adım

Örnek girdi: " Keçi Tanrısını övüyoruz! "


Takma ad alt, böylece tekrarlanan çağrılarda bayt kaydedebiliriz

import re
s=re.sub

Tüm kelime karakterlerini "e" ile değiştir

s("\w","e",i)

Çıktı: ee eeeeee eee eeee eee!

Öncesinde bir sözcük sınırı (sözcüğün başlangıcı) olan tüm "e" leri "B" ile değiştir

s(r"\be","B",s("\w","e",i))

Çıktı: Be Beeeee Bee Beee Bee!

Tüm "Be" ifadelerini "Bl" ile değiştirin

s("Be","Bl",s(r"\be","B",s("\w","e",i)))

Çıktı: Bl Bleeee Ble Blee Ble!

Ardından "t" ile başlayan kelime sınırlarını izleyen tüm "e" leri değiştirin

s(r"e\b","t",s("Be","Bl",s(r"\be","B",s("\w","e",i))))

Çıktı: Bl Bleeet Blt Blet Blt!


PPCG'ye Hoşgeldiniz! Biz bu yüzden değiştirilmesi, fonksiyonlar sonuçlarını yazdırmak için izin returnile printbir byte kaydetmek gerekir.
Conor O'Brien

Ayrıca, rbaşka bir 3 bayt tasarruf eden herhangi bir boşluk yoksa ham dizelerden liderleri kaldırabilirsiniz
Conor O'Brien

Teşekkürler @ ConorO'Brien! Regex'in bir parçasını basitleştirebildim (bu da bir ihtiyaç duydu r) ve 95 bayta indirdim. Önerin için teşekkürler!
Brandon Sturgeon

Tamam 88 bayta indirdim ve sanırım burada yapabileceğim en iyi şey bu
Brandon Sturgeon

1

Pip , 28 bayt

aR+XA{Y'eX#a-3\"Bl\yt\"@<#a}

Girdiyi komut satırı bağımsız değişkeni olarak alır. Çevrimiçi deneyin!

açıklama

Bu eğlenceliydi - regex değiştiricileri ve string enterpolasyonunu kullanmalıydım.

                              a is 1st cmdline arg; XA is the regex `[A-Za-z]` (implicit)
aR                            In a, replace
   XA                          the regex XA
  +                            wrapped in (?:  )+
     {                     }  with this callback function:
          #a-3                 Length of argument - 3
       'eX                     Repeat e that many times (empty string if #a-3 is negative)
      Y                        Yank that string into the y variable
              \"Bl\yt\"        An escaped string, which interpolates the value of y
                       @<#a    Take first len(a) characters
                              After the replacement, the string is autoprinted

1

Python 3, 271 bayt

Bunun oldukça uzun olduğunun farkındayım ve uzunluğun nasıl azaltılacağı ile ilgili önerileri memnuniyetle karşılıyorum.

def f(s):
 b=[];t='';f=[];a=list.append
 for c in s:
  if c.isalpha():t+='e'
  else:
   if t:a(b,t);t=''
    a(b,c)
 if t:a(b,t)
 for i in b:
  i=[*i]
  if i[0]=='e':
   i[0]='B';i[-1]=[i[-1],'t'][len(i)>2]
   if len(i)>2:i[1]='l'
  a(f,''.join(i))
 return ''.join(f)

Siteye Hoşgeldiniz! Yapabileceğin birkaç golf görüyorum. Python'da golf için faydalı ipuçlarının bir listesi için ipuçları sayfamızı ziyaret edebilirsiniz .
Rock Garf Hunter Post

x.append(y)senin yerine ya da senin durumunda, a(x,y)yapabilirsin x+=y,(virgül gerekir)
Cyoce

1

yığınlanmış , 57 bayt

'\l+'{!n size 2-:4\^5*1+3/\1<-4 tb 0\,'Blet'\#''join}repl

Çevrimiçi deneyin!Yığının üstünden girdi alır.

Let bir ( n ) = A136412 ( n - 2) = (5 x 4 N - 2 + 1) ÷ 3. dönüştürme bir ( n tabanı 4 verimleri için):

a (3) = 13 4 
a (4) = 123 4 
a (5) = 1223 4 
a (6) = 12223 4
...

Endeksleri 0..3'ü dizeyle eşleme Blet elde ederiz:

a (3) = lt
a (4) = hadi
a (5) = leet
a (6) = leeet
...

Şimdi, prepending Bbize uzunluk olarak istenen dizeyi verir. Çoğunlukla. Bir kişinin n ≤ 2 için özel durumları ele alması gerekir . Benim durumumda, bu, sayısal bir boole ("true" için 1 ve "false" için 0) çıkarılarak ( n - 2 <1) çıkarılarak çözülür .

Cevabın ayrıntılarına gelince:

'\l+'{! ... }repl
             repl    replace all
'\l+'                alphanumeric strings ("letters")
     {!     }        applying this function to the result.


0

Java 7, 201 bayt

String c(String s){String r="",z="e([^e]|$)";char p=0;int x;for(char c:s.toCharArray()){x=c&~32;p=x>64&x<91?p==66?'l':p>100&p<109?'e':66:c;r+=p;}return r.replaceAll("l"+z,"lt$1").replaceAll(z,"et$1");}

Gerçekten memnun değil ve kesinlikle biraz daha golf olabilir ..

Açıklama:

String c(String s){               // Method with String parameter and String return-type
  String r="",                    //  The return-String
         z="e([^e]|$)";           //  Partial regex String that's used twice ('e' followed by non-'e' or nothing)
  char p=0;                       //  The previous character
  int x;                          //  Another temp value
  for(char c : s.toCharArray()){  //  Loop over the characters of the input String
    x = c&~32;                    //   Make every lowercase character uppercase (this returns an integer, hence the integer temp value, which is shorter than a cast to char)
    p = x>64 & x<91 ?             //   If the current character is a letter:
         p == 66 ?                //    And if the previous character is 'B':
          'l'                     //     Set the character value to 'l'
         : p>100&p<109 ?          //    Else if the previous character is either an 'e' or 'l':
            'e'                   //     Set the character value to 'e'
           :                      //    Else:
            66                    //     Set the character value to 'B'
         :                        //   Else (not a letter):
          c;                      //    Set the character to the current character
    r += p;                       //   Append the result-String with this character
  }                               //  End loop
  return r                        //  Return the result-String
    .replaceAll("l"+z,"lt$1")     //   After we've replaced all occurrences of "le." with "lt." (where "." can be anything else, including nothing at the end of a line)
    .replaceAll(z,"et$1")         //   And also replaced all occurrences of "ee." with "et." (where "." can again be anything else)
}                                 // End of method

Test kodu:

Burada deneyin.

class M{
  static String c(String s){String r="",z="e([^e]|$)";char p=0;int x;for(char c:s.toCharArray()){x=c&~32;p=x>64&x<91?p==66?'l':p>100&p<109?'e':66:c;r+=p;}return r.replaceAll("l"+z,"lt$1").replaceAll(z,"et$1");}

  public static void main(String[] a){
    System.out.println(c("Hello, World!"));
    System.out.println(c("lorem ipsum dolor sit amet."));
    System.out.println(c("We praise the Goat God!"));
    System.out.println(c("I have a pen"));
    System.out.println(c("0123456789_"));
    System.out.println(c("0te_st1"));
  }
}

Çıktı:

Bleeet, Bleeet!
Bleeet Bleeet Bleeet Blt Bleet.
Bl Bleeeet Blt Bleet Blt!
B Bleet B Blt
0123456789_
0Bl_Bl1

s.split("")yerine s.toCharArray()inanıyorum bazı kurtarır
Kritixi Lithos

@KritixiLithos Ben denedim, ama sonra Dize bir harf olup olmadığını kontrol sorunu var ( x=c&~32bir String üzerinde çalışmaz ve x>64&x<91her ikisi de artık çalışmaz). Eğer bölünme ile daha kısa yapabilirseniz, bana bildirin.
Kevin Cruijssen

0

05AB1E , 36 bayt

lDAsSå.¡€g£vyAySåPigÍ<'e×"Blÿt"yg£}J

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

Girişi hazırlayın:

lD                                    # convert input to lower-case and duplicate
  As                                  # push lower-case alphabet and swap input to the top
    Så                                # check each char in input for 
                                      # membership in the alphabet
      .¡                              # split into chunks of equal elements
        €g                            # get length of each chunk
          £                           # split input into chunks of those lengths

Bu ['hello', ', ', 'world', '!'] giriş için bir liste oluştururHello, World!

Listede yineleme:

v                          # for each element in the list
 y                         # push current element
  AySåPi               }   # if all members of current element are letters
        gÍ<'e×             # repeat string "e" len(element)-3 times
              "Blÿt"       # replace "ÿ" with the e's in the string "Blÿt"
                    yg£    # take the first len(element) chars of the string
                        J  # join to string
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.