プレサノールトマンテウス


32

かばんの単語は、各単語の一部を取り、単一の新しい単語にそれらを作る二つの単語を組み合わせたものです。たとえば、lion + tiger => ligerです。

1組の入力語からportmanteausを生成するプログラムを作成しましょう。コンピューターは英語が上手ではないので、出力のマントマンが目と耳に心地よいものになるように、いくつかのルールを確立する必要があります。

(ここでの例は、わかりやすくするために接頭辞と接尾辞の間に区切り文字を付けて示していますli|ger。ただし、プログラムの実際の出力には区切り文字を使用しないでくださいliger。)

  • 各portmanteauは、2番目の単語の空でない接尾辞に連結された最初の単語の空でない接頭辞で構成されます:yes to li|ger、no to |iger
  • 接頭辞が母音で終わる場合、接尾辞は子音で始まる必要があり、その逆も同様です:yes to lio|gerまたはl|erno to lio|igeror l|ger母音と子音のどちらとして数えるかを決めることができyます。ただし、ソリューションでは1つのオプションを選択し、それに従う必要があります。
  • 結果の単語には、元の単語のいずれか(yes to lio|ger、no to、lion|igerまたは)を完全に含めることはできませんli|tiger
    • このルールは、問題の部分が両方の単語の一部で構成されている場合でも成立します。入力がtwo+のwords場合、出力にtw|ordsはsubstringが含まれているため、出力は依然として不正wordsです。(このペアの有効な出力はのみですt|ords。)

プログラムまたは関数は2つの単語を取り、それらの単語からその順序で形成できるすべての快適な門脈のリストを出力または返す必要があります。

詳細

  • 標準の入出力方法が適用されます。標準的な抜け穴は禁止されています。
  • 単語は小文字のみで構成されます(または、必要に応じて大文字のみで構成されます)。
  • 2つの入力語をリスト、タプル、2つの個別の入力、非文字区切り文字付きの単一の文字列などとして使用できます。
  • 出力形式も同様に柔軟です。文字列を返すか出力する場合は、あるportmanteauの単語がどこで終わり、次の単語が始まるかが明確になるように区切る必要があります。
  • ポルトマントー語の中に区切り文字はありません。
  • 出力リストに重複した結果が含まれていても問題ありません。重複を削除してもかまいません。

テストケース

> 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子音として扱います)。


これはです。各言語で最短の答えが勝ちます!



区切り文字は定数である必要がありますか、または単語の間にスペースをたくさん入れることができますか?
Asone Tuhid

@AsoneTuhid確かに、可変量の空白は許容可能な区切り文字になります。唯一の要件は、「1つのportmanteau単語がどこで終わり、次の単語が始まるかが明確である」ことです。
DLosc

回答:


5

05AB1E、28バイト

y 母音です(ただし、子音と同じバイトカウント)。

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

オンラインでお試しください! またはわずかに変更されたテストスイートとして


2
いい答えだ!面白いことに、最後のフィルターにはかなりの数のオプションがありますが、残念ながらすべて同じバイト数ですʒs¢Z_ʒsåO_; ʒsм__; 等
ケビン・クルーッセン

4

網膜、72バイト

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

オンラインでお試しください!


ああ、私はLw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])できる限り持っていましたが、頭痛のためにゴルフに集中できませんでした。
ニール

私の最初の試みは非常に似ていましたが、最後に母音/子音のようなものをチェックすることで中央部分を繰り返すことを避け、(?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))現在の位置に到達するには少なくとも6回の反復が必要でした。
マーティンエンダー

^前のコメントのsは誤りです)実際、私はその()|.()トリックを考えたことがなかったでしょう、おそらくで止まったでしょうLw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou]))
ニール

3

Pyth、38バイト

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

入力は2つの単語のリストであり、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;}

カリー化構文で2つの文字列を受け取り、文字列を返します。扱いy子音として。こちらからオンラインでお試しください

おかげDLosc2バイトのゴルフをしてにます。

ゴルフをしていない:

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の構文をShaggyがより明確に理解したため、10バイト節約されました。

新しい言語機能により8バイトを節約

ETHproductionsからのいくつかの提案のおかげで2バイト節約

Japtの最新バージョンは、デカルト積関数を導入しました。これはかなりのバイトを節約し、入力の順序を復元できるようにしました(「ライオン」「虎」出力「ライガー」など)。「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へようこそ(再び!)。ここでゴルフを増やす可能性を間違いなく見ることができます。コンピューターに戻ったら、適切に確認します。
シャギー


3

Pythonの3156 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バイト

オンラインでお試しください!



@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

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子音として。こちらからオンラインでお試しください

ゴルフをしていない:

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

パイソン2179の 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[]

オンラインでお試しください!

Jonathan Frechから3バイト。そして、マットに 10バイトthx

私の世界でyは、母音ではありません。(それはあくびです!)


とに漂遊スペースがt) ifありt) or []ます。
ジョナサンフレッチ

@Jonathon Frech:ありがとう!...そこに少し怠惰ガット
チャス・ブラウン

私は...私はあなたにも私の名前を入力しながら、少し怠け者だと推定参照:P
ジョナサンFRECH

*ジョナサン:ど!まあ、少なくとも私は一貫していた!:)
チャスブラウン

1
@ザマット:ありがとう!実際、を介してさらに2バイトを圧縮しました(s in w)<1>(t in w)
チャスブラウン


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は子音とみなされます。

非ゴルフ

(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.