Спустошливі слова


50

Давши два слова, опустіть їх, переключивши їх початкові приголосні кластери. Виграє найменше байт.

plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di
few years -> yew fears

Приголосні, що з’являються перед першим голосним ( aeiou), перемикаються.

Введення: Дві рядки з малих літер, що починаються з різних приголосних, і кожен містить голосну aeiou.

Вихід: Дві спонсоровані рядки в правильному порядку.

Для введення та / або виведення два рядки також можуть бути у списку чи подібні, або як одна рядок із роздільником.


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


4
Слова починаються з приголосних.
xnor

21
Відповідь має бути "oozing snotter"imo ~
Патрік Робертс

3
@PatrickRoberts Я згоден, але це робить виклик трохи простішим.
xnor

1
Не дуже на тему, але приємний приклад снігової пластівці -> течія змії
хитка

1
швидкі удачі та коуті-банти не допускаються до участі
Denham Coote

Відповіді:


50

Вім, 18 натискань клавіш

/[aeiou]<CR>dbwvnhp0P

Найважливіший трюк полягає в тому, що вставляння чогось у візуальному режимі фактично поміщає старий вміст візуального вибору в буфер вставки.


... о, да, не думав про це. Утримуйте відкинуті, vвключивши всередину та намагаючись виділити голосну спину.
Дверна ручка

10
Як випадковий користувач vim, я продовжував дивуватися, коли я набирав кожну наступну команду
Аарон

4
<CR> означає повернення вагона (старий термін друкарської машинки!), Також відомий як Enter
Kai Carver

22

мозковий ебать, 238 207 байт

,[[<+<+>>-]++++[<-------->-]-[<<-->>-----]<<+++++[----[----[------[------>>]]]]>[>>]>,]<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]<[<<]-[<+>---]>[>.>]<[<<]<<[<<]>[>>]>[.>>]<.<[<<]>[>.>]>[>>]>[>>]>[.>>]

Потрібно ,повернути 0 на EOF, 8-бітні обертові комірки та можливість переміщення ліворуч від комірки 0. На мій досвід, це найпоширеніші параметри за замовчуванням.

Я дуже задоволений цим. Першою моєю спробою було 314 байт, і це, безумовно, поліпшення. :)

Він працює, зберігаючи кожен байт із вхідних даних у дві комірки; один із фактичним значенням байта, а інший із результатом наступного коду при даному значенні (значення байта - 97):

[
    ----
    [
        ----
        [
            ------
            [
                ------>>
            ]
        ]
    ]
]

Якщо символ є приголосним, то він виходить з ненульового значення. Якщо це голосний, він стає 0. Звідси лише питання пошуку, звідки починається друге слово, і друкування все по порядку.

Версія 238 байт цієї програми знайшла пробільний символ після збору всіх вхідних даних. Це був головний біль, тому що це стосувалося створення клітини, яка містила 0 прямо там, де я намагався перекинути її. Як я вирішив, це призвело до віднімання 30 перших слів із кожного символу та 32 після кожного символу після нього. Досить велика частина коду була присвячена обробці цієї дурниці.

Тепер, 32 символи віднімаються від кожного символу вхідного циклу, який коротший і має подібний побічний ефект, з яким легше боротися. Як бонус, зробивши це таким чином, я дозволив мені створити власний простір персонажу коротшим чином: Замість віднімання 139 від 171 (171 - це те, що ви отримуєте, коли пропускаєте пробіл через детектор голосних вище), цикл, який додає 32 кожен персонаж виходить зі свого шляху, щоб також додати 32 до 171 комірки. Це коштує чотири байти там, але означає, що я можу пізніше відняти 171 (замість віднімання 139) за загальну суму 3 байтів, збережених.

З коментарями:

For every input character
,[

  Make a copy
  [<+<+>>-]

  Subtract 32 from one
  ++++[<-------->-]

  Subtract 97 from the other
  -[<<-->>-----]<<+++++

  If nonzero:
  [

    Subtract 4
    ----

    If nonzero:
    [

      Subtract 4
      ----

      If nonzero:
      [

        Subtract 6
        ------

        If nonzero:
        [

          Subtract 6
          ------>>

        ]

      ]

    ]

  ]

>[>>]>,]

Add 32 to every character and the 171 that the space left behind
<<++++++++[<[++++<<]<++++<[++++<<]>>[>>]>>[>>]<-]

Go to the space
<[<<]

