自動的に予測不可能に文字のアリアを組み立てます


15

タイトルを提供してくれた@ComradeSparklePonyに感謝します。

この課題は非常に単純でなければなりません。3つのリストが与えられます。

最初は、タイトルケースの名のリストです。

2番目は、小文字の形容詞のリストです。

3番目は、小文字の名詞のリストです。

名前、オプションの形容詞、名詞、およびoutputをランダムに選択してください<Name>'s <adjective> <noun>。ただし、各単語は同じ文字で始まる必要があります。すべての単語は文字で始まると想定できます。また、想定することもできます(ただし、回答する場合は注意してください):

  • すべての単語はアルファベット文字のみで構成されていること
  • 名前ごとに少なくとも1つの名詞があること
  • 各名詞に少なくとも1つの名前があること

ただし、形容詞はオプションであるため、出力は引き続き有効であるため、名前と名詞の特定のペアに対して形容詞が存在するとは想定できません。

共有レターを一律に選択する必要はありませんが、使用可能なすべてのレターは、発生する可能性がゼロ以外でなければなりません。ただし、特定の文字のすべての出力が、言語の乱数ジェネレーターの制限内で発生する可能性がほぼ等しいことを確認する必要があります。形容詞の場合、これは、この文字の他の形容詞のすべてと同じチャンスを持つ「この文字の形容詞なし」を意味する追加のエントリを持つことに相当します。

入力リストの例:

Joan Neil Nicola Oswald Sherman Stephanie
new novel old original second silent
jeep noun novel output second sheep snake

これらの入力の出力例(各行は個別の例です):

Stephanie's second second
Sherman's silent snake
Oswald's original output
Nicola's novel novel
Neil's noun
Joan's jeep

最後の2つの例では、単語間に余分なスペースがないことに注意してください。

これはなので、標準の抜け穴を壊さない最短のコードが勝ちです!

万が一それが役立つ場合は、すべてを大文字で入力できますが、文の場合は出力する必要があります。


プログラムが次を返すと仮定するのは正しいですか?1名前1形容詞(名前と一致する場合)1名詞?それとも、名前ごとに出力を生成するように求めていますか?
DavidC

1
たぶん、あなたの例に「Joan」と「jeep」を追加して、与えられた手紙には形容詞がまったくないかもしれないという事実を説明する必要がありますか?
アーナルド

あなたの入力例では、形容詞が3分の1にならない可能性があります(すべての形容詞「リスト」は2長いため)。...「ジョアン」と「ジープ」もj形容詞なしでそこにいた場合、チャンスは9分の4になりますか?出力に対して確率を設定するか、すべての出力を列挙する価値があるかもしれません-私はそれが「特定の文字のすべての出力...」だけでなく、すべての別個の出力が等しい尤度を持っている必要があることを理解しているので(各リスト内で別個の値が与えられます)。
ジョナサンアラン

@DavidC申し訳ありませんが、余分な例を追加すると、それが不明瞭になります。呼び出しごとに1行の出力のみを生成します。
ニール

1
@JonathanAllan「Joan」と「jeep」を追加しても、「Neil」と「noun」を含む他のオプションと比較して、「Neil's noun」が出力される相対的な可能性には影響しません。
ニール

回答:


5

ゼリー 27 25  24 バイト

-1アウトゴルファーのエリックに感謝(スペース文字の代わりにゼロを使用)

Ż€2¦Œpḟ€0ZḢŒuEƲƇXż“'s“”K

出力をSTDOUTtに出力する文字列のリストのPython形式リストの形式で引数を受け取る完全なプログラム。

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

どうやって?

Ż€2¦Œpḟ€0ZḢŒuEƲƇXż“'s“”K - Main Link: list of lists of lists of characters
 € ¦                     - sparse application...
  2                      - ...to indices: [2]
Ż                        - ...action: prepend a zero (place holder for no adjective)
    Œp                   - Cartesian product (all choices, including invalid ones)
       €                 - for each:
      ḟ 0                -   filter out any zeros
               Ƈ         - filter keep those for which:
              Ʋ          -   last four links as a monad:
         Z               -     transpose
          Ḣ              -     head
           Œu            -     upper-case
             E           -     all equal?
                X        - random (uniform) choice  e.g. [['B','o','b'],['b','l','u','e'],['b','a','g']]
                 ż       - zip with:
                  “'s“”  -   list [["'", 's'], []]       [[['B','o','b'],["'", 's']],[['b','l','u','e'],[]],['b','a','g']]
                       K - join with spaces              [['B','o','b'],["'", 's'],' ',['b','l','u','e'],[],' ','b','a','g']
                         - implicit (smashing) print     Bob's blue bag


ああ、いいね:)
ジョナサンアラン

5

05AB1E 24 23  21バイト

チャレンジで許可されているように、名前ごとに名詞があると仮定します。

