Bleeeet Bleeeet Bl Bleet!


18

(意味:英語からBleetへの変換)

私たちは何年もの間、ヤギを神として賞賛してきました。

しかし、英語をヤギ神の言語である「Bleet」に翻訳できなければ、彼らとコミュニケーションをとることはできません。

そこで、彼らとコミュニケーションをとるために、ヤギの活動を調査し、言語の中核であるこのパターンを取得しました。

各単語の長さについて「Bleet」と言います。つまり、3文字より長い単語の場合、「e」の長さは(長さ3)である必要があります。たとえば、「be」は「bl」になりますが、「cat」と「boat」は「blt」と「blet」になります。

どうやら、実際にはアルファベット以外の文字を「Bleet」に変更しません。私たちの調査では、「Hello、World!」Bleetには「Bleet、Bleet!」「Bleeet Bleeet」ではありません。また、ヤギはそれほど知的ではないので(攻撃はありません)、非ASCII文字や発音区別記号をまったく理解していないようです。

さあ、ヤギの神とコミュニケーションを取るための翻訳者を作る時です。

Bleeeeet(意味:例)

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
そして、アポストロフィを含む単語はどうですか?ウィルit'sなるBltBl'tまたはBl'B
ケビンCruijssen

3
それはあなた次第ですが、あなたがそれを維持するならば、私はすべての回答者に通知するでしょう。(それらを渡す:それは私だったら私はおそらく何らかの行動を許すと思うJimmy'sBleee't、単語の分離として扱う)( :Jimmy's)、Bleet'Bまたは単語の一部として扱います(Jimmy'sBleeeet)。1つを選択する必要がある場合は、6つの答えが何をするかということなので、単語区切りオプションを使用します。
ジョナサンアラン

2
これは本当に良い挑戦であり、もっとこのようにすべきです。
ダウンゴート

2
@Downgoat品質面で、またはヤギ面で?
マシュー盧

回答:


13

網膜、31バイト

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

オンラインでお試しください!

説明

T`lL`e

すべての文字を e sにます。

(?<!e)e
B

e各実行の最初をBます。

Be
Bl

ターンBeBl

e(?!e)
t

e各実行の最後をに変えtます。


T1LTステージは、あなたがそのようにすべての文字を回すことができるように、翻訳ペアを「ラップ」e
コナー・オブライエン

@ ConorO'Brien実際には小文字lではなく、1ですが、「ラップ」の意味がわかりません。音訳は、単にターゲットパターンの最後の文字を繰り返し、それがあった場合のでT`lL`ef、あなたがマップ思いaeとすべての他の文字fにはない交互に、ef
マーティンエンダー

それは悪い冗談でした。ごめんなさい
コナー・オブライエン

4

JavaScript(ES6)、79 77 74バイト

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

代替アプローチ、現在83 78バイト:

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

再帰的にできることは88バイトでした:

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

思いつきました'Blet'[i>1?2+!x[i+1]:i]が、悲しいことに同じ長さです。
ニール

@ニールええ、私はそれがそのようにすることが可能であると思ったが、私はそれが私がそれをしている方法よりもほぼ短いことに驚いた。
-ETHproductions

4

PHP、115 88 86 77 75バイト

preg_replace 配列あり(PHP 5.4以降が必要)

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

オンラインで実行するecho '<string>' | php -nR '<code>'、オンラインでテストします

壊す

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

リビジョン5:Martin Enderの正規表現チェーンで 9バイトを節約しました。
(アルファベット以外の単語文字=数字/アンダースコアの場合も修正されました。)


3

Haskell135 128バイト

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!_=[]
(""!)

オンラインでお試しください!使用法(""!) $ "some string"。正規表現がなければ、これは非常に長いことが判明しました。他のアプローチはもっと短いかもしれません。編集:@nimiのおかげで7バイトを節約しました!


1
関数の名前を変更するba、結果の文字列を構築するときすぐにそれを適用し、finalを省略できます=<<b!(l:t)|...|1<3=a b++l:""!t;b!_=a b;(""!)
ニミ

それはジミーのテストのためにオンラインで動作しませんBl'B Bleet'Bを取得
cleblanc

@cleblancこの要件は私の回答の後に追加され、現在の回答のほとんどが無効になります... OPに聞いてみましょう。
ライコニ

@ライコニそう。私はこのゲームに遅刻し、アポストロフィは特に扱いにくい例外です。
-cleblanc

2

Perl 5バイト

Martin Enderと同じ手法を使用して15バイトを節約しました Retina answer。(この答えは基本的に彼の答えの移植版です)

46バイトのコード+ -pフラグ。

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

オンラインでお試しください!


古いバージョン:62バイト:

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

そして、68バイト:

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

2

PHP、84バイト

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

PHP、117バイト

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

で1バイトを節約-1+$l=...
Titus

@タイタスいいと私はより良い解決策を見つけた
ヨルクヒュルサーマン

1
ツヴァイ・ダム-アイン・ゲダンケ。:)しかし、\blアルファベット以外の単語文字では失敗します:_we_。明示的なアサーションが必要です:(?<!l)le\b-> e(?!e)(+7バイト)についても同じ
タイタス

@Titusその間、自分の考えが間違っていたことに気づきました。ドイツ語のコメントが大好きです。
ヨルグヒュルサーマン

2

C、120 151 140 111 108 105 104 92 90のバイト

「それはジミーのテスト」のために働いている-> 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];);}