Subtract 171 from (32 plus 171)
-[<+>---]

~~~~~~~~~~~~~~~

Ready to print!

~~~~~~~~~~~~~~~

Print letters from the second word until the value to the left is zero
>[>.>]

Go to the beginning of the first word
<[<<]<<[<<]

Look at cells to the left of letters in the first word until reaching a zero
>[>>]

Print the rest of the letters in the first word
>[.>>]

Print a space
<.

Go to the beginning of the first word
<[<<]

Print letters from the first word until the value to the left is zero
>[>.>]

Go to the beginning of the second word
>[>>]

Look at cells to the left of letters in the second word until reaching a zero
>[>>]

Print the rest of the letters in the second word
>[.>>]

Це вважається yголосним, але запитання говорить, що це не так. ( nye cat-> ce nyat)
Лооджо

1
@Loovjo це дуже дивно, тому що код, який перевіряє голосні, безумовно, трактує yяк приголосний ... Я розберуся, чому це робиться.
підземниймонорельс

17

vim, 23

/[aeiou]<cr>"xd0wndb0Pw"xP

Цікаво, чи справді vim є конкурентоспроможним у цьому виклику. Можливо, не з мовами для гольфу, але, можливо, з Ruby / Python / Perl / тощо.

/[aeiou]<cr>  Find the first vowel
"xd0          "Delete" (cut), to register "x, everything from here to BOL
w             Go to next word
n             Find next vowel
db            "Delete back" - delete from here to the beginning of the word
0             Go to BOL
P             Paste what we just "deleted" (cut) behind the cursor
w             Next word
"xP           Paste backwards from register "x

11
Я роблю це в режимі вставки, правда?
Алекс А.

5
@AlexA. ಠ_ಠ
Дверна ручка

@AlexA. Режим вставки буде додатковим натисканням клавіші
:)

@AlexA. Вставити режим? Ви мали на увазі команду
Blacklight Shining

1
@BlacklightShining Nope. Це був жарт, тому що якщо ви перебуваєте в режимі вставки та вводите цей матеріал, він не виконує жодних команд; ви просто набрали його у файл.
Олексій А.

13

Пітон, 68 63 60 байт

import re
lambda s:re.sub('([^aeiou]+|.+ )'*3,r'\3\2\1',s,1)

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

Як це працює

Рядок візерунка повторюється тричі ( *3), в результаті чого виходить візерунок

([^aeiou]+|.+ )([^aeiou]+|.+ )([^aeiou]+|.+ )

Усі екземпляри будуть відповідати непустому рядку неголосних або непустому рядку з наступним символом пробілу.

Перший екземпляр буде відповідати приголосним на початку першого слова. Оскільки +жадібна, вона намагатиметься відповідати якомога більше, тобто все до першого голосного.

Через це друга інстанція розпочнеться з голосної, тому вона буде відповідати решті першого слова, аж до місця, що розділяє слова.

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

Неочищена рядок \3\2\1( rзаважає Python замінювати \3і т. Д. Контрольними символами) обертає порядок збігів у дужках, тобто замінює їх приголосними на початку другого слова, потім усі символи з першого голосного перше слово до пробілу, і нарешті приголосні на початку першого слова.

Остаточний аргумент до sub( 1) змушує повернутись відразу після першої успішної заміни, щоб уникнути безглуздих замін у решті другого слова. Це потрібно, оскільки шаблон може відповідати будь-якій струні з трьох або більше послідовних приголосних.


1
Поздравляю з щедротою, за те, щоб надати магію регексу на Python із дуже ефективним регулярним виразом. Приємне пояснення теж.
xnor

11

JavaScript (ES6), 54 байти

s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])

Пояснення

s=>
  s.replace(
    r=/\b[^aeiou ]+/g,     // r = regex to match consonants
    (_,i)=>s.match(r)[+!i] // replace consonants with the consonants from the other word
  )

Тест

var solution = s=>s.replace(r=/\b[^aeiou ]+/g,(_,i)=>s.match(r)[+!i])
<input type="text" id="input" value="plaster man" />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


Ой, мій поганий, я неправильно зрозумів. Я перегляну документи mdn, matchколи повернусь додому
Патрік Робертс

+!iТрюк є хорошим рішенням. +1
ETHproductions

10

Python 3, 108 101 99 байт

(Немає використання регулярного вираження)

Ця функція очікує введення через 2 аргументи, наприклад f('blushing','crow'). Повертає нові слова в кортежі.

