Створіть словосполучувальне нісенітниця Word


15

Ваше завдання - генерувати дурницьке слово, яке можна вимовляти з вказаною кількістю "складів". Кожен раз, коли програма запускається, можливо, виникає інше дурницьке слово.

Вимовність

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

Запуск приголосних груп:

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

Групи голосних:

a e i o u ae ai ao au ea ee ei eu ia ie io oa oe oi oo oo ou ue ui

Закінчення груп приголосних:

bcdfglmnprstxz bt ch ck ct ft gh gn lb ld lf lk lll lm ln lp lt mb mn mp nk ng nt ph pt rb rc rc rd rf rg rk rl rm rn rt rv rz sh sk ss st zz lch lsh rst rth sch tch

Поєднання складів

І початкові, і закінчуючі групи приголосних взагалі необов’язкові, проте ви не можете розміщувати склад, що закінчується голосним, безпосередньо перед початком голосного.

Відмова від відповідальності

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

Огляд

Можливі шаблони складів за допомогою цієї клавіші:

(SC) = вихідний приголосний; (V) = група голосних; (ЕС) = закінчення приголосного

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

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

З двома складами:

  • (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 склад

  • цілісний
  • туго
  • кричущий
  • eess
  • shue
  • оо
  • сир

2 склади

  • джазкрап
  • вил
  • їдять
  • umba
  • ола
  • мати
  • ingsoc
  • greespheurz
  • блешня

3 склади

  • brokiompic
  • білочка
  • капітал
  • opengtrass
  • подвійне розмірковування
  • великий брат
  • фоебліаптму
  • skolfblauquent

4 склади

  • соломинок
  • печворкзомбі
  • prearneajoomie
  • slephotoschou
  • подвійний товар

Кодування

Введення: ціле число для кількості генеруються складів

Вихід: слово (мабуть) нісенітниця, яке довгі багато складів

Правила

  • Потрібна певна форма (псуедо) випадковості. Усі комбінації складів повинні бути (теоретично) можливими для створення, хоча розподіл не повинно бути рівномірним.
    • Ви можете припустити, що ваш генератор є аперіодичним, тому він не повинен бути математично можливим для створення кожного можливого слова (можливо, у реальності не буде достатньо тривалого періоду), і вам не потрібно надавати будь-які докази того, що ваш Фактично генератор може створити кожне можливе слово.
    • Насправді ваш генератор повинен мати можливість створювати щонайменше 255 різних значень, тому ви не можете просто повернути 4 щоразу, коли генератор викликається.
    • Що в кінцевому рахунку важливо, це те, що ви якось включаєте всі вищезгадані групи букв у свій код, що кожна група букв має ненульову ймовірність вибору, а кожна складова шаблону має ненульову ймовірність виникнення (якщо вона забезпечена справжньою випадковістю).
  • Ви повинні підтримувати до 16 складних слів
  • Окрім правил щодо поєднання складів, вихідне слово не повинно містити:
    • 3 послідовні голосні ( a e i o u; це може трапитися і для quслів)
    • 3 послідовних збігу приголосних

Удачі!


Зауважте, що це відмінне від слова " Створення вимовляючого слова" з кількох причин:

  • Змінна кількість складів, зазначених введенням, а не суворою вимогою в 10 літер.
  • Цей виклик додає невичерпні групи листів, які повинні бути (розумно) закодовані та дозволяють отримати більше варіантів складів, тому код не може бути скопійований з іншого виклику
  • Вишкрібання. Потрібно сказати більше?

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


2
"Я також забув перевірити, але це виявляється, це приносить достатньо нового для таблиці, що це не має значення". Хтось це підтвердив? Я відчуваю, що це не завжди правда ...
Квінтек

2
Захищений за велику кількість «твердої кодовості», необхідної з огляду на три довгі списки приголосних і голосних
Stephen

1
Запропонуйте додати Doubleplusgood як приклад, щоб відповідати якості цього завдання.

1
Чому б не "бігати з клікером"? Треба бити "сильних" за послідовними приголосними :)
Перпендикуляр

Відповіді:


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}це правильно? На основі слова "відповідність" та прикладу, squirdshlickerщо містить 3 склади rdshl, я думаю, що ОП означає лише 3 таких самих суміжних приголосних (тобто bbbне дозволено), а не 3 сусідніх приголосних взагалі.
Кевін Крейссен

2
@KevinCruijssen Після другого читання виклику, я думаю, мало сумнівів у правильності вашого тлумачення. Тому я відповідно оновив свій код.
Арнольд

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це не повинно бути можливим, якщо я правильно зрозумів виклик. У розділі, що поєднує склади, вказується " ..., проте ви не можете розміщувати склад, що закінчується голосним, безпосередньо перед початком голосного ".
Кевін Круїйсен

@KevinCruijssen це пропустив. Тепер має відповідати і цій вимозі. Дякуємо, що
Нік Кеннеді,

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

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.