Varrer tha vogais!

18

Nota: o título foi escrito incorretamente intencionalmente.

Dada uma sequência s, troque as primeiras execuções de vogal a cada 2 palavras. Para esse desafio, y é considerado uma vogal.

Por exemplo, dada uma entrada de "ótimo dia senhor":

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"

Quando há trechos de vogal de diferentes comprimentos, você ainda troca os trechos inteiros. Quando uma palavra tem mais de uma vogal sendo executada, você ainda troca a primeira. Quando a primeira ou a segunda palavra de um par de palavras não possui uma vogal, você não troca as vogais por essas palavras.

Você pode assumir que a entrada consiste apenas em um caso de letras alfabéticas e no espaço literal ou outro delimitador constante.

Métodos padrão de E / S, brechas padrão se aplicam. Seja qual for o líder / seguidor, tudo bem.

Casos de teste:

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"
Camarada SparklePony
fonte
1
Para quem pode ver as postagens excluídas, a postagem da sandbox estava aqui .
Camarada SparklePony
1
Se a primeira palavra não possui vogais, é correto trocar as vogais da segunda e terceira palavras? Ou as vogais só podem ser trocadas entre séries de duas palavras? Por exemplo, deve ppcg is awesomese tornar ppcg is awesomeou ppcg as iwesome?
DJMcMayhem
As vogais @DJMcMayhem só podem alternar entre execuções de duas palavras. Eu vou editar.
Camarada SparklePony
Eu acredito que a saída para this is a long test case in case you could not telldeveria ser this is o lang tast cese an cise ou cyould net toll, já que a vogal é executada youe ouseria trocada.
Bashful Beluga
@BashfulBeluga Sim, meu erro. Vou arrumar.
Camarada SparklePony

Respostas:

9

V , 42 , 41 bytes

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

Experimente online!

Hexdump:

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                   ../......

Explicação:

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

Isso colocará todos os grupos de duas palavras em sua própria linha, por exemplo:

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

Agora, executamos algumas regex-magic extravagantes:

Í                                           " 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
DJMcMayhem
fonte
Sua regex não exige o fim de uma palavra entre seus dois grupos de vogais. Experimente online!
nmjcman101
@ nmjcman101 Você está olhando para a minha revisão antiga? Porque é exatamente isso que eu tenho agora
DJMcMayhem
Meu link TIO não estava consertando nada, apenas mudei a entrada. Troca as letras estranhamente.
nmjcman101
@ nmjcman101 Ah, entendo. Corrigido agora!
DJMcMayhem
6

Japt , 39 37 bytes

Eles disseram que seria feio, mas eu não ouvi ... e foi:

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

Teste online!

Explicação

 ¸  ò ® 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
ETHproductions
fonte
5

JavaScript (ES6), 62 106 98 101 bytes

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

darrylyeo
fonte
4

Retina , 65 bytes

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

Experimente online! Inclui casos de teste. Eu queria usar uma referência de grupo condicional, mas não consegui fazê-la funcionar em 66 bytes, muito menos em 65 ou menos.

Neil
fonte
4

Retina , 50 bytes

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

Experimente online!

-2 bytes graças a Martin.

  • O primeiro passo é dividir cada par de palavras em sua própria linha ( é nova linha). Isso nos permite usar .*dentro de um par de palavras.
  • A seguir, para cada linha, encontramos o primeiro bloco de vogal em cada palavra e os ordenamos por posição, em ordem decrescente.
Kobi
fonte
Tentei remover o dobro, [aeiouy]+mas não consegui algo econômico.
Kobi
1
É ligeiramente mais curto para trocar as pistas com um palco tipo: tio.run/...
Martin Ender
@MartinEnder - Nice one! Não consegui classificar para o trabalho. Eu tentei outra versão que removeu a [aeiouy]duplicação, mas não consigo reduzi-la. Eu acho que poderia funcionar muito bem com a sua sugestão: tio.run/...
Kobi
3

Python 2 , 148 bytes

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

Experimente online!

Código Golfing está ficando viciante!

Seções de pares de palavras, em seguida, pega os 2 grupos de vogais e a corda no meio, inverte a ordem e a usa como substituta .

Sunny Patel
fonte
3

Haskell , 177 173 171 169 bytes

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)

Experimente online!

Isso é um encurtamento direto da seguinte solução ingênua, portanto deve haver algo muito melhor por aqui:

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)
bartavelle
fonte
2

Java (OpenJDK 8) ,363 304 + 25 bytes

-34 bytes graças a @KevinCruijssen

Golfe:

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

Experimente online!

Ungolfed:

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);
}
Beluga Bashful
fonte
2
Você pode remover os parênteses ao redor da entrada ( (l)->para l->). Você pode adicionar import java.util.regex.*;à contagem de bytes e remover todos os outros java.util.regex.. Você pode remover o parêntese no regex ( "([aeiouy]+)"-> "[aeiouy]+"). E você pode mudar String[]s=l.split(" ");para String s[]=l.split(" "),a,b;, e remover o Stringinterior do loop for; E você pode mudar String.join(" ",s);para l.join(" ",s);. Aqui está tudo combinado. [ 329 bytes ]
Kevin Cruijssen 14/06
@KevinCruijssen Indeed! Editado, obrigado! :-)
Bashful Beluga
2

Perl, 58 bytes

Código de 57 bytes + 1 para -p.

$v="([aeiouy]+)";s!\w+ \w+!$&=~s/$v(.* .*?)$v/$3$2$1/r!ge

-2 bytes graças a @Dada !

Experimente online!

Dom Hastings
fonte
Apenas alguns bytes para economizar, soltando ?e armazenando ([aeiouy]+)em uma variável: Experimente online!
Dada
1

Ruby, 87 + 1 = 88 bytes

Usa a -pbandeira.

gsub(/(\w+) (\w+)/){_,a,b=*$~;a[r=/[aeiouy]+/]&&b[r]?a.sub(r,b[r])+' '+b.sub(r,a[r]):_}

Experimente online!

Value Ink
fonte
1

Python 3 , 198 196 192 bytes

  • Salvo 6 bytes: graças a Zachary T : if(m and n)se m e n & removeu r indesejado da string regex, indexe i a partir de 1 em vez de 0
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))

Experimente online!

officialaimm
fonte
1
Eu acho que você pode raspar três bytes do seu programa: um removendo or antes da sua string, outro alterando i+1<len(a)para i<=len(a)e o terceiro alterando if(m and n)para if m and n.
Zachary
1
Obrigado. Mas i+1<len(a)não pode ser alterado para, i<=len(a)ou tentará avaliar, a[j]ie, a[i+1]por i=len(a)e causar index out of rangeerro:
officialaimm
Desculpe, eu estava lendo isso como i<len(a)+1 , ups!
Zachary
1
Isso funcionaria? repl.it/IlX1
Zacharý
1
Você tem espaços estranhos no final de algumas de suas linhas, contei 192 bytes.
Zacharý