Covfefify рядок


371

У цьому виклику ви повинні взяти рядок, що відповідає регексу ^[a-zA-Z]+$або тому, що є розумним (вам не потрібно вважати великі або малі літери, якщо ви хочете) (ви можете вважати, що рядок є досить довгим і має правильну структуру для всіх операцій) та вивести іншу рядок, створений аналогічно слову в кінці недавнього твіту дадаїстів POTUS ( "Despite the constant negative press covfefe").

Як covfefify рядок:

Спочатку знайдіть першу звукову групу (складена термінологія).

Як це зробити? Ну:

  • Знайдіть перший голосний ( yтакож є голосним)

      v
    creation
    
  • Знайдіть перший приголосний після цього

        v
    creation
    
  • Вийміть решту рядка

    creat
    

Це ваша перша звукова група.

Наступний крок:

Отримайте останній приголосний звукову групу

t

і замініть його на звукову або безголосну версію. Для цього знайдіть букву в цій таблиці. Замініть на вказану букву (яка може бути однаковою літерою)

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

Отже, ми отримуємо

d

Потім прийміть наступну голосну після цього приголосного. Можна припустити, що цей приголосний не знаходиться в кінці рядка. З’єднайте ці два разом, а потім повторіть два рази:

didi

З'єднайте це з першою звуковою групою:

creatdidi

Ви закінчили: рядок covfefified, і тепер ви можете її вивести.

Тестові приклади:

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

Це , тому будь ласка, зробіть свою програму якомога коротшою!


7
"x" технічно має відображатись на "gz". "qu" має відображатись на "gw".
Стів Беннетт

2
Це визначає одну концепцію ковфіфікації, але я продовжую відчувати, що посилання на роботу Дугласа Хофштадтера (і Мелані Мітчелл) працює на аналогії перетворення рядків, наприклад, у Fluid Concepts .
Марс

58
Відповіді понад 140 символів слід дискваліфікувати
Сенді Гіффорд

12
На жаль, це неможливо зробити в TrumpScript :(

4
@ThePlasmaRailgun Це був жарт, оскільки твіти мають містити 140 символів або менше.
Esolanging Fruit

Відповіді:


91

Желе ,  58  57 байт

<TḢị
e€Øyµ¬TĖEÐḟḢṪ;ç¥T
ḣÇḢ⁸ÇịµḢØYiị“ßȷ%Hẹrȧq’œ?ØY¤⁾cgy;ẋ2

Повна програма, яка приймає список малих символів та друкує результат.

Спробуйте в Інтернеті!

Як?

<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

13
Це дивовижно ...
Кланген

Неймовірна робота.
JF це

9
Я желе. Отримано.
DeepS1X

6
Це най дивніша мова програмування, яку я коли-небудь бачив.
Райан

@Ryan призначений для гри в гольф.
Esolanging Fruit

61

JavaScript (ES6), 107 103 байт

Збережено 4 байти завдяки GOTO 0

s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)

Тестові справи


6
Ви можете зберегти кілька байтів так:s=>([,a,b,c]=s.match`(.*?[aeiouy]+(.)).*?([aeiouy])`,a+(b=(a="bcdfgszkvtgp")[11-a.search(b)]||b)+c+b+c)
GOTO 0

@ GOTO0 Дякую, оновлено.
Арнольд

49

Желе , 45 39 байт

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

Спробуйте в Інтернеті!

Як це працює

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.

4
вибачте, приятель, схоже, що ти пропустив мега-желе реп
руйнівний лимон

tfw відповідь виглядає надмірно спрощеною, але насправді справді чудовою ... просто красиво
Ерік the Outgolfer

31

CJam , 59 58 57 56 байт

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

Спробуйте в Інтернеті!

Пояснення

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.

2
CJam б'є Jelly? : O (Принаймні, це б'є желе відповідь, що всі, здається, викликає позитивні дії.)
Esolanging Fruit

29

C, 219 213 206 179 175 байт

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

Спробуйте в Інтернеті!


