Pleasanortmanteaus


32

กระเป๋าหิ้วคำคือการรวมกันของทั้งสองคำที่ใช้เวลาส่วนหนึ่งของแต่ละคำและทำให้พวกเขากลายเป็นคำใหม่เดียว ยกตัวอย่างเช่นสิงโต + เสือ => Liger

ลองเขียนโปรแกรมเพื่อสร้าง portmanteaus จากคำที่ใส่เข้าไป คอมพิวเตอร์ไม่ใช่ภาษาอังกฤษที่ดีที่สุดดังนั้นเราจะต้องสร้างกฎบางอย่างเพื่อให้แน่ใจว่าพอร์ทอุปกรณ์ส่งออกมีความพึงพอใจต่อตาและหู

(ตัวอย่างที่นี่จะแสดงด้วยตัวคั่นระหว่างคำนำหน้าและคำต่อท้ายเพื่อความชัดเจน: li|ger. อย่างไรก็ตามผลลัพธ์ที่แท้จริงของโปรแกรมไม่ควรมีตัวคั่น: liger.)

  • แต่ละกระเป๋าหิ้วจะประกอบด้วยคำนำหน้าว่างของคำแรกตัดแบ่งไปว่างต่อท้ายของคำที่สอง: ใช่li|ger, |igerไม่มี
  • หากคำนำหน้าลงท้ายด้วยสระคำต่อท้ายจะต้องเริ่มต้นด้วยพยัญชนะและในทางกลับกัน: ใช่lio|gerหรือl|erไม่lio|igerหรือl|gerหรือคุณอาจตัดสินใจว่าจะนับyเป็นสระหรือพยัญชนะ วิธีการแก้ปัญหาของคุณจะต้องเลือกหนึ่งตัวเลือกและติดกับมันอย่างไรก็ตาม
  • คำที่ได้จะต้องไม่มีคำเดิมอย่างใดอย่างหนึ่ง: ใช่ lio|ger , ไม่มีหรือ lion|igerli|tiger
    • กฎข้อนี้ถือแม้ว่าส่วนหนึ่งในคำถามที่จะเกิดขึ้นจากชิ้นส่วนของทั้งสองคำ: ด้วยการป้อนข้อมูลของtwo+ wordsการส่งออกยังคงเป็นที่ผิดกฎหมายเพราะมีอักขระย่อยtw|ords words(เอาต์พุตที่ถูกต้องเท่านั้นสำหรับคู่นี้t|ordsคือ)

โปรแกรมหรือฟังก์ชั่นของคุณจะต้องใช้สองคำและเอาท์พุท / ส่งคืนรายการของ portmanteaus ที่น่าพอใจทั้งหมดที่สามารถเกิดขึ้นจากคำเหล่านั้นในลำดับที่

รายละเอียด

  • ใช้วิธีการอินพุตและเอาต์พุตมาตรฐาน ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • คำจะประกอบด้วยตัวอักษรตัวพิมพ์เล็กเท่านั้น (หรือหากคุณต้องการเพียงตัวอักษรตัวพิมพ์ใหญ่เท่านั้น)
  • คุณอาจใช้คำสองคำที่ป้อนเข้าเป็นรายการ, tuple, สองอินพุตแยกกัน, สตริงเดียวที่มีตัวคั่นที่ไม่ใช่ตัวอักษร, ฯลฯ
  • รูปแบบผลลัพธ์มีความยืดหยุ่นในทำนองเดียวกัน หากคุณส่งคืนหรือส่งออกสตริงมันควรจะถูกคั่นด้วยเพื่อให้ชัดเจนโดยที่หนึ่งคำในพอร์ตแมนเทสิ้นสุดและคำถัดไปจะเริ่มขึ้น
  • ไม่ควรมีตัวคั่นภายในคำในกระเป๋าหิ้ว
  • ไม่เป็นไรหากรายการผลลัพธ์ของคุณมีผลลัพธ์ซ้ำซ้อน มันก็โอเคที่จะลบรายการที่ซ้ำกัน

กรณีทดสอบ

> 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

โซลูชันอ้างอิง

นี่คือโซลูชันอ้างอิงใน Pip (ถือว่าyเป็นพยัญชนะ)


นี่คือ : คำตอบที่สั้นที่สุดในแต่ละภาษาชนะ!


ที่เกี่ยวข้อง สัมพันธ์กันมากขึ้น
DLosc

ตัวคั่นต้องเป็นค่าคงที่หรือฉันสามารถใส่ช่องว่างระหว่างคำได้หรือไม่
Asone Tuhid

@AsoneTuhid แน่นอนจำนวนช่องว่างที่แปรผันจะเป็นตัวคั่นที่ยอมรับได้ ข้อกำหนดเพียงอย่างเดียวคือ "มันชัดเจนที่หนึ่งคำกระเป๋าเดินทางสิ้นสุดลงและหนึ่งต่อไปเริ่มต้น"
DLosc

คำตอบ:


5

05AB1E , 28 ไบต์

y เป็นเสียงสระ (นับไบต์เดียวกันกับพยัญชนะ)

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

ลองออนไลน์! หรือเป็นชุดทดสอบที่ปรับเปลี่ยนเล็กน้อย


2
คำตอบที่ดี! ขำ ๆ ว่ามีตัวเลือกค่อนข้างน้อยสำหรับตัวกรองสุดท้าย แต่น่าเสียดายที่จำนวนไบต์เดียวกันทั้งหมด .. ʒs¢Z_; ʒsåO_; ʒsм__; ฯลฯ
Kevin Cruijssen

4

เรติน่า 72 ไบต์

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

ลองออนไลน์!


