自动反预测地组装替代性咏叹调


15

感谢@ComradeSparklePony的标题。

这个挑战应该非常简单。给出三个列表。

第一个是名字的列表,在标题的情况下。

第二个是小写的形容词列表。

第三个是小写的名词列表。

请随机选择一个名称,可选的形容词和名词,然后输出<Name>'s <adjective> <noun>。但是,每个单词必须以相同的字母开头。您可以假设所有单词都以字母开头。您还可以假设(但是请注意在答案中):

  • 所有单词都完全由字母字符组成
  • 每个名字至少有一个名词
  • 每个名词至少有一个名字

但是,您不能假定名称和名词的特定对存在形容词,因为形容词是可选的,因此输出仍然有效。

您不必统一选择共享字母,尽管所有可用字母都必须具有非零的出现机会。但是,您必须确保给定字母的所有输出在您语言的随机数生成器的限制范围内,具有尽可能接近发生的机会。在形容词的情况下,这等同于有一个额外的条目,意思是“此字母没有形容词”,与该字母的所有其他形容词有相同的机会。

输入列表示例:

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

请注意,在最后两个示例中,单词之间没有多余的空格。

这是,因此最短的代码不会打破任何标准漏洞,这是有道理的!

万一它有帮助,您可以以大写形式输入所有内容,但仍然需要以句子形式输出。


我们是否正确假设程序应返回:1名称1形容词(如果一个与名称匹配)1名词?还是您要为每个名称生成一个输出?
DavidC,

1
也许您应该在示例中添加“ Joan”和“ jeep”以说明以下事实:给定字母可能根本没有形容词?
阿诺尔德

给定您的示例输入,是否有三分之一没有形容词的可能性(因为所有形容词“列表”都是2个长)?...如果“琼”和“吉普”也都没有- j形容词出现,那么机会会变成9比4吗?可能值得对输出放置概率,或对所有输出进行枚举-据我所知,不仅“给定字母的所有输出...”而且所有不同的输出也应该具有相同的可能性(每个列表中给定不同的值)。
乔纳森·艾伦,

@DavidC抱歉,我知道添加更多示例已经使我们不清楚。您每次调用仅产生一行输出。
尼尔,

1
@JonathanAllan与其他包含“ Neil”和“ noun”的选项相比,添加“ Joan”和“ jeep”不会影响输出“ Neil的名词”的相对机会。
尼尔,

Answers:


5

果冻 27 25  24 字节

-1感谢Outgolfer的Erik(使用零代替空格字符)

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

一个完整的程序,该程序接受Python格式的字符串列表的形式的参数,该参数将输出打印到STDOUTt。

在线尝试!

怎么样?

Ż€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:是的,这也是我遇到最多问题的部分。花了我一段时间才意识到我可以用它¯代替填充空字符串,我不得不稍后手动清理。
艾米尼亚(Emigna)

4

[R155个 148字节的

-7个字节,感谢Giuseppe(*用于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 124 122  120字节

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

gs

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

然后,我们检查所有初始字母是否与以下正则表达式相同:

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

s


+[(o=g([,...a]))&&o+' ']+保存2个字节,我想呢?
尼尔,

@尼尔,是的。好一个。
阿诺尔德

3

Python 3中161个154 151 147 145字节

感谢ArBo,MemberionOfIgnorance和Neil为我的第一次高尔夫贡献了2、3和4个字节!

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)

在线尝试!(执行50万次)

  • 将三个列表作为输入。

  • 每个名称至少假设一个名词。


得分相同,高尔夫得分更高:

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

在线尝试!(执行50万次)

如果允许尾随空格,则仅为140(通过删除方形[:-1]


1
不错的第一答案!您可以在第一个while循环中保存一个字节:while t>""<t[0]!=w。您也可以用替换最后一行print(s+"'s",t+(t and" ")+o),将u=放到第三行。
阿博

我最终更改了解决方案,因为以前的解决方案不符合要求
Nicola Sap

1
152个字节(删除了页脚以使URL适合注释)
的无知的体现

1
您只使用t一次变量,因此可以通过内联代码节省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)但通过可选arg将条件空格添加到y,花费了我11个字节
Nicola Sap

0

果冻,28个字节

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

在线尝试!

在我看到@JonathanAllan的简短回答之前就写了这个,但是认为它值得发表,因为它使用了不同的方法。@EriktheOutgolfer在该答案上的建议节省了3个字节。

一个完整的程序,它使用字符串列表的列表并隐式地打印随机选择的项目。每个名称至少假设一个名词。



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
}


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.