„'s«I¯ªâI‘ʒl€нË}Ωðý

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

説明

„'s«                    # append "'s" to all names in the name-list
    I¯ª                 # append an empty list to the adjective-list
       â                # cartesian product between the lists
        Iâ              # cartesian product with the noun-list
          €˜            # deep flatten each sublist
            ʒ    }      # filter, keep only lists that when
             l          # converted to lowercase
              €н        # with only heads kept
                Ë       # have all elements equal
                  Ω     # pick a valid list uniformly at random
                   ðý   # and join by spaces

ああ、¯ªそして€˜スマートです!私は.. 26バイトの答えを持っていたが、形容詞がない場合のトラブルダブルスペースを固定を持っていた
ケビンCruijssen

@KevinCruijssen:ええ、それは私が最も多くの問題を抱えていた部分でもありました。¯空の文字列を入力する代わりに使用できることに気づくまでしばらく時間がかかりました。後で手動でクリーンアップする必要がありました。
エミグナ

4

R155 148バイト

-7(使用ジュゼッペおかげバイト*のためsample

function(x,y,z){`*`=sample
while(T)T=length(unique(c(tolower(substr(c(a<-x*1,b<-c(y,"")*1,c<-z*1),1,1)),"")))-2
paste0(a,"'s ",b,if(nchar(b))" ",c)}

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

拒否サンプリングを使用します。最初の文字が一致するまで、名前、形容詞(おそらく空の文字列)、および名詞をランダムに描画します。この条件は、最初の文字と空の文字列で構成されるベクトルの一意の要素の長さが2であるかどうかをカウントすることでチェックされます。これにより、空の形容詞が許可されます。

次に、形容詞が空でない場合、余分なスペースを使用して結果を出力します。

同じ文字で始まるさまざまな可能性sampleは、均一な分布から引き出されるため、発生確率が等しくなります。これを確認する最も簡単な方法は、名前と名詞が同じ文字で始まるというイベントを条件とすることです(そうでない場合は、拒否します)。次に、受け入れるイベントを条件にします。これは、空の形容詞、または同じ文字で始まる形容詞のいずれかを描画することを意味します。これらの可能性のそれぞれは、依然として等しい確率を持っています。

105


これは、与えられた最初の文字について、お互いに空の形容詞の可能性と同等の可能性を持っていますか?
ニックケネディ

@NickKennedyはい、sample均一分布から描画するため。これを確認する最も簡単な方法は、名前と名詞が同じ文字で始まるというイベントを条件とすることです(そうでない場合は、拒否します)。次に、受け入れるイベントを条件にします。これは、空の形容詞、または同じ文字で始まる形容詞のいずれかを描画することを意味します。これらの可能性のそれぞれは、依然として等しい確率を持っています。
ロビンライダー

ありがとう、よく説明されています。
ニックケネディ

@NickKennedyありがとう、確率が等しいことを経験的に検証するためのリンクとともに、その説明を投稿に追加します。
ロビンライダー


3

JavaScript(ES6)、 139  124122120 バイト

@Neilのおかげで2バイト節約

入力をとして受け取ります(names,adjectives)(nouns)

(N,a)=>F=n=>/^(.)\S+( \1\S+)+$/i.test(s=(g=a=>a[Math.random()*a.length|0])(N)+"'s "+[(o=g([,...a]))&&o+' ']+g(n))?s:F(n)

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

または、500万ドローの分布確認します

どうやって?

ヘルパー関数 g は配列を取り、この配列からランダムな要素を均一な分布で返します。

g = a => a[Math.random() * a.length | 0]

呼び出すことにより g 3回、ランダムな文字列を生成します s有効なフォーマットを使用しますが、頭文字を考慮しません。形容詞については、空のエントリを追加し、選択されている場合は末尾のスペースを挿入しないようにします。

s = g(N) + "'s " +
    [(o = g([, ...a])) && o + ' '] +
    g(n)

次に、すべての頭文字が次の正規表現と同一であるかどうかを確認します。

/^(.)\S+( \1\S+)+$/i

そうではありません。 s 有効です。


+[(o=g([,...a]))&&o+' ']+2バイト節約できると思いますか?
ニール

@ニールああ、はい。良いですね。
アーナルド

3

Pythonの3161の154 151 147 145バイト

私の最初のゴルフに2バイト、3バイト、および4バイトを提供してくれたArBo、ExperimentOfIgnorance、Neilに感謝します!

from random import*
c=choice
def f(N,a,n):
 s=c(N);w=s[0].lower();o=N
 while o[0]!=w:o=c(n)
 print(s+"'s",c([x+" "for x in a if x[0]==w]+[""])+o)

オンラインでお試しください!(500k回の実行)

  • 入力として3つのリストを受け取ります。

  • 名前ごとに少なくとも1つの名詞を想定しています。


同じスコア、よりゴルフy:

Python 3、145バイト

from random import*
c=choice
def f(N,a,n):
 s=c(N);y=lambda p,e=[]:c([x+" "for x in p if x[0]==s[0].lower()]+e);print(s+"'s",y(a,[""])+y(n)[:-1])

オンラインでお試しください!(500k回の実行)

末尾の空白が許可されている場合は(正方形の面を削除することにより[:-1])140


1
素敵な最初の答え!最初のwhileループでバイトを保存できます:while t>""<t[0]!=w。最後の行をで置き換えることもでき、3行目にprint(s+"'s",t+(t and" ")+o)ドロップしu=ます。
-ArBo

私は以前、要件適合していなかったので、私の解決策を変えてしまった
ニコラ樹液を

1
152バイト(コメントにURLを収めるためにフッターを削除)
無知の

1
変数をt1回だけ使用するため、コードをインライン化することで4バイトを節約できます。にo似たコードパターンを使用するように切り替えてt、インライン化することでさらに4バイト節約できると思います。
ニール

おかげで、あなたたちは本当に助けています!@Neil、私はリファクタリングすることはできなかったo。私はこれを達する:from random import* c=choice def f(N,a,n): s=c(N);y=lambda p,e=[]:c([x for x in p if x[0]==s[0].lower()]+e);print(s+"'s",y(a,[""])+y(n))137)だけに、オプションの引数を経由して、条件付きの空白を追加しy、私に11バイトのコスト
ニコラ・サップ

