Progruzzle & Colf


76

#brexit 또는 #brangelina ? 와 같은 멋진 트위터 해시 태그를 만드는 것을 본 적이 있습니까? 이 골프는 당신을위한 것입니다.


두 개의 문자열 A & B를 입력으로 받아들이고 다음 알고리즘에 따라 병합하는 프로그램을 작성하십시오.

  1. nA에있는 모음 그룹의 수를 보자 (예 : britain2 개의 모음 그룹 : i위치 3 및 ai위치 5).
    • n = 1 인 경우 : 첫 번째 모음 그룹 위치에서 시작하여 A를 자릅니다 (예 : bill=> b)
    • n> 1 인 경우 : n-1모음 그룹 위치 에서 시작하여 A를 자릅니다 (예 : programming=> progr, britain=> br)
  2. B의 시작 부분에서 모든 자음을 제거하십시오 ( jennifer=> ennifer)
  3. 수정 된 A & B를 연결

모음은 aeiou; 자음은 bcdfghjklmnpqrstvwxyz입니다.

입력

입력 문자열이 소문자이고 적어도 하나의 모음과 하나의 자음을 포함한다고 가정 할 수 있습니다.

brad + angelina      => brangelina
britain + exit       => brexit
ben + jennifer       => bennifer
brangelina + exit    => brangelexit
bill + hillary       => billary
angelina + brad      => angelad
programming + puzzle => progruzzle
code + golf          => colf
out + go             => o

65
새로운 테스트 사례? donald trump.
Stewie Griffin

5
이것들은 본질적으로 portmanteaus 입니다.
mbomb007


1
@ETHproductions 이것은 다음과 같은 다양한 조합을 생성하는 것으로 보입니다.Django + Angular = Djular
Pureferret

"n-1 모음 그룹 위치"
l4m2

답변:


24

루비, 44 43 40 + 1 = 41 바이트

-p플래그의 경우 +1 바이트 STDIN에서 공백으로 구분 된 입력을받습니다.
Martin Ender 덕분에 -1 바이트
histocrat 덕분에 -2 바이트

sub /([aeiou]+([^aeiou]*)){,2} \g<2>/,""

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

GNU sed, 39 37 + 1 = 38 바이트

-E플래그의 경우 +1 바이트 STDIN에서 공백으로 구분 된 입력을받습니다.
Martin Ender 덕분에 -1 바이트

s/([aeiou]+[^aeiou]*){,2} [^aeiou]*//

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

문자 그대로 동일한 솔루션이므로 이것을 별도의 답변으로 게시하지 마십시오.


좋은 정규식! 내 JS 답변에 일부를 사용하면 될까요?
ETHproductions

그래, 미쳐
Jordan

3
[^aeiou]하위 표현식 으로 캡처하여 정규식을 조금 더 골프화 할 수 있습니다 ./([aeiou]+([^aeiou]*)){,2} \g<2>/
histocrat


1
@Anko 이 답변의 "특별 호출"을 참조하십시오 . TL; DR : 기본 호출 외에 바이트 만 계산합니다. Ruby의 기본 호출은 ruby -e "..."입니다. 이를 위해 ruby -pe "..."는 1 바이트 만 추가합니다.
Jordan

12

MATL, 31 30 바이트

t13Y2XJmFwhdl=fql_):)itJmYsg)h

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

설명

t       % Implicitly grab the input and duplicate it
13Y2    % Push the string literal 'aeiouAEIOU'
XJ      % Store this in clipboard J for later use
m       % Check which characters from the input are vowels (true for vowel)
Fwh     % Prepend FALSE to this logical array
dl=     % Compute the difference and find where we went from not-vowel to vowel
f       % Find the indices of these transitions
q       % Subtract 1 to get the location of the last consonant in each transition
l_)     % Get the next-to-last one of these
:)      % Grab the first string up to this location

% Now for the second component!

it      % Explicitly grab the input and duplicate
J       % Retrieve the string literal 'aeiouAEIOU' from clipboard J
m       % Find where the vowels are (true for vowel)
Ys      % Compute the cumulative sum along the array. The result will be 0
        % for all characters before the first vowel and non-zero after
