Pleasanortmanteaus


32

Sebuah kata portmanteau adalah kombinasi dari dua kata yang mengambil bagian dari setiap kata dan membuat mereka menjadi sebuah kata single baru. Misalnya, singa + harimau => liger .

Mari kita menulis sebuah program untuk menghasilkan portmanteaus dari sepasang kata input. Komputer bukan yang terbaik dalam bahasa Inggris, jadi kita perlu membuat beberapa aturan untuk memastikan bahwa portmanteaus output menyenangkan bagi mata dan telinga.

(Contoh di sini ditunjukkan dengan pemisah antara awalan dan akhiran untuk kejelasan:. li|gerNamun, keluaran aktual program tidak boleh memiliki pemisah:. liger)

  • Setiap portmanteau akan terdiri dari awalan kosong dari kata pertama yang disatukan dengan akhiran kosong dari kata kedua: ya untuk li|ger, tidak untuk |iger.
  • Jika awalan berakhir dengan vokal, akhiran harus dimulai dengan konsonan, dan sebaliknya: ya ke lio|geratau l|er, tidak ke lio|igeratau l|ger. Anda dapat memutuskan apakah akan dihitung ysebagai vokal atau konsonan. Solusi Anda harus memilih satu opsi dan tetap menggunakannya.
  • Kata yang dihasilkan tidak boleh berisi salah satu dari kata-kata asli secara penuh: ya untuk lio|ger, tidak lion|igeratau li|tiger.
    • Aturan ini berlaku bahkan jika bagian yang dimaksud dibentuk dari bagian dari kedua kata: dengan input two+ words, output tw|ordsmasih ilegal karena mengandung substring words. (Satu-satunya output yang valid untuk pasangan ini adalah t|ords.)

Program atau fungsi Anda harus mengambil dua kata dan menampilkan / mengembalikan daftar semua portmanteaus menyenangkan yang dapat dibentuk dari kata-kata itu dalam urutan itu.

Detail

  • Metode input dan output standar berlaku. Celah standar dilarang.
  • Kata-kata hanya akan terdiri dari huruf kecil (atau, jika Anda suka, hanya huruf besar).
  • Anda dapat menggunakan dua kata input sebagai daftar, tupel, dua input terpisah, string tunggal dengan pembatas non-huruf, dll.
  • Format output juga fleksibel; jika Anda mengembalikan atau menampilkan string, itu harus dibatasi sehingga jelas di mana satu kata portmanteau berakhir dan yang berikutnya dimulai.
  • Seharusnya tidak ada pembatas di dalam kata portmanteau.
  • Tidak apa-apa jika daftar output Anda menyertakan hasil duplikat; menghapus duplikat juga tidak apa-apa.

Uji kasus

> 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

Solusi referensi

Berikut solusi referensi di Pip (memperlakukan ysebagai konsonan).


Ini adalah : jawaban terpendek di setiap bahasa menang!



Haruskah pembatasnya konstan atau dapatkah saya menempatkan banyak spasi di antara kata-kata?
Asone Tuhid

@ AsoneTuhid Tentu, jumlah spasi putih akan menjadi pembatas yang dapat diterima. Satu-satunya persyaratan adalah bahwa "jelas di mana satu kata portmanteau berakhir dan yang berikutnya dimulai."
DLosc

Jawaban:


5

05AB1E , 28 byte

y adalah vokal (jumlah byte yang sama dengan konsonan).

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

Cobalah online! atau sebagai Test Suite yang sedikit dimodifikasi


2
Jawaban bagus! Lucu bagaimana ada beberapa opsi untuk filter terakhir, tapi sayangnya semua byte-count yang sama .. ʒs¢Z_; ʒsåO_; ʒsм__; dll.
Kevin Cruijssen

4

Retina , 72 byte

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

Cobalah online!


Bah, saya sudah sejauh ini Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])tetapi saya tidak bisa berkonsentrasi bermain golf karena sakit kepala.
Neil

