生成一个


15

您的任务是生成一个带有指定数量的“音节”的合理发音的无意义的单词。每次运行程序都可能导致一个不同的废话。

发音能力

可发音的单词由音节组成,而音节又由可能夹在两个辅音组之间的元音组组成。并非所有声音在所有位置都能发音,并且由于这取决于语言,因此我们将使用英语使用者可以理解的模式

起始辅音组:

b c d f g h j k l m n p r s t v w y z bl br ch ch cl cr dr fl ghgh gn gr kn ph pl pr qu sc sh sk sl sm sn sp st st th tr whwr sch scr shr squ str

元音组:

我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我爱我

结束辅音组:

bcdflmnprstxz bt ch ck ct ft ghgn lb ld lf lk lm lm ln lp lp mb mb mn mp mp mp mp nk nk ng nt ph pt rb rc rd rf rg rk rl rm rm rn rp rt rv rr rsh r sk r s lst lc lch中学

组合音节

起始和结束辅音组通常都是可选的,但是您不能在以元音开头的音节之前紧接以元音结尾的音节。

免责声明

为了简单起见,某些英语单词实际上无法以这种方式生成,例如真空,木琴,助记符,翼手龙,美丽,等等,它们,哇和大多数复数形式。

总览

使用此键的可能音节模式:

(SC)=起始辅音;(V)=元音组;(EC)=结束辅音

对于一个音节:

  • (SC)(V)(EC)
  • (V)(EC)
  • (SC)(五)
  • (五)

有两个音节:

  • (SC)(V)(EC)(SC)(V)(EC)
  • (SC)(V)(EC)(SC)(V)
  • (SC)(V)(EC)(V)(EC)
  • (SC)(V)(EC)(V)

  • (SC)(V)(SC)(V)(EC)

  • (SC)(V)(SC)(V)

  • (V)(EC)(SC)(V)(EC)

  • (V)(EC)(SC)(V)
  • (V)(EC)(V)(EC)
  • (V)(EC)(V)

  • (V)(SC)(V)(EC)

  • (V)(SC)(V)

... 等等

例子

1个音节

  • 查斯特
  • igh
  • Shriegn
  • s
  • ue
  • OO
  • 奇兹

2个音节

  • 爵士乐
  • Whylprog
  • ba
  • 奥拉
  • 英索克
  • 格里斯菲尔兹
  • 布卢斯波

3个音节

  • 细支
  • 乌贼
  • 首都
  • gt
  • 双重思考
  • 哥哥
  • phoebliaptmoo
  • skolfblauquent

4个音节

  • 稻草
  • 僵尸
  • Prearneajoomie
  • slephotoschou
  • 双佳

编码

输入:要生成的音节数的整数

输出:许多音节长的(可能是)废话

规则

  • 需要某种形式的(伪)随机性。音节的所有组合都应该(理论上)可以生成,尽管分布不必是统一的。
    • 您可以假设生成器是非周期性的,因此不必在数学上生成每个可能的单词(现实中可能没有足够长的时间),也不需要提供任何形式的证据来证明实际上,生成器可以产生所有可能的单词。
    • 您的生成器实际上必须能够产生至少255个不同的值,因此您不能每次调用生成器时都只返回4
    • 最终重要的是,您应该以某种方式在代码中包括上述所有字母组,每个字母组被拣选的机率非零,并且每个音节模式的出现机率也非零(如果提供了真正的随机性)。
  • 您最多必须支持16个音节词
  • 除了组合音节的规则外,输出字还不得包含:
    • 3个连续的元音(a e i o u;这可能发生在qu单词上)
    • 3个连续匹配的辅音

祝好运!


请注意,由于以下几个原因,这与生成可发音单词不同:

  • 输入指定的可变音节数目,而不是严格的10个字母的要求。
  • 这项挑战增加了必须(正确)编码的非穷举字母组,并允许音节的更多变体,因此不能仅从其他挑战中复制代码
  • Squirdshlicker。需要我多说?

