Pleasanortmanteaus


32

Một từ portmanteau là sự kết hợp của hai từ chiếm một phần của mỗi từ và biến chúng thành một từ mới. Ví dụ: sư tử + hổ => liger .

Chúng ta hãy viết một chương trình để tạo ra portmanteaus từ một cặp từ đầu vào. Máy tính không phải là tiếng Anh tốt nhất, vì vậy chúng tôi sẽ cần thiết lập một số quy tắc để đảm bảo rằng portmanteaus đầu ra dễ chịu cho mắt và tai.

(Ví dụ ở đây được hiển thị với dấu phân cách giữa tiền tố và hậu tố cho rõ ràng : li|ger. Tuy nhiên, các đầu ra thực tế của chương trình không nên có dấu phân cách : liger.)

  • Mỗi portmanteau sẽ bao gồm một tiền tố không trống của từ đầu tiên được nối với một hậu tố không trống của từ thứ hai: yes to li|ger, no to |iger.
  • Nếu tiền tố kết thúc bằng nguyên âm, hậu tố phải bắt đầu bằng phụ âm và ngược lại: yes to lio|gerhoặc l|er, no to lio|igerhoặc l|ger. Bạn có thể quyết định nên tính ylà nguyên âm hay phụ âm. Giải pháp của bạn phải chọn một tùy chọn và gắn bó với nó, tuy nhiên.
  • Từ kết quả không được chứa đầy đủ một trong hai từ gốc: có lio|ger, không lion|igerhoặc không li|tiger.
    • Quy tắc này được giữ ngay cả khi phần trong câu hỏi được hình thành từ các phần của cả hai từ: với đầu vào là two+ words, đầu ra tw|ordsvẫn là bất hợp pháp vì nó chứa chuỗi con words. (Đầu ra hợp lệ duy nhất cho cặp này sẽ là t|ords.)

Chương trình hoặc chức năng của bạn phải lấy hai từ và xuất / trả về một danh sách tất cả các portmanteaus dễ chịu có thể được hình thành từ những từ đó theo thứ tự đó.

Chi tiết

  • Phương pháp đầu vào và đầu ra tiêu chuẩn được áp dụng. Sơ hở tiêu chuẩn bị cấm.
  • Các từ sẽ chỉ bao gồm các chữ cái viết thường (hoặc, nếu bạn thích, chỉ các chữ cái viết hoa).
  • Bạn có thể lấy hai từ đầu vào làm danh sách, tuple, hai đầu vào riêng biệt, một chuỗi với một dấu phân cách không phải là chữ cái, v.v.
  • Định dạng đầu ra là linh hoạt tương tự; nếu bạn trả về hoặc xuất ra một chuỗi, nó sẽ được phân định để nó rõ ràng nơi một từ portmanteau kết thúc và chuỗi tiếp theo bắt đầu.
  • Không nên có dấu phân cách trong một từ portmanteau.
  • Không sao nếu danh sách đầu ra của bạn bao gồm các kết quả trùng lặp; cũng không sao để loại bỏ trùng lặp.

Các trường hợp thử nghiệm

> 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

Giải pháp tham khảo

Đây là một giải pháp tham khảo trong Pip (coi ynhư một phụ âm).


Đây là : câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!



dấu phân cách phải là hằng số hay tôi có thể đặt một khoảng trắng giữa các từ không?
Asone Tuhid

@AsoneTuhid Chắc chắn, số lượng khoảng trắng khác nhau sẽ là một dấu phân cách chấp nhận được. Yêu cầu duy nhất là "rõ ràng nơi một từ portmanteau kết thúc và từ tiếp theo bắt đầu."
DLosc

Câu trả lời:


5

05AB1E , 28 byte

y là một nguyên âm (mặc dù số byte giống như phụ âm).

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm sửa đổi một chút


2
Câu trả lời tốt đẹp! Thật buồn cười là có khá nhiều tùy chọn cho bộ lọc cuối cùng, nhưng thật không may, tất cả cùng một số đếm byte .. ʒs¢Z_; ʒsåO_; ʒsм__; v.v.
Kevin Cruijssen

4

Võng mạc , 72 byte

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

Hãy thử trực tuyến!


Bah, tôi đã đi xa như Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])vậy nhưng tôi không thể tập trung chơi golf vì đau đầu.
Neil