0

ゼリー、28バイト

1ịZḢXɓŒuḢ=ɗƇ€Ż€2¦X€ḟ0ż“'s“”K

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

@JonathanAllanの短い回答を見る前にこれを書きましたが、別のアプローチを使用しているので投稿する価値があると考えました。その答えに関する@EriktheOutgolferの提案によって3バイトを節約しました。

文字列のリストのリストを取得し、ランダムに選択された反復を暗黙的に印刷する完全なプログラム。名前ごとに少なくとも1つの名詞を想定しています。


0

C#(Visual C#Interactive Compiler)、176バイト

(a,b,c)=>(a=a[z.Next(a.Count)])+"'s "+b.Where(x=>(x[0]&95)==a[0]).Append("").OrderBy(x=>z.Next()).Last()+" "+c.OrderBy(x=>z.Next()).Last(x=>(x[0]&95)==a[0]);var z=new Random();

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


名前が大文字で始まると仮定することができますので、比較のために他の文字を大文字にするだけで10バイト節約できますか?
ニール

@Neil Yep、正確に10バイト:)
無知の

0

、179バイト

func[a b c][random a random c
foreach k c[if k/1 = h: a/1/1 + 32[g: rejoin[sp k]]]collect/into[foreach
d b[if d/1 = h[keep rejoin[sp d]]]]e: copy[""]random e rejoin[a/1"'s"e/1 g]]

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

説明:

Red[]
f: func[a b c][                     ; a function with 3 arguments
    random a                        ; shuffle the list of names in place
    random c                        ; shuffle the list of nouns in place
    foreach k c [                   ; for each item in the shuffled list of nouns
        if k/1 = h: a/1/1 + 32 [    ; check if it begins with the same lowercase letter
                                    ; as the first name in the shuffled list of names
            g: rejoin [" " k]       ; if yes, then insert a " " in front of it save it as g
        ]                           ; thus I always get the last match
    ]
    collect/into [                  ; collect in a new list e
        foreach d b [               ; all items form the adjectives list
            if d/1 = h [            ; that start with the same lowercase letter as the 1st noun
                keep rejoin [" " d] ; insert a " " in form of the adjective
            ]
        ]
    ] e: copy[""]                   ; the list initially has a single item - the empty string
   random e                         ; shuffle the extracted adjectives list
   rejoin [a/1 "'s" e/1 g]          ; return the formatted string
]

0

スカラ234の 226 234 206バイト

-28 StdInを受け入れる必要があると思ったため、現在は関数です

def f(a:List[String],b:List[String],c:List[String])=scala.util.Random.shuffle(for(d<-a;e<-("" +: b);g<-c;if(d.head.toLower==g.head&&(e.isEmpty||e.head==g.head))) yield s"$d's $e $g".replace("  ", " ")).head

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

ゴルフをしていない:

def f(names: List[String], adjectives: List[String], nouns: List[String]) = {
  val allPossible = for {
    name <- names
    adjective <- ("" +: adjectives) // Add the choice of no adjective
    noun <- nouns
    if (name.head.toLower == noun.head && (adjective.isEmpty || adjective.head == noun.head)) // Filter out so only matching entries remain
  } yield
    s"$name's $adjective $noun"
      .replace("  ", " ") // Get rid of artifact created by the empty adjective selection

  scala.util.Random.shuffle(allPossible.toList).head // Get a random element
}


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.