我也忘记了重复检查,但是事实证明,这为表带来了足够多的新内容,这无关紧要。毕竟,存在数百种奎因变种挑战。


2
“我也忘记了伪造支票,但事实证明,这给表带来了足够多的新东西,这无关紧要。” 有人确认吗?我觉得这并不总是正确的……
Quintec

2
Downvoted了大量的“hardcodedness”需要给出辅音你的3名长名单和元音
斯蒂芬

1
建议添加doubleplusgood作为示例,以匹配此挑战的质量。

1
为什么不“squirds Ç hlicker”?必须在连续的辅音上击败“优势” :)
受到干扰

Answers:


4

的JavaScript(ES6), 407个  403字节

f=n=>/[aeiou]{3}|(.)\1\1/.test(s=(h=k=>k?(g=s=>p=s.match(/.[a-z]*/g)[Math.random()*99|0]||(s>x&&p?'':g(s)))(x+'lBrClCrDrFlFrGlGrHJKKnPlPrQuScScrShmShrSlSmSnSquStrThThrTrVWWhWrY')+g('AAeAiAoAuEEaEeEiEuIIaIeIoOOaOeOiOoOuUUeUi')+g(x+'tCkCtFtLbLchLdLfLkLlLmLnLpLshLtLthMbMnMpNgNkNtPtRbRcRchRdRfRgRkRlRmRnRpRshRstRtRthRvRzSsTchXZz')+h(k-1):'')(n,p=x='BCChDFGGhGnLMNPPhRSSchShSkSpStTZB').toLowerCase())?f(n):s

在线尝试!


您确定[^aeiou]{3}正确吗?基于单词“匹配”和3音节例如squirdshlicker含有rdshl,我想OP只意味着同一相邻辅音3(即bbb是不允许的),而不是一般的3升相邻的辅音。
凯文·克鲁伊森

2
@KevinCruijssen在对挑战进行二读时,我认为毫无疑问您的解释是正确的。因此,我已经相应地更新了代码。
阿纳尔德

3

05AB1E237个 234 230 228 字节