Nỗ lực đầu tiên của tôi khá giống nhau, mặc dù tôi đã tránh lặp lại phần trung tâm bằng cách kiểm tra nguyên âm / phụ âm ở cuối bằng một cái gì đó giống như (?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))và sau đó có lẽ cần ít nhất sáu lần lặp để đưa nó xuống vị trí hiện tại.
Martin Ender

(Các ^s trong nhận xét trước của tôi là sai lầm) Thật vậy, tôi sẽ không bao giờ nghĩ về ()|.()mánh khóe đó , tôi có lẽ đã dừng lại ở đó Lw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou])).
Neil

3

Bình thường , 38 byte

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

Đầu vào là danh sách hai từ và y không được coi là phụ âm.

Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đâ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 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;}

Lấy hai chuỗi theo cú pháp currying và trả về một Chuỗi. Đối xử ynhư một phụ âm. Hãy thử trực tuyến tại đây .

Cảm ơn DLosc đã chơi golf 2 byte.

Ung dung:

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

Thông dịch viên Japt

Đã lưu 10 byte nhờ vào sự hiểu biết rõ ràng hơn về cú pháp của Japt.

Đã lưu 8 byte do tính năng ngôn ngữ mới

Đã lưu 2 byte nhờ một số đề xuất từ ​​ETHproductions

Phiên bản mới nhất của Japt đã giới thiệu chức năng Sản phẩm của Cartesian, đã lưu khá nhiều byte và cho phép tôi khôi phục thứ tự đầu vào (vì vậy "sư tử" "hổ" xuất ra "liger" và như vậy). "y" vẫn được coi là phụ âm.

Giải trình:

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

Chào mừng đến với Japt (một lần nữa!). Tôi chắc chắn có thể thấy một số tiềm năng để chơi golf nhiều hơn ở đây; Tôi sẽ có một cái nhìn đúng đắn về nó khi tôi quay lại máy tính.
Shaggy


3

Python 3 , 156 150 byte

Tôi đã coi ynhư một phụ âm.

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 nhờ Jonathan Frech

Hãy thử trực tuyến!


Có thể 150 byte .
Jonathan Frech

@JonathanFrech cảm ơn vì đã phát hiện ra nó
PieCot

Bạn có thể sử dụng các đối số mặc định lambda x=0để đưa nó xuống để lưu ... 0 ký tự, thật khó chịu. 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:])}(Vẫn 150)
Matt

2

JavaScript (ES6), 124 byte

Lấy 2 từ theo cú pháp currying (a)(b)và in kết quả với alert(). Giả sử y là một phụ âm.

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

Hãy thử trực tuyến!



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

Làm cho sử dụng nặng std::string#find. Đối xử ynhư một phụ âm. Hãy thử trực tuyến tại đây .

Ung dung:

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

Hãy thử trực tuyến!

3 byte từ Jonathan Frech . Và 10 byte thx cho The Matt .

Trong thế giới của tôi, ykhông phải là một nguyên âm. (Đó là một yowl!)


Có không gian đi lạc trong t) ift) or [].
Jonathan Frech

@Jonathon Frech: Cảm ơn! Có một chút lười biếng ở đó ...
Chas Brown

Tôi hiểu rồi ... Tôi đoán bạn cũng có một chút lười biếng trong khi gõ tên tôi: P
Jonathan Frech

* JonathAn: Ôi! Chà, ít nhất thì tôi đã kiên định! :)
Chas Brown

1
@ Matt: Cảm ơn! Trên thực tế, tôi đã vắt thêm 2 byte thông qua (s in w)<1>(t in w).
Chas Brown

0

Hồng ngọc , 113 112 109 104 byte

y là một phụ âm

Điều này xuất ra các bản sao giống như các ví dụ trong câu hỏi, tôi phải sử dụng cùng một vòng lặp

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

Hãy thử trực tuyến!


0

Emacs Lisp , 306 + 13 = 319 byte

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

Dùng thử trực tuyến!

Xác định một hàm lambda ẩn danh. Xuất ra một chuỗi các portmanteaus được phân tách bằng dòng mới với mỗi cái được bao quanh bởi dấu ngoặc kép. Lời khuyên chơi golf được chào đón. Bức thư yđược coi là một phụ âm.

Ung dung

(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))
            )
          )
        )
      )
    )
  )
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.