Pleasanortmanteaus


32

Bir portmanteau kelimesi , her kelimenin bir parçası olan ve onları tek bir yeni kelimeye dönüştüren iki kelimenin birleşimidir. Örneğin, aslan + kaplan => liger .

Bir çift giriş kelimesinden portmanteaus üretmek için bir program yazalım. Bilgisayarlar İngilizce’de en iyisi değildir, bu yüzden çıktı portmanteaus’un göze ve kulağa hoş gelmesini sağlamak için bazı kurallar koymamız gerekir.

(Buradaki örnekler netlik sağlamak için önek ve sonek arasında bir ayırıcı ile gösterilmiştir: li|ger. Bununla birlikte, programın gerçek çıkışları bir ayırıcı olmamalıdır: liger.)

  • Her portmanteau, ikinci kelimenin boş olmayan bir son ekiyle birleştirilmiş ilk kelimenin boş olmayan bir ön ekinden oluşur: evet li|ger, hayır |iger.
  • Önek bir sesli harfle bitiyorsa, sonek bir ünsüzle başlamalı ve bunun tersi: evet, lio|gerveya l|er, hayır lio|igerveya veya l|ger. Ünlü veya ünsüz olarak sayılmaya karar verebilirsiniz y. Bununla birlikte, çözümünüz bir seçenek seçmeli ve buna bağlı kalmalıdır.
  • Ortaya çıkan kelime, tam olarak orijinal sözcüklerden hiçbirini içermemelidir: evet ila lio|ger, hayır lion|igerveya li|tiger.
    • Bu kural, söz konusu kısım her iki kelimenin de bölümlerinden oluşsa bile geçerlidir: two+ girişi ile words, çıkış tw|ordshala yasadışıdır çünkü alt dizeyi içerir words. (Bu çift için geçerli olan tek çıktı olacaktır t|ords.)

Programınız veya işleviniz iki kelime almalı ve bu sözcüklerden o sırayla oluşturulabilecek tüm hoş portmanteausların bir listesini çıkarmalı / vermelidir .

ayrıntılar

  • Standart giriş ve çıkış yöntemleri uygulanır. Standart boşluklar yasaktır.
  • Kelimeler yalnızca küçük harflerden oluşacaktır (veya eğer isterseniz, yalnızca büyük harflerden).
  • İki giriş sözcüğünü liste, bağlantı, iki ayrı giriş, harf sınırlayıcı olmayan tek bir dize vb. Olarak alabilirsiniz.
  • Çıktı formatı benzer şekilde esnektir; Bir dize döndürür veya çıkarırsanız, bir portmanteau sözcüğünün bittiği ve bir sonrakinin başladığı yer netlenecek şekilde sınırlandırılmalıdır.
  • Bir portmanteau kelimenin içinde sınırlayıcılar olmamalıdır.
  • Çıktı listenizde yinelenen sonuçlar varsa sorun değil; Ayrıca kopyaları kaldırmak da sorun değil.

Test durumları

> 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

Referans çözümü

İşte Pip'de referans çözümü ( yünsüz gibi davranır ).


Bu : Her dilde en kısa cevap kazanır!



sınırlayıcı sabit olmalı mı yoksa kelimeler arasına bir sürü boşluk koyabilir miyim?
Asone Tuhid

@AsoneTuhid Tabii ki, değişken miktarlarda beyaz boşluk kabul edilebilir bir sınırlayıcı olacaktır. Tek gereksinim, "bir portmanteau sözcüğünün nerede bittiği ve bir sonrakinin başladığı yer olduğu" açıktır.
DLosc

Yanıtlar:



4

Retina , 72 bayt

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

Çevrimiçi deneyin!


Bah, elimden gelenin en iyisini yaptım Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])ama baş ağrısından dolayı golf oynamaya konsantre olamadım.
Neil,

İlk denemem oldukça benzerdi, ancak sonunda sesli harf / ünsüz olayını kontrol ederek merkez kısmı tekrarlamaktan kaçındım (?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))ve sonra şimdi bulunduğu yere ulaşmak için muhtemelen en az altı yinelemeye ihtiyacım vardı.
Martin Ender

