Pleasanortmanteaus

32

Słowo kufer to połączenie dwóch słów, które bierze udział w każdym słowie i czyni je jednym nowym słowem. Na przykład lew + tygrys => liger .

Napiszmy program do generowania portmanteaus z pary słów wejściowych. Komputery nie są najlepsze w języku angielskim, więc musimy ustalić pewne zasady, aby portmanteaus wyjściowe były przyjemne dla oka i ucha.

(W tym miejscu pokazano przykłady z separatorem między prefiksem i sufiksem:. li|gerJednak rzeczywiste wyjścia programu nie powinny mieć separatora:. liger)

  • Każdy portmanteau będzie składał się z niepustego przedrostka pierwszego słowa połączonego z niepustym przyrostkiem drugiego słowa: tak na li|ger, nie na |iger.
  • Jeśli prefiks kończy się samogłoską, sufiks musi zaczynać się spółgłoską i odwrotnie: tak na lio|gerlub l|er, nie na lio|igerlub l|ger. Możesz zdecydować, czy liczyć yjako samogłoskę czy spółgłoskę. Twoje rozwiązanie musi jednak wybrać jedną opcję i pozostać przy niej.
  • Wynikowe słowo nie może zawierać żadnego z oryginalnych słów w całości: tak lio|ger, nie, lion|igerlub li|tiger.
    • Ta reguła obowiązuje nawet wtedy, gdy dana część jest utworzona z części obu słów: z wprowadzeniem two+ words, wyjście tw|ordsjest nadal nielegalne, ponieważ zawiera podłańcuch words. (Jedyne prawidłowe dane wyjściowe dla tej pary to t|ords.)

Twój program lub funkcja musi wziąć dwa słowa i wypisać / zwrócić listę wszystkich przyjemnych portmanteaus, które można utworzyć z tych słów w tej kolejności.

Detale

  • Obowiązują standardowe metody wejścia i wyjścia . Standardowe luki są zabronione.
  • Słowa będą się składać tylko z małych liter (lub, jeśli wolisz, tylko z wielkich liter).
  • Możesz wziąć dwa słowa wejściowe jako listę, krotkę, dwa osobne dane wejściowe, pojedynczy ciąg znaków z nieliterowym ogranicznikiem itp.
  • Format wyjściowy jest podobnie elastyczny; jeśli zwrócisz lub wyślesz ciąg, należy go oddzielić tak, aby było jasne, gdzie kończy się jedno słowo portmanteau, a następne zaczyna.
  • W wyrazie portmanteau nie powinno być żadnych ograniczników.
  • W porządku, jeśli twoja lista wyników zawiera duplikaty wyników; można również usunąć duplikaty.

Przypadki testowe

> 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

Rozwiązanie referencyjne

Oto rozwiązanie odniesienia w Pip (traktuje yjako spółgłoskę).


To jest : wygrywa najkrótsza odpowiedź w każdym języku!

DLosc
źródło
czy separator musi być stały, czy mogę wstawić spację między słowa?
Asone Tuhid,
@AsoneTuhid Pewnie, zmienne ilości białych znaków byłyby akceptowalnym ogranicznikiem. Jedynym wymaganiem jest to, aby „było jasne, gdzie kończy się jedno słowo portmanteau, a zaczyna następne”.
DLosc

Odpowiedzi:

5

05AB1E , 28 bajtów

y jest samogłoską (ta sama liczba bajtów, co spółgłoska).

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

Wypróbuj online! lub jako nieznacznie zmodyfikowany pakiet testowy

Emigna
źródło
2
Niezła odpowiedź! Zabawne, że istnieje całkiem sporo opcji dla ostatniego filtra, ale niestety wszystkie te same liczby bajtów .. ʒs¢Z_; ʒsåO_; ʒsм__; itd.
Kevin Cruijssen
4

Siatkówka , 72 bajty

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

Wypróbuj online!

Martin Ender
źródło
Ach, doszedłem tak daleko, Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])ale nie mogłem się skoncentrować na grze w golfa z powodu bólu głowy.
Neil
Moja pierwsza próba była dość podobna, chociaż uniknąłem powtarzania środkowej części, sprawdzając na końcu samogłoskę / spółgłoskę za pomocą czegoś podobnego, (?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))a następnie potrzebowałem prawdopodobnie co najmniej sześciu iteracji, aby zejść tam, gdzie jest teraz.
Martin Ender
(Te ^w moim poprzednim komentarzu są błędne) Rzeczywiście, nigdy nie pomyślałbym o tej ()|.()sztuczce, prawdopodobnie zatrzymałbym się Lw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou])).
Neil
3