Bah ฉันได้มาถึงLw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])แต่ฉันไม่สามารถมีสมาธิในการเล่นกอล์ฟเพราะปวดหัว
Neil

ความพยายามครั้งแรกของฉันคล้ายกันมากแม้ว่าฉันจะหลีกเลี่ยงการทำซ้ำส่วนตรงกลางโดยการตรวจสอบเสียงสระ / พยัญชนะตอนท้ายด้วยบางสิ่งบางอย่างที่คล้ายกัน(?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))และจากนั้นจำเป็นต้องมีอย่างน้อยหกซ้ำ
Martin Ender

(สิ่ง^ที่อยู่ในความคิดเห็นก่อนหน้าของฉันผิดพลาด) จริง ๆ แล้วฉันคงไม่เคยนึกถึง()|.()กลอุบายLw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou]))นั้น
Neil

3

Pyth , 38 ไบต์

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

อินพุตเป็นรายการของคำทั้งสองและ 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 ไบต์

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

รับสอง Strings ในการแก้ไวยากรณ์และคืนค่า String ถือว่าyเป็นพยัญชนะ ลองออนไลน์ที่นี่ที่นี่

ขอบคุณ DLoscสำหรับการเล่นกอล์ฟ 2 ไบต์

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 ไบต์

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

ล่าม Japt

บันทึก 10 ไบต์ด้วยความเข้าใจที่ชัดเจนของ Shaggy เกี่ยวกับไวยากรณ์ของ Japt

บันทึกแล้ว 8 ไบต์เนื่องจากคุณสมบัติภาษาใหม่

บันทึก 2 ไบต์ด้วยคำแนะนำจาก ETHproductions

Japt เวอร์ชั่นใหม่ล่าสุดได้เปิดตัวฟังก์ชั่นสินค้าคาร์ทีเซียนซึ่งบันทึกได้ไม่กี่ไบต์และอนุญาตให้ฉันเรียกคืนการสั่งซื้ออินพุต (เช่น "สิงโต" "เสือ" เอาต์พุต "liger" และอื่น ๆ ) "y" ยังคงเป็นพยัญชนะ

คำอธิบาย:

   ï     )       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 (อีกครั้ง!) ฉันเห็นศักยภาพในการเล่นกอล์ฟที่นี่มากขึ้น ฉันจะดูอย่างเหมาะสมเมื่อฉันกลับไปที่คอมพิวเตอร์
Shaggy


3

Python 3 , 156 150 ไบต์

ฉันถือว่าyเป็นพยัญชนะ

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 ไบต์ขอบคุณJonathan Frech

ลองออนไลน์!


เป็นไปได้150 ไบต์
Jonathan Frech

@ JonathanFrech ขอบคุณที่จำได้
PieCot

คุณสามารถใช้อาร์กิวเมนต์เริ่มต้นในlambda x=0การลงเพื่อบันทึก ... 0 ตัวอักษรน่ารำคาญ 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:])}(ยัง 150)
แมตต์

2

JavaScript (ES6), 124 ไบต์

ใช้เวลา 2 คำในความดีความชอบไวยากรณ์และพิมพ์ผลกับ(a)(b) alert()สมมติว่าyเป็นพยัญชนะ

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

ลองออนไลน์!


1

เยลลี่ , 27 ไบต์

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

ลองออนไลน์!

Yyเป็นพยัญชนะ รองรับทั้งสองกรณี ส่งคืนรายการซ้ำ

เอาต์พุตได้รับการกำหนดล่วงหน้าผ่าน TIO ลบออก+/€จากส่วนท้ายเพื่อดูผลลัพธ์จริง


1

C ++ 11, 217 202 ไบต์

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

std::string#findทำให้การใช้งานหนัก ถือว่าyเป็นพยัญชนะ ลองออนไลน์ได้ที่นี่

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 ไบต์

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

ลองออนไลน์!

3 ไบต์จากโจนาธาน Frech และ 10 ไบต์ขอบคุณไปแมตต์

ในโลกของฉันyไม่ใช่เสียงสระ (มันเป็น yowl!)


มีช่องว่างในจรจัดอยู่และt) if t) or []
Jonathan Frech

@ Jonathon Frech: ขอบคุณ! มีบิตขี้เกียจมี ...
Chas สีน้ำตาล

ฉันเห็น ... ฉันคิดว่าคุณขี้เกียจนิดหน่อยในขณะที่พิมพ์ชื่อของฉัน: P
Jonathan Frech

* JonathAn: D'oh! อย่างน้อยฉันก็สอดคล้อง! :)
Chas Brown

1
@ Matt: ขอบคุณ! อันที่จริงผมบีบเพิ่มอีก 2 (s in w)<1>(t in w)ไบต์ออกผ่านทาง
Chas Brown

0

Ruby , 113 112 109 104 ไบต์

y เป็นพยัญชนะ

ผลลัพธ์นี้ซ้ำซ้อนกันเป็นตัวอย่างในคำถามฉันต้องใช้ลูปเดียวกัน

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

ลองออนไลน์!


0

Emacs Lisp , 306 + 13 = 319 ไบต์

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

ลองออนไลน์!

กำหนดฟังก์ชั่นแลมบ์ดานิรนาม เอาต์พุตลำดับของพอร์ตที่แยกกันของบรรทัดใหม่ด้วยแต่ละอันล้อมรอบด้วยเครื่องหมายคำพูด ยินดีต้อนรับเคล็ดลับการเล่นกอล์ฟ ตัวอักษรyนั้นถือว่าเป็นพยัญชนะ

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))
            )
          )
        )
      )
    )
  )
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.