Чи працює * p = putchar як перший рядок?
k_g

4
Вибачте, що дискваліфікували. Не можу вписатись у твіт.
caird coinheringaahing

@cairdcoinheringaahing Ви, сер, неправі (я знаю, що це було 140, коли ви це писали)
Стен Струм


1
12 або більше байтів можна відтерти, замінивши #defines та функцію прапорами препроцесора ( -D...).


18

PHP, 121 байт

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

Спробуйте в Інтернеті!


3
-2 байти:echo$t[1],$z=strtr($t[2].$t[3],bcdfgkpstvz,pgtvkgbzdfs),$z;
Тіт

@Titus Я про це не думав. Дякую
Йорг Хюльсерманн

чому б не перейменувати $argnщось коротше? $a, наприклад - це -3 байти
Тайлер Себастьян

@TylerSebastian У мене повинна бути вхідна змінна. Так, я можу створити функцію, але якщо я це роблю, піднімаю кількість байтів більше, оскільки використовую три байти
Йорг Гюльсерманн

ах добре вибачте, я забув, як PHP робить аргументи командного рядка - я щойно побачив, що ви визначили це в розділі заголовка, але не змогли зрозуміти, що це зарезервована змінна.
Тайлер Себастьян

15

Pyth, 54 байти

L+hb?>F}RJ"aeiouy"<b2+hKtb*2+XhK"cgdsfbpvztkg")h@JKytb

Це визначає функцію y, яка очікує рядок. Спробуйте в Інтернеті: Test Suite


14

Python 3, 155 139 байт

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

видалено 16 байт завдяки @ovs

видалено 1 байт завдяки Габору Фекете


2
Ви можете створити змінну, яка має значення 'aeiouy]', можливо, це дозволить зберегти деякі байти. Також ви можете видалити деякі символи з рядків заміни, оскільки вони є однаковими.
Габор Фекете

2
Я не можу видалити однакові символи з рядка заміни, тому що це було б IndexError, а збереження aeiouy])не зберігає жодних байтів.
L3viathan

2
якщо ви витягнете щось на кшталт s='aeiouy])', ви могли б скористатися b,c,v=re.findall('(.*?[%s([^%s.*?([%s'%(s,s,s). Він не коротший, але може призвести до способу його скорочення в цілому.
Джеремі Вейріх


3
Використання f-рядків збереже 1 байт: k='aeiouy])'іf'(.*?[{k}([^{k}.*?([{k}'
Gábor Fekete

14

Java 8, 243 236 222 байти

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

Використання .replaceAll регекси з групами захоплення для фільтрації частин, які ми не хочемо.

Пояснення:

Спробуйте тут.

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

13

Haskell , 143 141 138 137 136 байт

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]

Спробуйте в Інтернеті!


1
Дивовижно! Замінивши nxчимось однолітерним, заощадить 2 байти.
tomsmeding

декларування zза межами fта перехід на охорону, а не letекономить ще два байти: Спробуйте це в Інтернеті!
Laikoni

2
І ще два, об’єднавши (s,v)<-break z i,(m,c:x)<-span z vв(s,(m,c:x))<-span z<$>break z i .
Лайконі

Не могли б постригти ще одну, поставивши відкривальні дужки поруч із let, спасибі!
bartavelle

@Laikoni Я не розумію частини про переїзд z з f?
bartavelle

10

Пітон, 261 260 байт

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

Негенезуючий розчин, не езотеричний розчин. Щоб взяти на гольф приблизно 20 хвилин, і ще на годину більше.

Це, мабуть, більше розуміння списку, ніж вся стандартна бібліотека python, здебільшого тому, що я не знаю регулярного вираження ...

Спробуйте в Інтернеті! (З випробуваннями)


8

Рубін , 90 байт

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

Спробуйте в Інтернеті!

Трохи відмахуючись, ми маємо щось рівнозначне:

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

8

Пітон 2, 251 246 245 239 237 234 229 211 байт

Перше подання тут.

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