出力は、元の文字列を破壊することによる副作用になりました。

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

少なくとも今は正しいと思う

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


@DLosc私はまだ怒らずに亡くなりました。
cleblanc

2

パイソン2.7、129 118 114 109 95の 91の 88バイト

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

ただのre.subチェーン

ステップバイステップ

入力例:「ヤギの神を称賛します!


エイリアスのサブなので、繰り返し呼び出しでバイトを節約できます

import re
s=re.sub

すべての単語文字を「e」に置き換えます

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

出力: ee eeeeee eee eeee eee!

単語の境界(単語の先頭)が前にあるすべての「e」を「B」に置き換えます

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

出力: Be Beeeee Bee Beee Bee!

すべての「Be」を「Bl」に置き換えます

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

出力: Bl Bleeee Ble Blee Ble!

単語の境界が続くすべての「e」を「t」に置き換えます

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

出力: Bl Bleeet Blt Blet Blt!


PPCGへようこそ!関数が結果を出力できるようにするため、に置き換えるreturnprintバイトが節約されるはずです。
コナーオブライエン

また、rさらに3バイトを節約するバックラッシュがない場合、生の文字列から先頭を削除することができます
コナーオブライエン

ありがとう@ ConorO'Brien!私は正規表現の一部を単純化することができ(最終的にはが必要になりましたr)、95バイトになりました。提案をありがとう!
ブランドンチョウザメ

申し分なく88バイト
ブランドンスタージョン

1

ピップ、28バイト

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

入力をコマンドライン引数として受け取ります。 オンラインでお試しください!

説明

これは楽しかったです。正規表現修飾子と文字列補間を使用するようになりました。

                              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バイト

これはかなり長いことを認識しており、長さを短縮する方法についての提案を歓迎します。

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)

サイトへようこそ!あなたが作ることができるいくつかのゴルフを見ます。あなたは私たちの訪問することができますヒント Pythonでゴルフのために役立つヒントのリストのページを。
小麦ウィザード

の代わりに、x.append(y)またはあなたの場合、a(x,y)あなたはすることができますx+=y,(カンマが必要です)
チョイス

1

積み上げ、57バイト

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

オンラインでお試しください!スタックの最上部から入力を取得します。

ましょう(N)= A136412N - 2)=(5×4 N - 2 + 1)÷3の変換(Nベース4つの収量に)。

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

インデックス0..3を文字列にマッピングすると、次のようになりますBlet

a(3)= lt
a(4)= let
a(5)=リート
a(6)=リート
...

ここでB、長さを指定すると、先頭に追加することで目的の文字列が得られます。主に。一つだけのための特別なケースを処理する必要があるのn(≤私の場合は2、これは減算することによって解決されるn個の数値ブール(「真」のための1と「偽」のための0)として- 1 <2)。

答えの詳細に関して:

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


0

Java 7、201バイト

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

それに本当に満足していない、そして確かにもう少しゴルフすることができます..

説明:

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

テストコード:

ここで試してみてください。

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

出力:

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

s.split("")代わりにs.toCharArray()、私は信じているいくつかのセーブ
KritixiのLithos

@KritixiLithos試しましたが、文字列が文字であるかどうかを確認する問題があります(x=c&~32文字列でx>64&x<91は機能せず、両方とも機能しません)。ただし、分割で短くすることができる場合はお知らせください。
ケビンCruijssen

0

05AB1E、36バイト

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

オンラインでお試しください! またはテストスイートとして

説明

入力を準備します。

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

これにより['hello', ', ', 'world', '!'] 、入力用などのリストが作成されますHello, World!

リストの繰り返し:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.