Covfefify a string

373

86

In this challenge, you must take a string matching the regex ^[a-zA-Z]+$ or whatever is reasonable (you don't have to consider uppercase or lowercase letters if you want) (you may assume the string is long enough, and has the right structure for all the operations), and output another string, produced similarly to word at the end of a recent dadaist tweet by the POTUS ("Despite the constant negative press covfefe").

How to covfefify a string:

First, get the first sound group (made up terminology).

How do you do this? Well:

  • Find the first vowel (y is also a vowel)

      v
    creation
    
  • Find the first consonant after that

        v
    creation
    
  • Remove the rest of the string

    creat
    

That is your first sound group.

Next step:

Get the last consonant of the sound group

t

and replace it with the voiced or voiceless version. To do this, find the letter in this table. Replace with the letter given (which may be the same letter)

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

so, we get

d

Then, take the next vowel after that consonant. You can assume that this consonant is not at the end of the string. Join these two together, then repeat it twice:

didi

Concatenate this to the first sound group:

creatdidi

You're done: the string is covfefified, and you can now output it.

Test cases:

coverage: covfefe

example: exxaxa

programming: progkaka (the a is the first vowel after the g, even though it is not immediately after)
code: codtete

president: preszizi

This is , so please make your program as short as possible!

Destructible Lemon

Posted 2017-05-31T08:07:15.733

Reputation: 5 908

7"x" should technically map onto "gz". "qu" should map onto "gw". – Steve Bennett – 2017-06-05T05:34:49.310

3

This specifies one concept of covfefification but I keep feeling that a reference to Douglas Hofstadter's (and Melanie Mitchell's) work on string-conversion analogies, e.g. in Fluid Concepts seems appropriate.

– Mars – 2017-06-07T05:51:11.113

64Answers over 140 characters should be disqualified – Sandy Gifford – 2017-06-07T15:27:53.263

