Выговаривать слова


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
Не очень по теме, но хороший пример снежинки -> поток змеи
flawr

1
быстрые удачи и койки не допускаются к участию
Денхам Кут

Ответы:


50

Vim, 18 нажатий клавиш

/[aeiou]<CR>dbwvnhp0P

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


... о, не думал об этом. Держал сброшенным, vбудучи включительным и пытаясь выбрать из гласного назад.
Дверная ручка

10
Как случайный пользователь vim, я продолжал удивляться, набирая каждую последующую команду
Aaron

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

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
@BlightlightShining Нету. Это была шутка, потому что если вы находитесь в режиме вставки и набираете этот материал, он не будет выполнять никаких команд; Вы только что напечатали это в файле.
Алекс А.

13

Python, 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и т. Д. Управляющими символами) меняет порядок совпадений шаблонов в скобках, т. Е. Заменяет их согласными в начале второго слова, а затем все символы из первого гласного слова первое слово до пробела и, наконец, согласные в начале первого слова.

Последний аргумент to 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
Добро пожаловать в Программирование Пазлов и Code Golf! 1. Вам не нужно беспокоиться о формате ввода. Задача прямо говорит, что вы можете взять список. 2. В соответствии со значениями по умолчанию, указанными в теге wiki , вы можете предоставить либо полные программы, либо функции для кодирования задач в гольф. Для этой конкретной задачи функция должна быть на 7 байт короче.
Деннис

4
Что касается последнего предложения: «Я надеюсь, что [...] есть смысл опубликовать решение, которое не может победить». Там, безусловно, есть! Мы все здесь, чтобы повеселиться, внести свой вклад и учиться друг у друга. Я нахожу этот ответ особенно умным, поскольку более очевидным решением является использование регулярных выражений. Очень хорошая работа!
Алекс А.

Отличный первый ответ. Это очень похоже на то, что я придумал для не-регулярных выражений. У вас была хорошая мысль об использовании коротких замыканий логических выражений, и оказалось, что они могут сократить выражение, хотя, возможно, вы захотите сами подумать о том, как это сделать.
xnor

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

9

C # 6, 115 байт

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

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


2
Боже мой, это многословно.
Конор О'Брайен

4
System.Text.RegularExpressions.Regex.Replace44 персонажа! +1 потому что это должна быть какая-то запись.
Уровень Река Сент

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

9

CJam, 27 24 22 байта

2{l_{"aeiou"&}#/(N\}*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

@ user81655 Ой, извини, что так получилось.
Конор О'Брайен

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

@ETHproductions О, да! Спасибо!
Конор О'Брайен

7

C 255 201 199 байт

Я не вижу здесь много ответов на C, так что наслаждайтесь; Кроме того, впервые в гольф, предложения и критика приветствуются.

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

Ungolfed:

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

РЕДАКТИРОВАТЬ: Благодаря предложению Feersum я сэкономил 54 байта. = D


Я рекомендую изучить strpbrk.
feersum

+1 Это отличный первый ответ. Добро пожаловать на сайт.
wizzwizz4

Спасибо за рекомендацию @feersum. И спасибо за приветственный @ wizzwizz4!
Линс Ассассино

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

@ Мего, я обещаю, что работаю над этим как можно скорее. Прямо сейчас. Но я работаю над регулярным выражением.
TanMath

@ Пожалуйста, смотрите редактирование.
TanMath

5

Japt, 26 25 байт

К счастью, я добавил класс гласных в функции регулярных выражений Japt несколько дней назад. К сожалению, я не добавил не-гласный класс или обход двойных обратных косых черт в строках регулярных выражений.

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

¿Должна быть сырой символ U + 0093. Ввод - многострочная строка, одно слово / строка. Попробуйте онлайн!

РЕДАКТИРОВАТЬ: я теперь добавил не гласный класс \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 Деннис

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

Поиграл с несколькими версиями, но не могу получить его ниже. def f(g)Вместо этого можно уменьшить его на 99 байтов, чтобы он занял список строк, а не две отдельные строки, но я предпочитаю два аргумента.

Альтернатива равна длине:

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 изменилась между py2 и py3 - он автоматически оценивает stdin как строку.


1
Предположительно вы имеете s=re.splitв виду в альтернативе?
xnor

Да! Определенно. Я впервые играю в гольф, поэтому любые отзывы и советы приветствуются.
Огадай

1
1. Вопрос явно позволяет взять две строки в виде списка, так что, похоже, нет веской причины для *in *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/

Использование расширенного регулярного выражения из решения Retina .

Длина выше составляет 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

Добро пожаловать в Программирование Пазлов и Code Golf!
Деннис

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

Expanded:

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это не принимает params, так что это должно бытьnew[]{'a','e','i','o','u'}
Hand-E-Food

Ах, моя ошибка, я думал IndexOfAny, это метод params. В любом случае, отличный ответ
Воплощение Невежества

3

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

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

Try it here (Firefox only).

Если вам нужна помощь в понимании этого, это переводит ES6 как

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

На каком это языке? Я получаю персонажи-боксы даже за это.
Джесси Уильямс

@JesseWilliams Это называется ESMin .
ETHproductions

Было бы хорошо, если бы у оператора было что-то вроде Japt, где он показывает вам, как становится j
Общий пользователь

Скомпилированный 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]`
Downgoat

3

Python, 129 108 105 109 байт

Эта программа принимает список слов, как это ["master","plan"]

РЕДАКТИРОВАТЬ : Спасибо @ Volollity

РЕДАКТИРОВАТЬ: теперь с помощью 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 слово должно иметь по крайней мере одну гласную и одну согласную. Входные данные принимают список строк, поэтому я - первое слово, а 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));}}

Ungolfed:

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 и функциональности «index -where», все это всего лишь определение одной анонимной функции. По сути, мы восстанавливаем нанизанную строку, сохраняя точки отсечения в 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, когда я создавал пользовательские классы char. Я забыл, что \wуже использовался JavaScript. Я скоро вернусь
Downgoat

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) на первом гласном и создайте новые строки для возврата.

РЕДАКТИРОВАТЬ: получил несколько байтов, используя сопоставление с образцом вместо неуклюжих 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.