Спробуйте в Інтернеті!

Колеги-гольфісти, які мені допомогли:

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

2
Ласкаво просимо на сайт! Я бачу, ви спробували використовувати вкладки для відступу. Якщо ви заміните кожну вкладку одним простором, вона є функціонально однаковою і фактично відображається належним чином, а не як зайві байти
Руйнуючий лимон

4
Хоча те, що сказав Destructible Lemon є правильним, ви можете зберегти ще більше байтів у своєму джерелі, відступаючи перший рівень коду одним простором, а другий рівень однією вкладкою, це зробить його трохи важким для відображення, але буде заощадите 5 байт.
Сріотчілізм О'Заїк

1
Чи потрібна крапка з комою в кінці рядка 4?
Hubert Grzeskowiak

1
@WaitndSee Я думаю, ви можете скоротити деякі свої умови. По-перше: ви можете змінитись not nна n<12 байти, оскільки ви знаєте n, що ніколи не буде негативним. Крім того, ви можете змінити , n==3щоб , n>2так як ви знаєте , nніколи не буде більше 3. Ви можете також використовувати трюки Python для умовних , щоб вкоротити перші і другий-останній ще далі n=[n,1][i in w and n<1]; r+=[0,r][n<2]
musicman523

1
Ви можете змінити , r,v,c=('',)*3щоб r=v=c='', оскільки рядки є незмінними. Я спробував купу інших хитромудрих хитрощів, але розчаровують їх так само довго. Крім того, варто додати спробувати в Інтернеті! посилання на ваше повідомлення
musicman523

7

Рубі , 175 141 110 байт

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

Спробуйте в Інтернеті!

Безумовно

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

4
-34 байт сHash[*"bpcgdtfvgkkgpbsztdvfzs".chars]
Ерік Думініл

1
Оскільки введення, як видається, гарантується усіма алфавітними символами, c=[^aeiou]коротше. Мати перші інтерполяції для кожного змінного привласнити одночасно -2 байт: /^(.*?${v='[aeiou]'}+(#{c='[^aeiou]})).../. Нарешті, $2.tr("b-z","pgtevkhijgl-obqrzdufwxys")замість рішення Hash.
Значення чорнила

Ви можете заощадити 14 байт, використовуючи подвираженія ( \g<n>) замість інтерполяції, плюс ще 14 з допомогою @ ValueInk по [^aeiou]пропозицією: s=~/^(.*?([aeiouy])+([^aeiou]))\g<3>*(\g<2>)/.
Йорданія

Насправді, це помилка з programming-> progkaka, яку я не можу зрозуміти.
Йорданія

@Jordan, на жаль, дзвінок під вираженою експресією \g<3>оновлює значення $ 3, тому ми не можемо скористатися цим ярликом.
sudee

6

Кристал, 203 194 187 186 184 163 байт

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]

Я думаю, що ти можеш втратити парони навколо c=vіo+=<...>
Cyoce

5

MATLAB / Octave - 159 158 байт

Наступні роботи припускають, що вхідний рядок - це малі літери.

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]

