¡Barre las vocales!


18

Nota: el título fue mal escrito intencionalmente.

Dada una cadena s, intercambie la primera vocal de cada 2 palabras. Para este desafío, y se considera una vocal.

Por ejemplo, dada una entrada de "gran día señor":

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"

Cuando hay corridas de vocales de diferentes longitudes, todavía intercambias las corridas completas. Cuando una palabra tiene más de una vocal, solo intercambia la primera. Cuando la primera o segunda palabra de un par de palabras no tiene vocal, entonces no intercambia las vocales por esas palabras.

Puede suponer que la entrada solo consiste en un caso de letras alfabéticas y el espacio literal u otro delimitador constante.

Métodos estándar de E / S, se aplican las lagunas estándar. Lo que sea líder / final está bien.

Casos de prueba:

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
Para aquellos que pueden ver publicaciones eliminadas, la publicación de sandbox estaba aquí .
Camarada SparklePony

1
Si la primera palabra no tiene vocales, ¿está bien intercambiar las vocales de la segunda y tercera palabras? ¿O las vocales solo pueden intercambiarse entre series de dos palabras? Por ejemplo, debería ppcg is awesomeconvertirse en ppcg is awesomeo ppcg as iwesome?
DJMcMayhem

@DJMcMayhem Vowels solo puede intercambiar entre series de dos palabras. Voy a editar
Camarada SparklePony

Creo que la salida para this is a long test case in case you could not telldebería ser this is o lang tast cese an cise ou cyould net toll, ya que la vocal se ejecuta youy ouse intercambiaría.
Tashful Beluga

@BashfulBeluga Sí, mi error. Lo arreglaré
Camarada SparklePony

Respuestas:


9

V , 42 , 41 bytes

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

Pruébalo en línea!

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

Explicación:

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

Esto pondrá todos los grupos de dos palabras en su propia línea, por ejemplo:

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

Ahora ejecutamos algunos sofisticados regex-magic:

Í                                           " 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

Su expresión regular no requiere el final de una palabra entre sus dos grupos de vocales. Pruébalo en línea!
nmjcman101

@ nmjcman101 ¿Estás mirando mi antigua revisión? Porque eso es exactamente lo que tengo ahora mismo
DJMcMayhem

Mi enlace TIO no estaba arreglando nada, solo cambié la entrada. Cambia las letras de forma extraña.
nmjcman101

@ nmjcman101 Ah, ya veo. Solucionado ahora!
DJMcMayhem

6

Japt , 39 37 bytes

Dijeron que sería feo, pero no escuché ... y fue:

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

¡Pruébalo en línea!

Explicación

 ¸  ò ® 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

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


4

Retina , 65 bytes

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

Pruébalo en línea! Incluye casos de prueba. Quería usar una referencia de grupo condicional, pero no pude hacerlo funcionar en 66 bytes, y mucho menos en 65 o menos.


4

Retina , 50 bytes

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

Pruébalo en línea!

−2 bytes gracias a Martin.

  • El primer paso es dividir cada par de palabras en su propia línea ( es nueva línea). Esto nos permite usar.* dentro de un par de palabras.
  • Luego, para cada línea encontramos el primer bloque de vocales en cada palabra, y los clasificamos por posición en orden descendente.

Traté de eliminar el doble [aeiouy]+pero no pude obtener algo económico.
Kobi

1
Es marginalmente más corto intercambiar las carreras con una etapa de clasificación: tio.run/…
Martin Ender

@MartinEnder - ¡Buena! No pude ordenar para trabajar. Intenté con otra versión que eliminó la [aeiouy]duplicación, pero no puedo jugar golf. Creo que podría funcionar bien con su sugerencia: 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())

Pruébalo en línea!

¡Code Golfing se está volviendo adictivo!

Secciona los pares de palabras, luego toma los 2 grupos de vocales y la cadena en el medio, invierte el orden y lo usa como sustituto .


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)

Pruébalo en línea!

Esta es una reducción directa de la siguiente solución ingenua, por lo que debería haber algo mucho mejor por aquí:

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

Java (OpenJDK 8) ,363 304 + 25 bytes

-34 bytes gracias a @KevinCruijssen

Golfizado:

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

Pruébalo en línea!

Sin golf:

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
Puede eliminar el paréntesis alrededor de la entrada ( (l)->a l->). Puede agregar import java.util.regex.*;al conteo de bytes y eliminar todos los demás java.util.regex.. Puede eliminar el paréntesis en la expresión regular ( "([aeiouy]+)"-> "[aeiouy]+"). Y puede cambiar String[]s=l.split(" ");a String s[]=l.split(" "),a,b;, luego puede eliminar el Stringinterior del ciclo for; Y puedes cambiar String.join(" ",s);a l.join(" ",s);. Aquí está todo combinado. [ 329 bytes ]
Kevin Cruijssen

@KevinCruijssen De hecho! Editado, gracias! :-)
Tashful Beluga



1

Python 3 , 198 196 192 bytes

  • Guardado 6 bytes: gracias a Zachary T : if(m and n)a si myn eliminó r no deseada para la cadena de expresiones regulares, indexe i comenzando desde 1 en lugar 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))

Pruébalo en línea!


1
Creo que puede eliminar tres bytes de su programa: uno quitando la r antes de su cadena, otro cambiando i+1<len(a)a i<=len(a)y el tercero cambiando if(m and n)a if m and n.
Zacharý

1
Gracias. Pero el i+1<len(a)no se puede cambiar a i<=len(a)o de lo contrario se tratará de evaluar a[j]es decir, a[i+1]para i=len(a)y la causa index out of rangede error:
officialaimm

Lo siento, estaba leyendo eso como i<len(a)+1, ¡whoops!
Zacharý

1
¿Funcionaría esto? repl.it/IlX1
Zacharý

1
Tienes espacios extraños al final de algunas de tus líneas, conté 192 bytes.
Zacharý
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.