Совмещать строку


371

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

Как совместить строку:

Сначала получите первую звуковую группу (составьте терминологию).

Как ты это делаешь? Что ж:

  • Найти первую гласную ( 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

Все готово: строка соффифицирована, и теперь вы можете вывести ее.

Тестовые случаи:

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
Это указывает на одну концепцию covfefification, но я продолжаю чувствовать, что ссылка на работу Дугласа Хофстадтера (и Мелани Митчелл) по аналогиям преобразования строк, например, в Fluid Concepts, кажется уместной.
Марс

60
Ответы более 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 it

9
Я желе Upvoted.
DeepS1X

6
Это самый странный язык программирования, который я когда-либо видел.
Райан

@ Райан предназначен для игры в гольф.
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
извини, приятель, похоже, ты пропустил мега желе
Разрушаемый Лимон

Ответ на этот вопрос выглядит слишком упрощенным, но на самом деле он действительно замечательный ... простой и красивый
Эрик Игрок в гольф

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 бьет желе? : 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
Извините дисквалифицирован. Не может поместиться в твит.
17

@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;
Тит

@ Я не думаю об этом. Спасибо
Йорг Хюльсерманн

почему бы не переименовать $argnв что-то более короткое? $aНапример - это -3 байта
Тайлер Себастьян

@TylerSebastian У меня должна быть входная переменная, которая существует. Да, я могу создать функцию, но если я сделаю это, она увеличит число байтов, используя три байта
Jörg Hülsermann

ах, извини, я забыл, как 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}'
Габор Фекете

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 байта.
Томсминг

объявление zвне fи переключение на охрану вместо letсохранения экономит еще два байта: попробуйте онлайн!
Лайкони

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

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

Python 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 байт.
Sriotchilism O'Zaic

1
Нужна ли точка с запятой в конце строки 4?
Юбер Гжесковяк

1
@WaitndSee Я думаю, что вы можете сократить некоторые из ваших условий. Во- первых: вы можете изменить not nв n<1течение 2 -х байт, так как вы знаете , 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}"}

Попробуйте онлайн!

  • Сохранено 34 байта благодаря Эрику Думинилу
  • Сохранено 31 байт благодаря Value Ink + оптимизированные предложенные trаргументы

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

4
-34 байта сHash[*"bpcgdtfvgkkgpbsztdvfzs".chars]
Эрик

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

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

На самом деле, здесь есть ошибка с programming-> progkaka, которую я не могу понять.
Иордания

@Jordan, к сожалению, вызов подвыражения \g<3>обновляет значение $ 3, поэтому мы не можем использовать этот ярлык.
Sudee

6

Crystal, 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;: Принимает логическую маску и устанавливает все символы во входной строке с первой позиции на первую согласную после гласной на ложь.
  9. v=a(find(m,1));: Находит следующую гласную, которая следует за первым согласным из входной строки.
  10. [f d v d v]: Вывести нашу 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]
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

Принимает слово из стандартного ввода и выводит результат в стандартный вывод. Предполагается, что входное слово состоит из строчных букв и содержит хотя бы одну гласную, за которой следует согласный.

Более читаемая версия программы с форматированием и объявлениями переменных:

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 с 1, и символ в результирующей позиции используется в качестве его замены. Операция XOR превращает 0 в 1, 2 в 3, 4 в 5 и т. Д. И наоборот, так что b заменяется на p, d на t и так далее. Наконец, исходная строка до с,

Пример результатов:

покрытие покрытия

создание креатиди

программирование прогкака

тупость тупбиби

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


ссылка на репо blitzmax?
Разрушаемый лимон

@DestructibleLemon BlitzMax был создан как язык, предназначенный главным образом для развития любительских игр, и с проприетарным компилятором, продаваемым за деньги. Хотя он сейчас бесплатный и доступен здесь , я считаю, что компилятор все еще не является открытым исходным кодом. Существует альтернативная реализация (репо здесь , сборки здесь ), которая, тем не менее, будет запускать только версию без кода из-за отсутствия «нестрогого» параметра, который позволяет пропустить объявления переменных.
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}*/

разбить первый аргумент на три части {"", String до одного символа перед первым согласным после первого гласного, остаток строки} и сохранить каждый из элементов в 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 и печатает свою зашифрованную версию.

Это моя первая подача кода в гольф! Я не проверял другие подробно, поэтому я мог пропустить некоторые общие оптимизации (и попал в некоторые ловушки). Я использовал 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

Не стесняйтесь оставлять отзывы :)

Примечание: если вам интересно, это 149 байт, используя MoonScript!


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

sed, 106 (105 + 1) байт

Это сед с -Eфлагом, который, по-видимому, считается за один байт.

s/([aoeuiy][^aoeuiy])[^aoeuiy]*(.).*/\1\2/
h
s/.*(..)/\1\1/
y/bcdfgkpstvz/pgtvkgbzdfs/
x
s/.$//
G
s/\n//g

Попробуйте онлайн!


2

C #, 584 581 байт

-3 байта благодаря Разрушаемому Лимону

Это моя первая заявка на Code Golf и Stack Exchange в целом. Я знаю, что 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.