Swep tha vocali!


18

Nota: il titolo è stato scritto erroneamente.

Data una stringa s, scambia le prime serie di vocali di ogni 2 parole. Per questa sfida, y è considerata una vocale.

Ad esempio, dato un input di "grande giorno signore":

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 ci sono piste vocaliche di diverse lunghezze, si scambiano comunque le piste complete. Quando una parola ha più di una corsa vocale, si scambia ancora solo la prima. Quando la prima o la seconda parola di una coppia di parole non ha una vocale, allora non si scambiano le vocali con quelle parole.

Si può presumere che l'input sia costituito solo da un caso di lettere alfabetiche e dallo spazio letterale o da un altro delimitatore costante.

Metodi standard di I / O, si applicano scappatoie standard. I whatevers principali / finali vanno bene.

Casi test:

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
Per coloro che possono vedere i post eliminati, il post sandbox era qui .
Compagno SparklePony,

1
Se la prima parola non ha vocali, è corretto scambiare le vocali della seconda e terza parola? Oppure le vocali possono scambiarsi solo tra sequenze di due parole? Ad esempio, dovrebbe ppcg is awesomediventare ppcg is awesomeo ppcg as iwesome?
DJMcMayhem

@DJMcMayhem Le vocali possono scambiare solo tra sequenze di due parole. Lo modificherò.
Compagno SparklePony,

Credo che l'output this is a long test case in case you could not telldovrebbe essere this is o lang tast cese an cise ou cyould net toll, poiché la vocale viene eseguita youe ouverrebbe scambiata.
Bashful Beluga,

@BashfulBeluga Sì, il mio errore. Aggiusterò.
Compagno SparklePony,

Risposte:


9

V , 42 , 41 byte

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

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

Spiegazione:

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

Questo metterà tutti i gruppi di due parole sulla propria riga, ad esempio:

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

Ora eseguiamo qualche fantasia regex:

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

Il tuo regex non richiede la fine di una parola tra i tuoi due gruppi vocalici. Provalo online!
nmjcman101,

@ nmjcman101 Stai guardando la mia vecchia revisione? Perché è esattamente quello che ho in questo momento
DJMcMayhem

Il mio link TIO non stava riparando nulla, ho appena cambiato l'input. Scambia le lettere in modo strano.
nmjcman101,

@ nmjcman101 Ah, capisco. Risolto ora!
DJMcMayhem

6

Japt , 39 37 byte

Dissero che sarebbe stato brutto, ma io non ho ascoltato ... ed era:

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

Provalo online!

Spiegazione

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

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


4

Retina , 65 byte

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

Provalo online! Include casi di test. Volevo usare un riferimento al gruppo condizionale ma non riuscivo a farlo funzionare in 66 byte e tanto meno 65.


4

Retina , 50 byte

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

Provalo online!

−2 byte grazie a Martin.

  • Il primo passo è quello di dividere ogni coppia di parole sulla propria riga ( è la nuova riga). Questo ci permette di usare.* in un paio di parole.
  • Successivamente, per ogni riga troviamo il primo blocco vocale in ogni parola e li ordiniamo per posizione in ordine decrescente.

Ho provato a rimuovere il doppio [aeiouy]+ma non sono riuscito a ottenere qualcosa di economico.
Kobi,

1
È leggermente più breve scambiare le piste con una sorta di stage: tio.run/…
Martin Ender

@MartinEnder - Nice one! Non riesco a far funzionare l'ordinamento. Ho provato un'altra versione che ha rimosso la [aeiouy]duplicazione, ma non posso sminuirla. Penso che potrebbe funzionare bene con il tuo suggerimento: tio.run/…
Kobi

3

Python 2 , 148 byte

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

Provalo online!

Il gioco del golf sta diventando avvincente!

Seziona le coppie di parole, quindi afferra i 2 gruppi di vocali e la stringa in mezzo, inverte l'ordine e lo usa come sostituto .


3

Haskell , 177 173 171 169 byte

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)

Provalo online!

Questo è un accorciamento diretto della seguente soluzione ingenua, quindi qui dovrebbe esserci qualcosa di molto meglio:

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 byte

-34 byte grazie a @KevinCruijssen

golfed:

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

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

2
È possibile rimuovere la parentesi attorno all'input ( (l)->a l->). È possibile aggiungere import java.util.regex.*;al conteggio byte e rimuovere tutti gli altri java.util.regex.. È possibile rimuovere la parentesi nella regex ( "([aeiouy]+)"-> "[aeiouy]+"). E puoi cambiare String[]s=l.split(" ");in String s[]=l.split(" "),a,b;, quindi puoi rimuovere l' Stringinterno del for-loop; E puoi cambiare String.join(" ",s);in l.join(" ",s);. Ecco tutto combinato. [ 329 byte ]
Kevin Cruijssen,

@KevinCruijssen Effettivamente! A cura, grazie! :-)
Bashful Beluga,


1

Rubino, 87 + 1 = 88 byte

Usa la -pbandiera.

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

Provalo online!


1

Python 3 , 198 196 192 byte

  • 6 byte salvati: grazie a Zachary T : if(m and n)se m e n rimossi r indesiderato per la stringa regex, indicizzo i a partire da 1 anziché 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))

Provalo online!


1
Penso che puoi radere tre byte dal tuo programma: uno rimuovendo r prima della stringa, un altro cambiando i+1<len(a)in i<=len(a)e il terzo cambiando if(m and n)in if m and n.
Zacharý,

1
Grazie. Ma la i+1<len(a)non può essere modificato al i<=len(a)altrimenti cercherà di valutare a[j]cioè a[i+1]per i=len(a)e la causa index out of rangedi errore:
officialaimm

Mi dispiace, lo stavo leggendo come i<len(a)+1, whoops!
Zacharý,

1
Funzionerebbe? repl.it/IlX1
Zacharý

1
Hai spazi estranei alla fine di alcune delle tue linee, ho contato 192 byte.
Zacharý,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.