| Bytes | Lang | Time | Link |
|---|---|---|---|
| 257 | Acc!! | 240522T040256Z | engineer |
| 281 | Lexurgy | 220118T194138Z | bigyihsu |
| 128 | Lua | 230424T214140Z | bluswimm |
| 281 | Scala | 230422T012104Z | 138 Aspe |
| 149 | brev | 220818T161223Z | Sandra |
| 154 | Knight | 220814T044445Z | naffetS |
| 071 | Perl 5 | 170531T122845Z | Grimmy |
| 032 | Vyxal o | 220814T012000Z | naffetS |
| 080 | !@#$%^&*_+ | 220117T133858Z | Twilight |
| 079 | BQN | 220117T141203Z | ovs |
| 324 | PowerShell | 210421T201328Z | coffee |
| 190 | Python 3 | 171031T175023Z | osuka_ |
| 207 | Excel | 210311T221840Z | Axuary |
| 149 | Python 3 | 210310T204835Z | Roy |
| 039 | Jelly | 170608T000841Z | Dennis |
| 142 | Python 3.8 prerelease | 200213T135224Z | chinatsu |
| 035 | 05AB1E | 200201T124102Z | Grimmy |
| 042 | 05AB1E | 181130T160922Z | Kevin Cr |
| 168 | SmileBASIC | 180421T053611Z | 12Me21 |
| 195 | SmileBASIC 3 | 180412T065214Z | snail_ |
| 107 | Vim | 180102T174908Z | Endenite |
| 222 | Java 8 | 170531T144817Z | Kevin Cr |
| 396 | Modern Pascal 2.0 | 170612T205406Z | Ozz Nixo |
| 581 | C# | 170721T195809Z | Brandon |
| 211 | Python 2 | 170601T104039Z | WaitndSe |
| 341 | R | 170621T145758Z | Andrew H |
| 298 | Go | 170619T144144Z | dr.jose |
| 088 | 05AB1E | 170601T113818Z | kalsower |
| nan | sed | 170618T084030Z | zgrep |
| 175 | C | 170531T101903Z | betseg |
| 057 | Jelly | 170531T113510Z | Jonathan |
| 071 | Perl | 170608T151527Z | SomeDude |
| 190 | BlitzMax | 170603T060940Z | Fireball |
| 068 | Retina | 170607T135212Z | Martin E |
| 229 | JavaScript ES5 | 170531T190157Z | Octopus |
| 130 | Crystal | 170606T183752Z | Domii |
| 156 | Clojure | 170606T221547Z | Brian Ba |
| nan | Perl | 170606T232452Z | Silvio M |
| 157 | Lua | 170606T105521Z | Kyrio |
| 139 | Python 3 | 170531T104928Z | L3viatha |
| 260 | Python | 170601T094033Z | sagiksp |
| 054 | Pyth | 170602T130143Z | Jakube |
| 158 | MATLAB / Octave | 170601T080218Z | rayryeng |
| 056 | CJam | 170531T140247Z | Business |
| 136 | Haskell | 170531T130556Z | bartavel |
| 121 | PHP | 170531T120146Z | Jör |
| 090 | Ruby | 170601T075625Z | ymbirtt |
| 110 | Ruby | 170531T114036Z | sudee |
| 103 | JavaScript ES6 | 170531T082959Z | Arnauld |
| 163 | Crystal | 170531T125506Z | reiterma |
Acc!!, 257 bytes
N
Count i while 49266414/2^(_-97)%2 {
Write _
N
}
Count i while 17842449/2^(_-97)%2 {
Write _
N
}
Write _
60525999331534840909024507175792639/25^(_-98)%25+N*25
Count i while 49266414/2^(_/25-97)%2 {
N*25+_%25
}
Count i while i-2 {
Write _%25+98
Write _/25
}
Expanded
# Read and print N while it is consonant
# Number encodes whether or not n+'a' (for each bit n) is a consonant
N
Count i while 49266414/2^(_-97)%2 {
Write _
N
}
# Read and print N while it is vowel
# Number encodes whether or not n+'a' (for each bit n) is a vowel
Count i while 17842449/2^(_-97)%2 {
Write _
N
}
Write _ # Print first consonant after vowel (end of sound group)
# Convert consonant - number encodes "pgt-vkh-jglmn-bqrzd-fwx-s" in reverse
# order as base 25 (b-z, - for vowels stored as 0/b)
# Store consonant in _%25 and N (to find next vowel) in _*25
60525999331534840909024507175792639/25^(_-98)%25+N*25
# Read N while it is consonant
Count i while 49266414/2^(_/25-97)%2 {
N*25+_%25
}
# Print consonant then vowel twice
Count i while i-2 {
Write _%25+98
Write _/25
}
Lexurgy, 288 286 281 bytes
Docs here.
Lexurgy is an online tool meant for conlangers (people who make constructed languages) to apply sound changes to their conlangs via a series of programmable rules. As such, this tool involves many string operations.
- -2: remove the
uandwclasses and replace them with one-time substitutions. - -5: fix a bug with the
examplecase, combine some rules into a single step
Class v {a,e,i,o,u}
Class c {p,t,k,f,s,c,b,d,g,v,z,g,h,j,l,m,n,q,r,w,x}
a:
@c *=>@c ;/$ @c* @v* _//{$ _,$ @c _}
b:
@c=>* /; _
c:
{@v,@c}=>* /; @v {@v,@c}* _
* {{p,t,k,f,s,c,x},{b,d,g,v,z,g,x}}$1=>$1 {{b,d,g,v,z,g,x},{p,t,k,f,s,c,x}}/_ ;
e:
@c$1 ;=>; $1
f:
(@c @v)$1=>$1 $1/; _
;=>*
Ungolfed:
Class vowel {a,e,i,o,u}
Class unvoiced {p,t,k,f,s,c}
Class voiced {b,d,g,v,z,g}
Class consonant {@unvoiced,@voiced,h,j,l,m,n,q,r,w,x}
# find first consonant after first vowel
part-1:
@consonant * => @consonant ; / $ @consonant* @vowel* _ // {$ _, $ @consonant _}
romanizer-a:
unchanged
# delete the consonant after the seperator
part-2:
@consonant => * / ; _
romanizer-b:
unchanged
# remove everything except the second vowel
part-3:
{@vowel, @consonant} => * / ; @vowel {@vowel, @consonant}* _
romanizer-c:
unchanged
# voicings
part-4:
* @voiced$1 => $1 @unvoiced / _ ;
* @unvoiced$1 => $1 @voiced / _ ;
romanizer-d:
unchanged
# swap mapped consonant and seperator
part-5:
@consonant$1 ; => ; $1
romanizer-e:
unchanged
# duplicate the `fe`
part-6:
(@consonant @vowel)$1 => $1 $1 / ; _
romanizer-f:
unchanged
# remove the seperator
part-7:
; => *
Lua, 128 bytes
w=...i,j,a,b=w:find'[aeiouy]+([^aeiouy]+)(.)'n=a:byte()-97g=('pgtevkhijglmnobqrzdufwxys'):sub(n,n)..b print(w:sub(1,j-#a)..g..g)
This is effectively Kyrio's Answer with a lot of minor optimizations, as well as completely swapping out the logic for finding the replacement consonant.
Scala, 281 bytes
Modified from the answer of @WaitndSe.
281 bytes version. Try it online!
type S=String
def f(s:S):S={val r,c=new StringBuilder;var(n,w,a)=(0,"aeiouy","bcdfghjklmnpqrstvwxz");for(i<-s){if(n<2)r+=i;if(n<1&&w.contains(i))n= 1;if(n==1&&a.contains(i)){c++="pgtvkhjglmnbqrzdfwxs"(a.indexOf(i))+"";n=2};if(n==2&&w.contains(i)){r++=c+""+i+c+i;return r+""}};r+""}
340 bytes version. Try it online!
type S=String
implicit class V[A](val x:A)extends AnyVal{def Q=x.toString}
def f(s:S):S={val r,c=new StringBuilder;var(n,w,a)=(0,"aeiouy","bcdfghjklmnpqrstvwxz");for(i<-s){if(n<2)r+=i;if(n<1&&w.contains(i))n= 1;if(n==1&&a.contains(i)){c++="pgtvkhjglmnbqrzdfwxs"(a.indexOf(i)).Q;n=2};if(n==2&&w.contains(i)){r++=c.Q+i+c.Q+i;return r.Q}};r.Q}
Ungolfed version. Try it online!
import scala.collection.mutable
object Main {
def f(s: String): String = {
val r = new StringBuilder
var c = ""
var n = 0
val w = "aeiouy"
val a = "bcdfghjklmnpqrstvwxz"
for (i <- s) {
if (n < 2) r += i
if (n < 1 && w.contains(i)) n = 1
if (n == 1 && a.contains(i)) {
c = "pgtvkhjglmnbqrzdfwxs"(a.indexOf(i)).toString
n = 2
}
if (n == 2 && w.contains(i)) {
r ++= c + i + c + i
return r.toString()
}
}
r.toString()
}
def test(func: String => String, testcases: Map[String, String]): Unit = {
for ((caseInput, caseOutput) <- testcases) {
if (func(caseInput) != caseOutput) {
throw new Exception(s"Function fails on testcase '$caseInput'.")
}
}
println("Function passed all testcases.")
}
def main(args: Array[String]): Unit = {
test(f, Map(
"coverage" -> "covfefe",
"example" -> "exxaxa",
"programming" -> "progkaka",
"code" -> "codtete",
"president" -> "preszizi"
))
println(f("creation"))
println(f("coverage"))
println(f("example"))
println(f("programming"))
println(f("code"))
println(f("president"))
}
}
brev 149 bytes
(define(v x)(string-translate x"bcdfgkpstvz""pgtvkgbzdfs"))(fn(strse x"(.*?[aeiouy]+(.))[^aeiouy]*(.)"(entire(conc(m 1)(v(m 2))(m 3)(v(m 2))(m 3)))))
Straight-forward regex solution♥
Knight, 161 154 bytes
;=xP;=v=c=uF;=s"";Wx;|&v c=s+sA=tAx;I=p|?97=aAx|?101a|?105a|?111a|?117a?121a=vTx;I&v!p=cTx;&&p&c&v!u=uAa=xGx 1LxO+s*+G"pgt_vkh_jglmn_bqrzd_fwx_s"-t 98Tu 2
-7 bytes thanks to Aiden Chow
Perl 5, 81 72 71 bytes
-1 byte thanks to Xcali!
s![aeiouy]+(.)\K.*!($1=~y/bdfgpstvzck/ptvkbzdfsg/r.$&x/[aeiouy]/g)x2!ge
!@#$%^&*()_+, 102 101 100 99 80 bytes
`33554(_(^1%)%)$pgtevkhijglmnobqrzdufwxys(0*!@&)^(0*!!@&_^)Q++&!@%(0*!^&)+!@0&@@
42nd answer of this question, it looks like. Just one byte longer than BQN! It took much more time than it should. I'm pretty sure there are still some simple tricks that I'm missing.
Accept lowercase characters. The program does not actually contain digits - 01345Q in the code above are unprintable characters with ASCII code 0, 1, 3, 4, 5 and 25 respectively.
PowerShell, 324 bytes
$v="[aeiouy]";$f=[regex]::match($w,$v).index+1;$s=[regex]::match($w.substring($f),"[^aeiouy]").index;$t=[regex]::match($w.substring($f),$v);
$c=@{b='p';c='g';d='t';f='v';g='k';h='h';j='j';k='g';l='l';m='m';n='n';p='b';q='q';r='r';s='z';t='d';v='f';w='w';x='x';z='s'};
$r=$c["$($w[($f+$s)])"];$w.substring(0,$f+$s+1)+"$r$t$r$t"
This was as short as I could get it without frying my brain. Takes input as $w='coverage'.
Python 3, 190 bytes
f=lambda s,g='aeiouy':min([s.index(l)for l in g if l in s])
C='bcdfghjklmnpqrstvwxyz'
q=input()
v=f(q)
c=f(q[v:],C)+v+1
print(q[:c]+('pgtvkhjglmnbqrzdfwxs'[C.index(q[c-1])]+q[f(q[c:])+c])*2)
I've had this coded since the week of the challenge, but was discouraged to post in its then-current state (which also happens to be the current state) because of all the 80-byte regex answers.
But hey, what the hell. Here's another non-esoteric, non-regex answer, six months late to the party.
-30 bytes from typing out the consonants in a string rather than using a list comprehension
-4 bytes from using the result of a calculation inline rather than assigning it to a variable (whoops)
Excel, 207 bytes
=LET(s,A1,x,SEQUENCE(LEN(s)),c,ISERROR(FIND(MID(s,x,1),"aeiouy")),k,MIN(IF(c*(x>MIN(IF(c,"",x))),x,"")),q,MID(s,k,1),m,"bcdfkszgvtgp"&q,n,MID(q&m,14-FIND(q,m),1)&MID(s,MIN(IF(c+(x<k),"",x)),1),LEFT(s,k)&n&n)
Python 3, 170 149 bytes
def f(s):g=lambda x,y:[(i in"aeiouy")for i in s].index(x,y);j=g(0,g(1,0));c=s[j];z="ckbdfszvtpgg"+c;return s[:j+1]+2*((c+z)[-z.index(c)-2]+s[g(1,j)])
A more readable version:
def f(s):
n = [ (i in "aeiou") for i in s ]
i = n.index(1)
j = n.index(0, i)
k = n.index(1, j)
c = s[j]
v = s[k]
z = "ckbdfszvtpgg" + c
r = (c+z)[-z.index(c)-2]
return s[:j+1] + r + v + r + v
i, j, and k are the indices of the first vowel, the first consonant after that c, and the first vowel after that v respectively.
Jelly, 45 39 bytes
Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2
e€ØyIi-‘ɓḣ;ç
How it works
e€ØyIi-‘ɓḣ;ç Main link. Argument: s (string)
Øy Vowels with y; yield "AEIOUYaeiouy".
e€ Test each character in s for membership.
I Increments; compute the forward differences of the
resulting array of Booleans.
i- Find the first index of -1.
‘ Increment this index to find the index of the first
consonant that follows a vowel.
Let's call this index j.
ɓ Begin a new chain. Left argument: s. Right argument: j
ḣ Head; yield the first j characters of s.
ç Call the helper link with arguments s and j.
; Concatenate the results to both sides.
Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2 Helper link. Left argument: s. Right argument: j
Øa Alphabet; set the return value to “abc...xyz”.
“œṣ$b|0Ḃ’ Yield 7787255460949942. This is a numeric literal in
bijective base 250. The value of each digit matches its
1-based index in Jelly's code page.
ṃ Convert 7787255460949942 to base 26, using the digts
a = 1, b = 2, ..., y = 25, z = 0.
This yields "bcdfkszgvtgp".
,Ṛ$ Pair the result with its reverse, yielding
["bcdfkszgvtgp", "pgtvgzskfdcb"].
ṫ Call tail with arguments s and j, yielding the j-th and
all following characters of s.
y Translate the result to the right according to the
mapping to the left, i.e., replace 'b' with 'p', 'c'
with 'g', etc. 'g' appears twice in the first string
of the mapping; only the first occurrence counts.
Let's call the resulting string r.
µ Begin a new chain. Argument: r
fØy Filter; remove non-vowels from r.
Ḣ Head; take the first vowel.
Ḣ Head; take the first character/consonant of r.
ṭ Tack; append vowel to the consonant.
ẋ2 Repeat the resulting string twice.
Python 3.8 (pre-release), 142 bytes
s=input()
g=lambda i,f='aeiuoy':i if s[i]in f else g(i+1,f)
q=g(g(0),c:='pgtcvkh jglmn bqrzd fwx s')
exit(s[:-~q]+(c[ord(s[q])-98]+s[g(q)])*2)
A little late to the party, but here's yet another non-regex Python answer! I interpreted the rules to allow printing to STDERR which saves a byte (exit/print). Using Python 3.8 over 3<=3.7 saves me a total of 1 byte with the walrus operator as opposed to defining the c variable elsewhere.
Thanks a lot to Post Rock Garf Hunter (-21 bytes) for the help!
05AB1E, 35 bytes
1ú.γžOså}R`¦??н©?н®ì.•gÍĆdQ¸G•‡D?,
1ú # prepend the input with a space
# (this ensures the word doesn’t start with a vowel)
.γ } # group characters by:
žO # built-in constant "aeiouy"
så # is the character in that string?
R # reverse the list of groups
` # dump all on the stack (first group on top)
¦ # remove the space we added earlier
? # print the first consonant group
? # print the first vowel group
н # get the first letter of the second consonant group
© # save it in the register
? # print it
н # get the first letter of the second vowel group
® # restore the consonant from the register
ì # prepend, giving a consonant-vowel pair
.•gÍĆdQ¸G• # compressed string "pgtvgzskfdcb"
 # push a reversed copy of it
‡ # transliterate (b => p, c => g, ...)
D # duplicate the transliterated pair
?, # print both copies (with a newline the second time)
05AB1E, 55 42 bytes
η.ΔžOSåàyžPSÅ¿à*}ÐIsKžOÃнsθ.•gÍĆdQ¸G•‡ìDJ
-13 bytes thanks to @Grimmy.
Try it online or verify all test cases.
Explanation:
η # Suffixes of the (implicit) input
# i.e. "creation" → ["c","cr","cre","crea","creat","creati","creato","creatio","creation"]
.Δ } # Find the first for which the following is truthy:
žO # Push vowels (including y): "aeiouy"
S # Convert it to a list of characters: ["a","e","i","o","u","y"]
å # Check for each if they're in the current (implicit) suffix
# i.e. "creat" → [1,1,0,0,0,0]
à # Pop and push the max (basically check if any are truthy)
# i.e. [1,1,0,0,0,0] → 1
y # Push the suffix again
žP # Push the consonants (excluding y): "bcdfghjklmnpqrstvwxz"
S # Convert to a list of characters: ["b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","z"]
Å¿ # Check for each if the suffix ends with it
# i.e. "creat" → [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0]
à # Pop and push the max (basically check if any are truthy)
# i.e. [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0] → 1
* # Check if both are truthy
# i.e. 1 and 1 → 1
Ð # Triplicate the found suffix
I # Push the input
s # Swap the top two items on the stack
# i.e. stack contains now: "creat","creat","creation","creat"
K # Remove the suffix from the input
# i.e. "creation" and "creat" → "ion"
žOÃ # Only leave the vowels
# i.e. "ion" → "io"
н # Pop and push the first character
# i.e. "io" → "i"
s # Swap again so the prefix is a the top of the stack again
θ # Pop and push the last character
# i.e. "creat" → "t"
.•gÍĆdQ¸G• # Push string "bcdfkszgvtgp"
 # Bifurcate it (short for Duplicate & Reverse copy): "pgtvgzskfdcb"
‡ # Transliterate the character of "bcdfkszgvtgp" to the same index in "pgtvgzskfdcb"
ì # Prepend the second character in front of the first
# i.e. "d" and "i" → "di"
D # Duplicate it
J # Join the stack together (and output implicitly)
# i.e. "creat" and "di" and "di" → "creatdidi"
See this 05AB1E tips of mine (section How to compress strings not part of the dictionary?) to understand why .•gÍĆdQ¸G• is "bcdfkszgvtgp".
SmileBASIC, 185 179 168 bytes
This is an even more golfed version of snail_'s answer.
INPUT W$DEF V(C)RETURN.>INSTR(@AEIOUY,W$[C])END@L?W$[I];
I=I+1ON!V(I-1)&&V(I)GOTO@L
X$=W$[I]WHILE V(I)I=I+1WEND?X$;((X$+@PGTVKGBZDFS)[INSTR(@BCDFGKPSTVZ,X$)+1]+W$[I])*2
Ungolfed:
'input
INPUT WORD$
'function returns true if the character at POS is a consonant
DEF CONSONANT(POS)
RETURN INSTR(@AEIOUY,WORD$[POS])<0
END
'scan through the word until there's a vowel followed by a consonant
REPEAT
PRINT WORD$[I];
I=I+1
UNTIL !CONSONANT(I-1) && CONSONANT(I)
'Store and print the final letter of the "normal" section
LASTNORMAL$=WORD$[I]
PRINT LASTNORMAL$;
'Find the next vowel
WHILE CONSONANT(I)
I=I+1
WEND
'If last normal letter is one of "BCDFGKPSTVZ", replace with corresponding letter in "PGTVKGBZDFS"
'otherwise don't change it
CORRUPTED$=(LASTNORMAL$+@PGTVKGBZDFS)[INSTR(@BCDFGKPSTVZ,LASTNORMAL$)+1]
'print the "corrupted" letter and the vowel that was found earlier, twice.
PRINT (CORRUPTED$+WORD$[I])*2
SmileBASIC 3, 195 bytes
Very late to this question, but how could I resist a good challenge for SmileBASIC 3? Features like iterating over a sequence or manipulating a string aren't quite as robust as other languages, so this is a bit of a challenge to do it as small as possible. Assumes words are UPPERCASE.
V$="AEIOUY
LINPUT W$REPEAT I=I+1UNTIL.<=INSTR(V$,W$[I-1])&&.>INSTR(V$,W$[I])J=I
WHILE.>INSTR(V$,W$[J])J=J+1WEND?LEFT$(W$,I+1)+("PGTVKHJGLMNBQRZDFWXS"[INSTR("BCDFGHJKLMNPQRSTVWXZ",W$[I])]+W$[J])*2
Vim, 107 keystrokes
Who needs Java, Python 3, Modern Pascal 2.0, C#, Python 2, R, Go, C, BlitzMax, Javascript, Crystal, Clojure, Lua, Matlab/Octave, Haskell and PHP when you have vim?
i ⎋o⏎bcdfghjklmnpqrstvwxz⏎pgtvkhjglmnbqrzdfwxs⎋1Ghqy/[aeiouy]⏎q/[^aeiouy]⏎mz@yyl`zpld$yhjpg*jyl`zpy2lPjdGX
⎋ is the Escape key and ⏎ is the Return key
Explanation
i ⎋ Insert a space before the first character
o⏎bcdfghjklmnpqrstvwxz⏎ Insert the character data
pgtvkhjglmnbqrzdfwxs⎋1Gh
qy/[aeiouy]⏎q Find the first vocal after the space
/[^aeiouy]⏎mz Find the next consonant and add a marker
@yyl`zp Find the next vocal and put it after the consonant
ld$ Delete the rest of the world
yhjpg* Search for the consonant in the first row of the character data
jyl Copy the character in the same position in the second row
`zpy2lPjdGX Paste it after the last vowel and repeat the two last characters
Java 8, 243 236 222 bytes
s->{String q="[a-z&&[^aeiouy]]",a=s.replaceAll("(^"+q+"*[aeiouy]+"+q+").*","$1"),b="pgtvkhjglmnbqrzdfwxs".charAt("bcdfghjklmnpqrstvwxz".indexOf(a.charAt(a.length()-1)))+s.replaceAll(a+q+"*([aeiouy]).*","$1");return a+b+b;}
Uses .replaceAll regexes with capture groups to filter out the parts we don't want.
Explanation:
s->{ // Method with String parameter and String return-type
// Temp String we use multiple times:
String q="[a-z&&[^aeiouy]]",
// Regex to get the first part (i.e. `creation` -> `creat` / `example` -> `ex`)
a=s.replaceAll("(^"+q+"*[aeiouy]+"+q+").*","$1"),
// Get the trailing consonant and convert it
b="pgtvkhjglmnbqrzdfwxs".charAt("bcdfghjklmnpqrstvwxz".indexOf(a.charAt(a.length()-1)))
// Get the next vowel after the previous consonant from the input-String
+s.replaceAll(a+q+"*([aeiouy]).*","$1");
// Return the result:
return a+b+b;
} // End of method
Modern Pascal 2.0, 415, 396 bytes
function c(S:String):String;
var L,M,I:Longint; const v='aeiouy'; o='_pgt_vkh_jglmn_bqrzd_fwx_s';
begin S:=Lowercase(S); Result:=S;
For l:=1 to length(S) do if pos(S[l],v)>0 then Break;
For M:=l to length(S) do if pos(S[M],v)=0 then begin
Result:=Copy(S,1,M);I:=Ord(S[M])-96;Delete(S,1,M);
For L:=1 to Length(S) do If Pos(S[l],v)>0 then begin
Result+=o[I]+S[L]+o[I]+S[L];Break;End;Break;End;End;
// Author of Modern Pascal
C#, 584 581 bytes
-3 bytes thanks to Destructible Lemon
This is my first submission on Code Golf and on Stack Exchange in general. I know that C# isn't a great golfing language and this probably isn't completely optimized but I wanted to give it a shot :p. Any tips are welcome!
Golfed Version:
namespace System{class B{static void Main(string[]args){var s="creation";var t="aeiou";int i=0,j=0,l=s.Length;char c=' ',f=' ';for(int x=0;x++<l;){if(t.IndexOf(s[x])>=0){i=x;break;}}for(int x=i;x++<l;){if(!(t.IndexOf(s[x])>=0)){j=x;c=s[x];for(int y=x;y++<l;){if (t.IndexOf(s[y])>=0){f=s[y];goto W;}}}}W:switch(c){case'b':c='p';break;case'c':c='g';break;case'd':c='t';break;case'f':c='v';break;case'g':c='k';break;case'k':c='j';break;case'p':c='b';break;case's':c='z';break;case't':c='d';break;case'v':c='f';break;case'z':c='s';break;}Console.Write(s.Substring(0,l-i-1)+c+f+c+f);}}}
Readable Version:
namespace System
{
class B
{
static void Main(string[] args)
{
var s = "creation";
var t = "aeiou";
int i = 0, j = 0, l = s.Length;
char c = ' ', f = ' ';
for (int x = 0; x++ < l; )
{
if (t.IndexOf(s[x]) >= 0)
{
i = x; break;
}
}
for (int x = i; x++ < l;)
{
if (!(t.IndexOf(s[x]) >= 0))
{
j = x; c = s[x];
for (int y = x; y++ < l;)
{
if (t.IndexOf(s[y]) >= 0)
{
f = s[y];
break;
}
}
}
}
switch (c)
{
case 'b': c = 'p';
break;
case 'c': c = 'g';
break;
case 'd': c = 't';
break;
case 'f': c = 'v';
break;
case 'g': c = 'k';
break;
case 'k': c = 'j';
break;
case 'p': c = 'b';
break;
case 's': c = 'z';
break;
case 't': c = 'd';
break;
case 'v': c = 'f';
break;
case 'z': c = 's';
break;
}
Console.Write(s.Substring(0, l - i - 1) + c + f + c + f);
}
}
}
Python 2, 251 246 245 239 237 234 229 211 bytes
First submission here.
def f(s):
r=c='';n=0;w='aeiouy';a='bcdfghjklmnpqrstvwxz'
for i in s:
if n<2:r+=i
if n<1and i in w:n=1
if n==1and i in a:c='pgtvkhjglmnbqrzdfwxs'[a.index(i)];n=2
if n==2and i in w:r+=c+i+c+i;break
return r
Fellow golfers that helped me:
Destructible Lemon / Wheat Wizard - 5 bytes
Hubert Grzeskowiak - 1 byte
musicman523 - 16 bytes
R, 341 characters
f=function(x){g=function(x,y)el(strsplit(x,y));a=g(x,'');v=g('aeiouy','');n=letters[-c(1,5,9,15,21,25)];l=data.frame(n,g('pgtvkhjglmnbqrzdfwxs',''));y=min(match(n,a)[which(match(n,a)>min(match(v,a),na.rm=T))]);m=l[which(l$n==a[y]),2];e<-a[-c(1:y)][min(match(v,a[-c(1:y)]),na.rm=T)];paste0(paste0(a[c(1:y)],collapse=''),m,e,m,e,collapse="")}
Horrendous R attempt, why are strings so hard
Readable version:
f = function(x) {
g = function(x, y)el(strsplit(x, y))
a = g(x, '')
v = g('aeiouy', '')
n = letters[-c(1, 5, 9, 15, 21, 25)]
l = data.frame(n, g('pgtvkhjglmnbqrzdfwxs', ''))
y = min(match(n, a)[which(match(n, a) > min(match(v, a), na.rm = T))])
m = l[which(l$n == a[y]), 2]
e <-a[-c(1:y)][min(match(v, a[-c(1:y)]), na.rm = T)]
paste0(paste0(a[c(1:y)], collapse = ''), m, e, m, e, collapse = "")
}
Go, 298 bytes
func c(l string)string{v:="aeiouy";c:="bcdfghjklmnpqrstvwxz";r:="pgtvkhjglmnbqrzdfwxs";b:=l[0:strings.IndexAny(l,v)+1];t:=strings.SplitAfterN(l,b,2)[1];i:=strings.IndexAny(t,c);b=b+t[0:i+1];x:=string(r[strings.IndexAny(c,string(t[i]))]);z:=string(t[i:][strings.IndexAny(t[i:],v)]);return b+x+z+x+z}
05AB1E, 101 104 88 bytes
-16 bytes thanks to Okx
I somehow hope this can be done way more efficiently.
žOÃćIsk>[DIs£¤žPså#\>]s[DIsèDžOså#\>]ŠŠ"bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"S2ôDí«ø`Šs¤sŠksŠèsŠì2׫
Explanation
Argument: s
žOÃ0èk Get index of first vowel in s
>[DIs£¤žPså#\>] Increment index and split s until last character of substring is a consonant
s[DIsèDžOså#\>] Increment index an get character at index in s until character is a vowel
ŠŠ Rearrange stack
.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø` Prepare character substitution map
Šs Rearrange stack
¤ Last character of substring
sŠ Rearrange stack (yes, again)
k Index of last character in substitution key list
sŠ Rearrange stack (it won't stop)
è Character at index in character substitution value list
sŠ Rearrange stack (ONE LAST TIME)
ì2׫ Prepend substitution consonant before vowel, duplcicate and concatenate with the substring from the very beginning
sed, 106 (105+1) bytes
This is sed with the -E flag, which apparently counts for one byte.
s/([aoeuiy][^aoeuiy])[^aoeuiy]*(.).*/\1\2/
h
s/.*(..)/\1\1/
y/bcdfgkpstvz/pgtvkgbzdfs/
x
s/.$//
G
s/\n//g
C, 219 213 206 179 175 bytes
#define p putchar
#define q(a)for(;a strchr("aeiouy",*s);p(*s++));
f(s,c,h)char*s;{q(!)q()p(*s);p(c="pgt vkh jglmn bqrzd fwx s"[*s-98]);p(h=s[strcspn(s,"aeiouy")]);p(c);p(h);}
Jelly, 58 57 bytes
<TḢị
e€Øyµ¬TĖEÐḟḢṪ;ç¥T
ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2
A full program that accepts a list of lowercase characters and prints the result.
How?
<TḢị - Link 1, extract first value from y not less than x: number, x; list of numbers, y
- e.g. 5, [3,4,7]
< - x less than vectorised across y [0,0,1]
T - truthy indices [ 3]
Ḣ - head 3
ị - index into y 7
e€Øyµ¬TĖEÐḟḢṪ;ç¥T - Link 2, indices of the letters to manipulate: list of characters, w
Øy - vowel+ yield = "AEIOUYaeiouy" e.g. "smouching"
e€ - exists in for €ach letter in w 001100100
µ - monadic chain separation, call that v
¬ - not vectorised across v 110011011
T - truthy indices 12 56 89
Ė - enumerate [[1,1],[2,2],[3,5],[4,6],[5,8],[6,9]]
Ðḟ - filter discard if:
E - elements are equal [[3,5],[4,6],[5,8],[6,9]]
Ḣ - head [3,5]
Ṫ - tail 5
T - truthy indices of v 34 7
¥ - last 2 links as a dyad
ç - call last link (1) as a dyad 7
; - concatenate 5,7
- ...i.e the indexes of 'c' and 'i'
ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2 - Main link: list of characters, w
- e.g. "smouching"
Ç - call the last link (2) as a monad [5,7]
ḣ - head to index (vectorises) ["smouc","smouchi"]
Ḣ - head "smouc"
- implicit print due to below leading constant chain
⁸ - link's left argument, w
Ç - call the last link (2) as a monad [5,7]
ị - index into w "ci"
µ - monadic chain separation, call that p
Ḣ - head p 'c'
ØY - consonant- yield = "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
i - first index 22
¤ - nilad followed by link(s) as a nilad:
“ßȷ%Hẹrȧq’ - base 250 number = 1349402632272870364
ØY - consonant- yield = "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
œ? - nth permutation = "BCDFGHJKLMNPQRSTVWXZpctvkhjglmnbqrzdfwxs"
ị - index into (special case ->) 'c'
⁾cg - literal ['c','g']
y - translate (change 'c's to 'g's) 'g'
; - concatenate with the headed p "gi"
ẋ2 - repeat list twice "gigi"
- implicit print ...along with earlier = smoucgigi
Perl, 71 bytes
s#[aeiouy]+(.)\K.*?([aeiouy]).*#"$1$2"=~y/bcdfgkpstvz/pgtvkgbzdfs/rx2#e
Also run with perl -pe. A few bytes less than the previous Perl solution. Admittedly I got some inspiration from there as well.
BlitzMax, 190 bytes
s$=Input()For i=1To s.Length
f="aeiouy".Contains(s[i-1..i])If f v=i If c Exit
If v And c|f=0c=i
Next
t$="bpdtfvgkcgsz"x$=s[c-1..c]r=t.Find(x)~1If r>=0x=t[r..r+1]
x:+s[v-1..v]Print s[..c]+x+x
Takes a word from stdin and prints the result to stdout. The input word is assumed to be lowercase and to contain at least one vowel followed by a consonant.
A more readable version of the progam with formatting and variable declarations:
SuperStrict
Framework BRL.StandardIO
Local s:String = Input()
Local v:Int
Local c:Int
For Local i:Int = 1 To s.Length
Local f:Int = "aeiouy".Contains(s[i - 1..i])
If f Then
v = i
If c Then Exit
End If
If v And c | f = 0 Then c = i
Next
Local t:String = "bpdtfvgkcgsz"
Local x:String = s[c-1..c]
Local r:Int = t.Find(x) ~ 1
If r >= 0 Then x = t[r..r + 1]
x :+ s[v - 1..v]
Print s[..c] + x + x
How it works:
BlitzMax doesn't have any builtin regex functionality or similar, so a loop is used to iterate over the characters of the input word until it finds a vowel followed by a chain of at least one consonant. The variable c stores the position of the last of those consonants, v that of the vowel. The loop continues to see if there is another vowel after the chain and if so, v is updated accordingly. Then the consonant at c is looked up in the string "bpdtfvgkcgsz", which acts as a replacement table. If the consonant is found in the table at any position, then that position is XOR-ed with 1 and the character at the resulting position gets used as its replacement. The XOR operation turns 0 into 1, 2 into 3, 4 into 5 etc. and vice versa, so that b gets swapped with p, d with t and so on. Finally, the original string up to c, the replacement character and the vowel at v are put together as required and printed.
Example results:
coverage covfefe
creation creatdidi
programming progkaka
stupidity stupbibi
blah blahhaha
Retina, 68 bytes
r`\B(?>([^aeiouy])+)([aeiouy]).*
$1$1$2$1$2
T-5>`fs\dbgcgk\ptzv`Ro`.
JavaScript (ES5), 237 229 bytes
function(s){r=['aeiouy','bcdfgkpstvz','pgtvkgbzdfs']i=0,p=''while(p+=s[i],r[0].indexOf(s[i++])<0);while(p+=s[i],~r[0].indexOf(s[i++]));b=s[i-1];while(r[0].indexOf(s[i++])<0);c=r[1].indexOf(b)d=((~c)?r[2][c]:b)+s[i-1]return p+d+d}
Probably not the most golfy, but it is ES5.
Recently fixed a bug. Example output:
creation->creatdidi
coverage->covfefe
example->exxaxa
programming->progkaka
code->codtete
president->preszizi
Crystal, 130 Bytes
c=/[aeiouy]/
x,y,z=ARGV[0].partition /[^aeiouy]*#{c}*/
k=z[0]
b=((i="pgtvkgbqrzdfs"=~/#{k}/)?"bcdfgkpqrstvz"[i]: k)+z[c]
p y+k+b*2
How it works
c = /[aeiouy]/
store a regex for searching first vowel to c.
x, y, z = ARGV[0].partition /[^aeiouy]*#{c}*/
split the first argument into three parts {"", String until one character before the first consonant after first vowel, rest of string} and store each of the elements into x, y and z.
k = z[0]
get the first character, the relevant consonant.
i = "pgtvkgbqrzdfs" =~ /#{k}/
get the index of the consonant inside the left string or nil.
b = ((i = ...) ? "bcdfgkpqrstvz"[i] : k) + z[c]
if i is not nil, use this index for the second string (kind of a golfed hash).
if i is nil, use the original character.
next, append the first vowel of z.
p y + k + (b * 2)
finally, print first part from first regex y, the first consonant k and two times the previous calculated string b.
Clojure, 182 156 chars
#(let[v #{\a\e\i\o\u\y}p(partition-by v %)[s m[c][n]](if(v(first %))(cons[]p)p)z[(or((zipmap"bcdfgkpstvz""pgtvkgbzdfs")c)c)n]](apply str(concat s m[c]z z)))
How It Works
(partition-by v "president")
Returns a seq of ((\p \r) (\e) (\s) (\i) (\d) (\e) (\n \t))
[s m [c] [n]] (if (v (first x)) (cons [] p) p)
Destructures the seq into s=(\p \r), m=(\e), c=\s, n=\i.
Or for "example" it's s=[], m=(\e), c=\x, n=\a.
(apply str (concat s m [c] [(l c) n] [(l c) n]))
Returns the output string by concatenating the pieces together and stringifying it.
And then I just removed as much whitespace as I could while still making it compile.
De-uglified:
(defn covfefify [x]
(let [vowel? #{\a\e\i\o\u\y}
parts (partition-by vowel? x)
[start mid [consonant] [last-vowel]] (if (vowel? (first x)) (cons [] parts) parts)
lookup #(or ((zipmap "bcdfgkpstvz" "pgtvkgbzdfs") %) %)]
(apply str (concat start mid [consonant] [(lookup consonant) last-vowel] [(lookup consonant) last-vowel]))))
Perl, 90 bytes (89 + 1)
I see that I've already been beaten by another Perl answer, but I'll post this anyway. Run with -p.
s/[aeiouy](.)\K[^aeiouy]*(.).*$//;$x=$1=~y/bcdfgkpstvz/pgtvkgbzdfs/r;$_.="$x$2"x2
Lua, 164 157 bytes
w=arg[1]
i,j,a,b=w:find('[aeiouy]+([^aeiouy]+)(.)')
print(w:sub(1,j-#a)..(('pgtvkhjglmnbqrzdfwxs'):sub(('bcdfghjklmnpqrstvwxz'):find(a:sub(1,1)))..b):rep(2))
Edit 1: Removed 7 bytes by looking for any character after the consonants (see regex)
This program takes a string in CLI argument and prints its covfefied version.
This is my first submission to a code golf! I didn't check the others in detail so I might have missed some common optimizations (and fell in some traps). I used Lua because I've grown to like this little language, and I tried to find a regex that suited my needs.
Here's a cleaner version, using a function (I intended to use one, but the keywords in Lua are too long!):
function covfefy(word)
i, j, a, b = word:find('[aeiouy]+([^aeiouy]+)(.)')
-- 'a' is one or several consonants following the first vowel, b is the first vowel after that
-- 'i' is the index of the beginning of 'a', 'j' the index of 'b'
cov = word:sub(1, j - #a)
-- Look for the first letter of 'a' in the voiced/voiceless table
f = ('pgtvkhjglmnbqrzdfwxs'):sub(('bcdfghjklmnpqrstvwxz'):find(a:sub(1, 1)))
return cov .. (f .. b):rep(2)
end
Feel free to give some feedback :)
Note: If you're wondering, it's 149 bytes long using MoonScript!
Python 3, 155 139 bytes
import re
def f(x,k='aeiouy])'):b,c,v=re.findall(f'(.*?[{k}([^{k}.*?([{k}',x)[0];return b+c+(('bcdfgkpstvz'+c)['pgtvkgbzdfs'.find(c)]+v)*2
removed 16 bytes thanks to @ovs
removed 1 byte thanks to Gábor Fekete
Python, 261 260 bytes
def c(s,t='bpcgdtfvgksz'):
q,r,t='aeiouy',range(len(s)),t+t[::-1]
c=[i for i in r if i>[j for j in r if s[j]in q][0]and s[i]not in q][0]
C=([t[2*i+1]for i in range(12)if s[c]==t[i*2]]or s[c])[0]
return s[:c+1]+(C+s[[i for i in r if i>c and s[i]in q][0]])*2
A Non regex, Not esoteric solution. Took about 20 minutes to make, and an hour more to golf.
It probably has more list comprehension than the entire python standard library, mostly because I don't know regex...
Pyth, 54 bytes
L+hb?>F}RJ"aeiouy"<b2+hKtb*2+XhK"cgdsfbpvztkg")h@JKytb
This defines a function y, that expects a string.
Try it online: Test Suite
MATLAB / Octave - 159 158 bytes
The following works assuming the input string is all lowercase.
a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
Explanation
a = input('','s');: Gets a string from STDIN and stores it into the variablea.m=ismember(a,'aeiouy');: Returns a Boolean array that is the same size as the stringadetermining where vowels are locateds='pgt vkh jglmn bqrzd fwx s';Thecovfefemapping of consonants as a string. This string is 25 characters long and omitting the vowels. The first position where the vowel'a'is supposed to be is removed while the other positions where the vowels are located are placed with a dummy space character. This is so that when we determine the first consonant appearing after the vowel, we will convert the consonant to a position to access a character in this string to determine the first component of the converted word.m(1:find(m,1))=1: Sets the first position of the Boolean array up to where we have found the first vowel as all vowels. This will be so that when we search for the next consonant that follows the first vowel, we will ignore these characters.i=find(~m,1);: Finds the first position of the string that is a consonant after the first vowel.f=a(1:i): Removes the string after the first consonant that follows the vowel. We simply sample from the first position of the string up to this point.d=s(f(end)-97);: Take the last character of the string that is remaining and finds where we need to sample from the lookup string and gets that character. Subtracting a character and a number in MATLAB or Octave coalesces to form an integer by converting the character into its ASCII code. In this case, we subtract the last character by the character at the beginning of the alphabet to give us the position relative to the beginning. However, instead of subtracting byb(98), we subtract byaas MATLAB starts indexing by 1 instead of 0.'a''s ASCII code is 97.m(1:i)=0;: Takes the Boolean mask and sets all characters in the input string from the first position to the first consonant following a vowel to false.v=a(find(m,1));: Finds the next vowel that follows the first consonant from the input string.[f d v d v]: Output ourcovfefeied string.
Example Runs
>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
coverage
ans =
covfefe
>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
example
ans =
exxaxa
>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
programming
ans =
progkaka
>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
code
ans =
codtete
>> a=input('','s');m=ismember(a,'aeiouy');s='pgt vkh jglmn bqrzd fwx s';m(1:find(m,1))=1;i=find(~m,1);f=a(1:i);d=s(f(end)-97);m(1:i)=0;v=a(find(m,1));[f d v d v]
president
ans =
preszizi
Try it online!
http://www.tutorialspoint.com/execute_octave_online.php?PID=0Bw_CjBb95KQMdjROYVR0aFNrWXM
When you hit the Execute button at the top, wait a few moments, then enter the desired string. Enter the string slowly as there seems to be a delay when entering in text.
CJam, 59 58 57 56 bytes
q_{"aeiouy":V&,_T|:T^}#)/(_W>"cbdfkszgvtpg"_W%er@sV&0=+_
Explanation
q_ e# Read the input and copy it.
{ e# Find the index of the first char for which the following is true:
"aeiouy":V e# Push "aeiouy" and store it in V.
&, e# Check if the current char is in the vowel string (0 or 1).
_T|:T e# Copy the result and OR with T (T is initially 0), storing back in T.
^ e# XOR with the original result. This will be 1 for the first
e# consonant appearing after a vowel.
}# e# (end find)
)/ e# Increment the index and split the string into chunks of that size.
( e# Pull out the first chunk.
_W> e# Copy it and get the last character (the consonant).
"cbdfkszgvtpg"_W%er e# Transliterate the consonant to voiced/voiceless alternative.
@s e# Bring all the other split chunks to the top and join them together.
V&0= e# First char of the set intersection of that and the vowels.
e# (i.e. the first vowel in the second half)
+ e# Concatenate the new consonant and the vowel.
_ e# Duplicate the result of that.
e# Implicit output of stack contents.
Haskell, 143 141 138 137 136 bytes
z h=elem h"aeiouy"
f i|(s,(m,c:x))<-span z<$>break z i,j:_<-filter z x,d<-"pgt.vkh.jglmn.bqrzd.fwx.s"!!(fromEnum c-98)=s++m++[c,d,j,d,j]
PHP, 121 Bytes
$v=aeiouy;preg_match("#(.*?[$v]+([^$v])).*?([$v])#",$argn,$t);echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;
Ruby, 90 bytes
->x{x[/(.*?#{$v='[aeiouy]'}+.).*?(#$v)/];$1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2}
Ungolfing it a bit, we have something equivalent to:
def covfefefify(x)
v = '[aeiouy]'
# Match x to a regular expression capturing:
# Group 1:
# some characters (non-greedy)
# followed by some (greedy) non-zero number of vowels
# followed by exactly one character
# Ungrouped:
# Some more (non-greedy) characters
# Group 2
# Exactly one other vowel
# By switching between greedy and non-greedy matches, we can capture longest and shortest vowel/consonant sequences without writing out all the consonants
x[/(.*?#{v}+.).*?(#{v})/]
# Glue it back together, replace the necessary consonants, duplicate where needed
$1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2
end
Ruby, 175 141 110 bytes
->s{s=~/(.*?#{v='[aeiouy]'}+(#{c='[^aeiouy]'}))#{c}*(#{v})/;"#$1#{($2.tr('bcdfgkpstvz','pgtvkgbzdfs')+$3)*2}"}
- Saved 34 bytes thanks to Eric Duminil
- Saved 31 bytes thanks to Value Ink + optimized suggested
trarguments
Ungolfed
covfefify = -> (s) {
from = 'bcdfgkpstvz'
to = 'pgtvkgbzdfs'
vowels = "[aeiouy]"
consonants = "[^aeiouy]"
s.match(/(.*?#{vowels}+(#{consonants}))#{consonants}*(#{vowels})/)
d = ($2.tr(from, to) + $3) * 2
"#$1#{d}"
}
JavaScript (ES6), 107 103 bytes
Saved 4 bytes thanks to GOTO 0
s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)
Test cases
let f =
s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)
console.log(f("creation"))
console.log(f("coverage"))
console.log(f("example"))
console.log(f("programming"))
console.log(f("president"))
Crystal, 203 194 187 186 184 163 bytes
o=""
ARGV[v=c=0].each_char{|a|r=/#{a}/
"aeiouy"=~r&&(v=x=1)||(c=v)
o+=a if c<2||x
c>0&&(x&&break||(o+=(i="pgtvkgbqrzdfs"=~r)?"bcdfgkpqrstvz"[i]: a))}
p o+o[-2..-1]