그쪽으로 모음을 쓸어 내십시오!


18

참고 : 제목이 의도적으로 철자가 틀 렸습니다.

문자열이 주어지면 두 단어마다 첫 번째 모음을 바꾸십시오. 이 도전에서, y는 모음으로 간주됩니다.

예를 들어, "Great day sir"라는 입력이 주어지면 :

1. Input: "great day sir"
2. Identify pairs of words: "[great day] [sir]" (No word for sir to pair with)
3. Identify the first vowel runs in each word: "[gr[ea]t d[ay]] [s[i]r]"
4. Swap the vowel runs in each pair: "[gr[ay]t d[ea]] [s[i]r]"
5. Return/print: "grayt dea sir"

길이가 다른 모음 런이 있으면 여전히 전체 런을 교체합니다. 단어에 모음이 두 개 이상 있으면 여전히 첫 번째 모음 만 바꿉니다. 한 쌍의 단어 중 첫 번째 또는 두 번째 단어에 모음이 없으면 모음을 해당 단어로 교체하지 않습니다.

입력은 알파벳 문자 하나와 문자 공간 또는 다른 상수 구분 기호로만 구성되어 있다고 가정 할 수 있습니다.

표준 I / O 방법, 표준 허점이 적용됩니다. 무엇이든 선행 / 후행은 괜찮습니다.

테스트 사례 :

Input -> Output

"great day sir" -> "grayt dea sir"
"ppcg is the best" -> "ppcg is the best" (When there is no vowel to swap, don't swap vowels."
"this is a test case" -> "this is e tast case"
"loooooooooooooong word" -> "long woooooooooooooord"
"great night" -> "grit neaght"
"anything goes" -> "oenything gas"
"qwrtpsdfghjklzxcvbnm aaaaaaaa hi there" -> "qwrtpsdfghjklzxcvbnm aaaaaaaa he thire"
"this is a long test case in case you could not tell" -> "this is o lang tast cese an cise ou cyould net toll"

1
삭제 된 게시물을 볼 수있는 사용자를 위해 샌드 박스 게시물이 여기 있었습니다.
동지 SparklePony

1
첫 단어에 모음이 없으면 두 번째 단어와 세 번째 단어의 모음을 바꾸어도 괜찮습니까? 아니면 모음이 두 단어로만 바뀔 수 있습니까? 예를 들어 또는 ? ppcg is awesome가 되어야합니다 . ppcg is awesomeppcg as iwesome
DJMcMayhem

@DJMcMayhem 모음은 두 단어로만 바꿀 수 있습니다. 편집하겠습니다.
동지 SparklePony

모음이 실행 되고 바뀌기 때문에에 대한 출력은 this is a long test case in case you could not tell이어야 한다고 생각합니다 . this is o lang tast cese an cise ou cyould net tollyouou
Bashful Beluga 2016 년

@BashfulBeluga 그래, 내 실수. 해결하겠습니다.
스파클 포니 동지

답변:


9

V , 42 , 41 바이트

ò2Eá
òͨ[aeiouy]«©¨ƒ ƒ©¨[aeiouy]«©/³²±
Íî

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

16 진 덤프 :

00000000: f232 45e1 0af2 cda8 5b61 6569 6f75 795d  .2E.....[aeiouy]
00000010: aba9 a883 2083 a9a8 5b61 6569 6f75 795d  .... ...[aeiouy]
00000020: aba9 2fb3 b2b1 0acd ee                   ../......

설명:

ò       ò                                   " Recursively:
 2E                                         "   Move to the end of two words forward
   á<cr>                                    "   And append a newline

예를 들어, 두 단어의 모든 그룹을 자체 줄에 넣습니다.

this is
a long
test case
in case
you could
not tell

이제 우리는 멋진 정규식 마술을 실행합니다.

Í                                           " Globally substitute
 ¨[aeiouy]«©                                "   A vowel (capture group 1)
            ¨<131>                          "   Followed by as few characters as possible, then a space
                   <131>©                   "   Followed by as few characters as possible (capture group 2)
                         ¨[aeiouy]«©        "   Followed by a vowel again
                                    /       " With:
                                     ³²±    "   Capture groups '3', '2', '1'
Í                                           " Remove all:
 î                                          "   Newlines

정규식은 두 모음 그룹 사이에 단어의 끝을 요구하지 않습니다. 온라인으로 사용해보십시오!
nmjcman101

@ nmjcman101 내 이전 개정판을보고 있습니까? 그것이 바로 지금 내가 가진
것이므로

내 TIO 링크가 아무것도 고치지 않고 입력을 변경했습니다. 문자를 이상하게 바꿉니다.
nmjcman101

아, 알 겠어요. 지금 수정했습니다!
DJMcMayhem

6

apt , 39 37 바이트

그들은 그것이 추악하다고 말했지만 나는 듣지 않았습니다 ...

¸ò ®efQ="%y+" ?Z£XrQZg°T fQP PÃ:ZÃc ¸

온라인으로 테스트하십시오!

설명

 ¸  ò ® efQ="%y+" ?Z£    XrQ    Zg° T fQ    P PÃ :ZÃ c ¸
UqS ò mZ{Zef"%y+" ?ZmXYZ{Xr"%y+"Zg++T f"%y+"P P} :Z} c qS
             Implicit: U = input string, such as     "abc def ghi jkl mno"
UqS          Split on spaces, splitting into words.  ["abc","def","ghi","jkl","mno"]
ò            Group into runs of two items.           [["abc","def"],["ghi","jkl"],["mno"]]
mZ{          For each pair Z:
 Zef"%y+"?     If not every item contains a run of vowels (%y = [AEIOUYaeiouy]),
 :Z            return Z.                             [              ["ghi","jkl"]        ]
 ZmXYZ{        Otherwise, for each item X in Z:
  Xr"%y+"        Replace each run of vowels with
  Zg++T           the item at the next index in Z,   [["def","abc"]               ["mno"]]
  f"%y+"P         but only the first run of vowels.  [["e",  "a"  ]               ["o"  ]]
  P              Replace only for the first match.   [["ebc","daf"]               ["mno"]]
 }
}                                                    [["ebc","daf"],["ghi","jkl"],"mno"]]
c            Flatten back into a single array.       ["ebc","def","ghi","jkl","mno"]
qS           Re-join on spaces.                      "ebc daf ghi jkl mno"
             Implicit: output result of last expression