.•O0¦"ÐD›ô:ΓF9—∊‘àÕGÌ•3LŽZв₂в×S£V[1U.µ\µTΩiY.•1θ₆Ω–¸‡ÊΔιÃмº³ô»ÝAïG3_@|å“₄bÒs₃l¬t©ïÙK:≠•3LŽII₂в×S£«Ω1U}XižM•·Áy&ŒGηΩ¼αŸKq•6вèJ•Λ1"•bS>£Ω¼0U}TΩiY.•E–æƵHl¨åñyBY±(ú,ā]JùË‚aEuŒ—[K³|C~ôÙŸ„#¼ÑûĀdš+¢zsÄΘä¹ÊÌ₅ôθ•3LŽAE₆в×S£«Ω1U}J}Dγ€g3‹P#

-2个字节,感谢@MagicOctopusUrn

在线尝试获得更多输出

说明:

.•O0¦"ÐD›ô:ΓF9—∊‘àÕGÌ•
                  "# Push compressed string "bcdfglmnprstzchghgnphshskspstsch"
  3L               # Push list [1,2,3]
    ŽA;            # Push compressed integer 8997
       ₂в          # Converted to Base-26 as list: [13,8,1]
         ×         # Repeat the digits [1,2,3] that many times: ["1111111111111","22222222","3"]
          S        # Convert it to a list of flattened digits
           £       # Split the string into parts of that size
            V      # Pop and store this string-list in variable `Y`
[                  # Start an infinite loop:
 1U                #  Reset variable `X` to 1
                 #  Reset the counter_variable to 0
 \                 #  Discard the top of the stack (if any)
 µ                 #  Loop while the counter_variable is not equal to the (implicit) input:
  TΩi              #   If a random boolean is truthy:
     Y             #    Push the string-list we stored in variable `Y`
     .•1θ₆Ω–¸‡ÊΔιÃмº³ô»ÝAïG3_@|å“₄bÒsl¬t©ïÙK:≠•
                   #    Push compressed string "hjkvwyblbrclcrdrflfrglgrknplprquscslsmsnthtrwhwrscrshmshrsqustrthr"
       3L          #    Push list [1,2,3]
         ŽII       #    Push compressed integer 4608
            ₂в     #    Converted to Base-26 as list: [6,21,6]
              ×    #    Repeat the digits [1,2,3] that many times: ["111111","222222222222222222222","333333"]
               S   #    Convert it to a list of flattened digits
                £  #    Split the string into parts of that size
     «             #    Merge it with list `Y`
      Ω            #    Pop and push a random starting consonant group from this list
     1U            #    And set variable `X` to 1
    }              #   Close the if-statement
  Xi               #   If variable `X` is 1:
    žM             #    Push builtin string "aeiou"
      •·ÁyGηΩ¼αŸKq
                   #    Push compressed integer 13814931869773709280202935082102
        6в         #    Converted to Base-6 as list: [1,0,1,1,1,2,1,4,0,1,0,2,0,3,0,4,2,0,2,1,2,3,3,0,3,1,3,2,3,3,3,4,4,1,4,2,0,1,2,3,4]
          èJ       #    Index each into the string "aeiou", and join together: "aeaiaoaueaeeeieuiaieiooaoeoiooouueuiaeiou"
      •Λ1"•       "#    Push compressed integer 8388576
           b       #    Converted to binary: "11111111111111111100000"
            S>     #    Split into a list of digits, and each increased by 1
              £    #    Split the string into parts of that size
               Ω   #    Pop and push a random vowel group from this list
    ¼              #    Increase the counter_variable by 1
    0U             #    And then set variable `X` to 0
   }               #   Close the if-statement
  TΩi              #   If a random boolean is truthy:
     Y             #    Push the string-list we stored in variable `Y`
     .•E–æƵHl¨åñyBY±(ú,ā]JùË‚aEuŒ—[K³|C~ôÙŸ„#¼ÑûĀdš+¢zsÄΘä¹ÊÌ₅ôθ•
                   #    Push compressed string "xbtckctftlbldlflklllmlnlpltmbmnmpnkngntptrbrcrdrfrgrkrlrmrnrprtrvrzsszzlchlshlthrchrshrstrthtch"
       3L          #    Push list [1,2,3]
         ŽAE       #    Push compressed integer 2564
            ₆в     #    Converted to Base-36 as list: [1,35,8]
              ×    #    Repeat the digits [1,2,3] that many times: ["1","222...222","33333333"]
               S   #    Convert it to a list of flattened digits
                £  #    Split the string into parts of that size
     «             #    Merge it with list `Y`
      Ω            #    Pop and push a random ending consonant group from this list
     1U            #    And set variable `X` to 1
    }              #   Close the if-statement
  J                #   Join all strings on the stack together
 }D                #  After the while-loop: duplicate the resulting string
   γ               #  Split the copy into chunks, with adjacent characters that are
                   #  the same grouped together
    g             #  Get the length of each chunk
      3           #  Check for each length if it's smaller than 3
        P          #  Check if all are truthy by taking the product, and if it is:
         #         #   Stop the infinite loop
                   # (after which the string at the top of the stack is output implicitly)

请参阅我的05AB1E技巧(如何压缩字符串而不是字典的一部分?如何压缩大整数?如何压缩整数列表?),以了解压缩部分的工作原理。


1
žM•ô#‰¦λu¢!¡°gU€•6BS<èJ比4小.•!m1±P1Ÿ6ºZ dâ4∍m–G¢”ãÔ2g•(使用AEIOU内置的基数6转换和替换)。TIO链接太长。
魔术章鱼缸

@MagicOctopusUrn谢谢!并使用节省了2个字节žM•·Áy&ŒGηΩ¼αŸKq•6вèJ。:) PS:您可以在PPCG上使用tinyurl.com之类的网址缩短器,这与大多数其他SE有所不同。:)
凯文·克鲁伊森

1

果冻,231字节