12Unfortunately it is impossible to do this in TrumpScript :( – None – 2017-06-14T22:09:21.887

@SandyGifford No, see the list of things to avoid when writing a challenge. https://codegolf.meta.stackexchange.com/a/8928/75773

– ThePlasmaRailgun – 2017-12-19T22:25:30.573

2@ThePlasmaRailgun dude... – Sandy Gifford – 2017-12-20T14:57:02.283

4@ThePlasmaRailgun It was a joke, since tweets have to be 140 characters or less. – Esolanging Fruit – 2017-12-31T22:14:50.063

Answers

91

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.

Try it online!

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

Jonathan Allan

Posted 2017-05-31T08:07:15.733

Reputation: 67 804

13This is amazing... – Klangen – 2017-05-31T14:23:44.313

Incredible work. – JF it – 2017-06-02T13:22:49.530

9I'm jelly. Upvoted. – DeepS1X – 2017-06-05T05:01:29.790

6This is the weirdest programming language I've ever seen. – Ryan – 2017-06-07T16:57:28.093

@Ryan it's intended for golfing. – Esolanging Fruit – 2017-07-17T22:39:31.743

I'm learning Jelly currently and this answer is still amazing. – MilkyWay90 – 2019-03-10T19:52:54.523

62

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

Arnauld

Posted 2017-05-31T08:07:15.733

Reputation: 111 334

6You can save a few bytes like this: s=>([,a,b,c]=s.match\(.?[aeiouy]+(.)).?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)` – GOTO 0 – 2017-06-01T00:13:39.233

@GOTO0 Thanks, updated. – Arnauld – 2017-06-01T05:11:25.373

52

Jelly, 45 39 bytes

Øa“œṣ$b|0Ḃ’ṃ,Ṛ$yṫµfØyḢṭḢẋ2
e€ØyIi-‘ɓḣ;ç

Try it online!

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 = 0, b = 1, ..., z = 25.
                            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.

Dennis

Posted 2017-05-31T08:07:15.733

Reputation: 196 637

4sorry, buddy, looks like you missed out on the mega jelly rep – Destructible Lemon – 2017-06-15T12:17:36.217

tfw an answer looks overly simplistic but is in fact really wonderful...simple is beautiful – Erik the Outgolfer – 2017-06-16T09:29:22.483

31

CJam, 59 58 57 56 bytes

q_{"aeiouy":V&,_T|:T^}#)/(_W>"cbdfkszgvtpg"_W%er@sV&0=+_

Try it online!

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.

Business Cat

Posted 2017-05-31T08:07:15.733

Reputation: 8 927

2CJam beats Jelly? :O (At least, it beats the Jelly answer everybody seems to be upvoting.) – Esolanging Fruit – 2017-07-17T22:41:54.533

29

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

Try it online!

betseg

Posted 2017-05-31T08:07:15.733

Reputation: 8 493

Does *p=putchar work as the first line? – k_g – 2017-06-03T23:25:32.287

5Sorry disqualified. Can't fit in a tweet. – caird coinheringaahing – 2017-06-09T06:46:28.263

@cairdcoinheringaahing you sir are incorrect (I know that it was 140 when you wrote that) – Stan Strum – 2018-01-11T20:25:04.570

1171 bytes – ceilingcat – 2018-11-30T19:21:49.527

112 or so bytes can be shaved off by replacing #defines and the function with preprocessor flags (-D...). – None – 2018-12-01T15:53:09.193

Actually tweetable now because twitter allows 280 chars. – Lyxal – 2020-01-22T07:32:55.603

23

Perl 5, 81 72 bytes

s![aeiouy]+(.)\K.*!($1=~y/bcdfgkpstvz/pgtvkgbzdfs/r.$&x/[aeiouy]/g)x2!ge

Try it online!

Grimmy

Posted 2017-05-31T08:07:15.733

Reputation: 12 521

You and I had the same idea with \K, but you did it 9 bytes better than I did. Good answer! – Silvio Mayolo – 2017-06-06T23:25:21.583

18

PHP, 121 Bytes

$v=aeiouy;preg_match("#(.*?[$v]+([^$v])).*?([$v])#",$argn,$t);echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;

Try it online!

Jörg Hülsermann

Posted 2017-05-31T08:07:15.733

Reputation: 13 026

3-2 bytes: echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z; – Titus – 2017-06-01T11:53:21.887

@Titus I have not think about that. Thank You – Jörg Hülsermann – 2017-06-01T11:59:01.047

why not rename $argn to something shorter? $a, for example - that's -3 bytes – Tyler Sebastian – 2017-06-06T22:37:08.453

@TylerSebastian I must have an input variable that exists. Yes I can create a function but if I do it it raise the byte count more as use the three bytes – Jörg Hülsermann – 2017-06-06T22:44:07.397

ah ok sorry I forgot how PHP does command line args - I just saw that you had defined it in the header section but failed to realize it was a reserved variable. – Tyler Sebastian – 2017-06-06T22:45:29.233

15

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

Jakube

Posted 2017-05-31T08:07:15.733

Reputation: 21 462

14

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

L3viathan

Posted 2017-05-31T08:07:15.733

Reputation: 3 151

2You could create a variable which has the value 'aeiouy]', maybe that will save some bytes. Also you can remove some characters from the replacement strings as there are the same. – Gábor Fekete – 2017-05-31T12:41:52.743

2I can't remove the identical characters from the replacement string, because that would be an IndexError, and saving aeiouy]) doesn't save any bytes. – L3viathan – 2017-05-31T13:14:35.723

2if you pull out something like s='aeiouy])', you could use b,c,v=re.findall('(.*?[%s([^%s.*?([%s'%(s,s,s). It's not shorter, but might lead towards a way to shorten it overall. – Jeremy Weirich – 2017-05-31T19:50:33.583

2yeah, using f-strings it might be shorter – Gábor Fekete – 2017-05-31T19:54:23.493

6Shortened to 139 bytes – ovs – 2017-05-31T20:34:39.740

2Who serially upvoted comments? – Arjun – 2017-06-01T07:29:40.770

3Using f-strings will save 1 byte: k='aeiouy])' and f'(.*?[{k}([^{k}.*?([{k}' – Gábor Fekete – 2017-06-01T07:48:16.203

14

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:

Try it here.

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

Kevin Cruijssen

Posted 2017-05-31T08:07:15.733

Reputation: 67 575

13

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]

Try it online!

bartavelle

Posted 2017-05-31T08:07:15.733

Reputation: 1 261

1Awesome! Replacing nx with something one-lettered will save 2 bytes. – tomsmeding – 2017-06-01T07:08:40.897

declaring z outside of f and switching to guards instead of a let saves another two bytes: Try it online!

– Laikoni – 2017-06-01T07:52:37.550

2And two more by combining (s,v)<-break z i,(m,c:x)<-span z v into (s,(m,c:x))<-span z<$>break z i. – Laikoni – 2017-06-01T07:55:30.953

Could shave one more by putting the opening parenthesis next to the let, thanks! – bartavelle – 2017-06-01T08:15:17.583

@Laikoni I don't understand the part about moving z out of f ? – bartavelle – 2017-06-01T08:18:00.553

@Laikoni : ok, finally got it, saved 1 byte! – bartavelle – 2017-06-01T13:30:01.543

10

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

Try it online! (With testcases)

sagiksp

Posted 2017-05-31T08:07:15.733

Reputation: 1 249

8

Ruby, 90 bytes

->x{x[/(.*?#{$v='[aeiouy]'}+.).*?(#$v)/];$1+($1[-1].tr('bcdfgkpstvz','pgtvkgbzdfs')+$2)*2}

Try it online!

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

ymbirtt

Posted 2017-05-31T08:07:15.733

Reputation: 1 792

8

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

Try it online!

Fellow golfers that helped me:

 Destructible Lemon / Wheat Wizard - 5 bytes
 Hubert Grzeskowiak - 1 byte
 musicman523 - 16 bytes

WaitndSee

Posted 2017-05-31T08:07:15.733

Reputation: 81

2Welcome to the site! I see you tried using tabs for indentation. If you replace each tab with a single space, it is functionally identical and actually shows up properly instead of as extra bytes – Destructible Lemon – 2017-06-01T10:43:36.280

4While what Destructible Lemon said is correct, you can save even more bytes in you source by indenting the first level of your code with a single space and the second level with a single tab, this will make it a bit hard to display, but will save you 5 bytes. – Post Rock Garf Hunter – 2017-06-01T10:45:26.803

Changes made, thanks a lot ! – WaitndSee – 2017-06-01T13:46:39.347

1Is the semicolon at the end of line 4 necessary? – Hubert Grzeskowiak – 2017-06-03T17:54:47.867

Well spotted Sir ! – WaitndSee – 2017-06-06T08:50:27.897

@WheatWizard Mixing spaces and tabs does make it incompatible with Python 3, though. – musicman523 – 2017-06-08T04:22:48.443

1

@WaitndSee I think you can shorten some of your conditionals. First: you can change not n to n<1 for 2 bytes, since you know n will never be negative. Also you can change n==3 to n>2 since you know n will never be greater than 3. You can also use the Python tricks for conditionals to shorten the first and second-last even further: n=[n,1][i in w and n<1]; r+=[0,r][n<2]

– musicman523 – 2017-06-08T04:33:14.570

@musicman523 I haven't tried the trick for shortening conditionnals as I don't fully understand it's functionning yet, but will look forward toward it in the future. Thanks for the ideas and the link to the page that showed me the "(int)(operator)" trick ! – WaitndSee – 2017-06-08T08:49:26.363

@musicman523 2 bytes saved by removing the r+=i on line 5 and using your trick. EDIT : Nevermind, old way seems more efficient but you got me to rethink a way to remove those caracters on line 5 so 11 bytes total thanks to you directly and indirectly ! – WaitndSee – 2017-06-08T09:59:28.653

2

You can change r,v,c=('',)*3 to r=v=c='', since strings are immutable. I've tried a bunch of other clever tricks but frustratingly they are exactly as long. Also it may be worth adding a Try it online! link to your post

– musicman523 – 2017-06-08T13:14:36.630

7

Ruby, 175 141 110 bytes

->s{s=~/(.*?#{v='[aeiouy]'}+(#{c='[^aeiouy]'}))#{c}*(#{v})/;"#$1#{($2.tr('bcdfgkpstvz','pgtvkgbzdfs')+$3)*2}"}

Try it online!

  • Saved 34 bytes thanks to Eric Duminil
  • Saved 31 bytes thanks to Value Ink + optimized suggested tr arguments

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

sudee

Posted 2017-05-31T08:07:15.733

Reputation: 551

4-34 bytes with Hash[*"bpcgdtfvgkkgpbsztdvfzs".chars] – Eric Duminil – 2017-05-31T13:30:40.017

1Since input seems guaranteed to be all alphabetical characters, c=[^aeiou] is shorter. Have the first interpolation for each variable assign it simultaneously for -2 bytes: /^(.*?${v='[aeiou]'}+(#{c='[^aeiou]})).../. Finally, $2.tr("b-z","pgtevkhijgl-obqrzdufwxys") instead of the Hash solution. – Value Ink – 2017-05-31T18:42:52.670

You can save 14 bytes by using subexpressions (\g<n>) instead of interpolation, plus another 14 using @ValueInk's [^aeiou] suggestion: s=~/^(.*?([aeiouy])+([^aeiou]))\g<3>*(\g<2>)/. – Jordan – 2017-05-31T20:02:16.703

Actually, that has a bug with programming -> progkaka, which I can't quite figure out. – Jordan – 2017-05-31T20:19:32.933

@Jordan unfortunately the subexpression call \g<3> updates the value of $3, so we can't use this shortcut. – sudee – 2017-06-01T09:15:42.673

6

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]

reitermarkus

Posted 2017-05-31T08:07:15.733

Reputation: 291

I think you can lose the parens around c=v and o+=<...> – Cyoce – 2017-06-19T15:24:36.020

5

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

  1. a = input('','s');: Gets a string from STDIN and stores it into the variable a.
  2. m=ismember(a,'aeiouy');: Returns a Boolean array that is the same size as the string a determining where vowels are located
  3. s='pgt vkh jglmn bqrzd fwx s'; The covfefe mapping 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.
  4. 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.
  5. i=find(~m,1);: Finds the first position of the string that is a consonant after the first vowel.
  6. 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.
  7. 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 by b (98), we subtract by a as MATLAB starts indexing by 1 instead of 0. 'a''s ASCII code is 97.
  8. 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.
  9. v=a(find(m,1));: Finds the next vowel that follows the first consonant from the input string.
  10. [f d v d v]: Output our covfefeied 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.

rayryeng - Reinstate Monica

Posted 2017-05-31T08:07:15.733

Reputation: 1 521

5

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

Brian Baritonehands Gregg

Posted 2017-05-31T08:07:15.733

Reputation: 161

Welcome to PPCG, and great first answer! We hope you'll stay and have fun participating in more challenges. :-) – ETHproductions – 2017-06-06T22:23:10.493

If you're defining a function, its name should probably be as short as possible. You could just call the main function c, for example. (We also allow anonymous functions, which are shorter in many languages; I'm not sure whether they are in Clojure). I see you've made that improvement in the interior of your code already, though, so probably not much needs changing here. – None – 2017-06-06T22:31:34.203

5

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 = "")
}

Andrew Haynes

Posted 2017-05-31T08:07:15.733

Reputation: 311

I believe your count it is off - I count 340 bytes – Taylor Scott – 2017-07-22T20:03:59.163

Got it down to 304 bytes – Giuseppe – 2017-07-25T20:54:01.383

4

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׫

Try it online!

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

kalsowerus

Posted 2017-05-31T08:07:15.733

Reputation: 1 894

You can replace "bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs" with .•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи• to save 15 bytes – Okx – 2017-06-19T09:41:11.610

You can also replace žOÃćIsk with žOÃ0èk to save another byte. – Okx – 2017-06-19T09:47:30.627

@Okx I think I really need to learn some String compression techniques. Thanks! – kalsowerus – 2017-06-19T12:41:06.103

@kalsowerus I know it's been a while, but you can golf 8 bytes from your answer like this: žOÃнk>[DIs£¤žPså#\>]©s[DIsèDžOså#\>]s\.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`®θkèìDJ Try it online. I mainly got rid of all the swaps and triple-swaps by using a variable instead. And can be н, and I've replaced 2׫ with DJ to join the entire stack together. PS: I've also posted a 55 bytes 05AB1E answer using a different technique. (Which also includes a link to better understand compression in 05AB1E. :D)

– Kevin Cruijssen – 2018-12-01T11:27:37.407

4

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

FireballStarfish

Posted 2017-05-31T08:07:15.733

Reputation: 91

link to blitzmax repo? – Destructible Lemon – 2017-06-03T06:29:19.843

@DestructibleLemon BlitzMax was created as a language primarily for amateur game delevopment and with a proprietary compiler sold for money. While it is now free and available from here, I believe the compiler is still not open source. There exists an alternative implementation (repo here, builds here), which will however only run the ungolfed version of above code due to the lack of a "non-strict" setting that allows omitting variable declarations.

– FireballStarfish – 2017-06-03T07:55:15.573

Clever use of XOR on index -- I'll probably be using that someday. Thank you. – A. I. Breveleri – 2017-06-08T03:42:57.353

4

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.

SomeDude

Posted 2017-05-31T08:07:15.733

Reputation: 41

3

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.

Try it online.

Domii

Posted 2017-05-31T08:07:15.733

Reputation: 219

3

Retina, 68 bytes

r`\B(?>([^aeiouy])+)([aeiouy]).*
$1$1$2$1$2
T-5>`fs\dbgcgk\ptzv`Ro`.

Try it online!

Martin Ender

Posted 2017-05-31T08:07:15.733

Reputation: 184 808

3

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

Kevin Cruijssen

Posted 2017-05-31T08:07:15.733

Reputation: 67 575

I ended up making my own answer, since even though I used your answer as a starting point, the result is very different. Unfortunately couldn’t get it below 35.

– Grimmy – 2020-02-01T12:44:58.810

2

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}