5

자바 스크립트 (ES6) 62 106 98 101 바이트

s=>s.match(/(\w+)( (\w+))?/g).map(m=>m.replace(/([aeiouy]+)(\w* \w*?)([aeiouy]+)/g,'$3$2$1')).join` `


4

레티 나 , 65 바이트

((\w*?)([aeiouy]+)(\w* \w*?)([aeiouy]+)|(\w+ ))(\w*)
$2$5$4$3$6$7

온라인으로 사용해보십시오! 테스트 사례를 포함합니다. 조건부 그룹 참조를 사용하고 싶었지만 65 바이트 이하로 66 바이트로 작동하지 못했습니다.


4

망막 , 50 바이트

\S+ \S+ 
$&¶
%O$^`(?<=\b[^aeiouy]*)[aeiouy]+
$`
¶

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

Martin 덕분에 -2 바이트.

  • 첫 번째 단계는 각 단어 쌍을 자체 줄 ( 개행) 로 나누는 것 입니다. 이를 통해 .*한 쌍의 단어 내 에서 사용할 수 있습니다 .
  • 다음으로, 각 줄마다 각 단어에서 첫 번째 모음 블록을 찾아 내림차순으로 위치별로 정렬합니다.

더블을 제거하려고했지만 [aeiouy]+경제적 인 것을 얻을 수 없었습니다.
코비

1
그것은 일종의 단계로 실행을 교체하는 소폭 짧은입니다 : tio.run/...
마틴 청산

@ MartinEnder-좋은 하나! 정렬 할 수 없었습니다. [aeiouy]중복 을 제거한 다른 버전을 사용해 보았지만 골프를 칠 수는 없습니다. 나는 그것이 당신의 제안과 잘 맞을
Kobi

3

파이썬 2 , 148 바이트

from re import*
v="([aeiouy]+)"
print sub(r"(\w+)(?: (\w+))?",lambda m:sub(v+"(.* .*?)"+v,lambda g:''.join(g.groups()[::-1]),m.group()),raw_input())

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

코드 골프가 중독성이되고 있습니다!

한 쌍의 단어를 잘라낸 다음 두 모음 모음과 그 사이에있는 줄을 잡고 순서를 반대로하여이를 대체 단어로 사용합니다 .


3

하스켈 , 177 173 171 169 바이트

unwords.s.words
s(x:y:z)=maybe[x,y]id(do(a,b)<-k x;(c,d)<-k y;j[b c,d a])++s z
s x=x
v=(`elem`"aeiouy")
j=Just
k s=do(a,(x:y,r))<-j$span v<$>break v s;j(x:y,\n->a++n++r)

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

