Bleeeet Bleeeet Bl Bleet!


18

(의미 : 영어를 Bleet로 변환)

우리는 염소를 신으로 칭찬 해 왔습니다.

그러나 우리가 영어를 염소 신의 언어 인 '블리트 (Bleet)'로 번역 할 수 없다면, 그들과 의사 소통 할 수 없습니다.

그래서 그들과 의사 소통하기 위해 염소의 활동을 조사하고 언어의 핵심 인이 패턴을 검색했습니다.

각 단어의 길이에 대해 'Bleet'이라고 말하십시오. 즉, 3 글자보다 긴 단어의 경우 'e'의 양은 (길이 -3)이어야합니다. 'Blt'보다 짧은 단어의 경우 'Bleet'을 줄이십시오. 예를 들어 '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'sBlt또는 Bl'tBl'B?
케빈 크루이 센

3
그것은 당신에게 달려 있지만, 당신이 그것을 지키면 나는 모든 응답자에게 알릴 것입니다. (전달할 : 그것은 나를라면 나는 아마 어떤 행동을 허용 거라고 생각 Jimmy's: Bleee't단어 분리로 취급) ( Jimmy's: Bleet'B), 또는 단어의 일부로 취급 ( Jimmy's: Bleeeet). 하나를 선택해야한다면 단어 구분 기호 옵션을 사용하십시오. 왜냐하면 6 개의 답변이하기 때문입니다.
Jonathan Allan

2
이것은 정말 좋은 도전입니다. 우리는 이와 같이 더 많은 것을 가져야합니다.
Downgoat

2
@ 다운 염소 품질, 염소 같은?
Matthew Roh

답변:


13

망막 , 31 바이트

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

온라인으로 사용해보십시오!

설명

T`lL`e

모든 글자를 es 로 바꿉니다.

(?<!e)e
B

e각 런 의 첫 번째 를로 바꿉니다 B.

Be
Bl

돌려 Be으로 Bl.

e(?!e)
t

e각 런 의 마지막 을로 바꿉니다 t.


T1LT단계는 당신이 그런 식으로 모든 문자를 회전 할 수 있도록 번역 쌍을 "래핑"e
코너 오브라이언

@ ConorO'Brien 실제로 소문자 l가 아닌 소문자 1이지만 "wrap"의 의미가 무엇인지 잘 모르겠습니다. 음역은 단순히 그것이 그래서 만약, 타겟 패턴의 마지막 문자를 반복 T`lL`ef, 당신은지도 줄 ae와 모든 다른 문자 f로하지 교대, ef.
마틴 엔더

농담이 아니었다. 죄송합니다
Conor O'Brien

4

자바 스크립트 (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]냈지만 슬프게도 같은 길이입니다.
Neil

@ Neil 그래, 나는 그렇게 할 수 있다고 생각했지만, 내가하는 방식보다 거의 짧다는 것에 놀랐다.
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

하스켈 , 135128 바이트

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
기능 이름 변경 b에 대한 a결과 문자열을 구성하고 최종를 생략 할 때 즉시 적용 할 수 있습니다 당신을 =<<: b!(l:t)|...|1<3=a b++l:""!t;b!_=a b;(""!).
nimi

온라인에서 작동하지 않습니다. Jimmy 's test Bl'B Bleet'B
cleblanc

@cleblanc이 요구 사항은 내 답변 뒤에 추가되어 현재 답변 대부분을 무효화합니다.
Laikoni

@Laikoni 맞습니다. 나는이 게임에 늦게 왔고 아포스트로피는 특히 다루기 어려운 예외이다.
cleblanc

2

펄 5 , 47 바이트

Martin Ender의 Retina answer 와 동일한 기술을 사용하여 15 바이트를 절약했습니다 . (이 답변은 기본적으로 그의 답변의 포트입니다)

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+$l=...
디도

@Titus nice와 저는 더 나은 해결책을 찾았습니다
Jörg Hülsermann

1
Zwei Dumme-Gedanke에 있습니다. :) 그러나 \bl알파벳이 아닌 단어 문자에는 실패합니다 _we_. 명시 적 주장이 필요합니다 : (?<!l)l. e\b-> e(?!e)(+7 바이트) 와 동일
Titus

@Titus 그동안 내 생각이 틀렸다는 것을 스스로 알게되었습니다. 그리고 나는 당신의 독일어 의견을 좋아합니다.
Jörg Hülsermann 2016 년

2

C, 120 151 140 111 108 105 104 92 90 바이트

"It 's Jimmy 's test"-> 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 바이트를 저장하는 백래시가없는 경우 원시 문자열 에서 행간 을 제거 할 수도 있습니다.
Conor O'Brien

감사합니다 @ ConorO'Brien! 정규식 조각을 단순화 할 수 있었으며 (결국에는을 필요로 함 r) 95 바이트로 줄였습니다. 제안 해 주셔서 감사합니다!
Brandon Sturgeon

좋아, 내가 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

파이썬 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,(쉼표 필요)
Cyoce

1

스택 , 57 바이트

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

온라인으로 사용해보십시오! 스택 맨 위에서 입력을받습니다.

하자 ( N ) = A136412 ( N - 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) =하자
a (5) = leet
a (6) = leeet
...

이제 prepending B은 길이에 따라 원하는 문자열을 제공합니다. 대개. 하나의 경우 n ≤ 2 의 특수한 경우 만 처리하면됩니다 . 제 경우에는 ( n -2 <1)를 숫자 부울로 빼서 ( "true"의 경우 1, "false"의 경우 0) 해결합니다.

답변의 세부 사항은 다음과 같습니다.

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


0

자바 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 시도했지만 String이 문자인지 확인하는 문제가 있습니다 ( x=c&~32String에서 x>64&x<91작동하지 않으며 더 이상 작동하지 않습니다). 분할로 더 짧게 만들 수 있다면 알려주십시오.
케빈 크루이 센

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.