S=lambda s,p="":s[0]in"aeiou"and(p,s)or S(s[1:],p+s[0])
def f(x,y):a,b=S(x);c,d=S(y);return c+b,a+d

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

Як це працює

Єдиною складною частиною є лямбда-вираз S(абревіатура означає " S plit перед першою голосною"). Він рекурсивно "повторює" над даним словом, переміщаючи один символ за один раз від початку s(який починається цілим словом) до кінця p(який починається порожнім). При першій голосній зустрічі він повертається (p,s), тобто (префікс, суфікс). Зауважте, що це неправильний порядок порівняно з параметрами!

Я вважав, що має більше сенсу, щоб повернутий порядок був префіксом, а потім суфіксом (тому що, як правило, префікс іде перед суфіксом). Це замовлення може a,b=S(x)полегшити читання коду.

Але у мене не було вибору порядку в параметрах лямбда, тому я не міг визначитись pраніше s. Перший параметр s, повинен був взяти слово цілком , тому що pмав значення за замовчуванням і параметри по замовчуванням йдуть в останню чергу . При цьому мені не потрібно було Sдвічі викликати функцію порожнім рядком, і кілька байтів можна було зберегти. Однак, можливо, це було просто поганим рішенням повернути префікс / суфікс у зворотному порядку, оскільки він використовувався в виразі лямбда.

Щодо вибору лямбда-експресії над функцією, то для цього потрібно більше байтів, def S(s,p=""):returnніж S=lambda s,p="":. Я можу зробити такий вибір, оскільки Python має оцінку короткого замикання та потрійний оператор. Однак я не можу адекватно пояснити, як я використовував коротке замикання; важко міркувати.


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

Редагування: дякуючі коментатори: трохи зменшити кількість байтів, двічі та видалити непотрібну інформацію. Спроба вдосконалити писемність. Сподіваємось, не помилився.


Ласкаво просимо до ppcg, чудова перша відповідь :) просто фій, більшість програм на цьому сайті не мають зворотного нового рядка, тому вам не потрібно згадувати про це (у рідкісних випадках, коли це необхідно, саме тоді люди згадують про це)
підземниймонорельс

3
Ласкаво просимо до головоломки програмування та коду для гольфу! 1. Вам не доведеться турбуватися про формат введення. У виклику прямо сказано, що ви можете взяти список. 2. За замовчуванням, згаданим у вікі тегів , ви можете надіслати або повні програми, або функції, щоб кодувати проблеми з гольфом. Для цієї конкретної проблеми функція повинна бути на 7 байт коротше.
Денніс

4
Щодо останнього речення, "я сподіваюсь, що [...] є значення для публікації рішення, яке не може перемогти". Там, безумовно, є! Ми всі тут, щоб веселитися і сприяти та вчитися один у одного. Я вважаю цю відповідь особливо розумною, оскільки більш очевидним рішенням є використання регулярних виразів. Дуже приємна робота!
Олексій А.

Відмінна перша відповідь. Це досить схоже на те, що я придумав для нерегексу. Ви добре подумали про використання логічних виразів з коротким замиканням, і виявляється, вони можуть скоротити вираз, хоча, можливо, ви хочете подумати самі над тим, як це зробити.
xnor

Мені дуже подобається те, що ти використовував рекурсивне рішення. Дуже елегантно втілено!
Огадай

9

C # 6, 115 байт

string S(string a)=>System.Text.RegularExpressions.Regex.Replace(a,"([^aeiou]*)(.*) ([^aeiou]*)(.*)","$3$2 $1$4");

Це просто біль для простору імен для регулярних виразів.


2
Мій боже, що є багатослівним.
Conor O'Brien

4
System.Text.RegularExpressions.Regex.Replace44 символи! +1, тому що це повинен бути якийсь запис.
Рівень річки Св.

2
... а тепер у вас 44 проблеми. ;)
Мейсон Уілер

9

CJam, 27 24 22 байт

