Pleasanortmanteaus


32

Контамінація слово являє собою поєднання двох слів , які беруть участь кожного слова і роблять їх в єдине нове слово. Наприклад, лев + тигр => лігер .

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

(Приклади тут показані з роздільністю між префіксом та суфіксом для наочності: li|gerОднак, фактичні виходи програми не повинні мати роздільник:. liger)

  • Кожен портманто буде складатися з непорожнього префіксу першого слова, з'єднаного з непорожнім суфіксом другого слова: так li|ger, ні |iger.
  • Якщо префікс закінчується на голосну, суфікс повинен починатися з приголосного, і навпаки: так, lio|gerабо l|erні, lio|igerабо l|ger. Ви можете вирішити, вважати yголосним або приголосним. Однак ваше рішення повинно вибрати один варіант і дотримуватися його.
  • Отримане слово не повинно містити жодного з оригінальних слів повністю: так lio|ger, ні lion|igerабо li|tiger.
    • Це правило справедливе, навіть якщо відповідна частина утворена з частин обох слів: із введенням two+ words, вихід tw|ordsвсе ще є незаконним, оскільки містить підрядку words. (Єдиним дійсним результатом для цієї пари був би t|ords.)

Ваша програма або функція повинна приймати два слова і виводити / повертати список усіх приємних портмантеїв, які можуть бути сформовані з цих слів у тому порядку.

Деталі

  • Застосовуються стандартні методи введення та виведення . Стандартні лазівки заборонені.
  • Слова складаються лише з малих літер (або, якщо вам зручніше, лише з малих літер).
  • Ви можете взяти два вхідні слова як список, кортеж, два окремі входи, одну рядок із нелітерним роздільником тощо.
  • Формат виводу аналогічно гнучкий; якщо ви повернете або виведете рядок, його слід розмежувати таким чином, щоб було зрозуміло, де закінчується одне слово портманто і починається наступне.
  • Всередині слова портманто не повинно бути роздільників.
  • Добре, якщо ваш вихідний список містить повторювані результати; також добре видалити дублікати.

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

> lion, tiger
< liger, ler, liger, lir, lioger, lior

> tiger, lion
< tion, ton, tin, tigion, tigon, tigen

> spoon, fork
< sork, spork, spork, spok, spoork, spook

> smoke, fog
< sog, smog, smog, smokog

> gallop, triumph
< giumph, gumph, gariumph, gamph, gaph, gah, galiumph, galumph, galliumph, gallumph, galloriumph, gallomph, galloh

> breakfast, lunch
< bunch, brunch, brench, brech, breh, breanch, breach, breah, breakunch, breakfunch, breakfanch, breakfach, breakfah, breakfasunch

> two, words
< tords

> harry, ginny (if y is treated as a consonant)
< hinny, hanny, hany, hay, harinny, harrinny

> harry, ginny (if y is treated as a vowel)
> hinny, hy, hanny, hany, harinny, hary, harrinny

Довідкове рішення

Ось довідкове рішення в Піпі (трактується yяк приголосний).


Це : найкоротша відповідь на кожній мові виграє!



чи повинен роздільник бути постійним або я можу поставити між проміжками купу пробілів?
Асона Тухід

@AsoneTuhid Звичайно, змінна кількість пробілів буде прийнятним роздільником. Єдина вимога полягає в тому, що "зрозуміло, де закінчується одне слово портманто і починається наступне".
DLosc

Відповіді:


5

05AB1E , 28 байт

y є голосним (те ж число байтів, що і приголосне).