Пояснення

  1. a = input('','s');: Отримує рядок від STDIN і зберігає його в змінну a.
  2. m=ismember(a,'aeiouy');: Повертає булевий масив, який має той самий розмір, що і рядок, що aвизначає місце голосних звуків
  3. s='pgt vkh jglmn bqrzd fwx s';covfefeВідображення приголосних звуків у вигляді рядка. Цей рядок має 25 символів і пропускає голосні. Перша позиція, де 'a'має бути голосний, видаляється, а інші позиції, де голосні розташовані, розміщуються з манекеновим символом пробілу. Це так, що коли ми визначаємо перший приголосний, що з’являється після голосної, ми перетворимо приголосний у позицію для доступу до символу в цьому рядку для визначення першого компонента перетвореного слова.
  4. m(1:find(m,1))=1: Встановлює перше положення булевого масиву до того місця, де ми знайшли перший голосний як усі голосні. Це станеться так, що коли ми будемо шукати наступний приголосний, що слідує за першою голосною, ми ігноруємо ці символи.
  5. i=find(~m,1);: Знаходить перше положення рядка, яке є приголосним після першого голосного.
  6. f=a(1:i): Вилучає рядок після першого приголосного, що йде за голосною. Ми просто робимо вибірку від першого положення рядка до цього моменту.
  7. d=s(f(end)-97);: Візьмемо останній символ рядка, що залишився, і знайдемо, де нам потрібно зробити вибірку з рядка пошуку і отримає цей символ. Віднімання символу та числа в MATLAB або Octave зливається, утворюючи ціле число, перетворюючи символ у його ASCII код. У цьому випадку ми віднімаємо останній символ символом на початку алфавіту, щоб дати нам положення відносно початку. Однак замість віднімання b(98) ми віднімаємо так, aяк MATLAB починає індексувати 1, а не 0. 'a'Код ASCII дорівнює 97.
  8. m(1:i)=0;: Бере булеву маску і встановлює всі символи у вхідному рядку від першого положення до першого приголосного після голосного на false.
  9. v=a(find(m,1));: Знаходить наступну голосну, яка слідує за першим приголосним із вхідного рядка.
  10. [f d v d v]: Виведіть наш covfefeied рядок.

Приклад працює

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

Спробуйте в Інтернеті!

http://www.tutorialspoint.com/execute_octave_online.php?PID=0Bw_CjBb95KQMdjROYVR0aFNrWXM

Натиснувши кнопку "Виконати" вгорі, зачекайте кілька хвилин, а потім введіть потрібний рядок. Введіть рядок повільно, оскільки, здається, є затримка під час введення тексту.


5

Clojure, 182 156 символів

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

Як це працює

(partition-by v "president")

Повертає послідовність ((\p \r) (\e) (\s) (\i) (\d) (\e) (\n \t))

[s m [c] [n]] (if (v (first x)) (cons [] p) p)

Destructures з послід в s=(\p \r), m=(\e), c=\s,n=\i .

Або «приклад» це s=[], m=(\e), c=\x, n=\a.

(apply str (concat s m [c] [(l c) n] [(l c) n]))

Повертає вихідний рядок, об'єднуючи частини і з'єднуючи їх.

А потім я просто видалив стільки пробілів, скільки міг, поки все ще змушував її компілювати.

Знехрещене:

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

Ласкаво просимо в PPCG, і чудова перша відповідь! Ми сподіваємось, що ви будете залишатися і отримувати задоволення, беручи участь у нових завданнях. :-)
ETHproductions

Якщо ви визначаєте функцію, її ім'я, мабуть, має бути якомога коротшим. Можна просто назвати c, наприклад, головну функцію . (Ми також допускаємо анонімні функції, які у багатьох мовах коротші; я не впевнений, чи є вони у Clojure). Я бачу, ви вже зробили це вдосконалення в інтер'єрі свого коду, тому, напевно, тут не потрібно багато чого змінювати.

5

R, 341 символ

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

Жахлива спроба R, чому струни такі важкі

Читаема версія:

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

Я вважаю, що ваш рахунок відключений - я рахую 340 байт
Тейлор Скотт


4

BlitzMax, 190 байт

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

Бере слово з stdin і друкує результат у stdout. Введене слово вважається малим і містить принаймні одну голосну, за якою йде приголосна.

Більш читаема версія progam з форматуванням та змінними оголошеннями:

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

Як це працює:

BlitzMax не має ніяких вбудованих функцій регулярних виразів або подібного, тому цикл використовується для ітерації символів введеного слова, поки він не знайде голосну, за якою йде ланцюжок щонайменше одного приголосного. Змінна c зберігає положення останнього з цих приголосних, v положення голосного. Цикл продовжує бачити, чи є інший голосний після ланцюга, і якщо так, v оновлюється відповідно. Потім приголосний на c шукається в рядку "bpdtfvgkcgsz", який виконує функції таблиці заміни. Якщо приголосний знайдений у таблиці в будь-якому положенні, то це положення XOR-ed з 1, і символ у отриманій позиції використовується як його заміна. Операція XOR перетворює 0 на 1, 2 на 3, 4 на 5 тощо і навпаки, так що b заміняється на p, d на t тощо. Нарешті, початковий рядок до c,