2{l_{"aeiou"&}#/(N\}*o

I / O - одне слово на рядок. Спробуйте в Інтернеті!

Як це працює

2{                 }*   Do the following twice:
  l                       Read a line from STDIN.
   _                      Push a copy.
    {"aeiou"&}#           Find the index of the first character that has a non-
                          empty intersection with the string "aeiou".
               /          Split the string into chunks of that size.
                (         Shift out the first chunk, i.e., all leading consonants.
                 N\       Swap the shifted out chunk with a linefeed.
                     o  Print the topmost stack item.



8

JavaScript ES6, 93 58 52 байти

Збережено 6 байт завдяки ETHProductions!

x=>x.replace(/([^aeiou]+)(.+ )([^aeiou]+)/,"$3$2$1")

Перевірте! (Лише для ES6)


Я ось-ось збирався натиснути відповідь на моє 58-
байтне

@ user81655 О, вибачте, що так сталося.
Conor O'Brien

Вам не потрібна четверта група захоплення або $4взагалі;)
ETHproductions

@ETHproductions О, так! Дякую!
Конор О'Браєн

7

C, 255 201 199 байт

Я не бачу тут багато відповідей на С, тому насолоджуйтесь; Крім того, перший гольф, пропозиції та критика вітаються.

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(v[1])+b+1
main(int q,char**v){char r[64],S(v[1],a),S(v[2],b)c,v[2])c+b,v[1]+a);strcat(r," ")l-a,v[1])l,v[2]+b);puts(r);}

Якщо main () не потрібен, ми можемо зберегти 24 байти, досягнувши 179 байт

#define S(w,p)p=strpbrk(w,"aeiou")-w
#define c ;strcpy(r
#define l c+strlen(x)+b+1
s(char*x,char*y){char r[64],S(x,a),S(y,b)c,y)c+b, x+a);strcat(r," ")l-a,x)l,y+b);puts(r);}

Безголівки:

void spoonerise(char* w1, char* w2)
{
    char rt[64];

    int p1 = strpbrk(w1, "aeiou")-w1;
    int p2 = strpbrk(w2, "aeiou")-w2;

    strcpy(rt, w2);
    strcpy(rt+p2, w1+p1);

    strcat(rt, " ");

    strcpy(rt+strlen(w1)+p2+1-p1, w1);
    strcpy(rt+strlen(w1)+p2+1, w2+p2);

    puts(rt);
}

EDIT: Завдяки пропозиції feersum я зберег 54 байти. = D


Я рекомендую заглянути strpbrk.
feersum

+1 Це чудова перша відповідь. Ласкаво просимо на сайт.
wizzwizz4

Дякуємо за рекомендацію @feersum. І дякую за привітання @ wizzwizz4!
Lince Assassino

6

Python 2, 364 352 269 251 байт

РЕДАКЦІЯ: Дякую @Cyoce за те, що він допомагав мені у гольфі 83 байти!

Будь ласка, допоможіть мені гольф у цьому! У всякому разі, я принаймні є першим відповідачем Python. І я сподіваюся, що зможу перемогти Java, якщо коли-небудь буде відповідь на Java!

i=input()
f=l=''
A='aeiou'
for j in A:
 I=i[0];J=I.find(j)
 if ~J:
  if f:
   if f>I[0][:J]:f=I[:J];break
  else:f=I[:J]
for j in A:
 Y=i[1];J=Y.find(j)
 if ~J:
  if l:
   if l>Y[:J]:l=Y[:J];break
  else:l=Y[:J]
print I.replace(f,l,1),Y.replace(l,f,1)

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


5
-1 за те, що не робив спроби розіграти гольф за межами змінних з одним символом
Mego

@Mego Обіцяю, що працюю над цим якнайшвидшим. Негайно. Але я працюю над версією регулярного виразка.
TanMath

@Mego, будь ласка, дивіться редагування.
TanMath

5

Japt, 26 25 байт

На щастя, я додав клас голосних до функцій регексу Japt кілька днів тому. На жаль, я не додав класу безголосних або способу навколо подвійних косих рисок в рядках регулярного виразів.

#¿s4 £Uf"[^\\v]+|.+
?" gX

¿Повинна бути сирої символ U + 0093. Введення - це рядковий рядок, одне слово / рядок. Спробуйте в Інтернеті!

EDIT: Зараз я додав клас неголосних \Vі шлях \\%), тому цей код зараз працює на 21 байт : ( Спробуйте в Інтернеті )

#¿s4 £Uf"%V+|.+
?" gX

Як це працює

                     // Implicit: U = input string
#¿s4                 // Convert the char code (147) into a base-4 string "2103".
     £               // Map each char X in this string to:
      Uf"[^\\v]+|.+  //  Match each group in U of non-vowels or non-newlines,