g)      % Convert to logical and use this as an index so any characters
        % after the first value are retrieved

% Now to combine them

h       % Horizontally concatenate the first and second pieces together
        % Implicitly display the result

1
나는 항상 행복한 코드를
찬성했다

12

자바 스크립트 (ES6), 81 73 72 바이트

@Jordan 덕분에 8 바이트 절약, @DavidConrad 덕분에 1 절약

a=>b=>a.match(/.*?(?=(?:[aeiou]+[^aeiou]*){1,2}$)/)+b.match(/[aeiou].*/)

.match배열을 array+array반환 하더라도 배열 의 내용이 연결된 문자열을 반환합니다 (예 [0]+[1]:) "01".

테스트 스 니펫

Jordan의 우수한 Ruby 솔루션은 JS에서 53 바이트입니다.

x=>x.replace(/([aeiou]+[^aeiou]*){1,2} [^aeiou]*/,"")

어쩌면 일치 비트를 버리고 교체를 사용할 수 있습니까?
Conor O'Brien

@ ConorO'Brien 요르단의 답변을 훔치는 느낌 : /
ETHproductions

당신은 말 그대로 내 마음을 읽었습니다. 그렇습니다, 사실입니다
Conor O'Brien

1
카레 는 1 바이트 (a,b)=>a=>b=>절약합니다.
David Conrad

7

젤리 , 23 22 바이트

eۯcT
ǵḟ‘-ị’
Ç⁸ḣ⁹ÑḢ⁹ṫ

TryItOnline

어떻게?

eۯcT    - Link 1, vowel indexes: s   e.g. "colouring"
  Øc     - yield vowels, "AEIOUaeiou"
e€       - in for each                     [0,1,0,1,1,0,1,0,0]
    T    - truthy indexes (1-based)        [2,4,5,7]

ǵḟ‘-ị’  - Link 2, n-1th or only vowel group index start - 1: s
 µ       - monadic chain separation
Ç        - call last link (1) as a monad   [2,4,5,7]
   ‘     - increment                       [3,5,6,8]
  ḟ      - filter out                      [2,4,7]
    -    - -1
     ị   - index value                     [4]
               (Jelly is 1-based and has modular indexing,
                so the last but one item is at index -1,
                and when there is only 1 item in the list it is also at index -1)
      ’  - decrement                       [3]

Ç⁸ḣ⁹ÑḢ⁹ṫ - Main link: a, b                      e.g. "colouring", "pencils"
Ç        - call last link (2) as a monad with a      [3]
 ⁸       - link's left argument, a
  ḣ      - head a[:y]                                "col"
   ⁹  ⁹  - link's right argument, b
    Ñ    - call next link (1) as a monad                          [2,5]
     Ḣ   - pop head                                               [2]
       ṫ - tail b[y-1:]                                           "encils"
         - implicit print                            "colencils"

아름답게 설명했다!
Pureferret

5

PowerShell v2 +, 76 바이트

param($n,$m)($n-replace'([aeiou]+[^aeiou]*){1,2}$')+($m-replace'^[^aeiou]*')

분명히 이것은 인기있는 정규 표현식입니다 ... ;-)

-replace연산자를 사용하여 적절한 조각을 뽑은 다음 결과를 함께 문자열로 연결합니다. $문자열의 끝을 당길 수 있도록 첫 번째 에 a 를 더하고 ^, 문자열의 앞쪽을 당길 수 있도록 두 번째에 a 를 추가 합니다.


4

망막 , 35 바이트

([aeiou]+[^aeiou]*){1,2} [^aeiou]*

온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 활성화합니다.

첫 번째 줄에서 정규식과 일치하는 항목을 모두 제거하면됩니다.


1
모음과 모음이 아닌 클래스를 추가 할 계획이 있습니까? ;-)
ETHproductions

@ETHproductions 내 정규 표현식을 구현하기 위해 귀찮게 (또는 적어도 .NET 정규 표현식으로 변환 할 수 있도록 토큰 화) 할 수 있다면 반드시! : P
Martin Ender