Upaya pertama saya sangat mirip, meskipun saya menghindari mengulangi bagian tengah dengan memeriksa hal vokal / konsonan di akhir dengan sesuatu seperti (?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))dan kemudian mungkin memerlukan setidaknya enam iterasi untuk membawanya ke tempat sekarang.
Martin Ender

(Jawaban ^dalam komentar saya sebelumnya salah) Memang, saya tidak akan pernah memikirkan ()|.()trik itu, saya mungkin akan berhenti Lw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou])).
Neil

3

Pyth , 38 byte

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

Input adalah daftar dari dua kata, dan Anda tidak diperlakukan sebagai konsonan.

Cobalah online di sini , atau verifikasi semua uji sekaligus di sini .

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

Membawa dua string dalam sintaks currying dan mengembalikan sebuah String. Memperlakukan ysebagai konsonan. Cobalah online di sini .

Berkat DLosc untuk bermain golf 2 byte.

Tidak Disatukan:

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

Japt Interpreter

Disimpan 10 byte berkat pemahaman Shaggy yang lebih jelas tentang sintaks Japt.

Disimpan 8 byte karena fitur bahasa baru

Disimpan 2 byte berkat beberapa saran dari ETHproductions

Versi terbaru dari Japt memperkenalkan fungsi Produk Cartesian, yang menghemat beberapa byte dan memungkinkan saya untuk mengembalikan urutan input (jadi "singa" "harimau" menghasilkan "liger" dan semacamnya). "y" masih diperlakukan sebagai konsonan.

Penjelasan:

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

Selamat datang di Japt (lagi!). Saya pasti dapat melihat beberapa potensi untuk lebih banyak bermain golf di sini; Saya akan melihatnya dengan benar ketika saya kembali ke komputer.
Shaggy


3

Python 3 , 156 150 byte

Saya telah dianggap ysebagai konsonan.

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 terima kasih kepada Jonathan Frech

Cobalah online!


Kemungkinan 150 byte .
Jonathan Frech

@JonathanFrech, terima kasih telah melihatnya
PieCot

Anda dapat menggunakan argumen default lambda x=0untuk menurunkannya untuk menyimpan ... 0 karakter, yang mengganggu. 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:])}(Masih 150)
The Matt

2

JavaScript (ES6), 124 byte

Membawa 2 kata dalam sintaks currying (a)(b)dan mencetak hasilnya dengan alert(). Berasumsi y adalah konsonan.

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

Cobalah online!


1

Jelly , 27 byte

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

Cobalah online!

Yy adalah konsonan. Kedua kasus didukung. Menghasilkan duplikat.

Output telah diprettified atas TIO. Hapus +/€dari footer untuk melihat output aktual.


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

Membuat penggunaan berat std::string#find. Memperlakukan ysebagai konsonan. Cobalah online di sini .

Tidak Disatukan:

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

Cobalah online!

3 byte dari Jonathan Frech . Dan 10 byte thx ke The Matt .

Di duniaku, ybukan vokal. (Ini merinding!)


Ada ruang nyasar di t) ifdan t) or [].
Jonathan Frech

@Jonathon Frech: Terima kasih! Agak malas di sana ...
Chas Brown

Saya mengerti ... Saya kira Anda juga agak malas saat mengetik nama saya: P
Jonathan Frech

* JonathAn: D'oh! Ya, setidaknya saya konsisten! :)
Chas Brown

1
@ Matt: Terima kasih! Sebenarnya, saya memeras 2 byte tambahan melalui (s in w)<1>(t in w).
Chas Brown

0

Ruby , 113 112 109 104 byte

y adalah konsonan

Ini menghasilkan duplikat yang sama seperti contoh dalam pertanyaan, saya harus menggunakan loop yang sama

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

Cobalah online!


0

Emacs Lisp , 306 + 13 = 319 byte

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

Cobalah secara Online!

Menentukan fungsi lambda anonim. Menghasilkan urutan portmanteaus yang dipisahkan baris baru dengan masing-masing dikelilingi oleh tanda kutip. Tips bermain golf dipersilakan. Surat yitu dianggap sebagai konsonan.

Tidak disatukan

(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))
            )
          )
        )
      )
    )
  )
)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.