?"                   //  with an optional trailing newline.
   gX                //  Get the item at position X in the resulting array.
                     // Implicit: output last expression

Стара версія (26 байт):

UrA="\\b[^\\v ]+"@UfA gÂ!Y

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

Як це працює

UrA="\\b[^\\v ]+"@UfA gÂ!Y  // Implicit: U = input string
  A="\\b[^\\v ]+"           // Set variable A to this regex string, which matches
                            // a word boundary followed by one or more non-vowels.
UrA              @          // Take U and replace each match X of A and its index Y with:
                  UfA       //  Take U.match(A).
                      gÂ!Y  //  Get the item at index ~~!Y (converts 0 to 1, anything else to 0).
                            // Implicit: output last expression

Я б хотів, щоб у мов мейнстріму була мета-голосна для регулярних виразів!
CJ Dennis

4

Python 3, 100 (або 99) байт

import re
def f(*g):a,b=[re.split("[aeiou]",r)[0] for r in g];return b+g[0][len(a):],a+g[1][len(b):]

Зіграно з кількома версіями, але, здається, не можна отримати це нижче. Можна зменшити його на 99 байт, використовуючи def f(g)натомість, тому він займає список рядків, а не дві окремі рядки, але я віддаю перевагу два аргументації аргументу.

Альтернатива - однакова довжина:

import re
s=re.split
def f(x,y):v="[aeiou]";a,b=s(v,x)[0],s(v,y)[0];return b+x[len(a):],a+y[len(b):]

Я спробував замінити, як @TanMath використовує, але коротше не міг. Крім того, TanMath може отримати свою відповідь коротше на байт, використовуючи "[aeiou]"замість того, "[aeiou]+"що нам потрібно лише відповідати окремим екземплярам. Нарешті, реалізація, input()схоже, змінилася між py2 та py3 - вона автоматично оцінює stdin як рядок.


1
Імовірно, ви маєте s=re.splitна увазі альтернативу?
xnor

Так! Безумовно. Це мій перший гольф коли-небудь, тому будь-які відгуки та поради цінуються.
Огадай

1
1. Питання явно дозволяє брати два рядки у вигляді списку, так що , здається , немає ніяких підстав для *ін *g. 2. Друга версія може бути переведена на гольф lambda x,y,s=lambda s:re.split("[aeiou]",s)[0]:(s(y)+x[len(s(x)):],s(x)+y[len(s(y)):]).
Денніс

Дякую @Dennis, що справді працює, приємно рефакторинг. Цікаво, що дужки потрібні, і вам не потрібно передавати s як аргумент другому лямбда? Це рішення дає мені 98 байт, з провідним заявою про імпорт та f=.
Огадай

1
Ні, sце аргумент за замовчуванням, тому не потрібно його вказувати. Безіменна лямбда - прийнятне подання; f=не потрібно.
Денніс

4

sed, 38 символів

s/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/

Використання розширеного регулярного вираження з розчину Сітківки .

Наведене вище - 37 символів і потребує -rперемикання (+1 символ).

Приклад:

$ cat input | tee /dev/tty | sed -r 's/([^aeiou]+)(.+ )([^aeiou]+)/\3\2\1/'
plaster man
blushing crow
litigating more
strong wrangler
def ghi
master plan
crushing blow
mitigating lore
wrong strangler
ghef di

Ласкаво просимо до головоломки програмування та коду для гольфу!
Денніс

3

C # 6, 165 байт

string S(string a,string b){int i=V(a),j=V(b);return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);}int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

Розширено:

string S(string a,string b){
    int i=V(a),
        j=V(b);
    return b.Remove(j)+a.Substring(i)+" "+a.Remove(i)+b.Substring(j);
}
int V(string s)=>s.IndexOfAny("aeiou".ToCharArray());

Це досить старе, але "aeiou".ToCharArray()може бути 'a','e','i','o','u'на 2 байти
Втілення Невігластва

Ні, @EmbodimentofIgnorance, IndexOfAnyце не приймає парами, тому потрібно було бnew[]{'a','e','i','o','u'}
Hand-E-Food

Ах, моя помилка, я думав IndexOfAny, це метод парам. У будь-якому випадку, чудова відповідь
Втілення Невігластва

3

𝔼𝕊𝕄𝕚𝕟, 24 символи / 42 байти

ïē/⟮(⁅ᶌ]+)⟯(.+ )Ⅰ/,`⑶⑵⑴`

Try it here (Firefox only).