Приклад результатів:

покриття covfefe

створення креадіді

програмування прогвака

дурість глупці

бла-бла-ха-ха


посилання на blitzmax repo?
Зруйнований лимон

@DestructibleLemon BlitzMax був створений як мова в першу чергу для аматорського відключення ігор та з фірмовим компілятором, проданим за гроші. Хоча зараз він безкоштовний і доступний звідси , я вважаю, що компілятор все ще не є відкритим кодом. Існує альтернативна реалізація (repo here , build тут ), яка, однак, буде запускати лише неперероблену версію вищевказаного коду через відсутність "не строгого" налаштування, яке дозволяє опускати оголошення змінної.
FireballStarfish

Розумне використання XOR в індексі - я, мабуть, буду користуватися цим колись. Дякую.
AI Breveleri

4

Perl, 71 байт

s#[aeiouy]+(.)\K.*?([aeiouy]).*#"$1$2"=~y/bcdfgkpstvz/pgtvkgbzdfs/rx2#e

Також бігайте з perl -pe. На кілька байт менше попереднього рішення Perl. Справді, я також звідти отримав натхнення.


4

05AB1E , 101 104 88 байт

-16 байт завдяки Okx

Я як - то сподіваюся , що це може бути зроблено способом більш ефективно.

žOÃćIsk>[DIs£¤žPså#\>]s[DIsèDžOså#\>]ŠŠ"bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"S2ôDí«ø`Šs¤sŠksŠèsŠì2׫

Спробуйте в Інтернеті!

Пояснення

                  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

Ви можете замінити "bpcgdtfvgkhhjjkgllmmnnpbqqrrsztdvfwwxxzs"з , .•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•щоб зберегти 15 байт
Okx

Крім того, можна замінити žOÃćIskз , žOÃ0èkщоб зберегти інші байти.
Okx

@Okx Я думаю, що мені справді потрібно вивчити деякі методи стиснення рядків. Дякую!
kalsowerus

@kalsowerus Я знаю, що минув час, але ви можете відповісти на 8 байтів зі своєї відповіді так: žOÃнk>[DIs£¤žPså#\>]©s[DIsèDžOså#\>]s\.•7¶ëÒ—Öb´ƒ≠Ä“šʒƵJ^ÝV“Îpи•S2ôDí«ø`®θkèìDJ Спробуйте в Інтернеті. В основному я позбувся всіх свопів і потрійних свопів, використовуючи натомість змінну. А може бути н, і я замінив 2׫з DJприєднатися весь стек разом. PS: Я також розмістив відповідь на 55 байт 05AB1E, використовуючи іншу техніку. (Що також включає посилання для кращого розуміння стиснення в 05AB1E .: D)
Кевін Кройсейсен

3

Кристал, 130 байт

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

Як це працює

c = /[aeiouy]/

зберігати регулярний вираз для пошуку першого голосного c.

x, y, z = ARGV[0].partition /[^aeiouy]*#{c}*/

розділіть перший аргумент на три частини {"", Рядок, поки один символ перед першим приголосним після першого голосного, решта рядка} і збережіть кожен з елементів у x, y і z.

k = z[0]

отримати перший символ, відповідний приголосний.

i = "pgtvkgbqrzdfs" =~ /#{k}/

отримати індекс приголосного всередині лівої рядки або nil.

b = ((i = ...) ? "bcdfgkpqrstvz"[i] : k) + z[c]

якщо iніnil , використовуйте цей індекс для другого рядка (вид хеш-гольфу).

якщо iєnil , використовуйте оригінальний символ.

далі, додайте перший голосний z .

p y + k + (b * 2)

нарешті, надрукуйте першу частину з першого регулярного виразів y , першого приголосного kі два рази попереднього обчисленого рядка b.

Спробуйте в Інтернеті .



2

Луа, 164 157 байт

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

Редагувати 1: Видалено 7 байт, шукаючи будь-який символ після приголосних (див. Регулярний вираз)

Спробуйте в Інтернеті!

Ця програма бере рядок в аргументі CLI і друкує її covfefied версія.

Це моє перше подання на код гольфу! Я не перевіряв інших детально, тому, можливо, пропустив деякі загальні оптимізації (і потрапив у деякі пастки). Я використовував Lua, тому що мені подобається ця маленька мова, і я намагався знайти регулярний вираз, який відповідає моїм потребам.

Ось більш чиста версія з використанням функції (я мав намір використовувати її, але ключові слова в Lua занадто довгі!):

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

Не соромтеся дати відгуки :)

Примітка. Якщо вам цікаво, у MoonScript використовується 149 байт!


2

JavaScript (ES5), 237 229 байт

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}