Try it online!

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

Octopus

Posted 2017-05-31T08:07:15.733

Reputation: 819

2

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)

Try it online!

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!

Kyrio

Posted 2017-05-31T08:07:15.733

Reputation: 121

2

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

Try it online!

zgrep

Posted 2017-05-31T08:07:15.733

Reputation: 1 291

2

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

Brandon Hao

Posted 2017-05-31T08:07:15.733

Reputation: 31

1I'm no expert, but I think you can add the incrementation to the comparator in the for loop, that is, x++ < l, or something (maybe l > x++ if the first doesn't work). not sure though – Destructible Lemon – 2017-07-22T02:51:18.787

@DestructibleLemon Thanks for the tip! – Brandon Hao – 2017-07-24T14:18:27.987

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

Detailed explanation here!

snail_

Posted 2017-05-31T08:07:15.733

Reputation: 1 982

2

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)

Try it online!

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!

chinatsu

Posted 2017-05-31T08:07:15.733

Reputation: 21

2Looks good! +1 for the good job :D also, you are never late for a code-golf party! – RGS – 2020-02-13T14:08:16.500

1

You can take off some bytes by having b look for the index instead of the character since indexing is shorter than .find. Try it online!

– Post Rock Garf Hunter – 2020-02-13T15:03:38.333