Якщо вам потрібна допомога, щоб зрозуміти це, це перекладається на ES6 як

input.replace(/([^aeiou]+)(.+ )([^aeiou]+)/g,'$3$2$1')

На якій мові це мова? Я отримую символи коробки навіть для цього.
Джессі Вільямс

@JesseWilliams Це називається ESMin .
ETHproductions

Було б добре, якби у інтерпетера було щось на кшталт Japt, де він показує вам js the 𝔼𝕊𝕄𝕚𝕟 стає
Загальний користувач

Скомпільований JS реєструється на консолі JS при запуску коду.
Mama Fun Roll

3

PowerShell, 52 байти

"$args "-replace('(.*?)([aeiou]\S+) '*2),'$3$2 $1$4'

e.g. 
PS C:\scripts\> .\Spoonerise.ps1 'blushing crow'
crushing blow

Це заміни регулярного вираження чотирма групами захоплення; з:

  • Множення рядків для розширення:
    • ('(.*?)([aeiou]\S+) '*2) до '(.*?)([aeiou]\S+) (.*?)([aeiou]\S+) '
  • "$args "Сили масив арг в рядок, і додає косу простір так , що тягнеться простір в регулярному виразі не порушуватиме його.

3

JavaScript (ES6), 120 107 102 101 99 92 байт

  • Дякую пуховику!

Це враховується, якщо параметри були таким об'єктом і назад:
var a = {x: "man", y:"plaster"]}

a.b=(e=>e.slice(e.search`[aeiou]`));with(a){c=b(x),d=b(y),x=x.replace(c,d);y=y.replace(d,c)}

.match(/[aeiou]/).indexможе стати:.search`[aeiou]`
Пуховик

3

Python, 129 108 105 109 байт

Ця програма містить список таких слів ["master","plan"]

EDIT : Спасибі @ Нестабільність

EDIT: Зараз використовується re.split

import re
a=re.split
c='[aeiou]+'
i,j=input()
f=a(c,i)[0]
l=a(c,j)[0]
print i.replace(f,l,1),j.replace(l,f,1)

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

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


Зауважте, що str.replaceзамінює всі екземпляри підрядки, тому ви хочете обмежити її однією заміною, маючи .replace(f,l,1). Однак ви можете зберегти купу, використовуючи i,j=input()та перезаписуючи re.findallта змінюючи '[^aeiou]+'окремі символи.
Нестабільність

Це не працює так, як є; навіть два однобуквені слова дадуть вам три символи, і ви намагаєтесь розпакувати input()дві зміни. Ви мали на увазі i,j=input().split()raw_input()в Python 2)?
Blacklight Shining

1
@BlacklightShining слово має мати принаймні одну голосну і одну приголосну. Вхід містить список рядків, тож i - перше слово, а j - друге.
TanMath

@TanMath, наскільки я знаю, це дозволено за замовчуванням, але ви, мабуть, десь скажете у відповіді, що це потрібно
undergroundmonorail

Це занадто сильно замінює. "sass","bit" -> "babb", "sit".
xnor

3

Java 8, 343 байт

Тут у вас є перший Java-відповідь. Не те, що відчували в гольфі, тому кожна пропозиція цінується!

java.util.function.Function;public class C{public static void main(String[] a){Function<String, Integer>f=s->{for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;return 0;};int i1=f.apply(a[0]),i2=f.apply(a[1]);System.out.println(a[1].substring(0,i2)+a[0].substring(i1)+" "+a[0].substring(0,i1)+a[1].substring(i2));}}

Безголівки:

public class SpooneriseWords {
    public static void main(String[] args)
    {       
        Function<String, Integer> f = s -> {
            for(int i = 0; i < s.length(); ++i)
                if("aeiou".contains(s.substring(i, i + 1))) 
                    return i;
            return 0;
        };

        int i1 = f.apply(args[0]);
        int i2 = f.apply(args[1]);
        System.out.println(args[1].substring(0, i2) + args[0].substring(i1));
        System.out.println(args[0].substring(0, i1) + args[1].substring(i2));
    }
}