e€ØẹŒrḢƇ,ŒɠF>2Ẹ
“yŒʠT¬ḅɼṬɦṀUżGv¶æɲCĊQ>ṙȦẇɼṄ0IḤhDẋDċṀĊṪɗĖƇẊ;1JƒṾỊżỵhṖ8>Ȯ⁶]¦Qṭ|Ṛṇẹm⁵ØKƈBNɦÇȯ¢ṣḟPṇMʠ¬YėĊÇẒỊĿXJÑḷÞeȮȮɼ$ỴœeṂṠɲẓḊ⁺ċŻ⁽⁶Ẓ⁹<>#nẇṬ⁴\¤ÐṡḞF5ƙẇwḶȤYḍ¡¢~ṚⱮ-ṃƲ⁻Ṙ6ɱṬ?İẆḌỊþEØ»Ḳµe€ØẹIkḣ3)Z;€“squ“qu”$1¦
“ئµ£‘ḃ3$Xµ³Ð¡ḊFµ⁺wØ2$¿ịÇX€Fß¹Ñ?

在线尝试!

带有单个参数(所需的音节数量)的完整程序。

说明

其核心是一个66字的压缩字典字符串。如果将单词分为辅音和元音组,并且每个单词的前3个组,则它们会从问题中生成所需的开始,元音和结尾组。qusqu是例外,因为它们中有元音,所以这些是手动添加的。单词列表是使用Python脚本从Jelly词典通过算法构建的。请注意,某些字母组是重复的,但是问题是输出不能统一代表每种可能的组合。如果希望这样做,则可以使每个组唯一,而只需两个字节(Q€)。

Helper链接1:检查是否连续3个以上的元音或连续3个以上的相同字母
                | Sample input: branggag
e€Øẹ            | For each letter, is it a vowel? [0, 0, 1, 0, 0, 0, 1, 0]
    Œr          | Run-length encode [[0, 2], [1, 1], [0, 3], [1, 1], [0, 1]]
      ḢƇ        | Filter only those with true first value, popping first value [[1], [1]]
        ,       | Pair with
         Œɠ     | Run lengths of input [[[1], [1]], [1, 1, 1, 1, 2, 1, 1]
           F    | Flatten [1, 1, 1, 1, 1, 1, 2, 1, 1]
            >2  | Greater than 2 [0, 0, 0, 0, 0, 0, 0, 0, 0]
              Ẹ | Any 0
辅助链接2:三组字符串
“yŒʠ...þEØ»                          | Compressed string: shmooze gaolbird hailshot shriech waeful furze ghaut cruelness stealthier gneiss shoeshine wheelchair wring build priorship knosp spoilfive karst through coalpit teschenite schoolkid theurgic zabtieh skiamachies yirth snazzier slimnastics scripted smirch droskies strift blepharism chaulmoogra glegness scarf fratch clerk brank jarvey flourless vorpal grex nard plumb larn philter sorbo tractabilities parcel mart damp rearm back bast bag bant baba boll bad bap becap basal ban bail bare
           Ḳ                         | Split at spaces
            µ        )               | For each word: e.g. hailshot
             e€Øẹ                    |   Check whether each character is a vowel [0, 1, 1, 0, 0, 0, 1, 0]
                 I                   | Increments of this [1, 0, -1, 0, 0, 1, -1]
                  k                  |   Split word at truthy values of this [h, ai, lsh, o, t]
                   ḣ3                |   Take the first three [h, ai, lsh]
                      Z              | Transpose (so now have three lists, start consonants, vowels, end consonants)
                        €        $1¦ | For the first group
                       ; “squ“qu”    | Append squ and qu
主链接
          µ³Ð¡                     | Repeat the following the input number of times, collecting results:
