Генерация произносимого бессмысленного слова


15

Ваша задача - создать бессмысленное слово, которое можно произносить с указанным количеством «слогов». Каждый раз, когда программа запускается, возможно, приводит к другому бессмысленному слову.

Pronounceability

Произносимое слово состоит из слогов, которые, в свою очередь, состоят из группы гласных, которая, возможно, зажата между двумя согласными группами. Не все звуки можно произносить во всех позициях, и поскольку это зависит от языка, мы будем использовать шаблоны, понятные для носителей английского языка.

Начальные согласные группы:

b c d f g h j k l m n p r s t v w y z bl brch cl cr dr fl f g g gl gn gr kn ph pr pr sc sh sl sl sm sn sp st th tr whr sch scr shm shr squ str thr

Группы гласных:

все в порядке, то есть, то есть, то есть, то, что вы хотите

Конечные согласные группы:

bcdfglmnprstxz bt ch ck ct ft gh gn lb ld lf lk ll lm ln lp lt mb mn mp nk ng nt n pn rt rt r r r r r r r r r r r r r r r r r r r r r r sh sh sp ss st zz lch lsh lth rch rrs rth sch tch

Объединение Слогов

Как начальная, так и конечная группы согласных являются необязательными, однако вы не можете поместить слог, заканчивающийся гласным, непосредственно перед тем, который начинается с гласного.

отказ

В интересах простоты, некоторые английские слова на самом деле не могут быть сгенерированы таким образом, такие как вакуум, ксилофон, мнемоника, птеродактиль, красивые, бла, они, вау, и большинство множественного числа.

обзор

Возможные шаблоны слогов с использованием этого ключа:

(SC) = начальный согласный; (V) = группа гласных; (EC) = согласный

Для одного слога:

  • (SC), (V), (ЕС)
  • (V), (ЕС)
  • (SC), (V),
  • (В)

С двумя слогами:

  • (SC), (V), (ЕС) (SC), (V), (ЕС)
  • (SC), (V), (ЕС) (SC), (V),
  • (SC), (V), (ЕС) (В) (ЕС)
  • (SC), (V), (ЕС) (В)

  • (SC), (V), (SC), (V), (ЕС)

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

  • (V), (ЕС) (SC), (V), (ЕС)

  • (V), (ЕС) (SC), (V),
  • (V), (ЕС) (В) (ЕС)
  • (V), (ЕС) (В)

  • (V), (SC), (V), (ЕС)

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

... и так далее

Примеры

1 слог

  • charst
  • Tigh
  • shriegn
  • EESS
  • Shue
  • оо
  • cheezz

2 слога

  • jazzcrap
  • whylprog
  • принимать пищу
  • Умба
  • ола
  • иметь
  • ангсоца
  • greespheurz
  • bleuspoo

3 слога

  • brokiompic
  • squirdshlicker
  • столица
  • opengtrass
  • двоемыслие
  • старший брат
  • phoebliaptmoo
  • skolfblauquent

4 слога

  • strawishoepick
  • patchworkzombie
  • prearneajoomie
  • slephotoschou
  • doubleplusgood

кодирование

Ввод: целое число для количества генерируемых слогов

Вывод: (возможно) бессмысленное слово, которое много слогов долго

правила

  • Требуется некоторая форма (псевдо) случайности. Все комбинации слогов должны (теоретически) генерироваться, хотя распределение не обязательно должно быть равномерным.
    • Вы можете предположить, что ваш генератор является апериодическим, так что не должно быть математически возможным генерировать каждое возможное слово (в действительности у него может не быть достаточно длительного периода), и вам не нужно предоставлять какие-либо доказательства того, что ваш генератор может, фактически, произвести любое возможное слово.
    • Ваш генератор должен действительно иметь возможность генерировать не менее 255 различных значений, поэтому вы не можете просто возвращать 4 каждый раз, когда вызывается генератор.
    • В конечном счете важно, чтобы вы каким-то образом включили все вышеупомянутые буквенные группы в свой код, чтобы каждая буквенная группа имела ненулевую вероятность выбора, а каждый шаблон слога имел ненулевую вероятность появления (если он предоставлен с истинной случайностью).
  • Вы должны поддерживать до 16 слоговых слов
  • В дополнение к правилам объединения слогов, выходное слово не должно иметь:
    • 3 последовательных гласных ( a e i o uэто может произойти для quслов)
    • 3 последовательных согласных согласных

Удачи!


Обратите внимание, что это отличается от « Произведите произносимое слово» по нескольким причинам:

  • Переменное количество слогов, заданное вводом, а не строгое требование из 10 букв.
  • Эта задача добавляет неисчерпывающие группы букв, которые должны быть (умно) закодированы, и допускает больше вариантов слогов, поэтому код нельзя просто скопировать из другой задачи.
  • Squirdshlicker. Нужно ли мне сказать больше?

Я также забыл дурачить проверку, но оказалось, что это приносит достаточно нового в таблицу, что это не имеет значения. В конце концов, существуют сотни различных вариантов.


2
«Я также забыл дурачить проверку, но оказывается, что это приносит достаточно нового к столу, что это не имеет значения». Кто-то подтвердил это? Я чувствую, что это не всегда так ...
Квинтек,

2
Проголосовал за большое количество «жестко закодированных» слов, учитывая ваши 3 длинных списка согласных и гласных
Стивен

1
Предложите добавить doubleplusgood в качестве примера, чтобы соответствовать качеству этой задачи.

1
Почему бы не "squirds c hlicker"? Должен побить «сильные стороны» последовательных согласных :)
Предназначен для

Ответы:


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 Во втором чтении задачи, я думаю, мало сомнений в том, что ваша интерпретация верна. Поэтому я обновил свой код соответственно.
Arnauld

3

05AB1E , 237 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•(преобразование базы 6 и замена с использованием встроенного для AEIOU). TIO Ссылка слишком длинная.
Волшебная Урна Осьминога

@MagicOctopusUrn Спасибо! И сохранил еще 2 байта с žM•·Áy&ŒGηΩ¼αŸKq•6вèJ. :) PS: Вы можете использовать сокращения URL, такие как tinyurl.com на PPCG, в отличие от большинства других 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 группы взяты для каждого слова, они генерируют желаемые начальную, гласную и конечную группы из вопроса. Исключение составляют quиsqu потому, что в них есть гласный звук, поэтому они добавляются вручную. Список слов был построен алгоритмически из словаря Jelly с использованием скрипта Python. Обратите внимание, что некоторые буквенные группы повторяются, но этот вопрос позволяет выходам неравномерно представлять каждую возможную комбинацию. Если бы это было предпочтительным, было бы просто сделать каждую группу уникальной за счет двух байтов ( Q€).

Вспомогательная ссылка 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 пропустил это. Теперь должен соответствовать этому требованию. Спасибо за указание
Ник Кеннеди

1
Хороший ответ, мне нравятся строки словаря, которые вы использовали для создания всех групп. Хотя я не уверен, почему словарь желе содержит такие слова, как shmooze gaolbird hailshot shriech waeful furze ghaut, ха-ха. xD Насколько велик словарь желе в любом случае?
Кевин Круйссен

1
@KevinCruijssen Large. Есть 20453 слова из менее чем 6 букв и 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}

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.