Що java.util.function.Function? Я дуже сумніваюся, що це має бути там, якщо ви не маєте на увазі import, але киньте імпорт, оскільки ви посилаєтесь на нього лише один раз. Перехід public class C{public static void Main(String[] a)наinterface C{void Main(String[]a)
кіт

Function<String, Integer>не потрібен пробіл
кішка

змінити цикл for for(int i=0;i<s.length();++i)if("aeiou".contains(s.substring(i,i+1)))return i;наfor(int i=0;i++<s.length();if("aeiou".contains(s.substring(i,i+1))){return i;})
cat

i1- жахливе, занадто довге ім'я.
кіт

Тобто, перейдіть Function<String, Integer>на java.util.function.Function<String,Integer>імпорт та упустіть його
кішка

3

Октава, 96 байт

Завдяки вбудованим завданням Octave та функціональності "індексу", вся ця річ є лише визначенням єдиної, анонімної функції. В основному, ми реконструюємо спонсоризовану рядок, зберігаючи точки відсіку в aі b. Я особливо задоволений fфункцією вбудовування , яка виявляє точку відсічення, і заважає мені find(ismember(a,b),1)два рази використовувати цілу річ. Також ніякого регексу :) .

@(p,q)[q(1:(a=(f=@(m)find(ismember(m,'aeoui'),1))(q))-1),p(b=f(q):end),32,p(1:b-1),q(a:end)];

2

TeaScript , 27 байт

xg/(\w+)(.+ )(\w+)/,"$3$2$1

\wнасправді [^aeiou].


Зачекайте, ви змінили \wмета-регекс за замовчуванням на [^aeiou]? Чому?
ETHproductions

@ETHproductions, коли я створював власні класи чарів. Я забув, що \wвже використовувався JavaScript. Я незабаром його
зміню

2

Еліксир ,143 117 байт

s=fn w->String.split_at(w,elem(hd(Regex.run(~r/[aeiou]/,w,return: :index)),0))end
{v,w}=s.(a)
{x,y}=s.(b)
[x<>w,v<>y]

Розділіть два рядки (a, b) на першому голосному і побудуйте нові рядки для повернення.

EDIT: Отримайте кілька байтів, використовуючи відповідність шаблонів замість незграбних elemвикликів, щоб отримати значення з кортежів.


2

Java, 147 байт

Я припускаю, що просто функція теж добре.

String s(String[]i){String r="[aeiou]",f=i[0].split(r)[0],s=i[1].split(r)[0];return s+i[0].substring(f.length())+" "+f+i[1].substring(s.length());}

split(regex)на жаль, споживає роздільник, що означає, що мені доводиться використовувати substringсуфікси.


2

Pyth, 30 28 байт

Бере введення та дає вихід у вигляді списку двох слів.

ACm,Kh:d"[aeiou]"3.-dKQ+V_GH

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


Я думаю, ти шукаєш ACm,Kh:d"[aeiou]"3.-dKQ+V_GH. Aпризначає двоелементний список G і H і Cтранспонує. Може статися щось ще краще.
lirtosiast

2

Python (без регулярних виразів), 85 байт

t=lambda s:s[1]in'aeiou'or-~t(s[1:])
lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])

Вибірка зразка:

>>> t=lambda s:s[1]in'aeiou'or-~t(s[1:])
>>> lambda a,b:(b[:t(b)]+a[t(a):],a[:t(a)]+b[t(b):])
<function <lambda> at 0x7f495e534398>
>>> _('plaster', 'man')
('master', 'plan')

t- це рекурсивна функція, яка обчислює індекс самого раннього голосного після першого символу в його аргументі s. Якщо другий символ s[1]є голосним, він оцінює значення True, яке має intзначення 1. В іншому випадку він робить рекурсивний виклик із видаленим першим символом та додає 1 до отриманого індексу, використовуючи -~(два доповнення доповнення одного). Нарешті, результати tвикористовуються як показники для нарізки рядків для обчислення спонеризму.


1

GNU Awk 4.0, 48 символів

split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]

Вибірка зразка:

bash-4.3$ for s in 'plaster man' 'blushing crow' 'litigating more' 'strong wrangler' 'def ghi'; do
>     echo -n "$s -> "
>     awk 'split($0,a,/\<[^aeiou]+/,s)&&$0=s[2]a[2]s[1]a[3]' <<< "$s"
> done
plaster man -> master plan
blushing crow -> crushing blow
litigating more -> mitigating lore
strong wrangler -> wrong strangler
def ghi -> ghef di

1

PowerShell, 61 байт

"$args"-replace'([^aeiou]+)(.*)\s([^aeiou]+)(.*)','$3$2 $1$4'

Використовує регулярний вираз, щоб поміняти місцями перші символи неголосних кожного слова

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