이것은 다음 순진한 솔루션의 직접적인 단축이므로 여기에 훨씬 더 좋은 것이 있어야합니다.

swapvowels :: String -> String
swapvowels = unwords . swapPairs . words

swapPairs :: [String] -> [String]
swapPairs (word1:word2:rest) =
   case (,) <$> extractVowels word1 <*> extractVowels word2 of
     Just ((vowels1, rebuild1), (vowels2, rebuild2))
       -> [rebuild1 vowels2, rebuild2 vowels1] ++ swapPairs rest
     Nothing -> [word1,word2] ++ swapPairs rest
swapPairs rest = rest

extractVowels :: String -> Maybe (String, String -> String)
extractVowels s = do
    let isVowel l = l `elem` "aeiouy"
    (a,b) <- Just $ break isVowel s 
    (w@(_:_),r) <- Just $ span isVowel b 
    return (w, \n -> a ++ n ++ r)

2

자바 (오픈 JDK 8) ,363 304 + 25 바이트

@KevinCruijssen 덕분에 -34 바이트

골프 :

l->{String s[]=l.split(" "),a,b;Pattern p=Pattern.compile("[aeiouy]+");for(int i=0;i<s.length-1;i+=2){Matcher m=p.matcher(s[i]),n=p.matcher(s[i+1]);a=m.find()?m.group():null;b=n.find()?n.group():null;if(a!=null&b!=null){s[i]=s[i].replaceFirst(a,b);s[i+1]=s[i+1].replaceFirst(b,a);}}return l.join(" ",s);}

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

언 골프 드 :

String swapVowels(String line) {
    String[] parts = line.split(" ");
    Pattern pattern = Pattern.compile("([aeiouy]+)");
    for (int i = 0; i < parts.length - 1; i += 2) {
        Matcher matcherL = pattern.matcher(parts[i]), matcherR = pattern.matcher(parts[i + 1]);
        String vowelRunL = matcherL.find() ? matcherL.group() : null, vowelRunR = matcherR.find() ? matcherR.group() : null;
        if (vowelRunL != null & vowelRunR != null) {
            parts[i] = parts[i].replaceFirst(vowelRunL, vowelRunR);
            parts[i + 1] = parts[i + 1].replaceFirst(vowelRunR, vowelRunL);
        }
    }
    return String.join(" ", parts);
}

2
입력 주변의 괄호를 제거 할 수 있습니다 ( (l)->to l->). import java.util.regex.*;바이트 수를 추가 하고 다른 모든을 제거 할 수 있습니다 java.util.regex.. 정규식 ( "([aeiouy]+)"-> "[aeiouy]+") 에서 괄호를 제거 할 수 있습니다 . 그리고 당신은 변경할 수 있습니다 String[]s=l.split(" ");위해 String s[]=l.split(" "),a,b;, 당신은 제거 할 수 있습니다 String내부에 대한 루프; 그리고 당신은 변경할 수 있습니다 String.join(" ",s);l.join(" ",s);. 여기에 모두 결합되어 있습니다. [ 329 바이트 ]
Kevin Cruijssen

@KevinCruijssen 과연! 편집했습니다, 감사합니다! :-)
Bashful Beluga



1

파이썬 3 , 198 196 192 바이트

  • 6 바이트 절약 : 덕분에 Zachary T : if(m and n)m 및 n & 정규 표현식 문자열에서 원치 않는 r을 제거하면 인덱스 i는 0 대신 1부터 시작합니다.
from re import*
s=search
a=input().split()
v="[aeiouy]+"
j=1
while j<len(a):
 i=j-1;m=s(v,a[j]);n=s(v,a[i])
 if m and n:a[i]=sub(v,m[0],a[i],1);a[j]=sub(v,n[0],a[j],1)
 j+=2
print(' '.join(a))

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


1
나는 당신이 당신의 프로그램 오프 3 바이트 면도 할 수 있다고 생각 : 변경하여, 당신의 문자열 전에 다른를 R을 제거하여 하나 i+1<len(a)i<=len(a), 그리고 변경하여 세 번째 if(m and n)if m and n.
Zacharý

1
감사. 하지만이 i+1<len(a)변경할 수 없습니다 i<=len(a)또는 다른 사람에 대한 평가하려고합니다 a[j]예를 a[i+1]위해 i=len(a)와 원인 index out of range오류 :
officialaimm

죄송합니다 i<len(a)+1.
Zacharý

1
이게 효과가 있을까요? repl.it/IlX1
Zacharý

1
일부 줄 끝에 여분의 공백이 있으며 192 바이트를 계산했습니다.
Zacharý
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.