I really, really like this, but does it not break on input words such as peeled? Try it online!

I need a bit of time to properly understand it, I can't quite figure out how to fix it but I have a feeling that it is possible!

– chinatsu – 2020-02-13T15:49:21.393

I thought I had it with this, however it also breaks if the word start with a vowel :( The example given should return avfefe

– chinatsu – 2020-02-13T16:31:01.430

1

You can save a few bytes with short-circuiting

– Reinstate Monica – 2020-02-13T16:51:07.150

Oh, nice! It breaks on example on input, but this seems to be solved by calling g(-1) instead of g(0) – chinatsu – 2020-02-13T17:02:08.330

1

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

Silvio Mayolo

Posted 2017-05-31T08:07:15.733

Reputation: 1 817

1

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

Ozz Nixon

Posted 2017-05-31T08:07:15.733

Reputation: 21

1this is not 415 bytes. please trim spaces and actually make it 415 bytes to have that score. also the function name can be golfed – Destructible Lemon – 2017-06-12T23:52:01.780

made smaller by unformatting. Could go even smaller, as modern pascal does not enforce the grammer of then a wasted heartbeat in parsing. – Ozz Nixon – 2017-06-13T17:46:48.717

3if you can go even smaller then you should – Destructible Lemon – 2017-06-13T22:17:34.043

1

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}

dr.jose

Posted 2017-05-31T08:07:15.733

Reputation: 11

Welcome to PPCG! – Martin Ender – 2017-06-19T14:46:34.830

1

Python 3, 194 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
S=('pgtvkhjglmnbqrzdfwxs'[C.index(q[c-1])]+q[f(q[c:])+c])*2
print(q[:c]+S)

Try it online!

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

osuka_

Posted 2017-05-31T08:07:15.733

Reputation: 391

Your TIO gives an error. – FlipTack – 2018-01-04T07:49:22.360

1

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

Herman L

Posted 2017-05-31T08:07:15.733

Reputation: 3 611

I may be wrong, but it doesn't look like [aeiou] and [^aeiou] account for the fact that, in this challenge, y is considered a vowel. – FlipTack – 2018-01-03T16:32:02.633

1

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

12Me21

Posted 2017-05-31T08:07:15.733

Reputation: 6 110

1

05AB1E, 35 bytes

1ú.γžOså}R`¦??н©?н®ì.•gÍĆdQ¸G•Â‡D?,

Try it online!

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)

Grimmy

Posted 2017-05-31T08:07:15.733

Reputation: 12 521