“ئµ£‘                             |   18, 5, 9, 2
      ḃ3$                          |   bijective base 3: [1,2,3],[1,2],[2,3],[2]
         X                         |   Take one at random
              Ḋ                    | Remove first item (which will be the input to the link because if the way С works
               F                   | Flatten; we now have e.g. [1,2,3,2,3,1,2,3,2]. This corresponds to SC V EC V EC AC V EC V
                µ⁺    ¿            | Do everything so far once and then repeat while:
                  wØ2$             |   The output contains two twos (i.e. vowel-vowel)
                       ịÇ          | Look these up in the previous link, so we now have a group of letter groups for each position
                         X€F       | Pick a random letter group for each position
                            ß¹Ñ?   | If helper link 1 is true, retry the whole of this link again. Otherwise implicitly output

1
很好奇看到的解释,但您确定它是正确的吗?我得到gnuignaalfbi输入的输出4,但aa如果我正确理解了挑战,那将是不可能的。结合音节的部分指出“ ...,但是您不能在以元音开头的音节之前紧接以元音结尾的音节。
Kevin Cruijssen

@KevinCruijssen错过了。现在也应该满足该要求。感谢您指出
Nick Kennedy

1
很好的答案,我喜欢您用来组成所有组的字典字符串。尽管我不确定为什么Jelly的词典中包含诸如shmooze gaolbird hailshot shriech waeful furze ghaut哈哈之类的词。xD果冻的字典有多大?
凯文·克鲁伊森

1
@KevinCruijssen大。少于20个单词的20453个单词和227845个大单词。
肯尼迪

0

Python 2中522个 510字节

from random import*
import re
c=choice
S,V,E=[map(str.lower,re.findall('[A-Z][a-z]*',x))for x in'BCDFGHJKLMNPRSTVWYZBlBrChClCrDrFlFrGhGlGnGrKnPhPlPrQuScShSkSlSmSnSpStThTrWhWrSchScrShmShrSquStrThr','AeAiAoAuEaEeEiEuIaIeIoOaOeOiOoOuUeUiAEIOU','BCDFGLMNPRSTXZBtChCkCtFtGhGnLbLdLfLkLlLmLnLpLtMbMnMpNkNgNtPhPtRbRcRdRfRgRkRlRmRnRpRtRvRzShSkSpSsStZzLchLshLthRchRshRstRthSchTch']
def f(n):w=c(['',c(S)]);exec"e=c(E);w+=c(V)[-(w[-1:]in V):]+c([c(S),e,e+c([x for x in S if x[0]*2!=e])])*(n>1);n-=1;"*n;return w+c(['',e])

在线尝试!


0

Pyth,346个 335字节

McG.u+NYr9,VHSlH1smjOgs@L"eaiou"jC" ¤E̽]¢¨¦l#"5,4 17*Vd,Og"bcdfghjklmnprstvwyzblbrchclcrdrflfrghglgngrknphplprquscshskslsmsnspstthtrwhwrschscrshmshrsqustrthr"[18 29 6)Og"bcdfglmnprstxzbtchckctftghgnlbldlflklllmlnlpltmbmnmpnkngntphptrbrcrdrfrgrkrlrmrnrprtrvrzshskspssstzzlchlshlthrchrshrstrthschtch"[13 43 8)tuaGO<W!eeG^,1Z2 2Q]1

在这里在线尝试。


0

红宝石381个 379 375字节

使用凌乱的正则表达式匹配来获取辅音组。可能可以优化。

->n,w=?a..s='zzz',a=[1]{s=(1..n).map{a=[w.grep(/^([^aeiouq]|[bcfgp][lr]|s?ch|dr|gn|kn|ph|s?qu|s[ct]r?|sh[mr]?|th?r?|s[klmnp]|wh|wr|gh)$/)+(a[-1]?[p]:[]),w.grep(/^[aeiou]{,2}$/),w.grep(/^([^aeiouqhjkvwy]|[bcflnprs]t|ck|gh|gn|l[bdfk-np]|m[bnp]|nk|ng|ph|r[bcdfgk-npvz]|[lr]?[stc]h|s[kps]|zz|rst|[st]ch)$/)<<p].map(&:sample)}*''while s=~/[aeiou]{3}|(.)\1\1|aa|eo|ii|iu|u[aou]/;s}

在线尝试!

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.