루비는 패턴 역 참조 (다른 문자 시퀀스와 일치 할 수있는 동일한 패턴)를 수행 할 수 있습니다. 이것들은 여기서 유용 할 것입니다. 예를 들어, 일치하는 괄호는 /^((\(\g<1>\))*)$/Ruby에서 일치합니다 .
John Dvorak

1
@JanDvorak 너무 나쁜 Retina는 .NET으로 작성되었습니다. ;) 나는 그것을 github.com/ltrzesniewski/pcre-net 과 번들로 묶어 풍미를 전환 할 수는 있지만 아직 그것에 도달하지 않았으며 일부 다른 기능은 점점 더 .NET 관련 일치 동작에 의존하고 있습니다.
Martin Ender

1
.net 특정 동작을 삭제하고 Ruby로 모든 것을 다시 쓸 시간입니까? 루비는 어쨌든 더 낫다 :-)
John Dvorak

4

계피 껌, 23 바이트

0000000: 64d3 884e 4ccd cc2f 8dd5 8e8e 8330 b434  d..NL../.....0.4
0000010: b108 d92b c0d9 00                        ...+...

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

설명

이에 압축 해제 d([aeiou]+[^aeiou]*)([aeiou]+[^aeiou]*)? [^aeiou]*하는 d것을 정규식 일치 아무것도 eletes. (요르단의 골퍼 d([aeiou]+[^aeiou]*){,2} [^aeiou]*는 반복 할 요소가 없기 때문에 24 바이트로 압축합니다.)


겠습니까 d[aeiou]+[^aeiou]*[aeiou]*[^aeiou]* [^aeiou]*어떤 짧아?
ETHproductions

@ETHproductions 나는 그것을 시도했다, 그것은 같은 바이트 수였다 :(
spaghetto

3

PHP, 95 바이트

$t="aeiou]";echo($p=preg_filter)("#([$t+[^$t*){1,2}$#","",$argv[1]).$p("#^[^$t*#","",$argv[2]);

preg_filter 대신 preg_match 사용 110 바이트

$t="aeiou]";($p=preg_match)("#(.*?)([$t+[^$t*){1,2}$#",$argv[1],$m);$p("#[$t.*#",$argv[2],$n);echo$m[1].$n[0];

1
+대신 사용할 수 있습니다 {1,2}.
Titus

더 중요한 @Titus 1 경우에 대한 버그를 제거하는 것이었다 지금은 골프를 아래에 시도 할 수 있습니다
요 르그 Hülsermann

$v=aeiou;3을 더 절약하기 위해 사용하십시오 .
Titus

@Titus 나는 같은 아이디어를 가지고 있었지만 약간의 변형이있었습니다. 감사합니다
Jörg Hülsermann

3

루아, 66 바이트

$ cat merge.lua
print(((...):gsub(("[]+[^]*[]*[^]*+[^]*"):gsub("]","aeiou]"),"")))
$ lua merge.lua brad+angelina
brangelina
$ lua merge.lua programming+puzzle
progruzzle

2

펄 5, 39 바이트

-pe대신 38, 1-e

s/([aeiou]+[^aeiou]*){1,2} [^aeiou]*//

모자 끝.


내부에 연결된 sed 답변과 동일하지만 펄에도있을 수 있습니다.
msh210


2

Lithp , 65 바이트

#X::((replace X (regex "([aeiou]+[^aeiou]*){1,2} [^aeiou]*") ""))

이것은 기본적으로 Lisp-ish 함수형 프로그래밍 언어에서 위의 JavaScript 답변 포트입니다.

사용법 예 :

(
    % Note, you can define this as a function, or assign it to a variable
    % and use the call function instead.
    (def f #X::((replace X (regex "([aeiou]+[^aeiou]*){1,2} [^aeiou]*") "")))
    (print (f "programming puzzle"))
)

아직 온라인 통역사가 없습니다. 곧 제공하겠습니다. 어렵지 않습니다. 제 언어는 JavaScript로 작성되었습니다.

대신,이 퍼즐 솔루션은 제 언어의 실례로 구현되었습니다. 다음 명령으로 실행할 수 있습니다.

node run.js l_src/progruzzle-colf.lithp



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.