Pleasanortmanteaus


32

Una parola portmanteau è una combinazione di due parole che prende parte di ogni parola e le trasforma in un'unica nuova parola. Ad esempio, lion + tiger => liger .

Scriviamo un programma per generare portmanteaus da una coppia di parole di input. I computer non sono i migliori in inglese, quindi dovremo stabilire alcune regole per garantire che i portmanteaus di output siano piacevoli alla vista e all'orecchio.

(Gli esempi qui sono mostrati con un separatore tra il prefisso e il suffisso per chiarezza:. li|gerTuttavia, gli output effettivi del programma non dovrebbero avere un separatore:. liger)

  • Ciascun portmanteau sarà costituito da un prefisso non vuoto della prima parola concatenato a un suffisso non vuoto della seconda parola: sì a li|ger, no a |iger.
  • Se il prefisso termina con una vocale, il suffisso deve iniziare con una consonante e viceversa: sì a lio|gero l|er, no a lio|igero l|ger. Puoi decidere se contare ycome vocale o consonante. La soluzione deve scegliere un'opzione e attenersi ad essa, tuttavia.
  • La parola risultante non deve contenere per intero nessuna delle parole originali: sì a lio|ger, no a lion|igero li|tiger.
    • Questa regola vale anche se la parte in questione è formata da parti di entrambe le parole: con input di two+ words, l'output tw|ordsè ancora illegale perché contiene la sottostringa words. (L'unico output valido per questa coppia sarebbe t|ords.)

Il tuo programma o funzione deve prendere due parole e produrre / restituire un elenco di tutti i piacevoli portmanteaus che possono essere formati da quelle parole in quell'ordine.

Dettagli

  • Si applicano i metodi standard di input e output . Sono vietate le scappatoie standard .
  • Le parole saranno composte solo da lettere minuscole (o, se preferisci, solo da lettere maiuscole).
  • Puoi prendere le due parole di input come un elenco, tupla, due input separati, una singola stringa con un delimitatore senza lettere, ecc.
  • Il formato di output è altrettanto flessibile; se si restituisce o si genera una stringa, dovrebbe essere delimitato in modo tale che sia chiaro dove termina una parola portmanteau e inizia quella successiva.
  • Non ci dovrebbero essere delimitatori all'interno di una parola portmanteau.
  • Va bene se l'elenco di output include risultati duplicati; va anche bene rimuovere i duplicati.

Casi test

> 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

Soluzione di riferimento

Ecco una soluzione di riferimento in Pip (tratta ycome consonante).


Questo è : vince la risposta più breve in ogni lingua!



il delimitatore deve essere costante o posso mettere un mucchio di spazi tra le parole?
Solo Tuhid, l'

@AsoneTuhid Certo, quantità variabili di spazi bianchi sarebbero un delimitatore accettabile. L'unico requisito è che "è chiaro dove finisce una parola portmanteau e inizia la successiva".
DLosc,

Risposte:


5

05AB1E , 28 byte

y è una vocale (lo stesso conteggio dei byte della consonante).

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

Provalo online! o come suite di test leggermente modificata


2
Bella risposta! Divertente come ci siano alcune opzioni per l'ultimo filtro, ma sfortunatamente lo stesso conteggio byte .. ʒs¢Z_; ʒsåO_; ʒsм__; ecc.
Kevin Cruijssen,

4

Retina , 72 byte

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

Provalo online!


Bah, ero arrivato al punto di Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])non riuscire a concentrarmi sul golf a causa di un mal di testa.
Neil,

Il mio primo tentativo è stato abbastanza simile, anche se ho evitato di ripetere la parte centrale controllando la vocale / cosa consonante alla fine con qualcosa di simile (?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))e quindi probabilmente avevo bisogno di almeno sei iterazioni per arrivare a dove si trova ora.
Martin Ender,

(Le ^s nel mio commento precedente sono errate) In effetti, non avrei mai pensato a quel ()|.()trucco, probabilmente mi sarei fermato a Lw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou])).
Neil,

3

Pyth , 38 byte

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

L'input è un elenco di due parole e y non viene trattato come una consonante.

Provalo online qui o verifica tutti i casi di test contemporaneamente qui .

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 byte

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

Accetta due stringhe nella sintassi del curry e restituisce una stringa. Tratta ycome consonante. Provalo online qui .

Grazie a DLosc per il golf 2 byte.

Ungolfed:

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 byte

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

Interprete Japt

Salvato 10 byte grazie alla più chiara comprensione di Shaggy della sintassi di Japt.

8 byte salvati grazie a una nuova funzionalità linguistica

Salvato 2 byte grazie ad alcuni suggerimenti di ETHproductions

La versione più recente di Japt ha introdotto la funzione Prodotto cartesiano, che ha salvato parecchi byte e mi ha permesso di ripristinare l'ordinamento degli input (quindi "lion", "tiger" restituisce "liger" e simili). "y" è ancora trattata come una consonante.

Spiegazione:

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

Benvenuti a Japt (di nuovo!). Posso sicuramente vedere qualche potenziale per più golf qui; Lo guarderò correttamente quando torno a un computer.
Shaggy


3

Python 3 , 156 150 byte

Ho considerato yuna consonante.

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 byte grazie a Jonathan Frech

Provalo online!


Possibili 150 byte .
Jonathan Frech,

@JonathanFrech grazie per averlo individuato
PieCot

Puoi usare gli argomenti predefiniti lambda x=0per farlo scendere per salvare ... 0 caratteri, in modo fastidioso. 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:])}(Still 150)
The Matt

2

JavaScript (ES6), 124 byte

Accetta le 2 parole nella sintassi del curry (a)(b)e stampa i risultati con alert(). Suppone che y sia una consonante.

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

Provalo online!


1

Gelatina , 27 byte

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

Provalo online!

Yy è una consonante. Entrambi i casi supportati. Restituisce duplicati.

L'output è stato preimpostato su TIO. Rimuovi +/€dal piè di pagina per vedere l'output effettivo.


1

C ++ 11, 217 202 byte

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

Fa un uso pesante di std::string#find. Tratta ycome consonante. Provalo online qui .

Ungolfed:

// 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 byte

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

Provalo online!

3 byte da Jonathan Frech . E 10 byte grazie a The Matt .

Nel mio mondo, ynon è una vocale. (È un guaito!)


Ci sono spazi randagi in t) ife t) or [].
Jonathan Frech,

@Jonathon Frech: grazie! È diventato un po 'pigro lì ...
Chas Brown

Vedo ... presumo che anche tu sia diventato un po 'pigro mentre digiti il ​​mio nome: P
Jonathan Frech

* JonathAn: D'oh! Beh, almeno ero coerente! :)
Chas Brown

1
@ The Matt: Grazie! In realtà, ho spremuto altri 2 byte via (s in w)<1>(t in w).
Chas Brown,

0

Rubino , 113 112 109 104 byte

y è una consonante

Questo produce gli stessi duplicati degli esempi nella domanda, devo usare lo stesso loop

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

Provalo online!


0

Emacs Lisp , 306 + 13 = 319 byte

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

Provalo online!

Definisce una funzione lambda anonima. Emette una sequenza di portmanteaus separati da newline con ognuno circondato da virgolette. I consigli sul golf sono i benvenuti. La letteray è considerata una consonante.

Ungolfed

(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))
            )
          )
        )
      )
    )
  )
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.