нη¨sθ.s¨âʒ`нsθ‚žOsåË_}Jʒs¢Z_

Спробуйте в Інтернеті! або як дещо змінений тестовий набір


2
Гарна відповідь! Смішно, як існує досить багато варіантів останнього фільтра, але, на жаль, все-таки підрахунок байтів .. ʒs¢Z_; ʒsåO_; ʒsм__; пр.
Кевін Кройсейсен

4

Сітківка , 72 байти

L$w`(?<=[aeiou]()|.())((.+),(.+))\B(?!\4)(?<!\5\3)(?([aeiou])\2|\1)
$`$'

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


Ба, у мене все було, Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])але я не міг сконцентруватися на гольфі через головний біль.
Ніл

Моя перша спроба була досить схожа, хоча я уникав повторення центральної частини, перевіряючи голосну / приголосну річ в кінці чогось подібного, (?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))і тоді потрібно було, мабуть, принаймні шість ітерацій, щоб дістати її туди, де вона є зараз.
Мартін Ендер

^мого попереднього коментаря помилкові) Справді, я б ніколи не думав про цю ()|.()хитрість, я б, напевно, зупинився Lw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou])).
Ніл

3

Pyth , 38 байт

f!s}RTQm+hd_edfxFm}ed"aeiou"T*._hQ.__e

Введення - це список двох слів, і y не трактується як приголосний.

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

f!s}RTQm+hd_edfxFm}ed"aeiou"T*._hQ.__e   Implicit: Q=eval(input())
                                hQ       First input word
                              ._         All prefixes of the above
                                     e   Second input word (Q inferred)
                                  .__    Reverse, take all prefixes
                             *           Cartesian product of the above
              f                          Filter the above using:
                 m          T              Map d in the current element using:
                   ed                        The last letter of the word part
                  }  "aeiou"                 Is it contained in the vowel list?
               xF                          Take the XOR of the list
                                         (This ensures that the word parts meet at one consonant)
       m                                 Map d in the filtered set using:
        +hd_ed                             Add the first part to the reversed second part
f                                        Filter the above using:
  s}RTQ                                    Does the portmanteau contain either of the input words?
 !                                         Logical NOT (remove from list if the above is true)

3

Java 8, 228 225 215 байт

v->w->{String r="",t,p=" aeiou";for(int i=w.length(),j;--i>0;)for(j=1;j<v.length();)r+=(t=v.substring(0,j)+w.substring(i)).matches(v+".*|.*"+w)|p.indexOf(t.charAt(j-1))*p.indexOf(t.charAt(j++))>0?"":t+" ";return r;}

Бере два рядки в синтаксисі currying і повертає String. Трактується yяк приголосний. Спробуйте його онлайн тут .

Завдяки DLosc за гольф у 2 байти.

Безголівки:

v -> w -> { // lambda taking two String parameters in currying syntax
    String r = "", // result
    t, // temporary variable used for storing
       // the portmanteau candidate currently being evaluated
    p = " aeiou"; // vowels for the purposes of this function;
                  // the leading space is so that they all have a positive index
    for(int i = w.length(), j; --i > 0; ) // loop over all proper suffixes
                                          // of the second word
        for(j = 1; j < v.length(); )      // loop over all proper prefixes
                                          // of the first word
            r += // construct the portmanteau candidate
                 (t = v.substring(0, j) + w.substring(i))
                 // if it contains one of the input words ...
                 .matches(v + ".*|.*" + w)
                 // ... or the boundary is consonant-consonant 
                 // or vowel-vowel (here we make use of the facts
                 // that all the vowels have a positive index, and
                 // indexOf() returns -1 in case of no match) ...
                 | p.indexOf(t.charAt(j-1)) * p.indexOf(t.charAt(j++)) > 0
                 ? "" // ... reject it ...
                 : t + " "; // ... else add it to the result
    return r; // return the result
}

3

Japt , 32 байти

å+ ïVw å+)f_xè"%v$" uÃmrÈ+YwÃkøN

Перекладач Japt

Збережено 10 байт завдяки чіткішому розумінню синтаксису Джапта Шаггі.

Збережено 8 байт завдяки новій мовній функції

Збережено 2 байти завдяки деяким пропозиціям від ETHproductions

Найновіша версія Japt ввела функцію «Декартовий продукт», що дозволило зберегти досить багато байтів і дозволило мені відновити впорядкованість входів (так «лев», «тигр» виводить «лігер» тощо). "у" все ще трактується як приголосний.

Пояснення:

   ï     )       Cartesian product of...
å+                prefixes of first input
    Vw å+         and suffixes of second input.

f_         Ã     Remove the ones where...
  xè"%v$"         the number of vowels at the joining point
          u       is not 1.

m     Ã          Replace each pair with...
 rÈ+Yw            the prefix and suffix joined together
       køN       then remove the ones that contain either input

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


3

Python 3 , 156 150 байт

Я вважав yприголосним.

lambda a,b:{a[:i]+b[j:]for i in range(1,len(a))for j in range(1,len(b))if((a[i-1]in'aeiou')^(b[j]in'aeiou'))*0**(a in a[:i]+b[j:]or b in a[:i]+b[j:])}

-6 байт завдяки Джонатану Фреху

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



@JonathanFrech дякую, що
помітили

Ви можете використовувати аргументи за замовчуванням, lambda x=0щоб зменшити їх, щоб зберегти ... 0 символів, дратівливо. lambda a,b,v='aeiou',r=range:{a[:i]+b[j:]for i in r(1,len(a))for j in r(1,len(b))if((a[i-1]in v)^(b[j]in v))*0**(a in a[:i]+b[j:]or b in a[:i]+b[j:])}(Ще 150)
Метт,

2

JavaScript (ES6), 124 байти

Візьме 2 слова у сирість каррі (a)(b)та друкує результати alert(). Припускає, що y - приголосний.

a=>b=>[...a].map(c=>[...b].map((C,j)=>!(w=s+b.slice(j)).match(a+'|'+b)&v.test(c)-v.test(C)&&alert(w),s+=c),s='',v=/[aeiou]/)

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


1

Желе , 27 байт

¹Ƥp¹ÐƤ}Ø.ị"e€Øc⁻/ƲƇẎ€wÐḟƒ@,

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

Yy - приголосний. Обидва випадки підтримувалися. Повертає дублікати.

Вихідні дані були попередньо визначені через TIO. Видаліть +/€з нижнього колонтитула, щоб побачити фактичний вихід.


1

C ++ 11, 217 202 байт

[](auto v,auto w){auto r=v,t=v,p=v;r="",p="aeiou";for(int i=w.size(),j;--i;)for(j=v.size();j;)(t=v.substr(0,j)+w.substr(i)).find(v)+1|t.find(w)+1|p.find(t[j-1])<5==p.find(t[j--])<5?v:r+=t+" ";return r;}

Значно використовує std::string#find. Трактується yяк приголосний. Спробуйте його онлайн тут .

Безголівки:

// lambda; relies on auto to keep declarations short
[] (auto v, auto w) {
    // let's declare some strings. To keep it terse, we're using auto and the type of the arguments.
    auto r = v, // result string
    t = v,      // temporary string for storing the portmanteau candidate
    p = v;      // vowels string
    // now assign them their values
    r = "",    // result starts empty
    p = "aeiou"; // vowels don't include 'y'
    for(int i = w.size(), j; --i; ) // suffixes of the second word
        for(j = v.size(); j; ) // prefixes of the first word
            // create the portmanteau candidate
            (t = v.substr(0, j) + w.substr(i))
            // if it includes one of the input words ...
            .find(v) + 1 | t.find(w) + 1
            // ... or the boundary is consonant-consonant or vowel-vowel ...
            | p.find(t[j - 1]) < 5 == p.find(t[j--]) < 5
            ? v // ... discard it ...
            : r += t + " "; // ... else add it to the result.
    return r; // return the result
}

1

Python 2 , 179 176 166 162 байт

lambda s,t:[w for w in g(s,t)if(s in w)<1>(t in w)]
g=lambda s,t:s[:-1]and[s[:-1]+t[j:]for j in range(1,len(t))if(s[-2]in'aeiou')^(t[j]in'aeiou')]+g(s[:-1],t)or[]

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

3 байти від Джонатана Фреха . І 10 байт Thx до Метта .

У моєму світі yне є голосним. (Це йол!)


В них є бродячі простори t) if і t) or []. .
Джонатан Фрех

@Jonathon Frech: Дякую! Там трохи ледачий ...
Час Браун

Я бачу ... Я припускаю, що ви теж трохи ледачі, вводячи моє ім'я: P
Джонатан Фрех

* JonathAn: D'oh! Ну принаймні я був послідовний! :)
Час Браун

1
@ Метт: Дякую! Насправді я вичавив додаткові 2 байти через(s in w)<1>(t in w) .
Час Браун


0

Emacs Lisp , 306 + 13 = 319 байт

+13 для (require'seq)

(require'seq)(lambda(a b)(dotimes(i(1-(length b)))(dotimes(j(1-(length a)))(progn(setq w(substring a 0(1+ j))x(substring b(1+ i))c(concat w x))(defun V(c)(seq-contains"aeiou"(elt c 0)'char-equal))(if(not(or(string-prefix-p a c)(string-suffix-p b c)))(if(V(substring w -1))(if(not(V x))(print c))(if(V x)(print c))))))))

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

Визначає функцію анонімної лямбда. Виводить послідовність портмантеїв, розділених рядками, з кожним оточеним лапками. Поради щодо гольфу вітаються. Письмо yвважається приголосним.

Безумовно

(require 'seq)                                                                                                                                                           
(defun Portmanteus(word1 word2)
  "Find all valid portmanteus of the two given words"
  (dotimes (i (1- (length word2)))
    (dotimes (j (1- (length word1)))
      (progn
        (setq w (substring word1 0 (1+ j)) w2 (substring word2 (1+ i)) comb (concat w w2))
        (defun isVowel (c) (seq-contains "aeiou" (elt c 0) 'char-equal))
        (if (not (or (string-prefix-p word1 comb) (string-suffix-p word2 comb)))
          (if (isVowel (substring w -1))
            (if (not (isVowel w2))
              (princ (format "%s\n" comb))
            )
            (if (isVowel w2)
              (princ (format "%s\n" comb))
            )
          )
        )
      )
    )
  )
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.