( ^Benim önceki yorumumdakiler yanlıştır.) Gerçekten, bu ()|.()numarayı asla düşünmezdim, muhtemelen durmuş olurdum Lw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou])).
Neil,

3

Pyth , 38 bayt

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

Giriş iki kelimenin bir listesidir ve y bir ünsüz olarak değerlendirilmez.

Online Deneyin burada ya bir kerede tüm test durumları doğrulamak burada .

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 bayt

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

Köreme sözdiziminde iki Strings alır ve bir String döndürür. yÜnsüz gibi davranır . Burada çevrimiçi deneyin .

2 bayt golf için DLosc sayesinde .

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 bayt

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

Japt Tercüman

Shaggy'nin Japt'ın sözdizimini daha iyi anlaması sayesinde 10 bayt kurtardı.

Yeni bir dil özelliği sayesinde 8 bayt kaydedildi

ETHproductions'un önerileriyle 2 bayt kurtarıldı

Japt'un en yeni sürümü, birkaç baytlık tasarruf sağlayan ve girdilerin sırasını geri yüklememe izin veren Kartezyen Ürün işlevini başlattı (yani "aslan" "kaplan" çıktı "liger" ve benzeri). "y" hâlâ ünsüz gibi muamele görür.

Açıklama:

   ï     )       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'a tekrar hoş geldiniz. Burada daha fazla golf oynamak için potansiyel görebiliyorum; Bir bilgisayara geri döndüğümde düzgün bir şekilde bakacağım.
Shaggy


3

Python 3 , 156 150 bayt

yBir ünsüz olarak kabul ettim .

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 bayt sayesinde Jonathan Frech

Çevrimiçi deneyin!


Mümkün 150 bayt .
Jonathan Frech


Varsayılan argümanları lambda x=0kullanarak aşağı inmek için kullanabilirsiniz ... can sıkıcı bir şekilde 0 karakter. 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:])}(Hala 150)
Matt

2

JavaScript (ES6), 124 bayt

Körleme sözdiziminde 2 kelimeyi alır (a)(b)ve sonuçları ile yazdırır alert(). Varsayar Y bir uyum içindedir.

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

Çevrimiçi deneyin!


1

Jöle , 27 bayt

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

Çevrimiçi deneyin!

yy bir ünsüz. Her iki vaka da desteklendi. Çiftleri döndürür.

Çıkış TIO üzerinden gerçekleştirildi. +/€Gerçek çıktıyı görmek için altbilgiden çıkarın .


1

C ++ 11, 217 202 bayt

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

Ağır kullanımı yapar std::string#find. yÜnsüz gibi davranır . Çevrimiçi deneyinBurada .

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 bayt

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

Çevrimiçi deneyin!

Jonathan Frech'ten 3 bayt . Ve 10 bayt Matt'e thx .

Benim dünyamda, ybir sesli değil. (Bu bir topak!)


Orada sokak alanlardır t) ifve t) or [].
Jonathan Frech

@Jonathon Frech: Teşekkürler! Orada biraz tembelim var ...
Chas Brown

Görüyorum ... İsmimi yazarken de biraz tembel olduğunuzu farz ediyorum: P
Jonathan Frech

* JonathAn: D'oh! En azından tutarlıydım! :)
Chas Brown,

1
@ Matt: Teşekkürler! Aslında, üzerinden 2 bayt daha sıktım.(s in w)<1>(t in w) .
Chas Brown,

0

Ruby , 113 112 109 104 bayt

y bir ünsüz

Bu sorudaki örneklerle aynı kopyaları verir, aynı döngüyü kullanmalıyım

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

Çevrimiçi deneyin!


0

Emacs Lisp , 306 + 13 = 319 bayt

İçin +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))))))))

Çevrimiçi Deneyin!

Anonim bir lambda işlevini tanımlar. Her biri tırnaklarla çevrili bir dizi yeni satır ayrılmış portmanteaus çıktılar. Golf ipuçları açıktır. Mektupy bir ünsüz olarak kabul edilir.

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))
            )
          )
        )
      )
    )
  )
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.