Спробуйте в Інтернеті!

Напевно, не самий гольф, але це ES5.

Нещодавно виправлено помилку. Приклад виводу:

creation->creatdidi
coverage->covfefe
example->exxaxa
programming->progkaka
code->codtete
president->preszizi


2

C #, 584 581 байт

-3 байти завдяки знищеному лимону

Це моє перше подання про Code Golf і взагалі про обмін стеками. Я знаю, що C # не є чудовою мовою для гольфу, і це, мабуть, не повністю оптимізовано, але я хотів би зробити це: p. Будь-які поради вітаються!

Версія для гольфу:

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

Читаема версія:

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

1
Я не експерт, але я думаю, що ви можете додати приріст до компаратора в циклі for, тобто x++ < l, або чомусь (можливо, l > x++якщо перший не працює). не впевнений, хоча
Зруйнований лимон

@DestructibleLemon Дякую за пораду!
Брендон Хао

2

SmileBASIC 3, 195 байт

Дуже пізно до цього питання, але як я міг протистояти гарному виклику для SmileBASIC 3? Такі функції, як ітерація над послідовністю або маніпулювання рядком, не настільки надійна, як інші мови, тому зробити це потрібно якомога менше. Припускає, що слова є ПОВНІШНІМ.

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

Детальне пояснення тут!


2

05AB1E , 55 байт

η.ΔžOSåàyžPSÅ¿à*}ÐIsKžOÃнsθU.•gÍĆdQ¸G•SDXåiÂXQÏθë\X}ìDJ

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

η                        # 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"
  U                      # Pop and store it in variable `X`
   .•gÍĆdQ¸G            # Push string "bcdfkszgvtgp"
             S           # Convert to list of characters: ["b","c","d","f","k","s","z","g","v","t","g","p"]
              D          # Duplicate it
               Xåi       # If `X` is in this string:
                  Â      #  Bifurcate the list (short for Duplicate & Reverse copy)
                         #   i.e. ["b","c","d","f","k","s","z","g","v","t","g","p"]
                         #   → ["p","g","t","v","g","z","s","k","f","d","c","b"]
                   XQ    #  Check if they're equal to variable `X`
                         #   i.e. `X` = "t" → [0,0,1,0,0,0,0,0,0,0,0,0]
                     Ï   #  Only keep the truthy values
                         #   i.e. ["b","c",...,"g","p"] and [0,0,1,0,0,0,0,0,0,0,0,0]
                         #    → ["d"]
                      θ  #  Pop and push the last one
                         #   i.e. ["d"] → "d"
                 ë       # Else:
                  \      #  Discard the duplicate list from the stack
                   X     #  And push variable `X` again
                 }       # Close the if-else
                  ì      # 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"

Дивіться цей 05AB1E кінчики моїх (розділ Як стиснути рядки не частина словника? ) , Щоб зрозуміти , чому .•gÍĆdQ¸G•це "bcdfkszgvtgp".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.