Pyth , 38 bajtów

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

Dane wejściowe to lista dwóch słów, a y nie jest traktowane jako spółgłoska.

Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

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)
Sok
źródło
3

Java 8, 228 225 215 bajtów

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

Pobiera dwa ciągi w składni curry i zwraca ciąg. Traktuje yjako spółgłoskę. Wypróbuj online tutaj .

Dzięki DLosc za grę w golfa 2 bajty.

Nie golfowany:

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
}
OOBalance
źródło
3

Japt , 32 bajty

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

Japt Interpreter

Oszczędność 10 bajtów dzięki jaśniejszemu zrozumieniu składni Japt przez Shaggy'ego.

Zapisano 8 bajtów dzięki nowej funkcji języka

Zaoszczędzono 2 bajty dzięki sugestiom ETHproductions

Najnowsza wersja Japt wprowadziła funkcję produktu kartezjańskiego, która pozwoliła zaoszczędzić sporo bajtów i pozwoliła mi przywrócić kolejność wejść (więc „lew” „tygrys” wyprowadza „liger” i tak dalej). „y” jest nadal traktowane jako spółgłoska.

Wyjaśnienie:

   ï     )       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
Kamil Drakari
źródło
Witamy w Japt (ponownie!). Zdecydowanie widzę tu potencjał do gry w golfa; Przyjrzę się temu, kiedy wrócę do komputera.
Kudłaty
1
Kilka szybkich oszczędności dla ciebie z mojego telefonu.
Kudłaty
3

Python 3 , 156 150 bajtów

Uważałem się za yspółgłoskę.

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 bajtów dzięki Jonathanowi Frechowi

Wypróbuj online!

PieCot
źródło
Możliwe 150 bajtów .
Jonathan Frech,
@JathanathanFrech dziękuje za wykrycie go
PieCot
Możesz użyć domyślnych argumentów lambda x=0, aby zapisać irytująco 0 znaków. 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:])}(Jeszcze 150)
Matt
2

JavaScript (ES6), 124 bajty

Pobiera 2 słowa w składni curry (a)(b)i drukuje wyniki alert(). Zakłada, że y jest spółgłoską.

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

Wypróbuj online!

Arnauld
źródło
1

Galaretka , 27 bajtów

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

Wypróbuj online!

Yy jest spółgłoską. Oba przypadki obsługiwane. Zwraca duplikaty.

Dane wyjściowe zostały upiększone przez TIO. Usuń +/€ze stopki, aby zobaczyć rzeczywiste wyjście.

Erik the Outgolfer
źródło
1

C ++ 11, 217 202 bajtów

[](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;}

Często korzysta z std::string#find. Traktuje yjako spółgłoskę. Wypróbuj online tutaj .

Nie golfowany:

// 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
}
OOBalance
źródło
1

Python 2 , 179 176 166 162 bajtów

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

Wypróbuj online!

3 bajty od Jonathana Frecha . I 10 bajtów dzięki za Matt .

W moim świecie ynie ma samogłoski. (To wycie!)

Chas Brown
źródło
Są nieużywane przestrzenie w t) ifi t) or [].
Jonathan Frech,
@Jonathon Frech: Dzięki! Trochę się tam leniwie ...
Chas Brown,
Rozumiem ... Podejrzewam, że ty też trochę się leniwiłeś, pisząc moje imię: P
Jonathan Frech
* JonathAn: D'oh! Cóż, przynajmniej byłem konsekwentny! :)
Chas Brown
1
@ Matt: Dzięki! Właściwie wycisnąłem dodatkowe 2 bajty przez (s in w)<1>(t in w).
Chas Brown,
0

Rubin , 113 112 109 104 bajtów

y jest spółgłoską

Powoduje to wygenerowanie tych samych duplikatów, co w przykładach w pytaniu. Muszę używać tej samej pętli

->a,b,i=j=1{r=a[0,i]+b[j..-1];g=:aeiou;!g[a[i-1]]^g[b[j]]|r[a]|r[b]||z=[*z,r];b[j+=1]||a[i+=j=1]?redo:z}

Wypróbuj online!

Asone Tuhid
źródło
0

Emacs Lisp , 306 + 13 = 319 bajtów

+13 dla (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))))))))

Wypróbuj online!

Definiuje anonimową funkcję lambda. Zwraca sekwencję portmanteaus oddzielonych znakiem nowej linii, z których każda jest otoczona cudzysłowami. Wskazówki dotyczące gry w golfa są mile widziane. Literay jest uważany za spółgłoskę.

Bez golfa

(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))
            )
          )
        )
      )
    )
  )
)
R. Kap
źródło