Genera una parola senza senso pronunciabile


15

Il tuo compito è generare una parola senza senso che sia ragionevolmente pronunciabile con il numero specificato di "sillabe". Ogni volta che il programma viene eseguito, si ottiene probabilmente una diversa parola senza senso.

pronunciabilità

Una parola pronunciabile è composta da sillabe, che sono a loro volta costituite da un gruppo vocale che può essere inserito tra due gruppi consonanti. Non tutti i suoni sono pronunciabili in tutte le posizioni e poiché questo dipende dalla lingua, useremo schemi comprensibili per chi parla inglese

Avvio di gruppi di consonanti:

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 squ str thr

Gruppi vocali:

ae i o u ae ai ao au eae ei eu ia cioè io oa oe of oo ou ue ui

Gruppi di consonanti finali:

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

Combinazione di sillabe

I gruppi di consonanti iniziali e finali sono facoltativi in ​​generale, tuttavia non è possibile posizionare una sillaba che termina con una vocale immediatamente prima di una che inizia con una vocale.

disconoscimento

Nell'interesse della semplicità, alcune parole inglesi non possono essere effettivamente generate in questo modo, come vuoto, xilofono, mnemonico, pterodattilo, bello, blah, loro, wow e la maggior parte dei plurali.

Panoramica

Possibili schemi di sillabe usando questo tasto:

(SC) = consonante iniziale; (V) = gruppo vocale; (CE) = consonante finale

Per una sillaba:

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

Con due sillabe:

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

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

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

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

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

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

  • (V) (SC) (V)

... e così via

Esempi

1 sillaba

  • charst
  • tigh
  • shriegn
  • EESS
  • Shue
  • oo
  • cheezz

2 sillabe

  • jazzcrap
  • whylprog
  • mangiare
  • Umba
  • ola
  • avere
  • Ingsoc
  • greespheurz
  • bleuspoo

3 sillabe

  • brokiompic
  • squirdshlicker
  • capitale
  • opengtrass
  • doublethink
  • grande Fratello
  • phoebliaptmoo
  • skolfblauquent

4 sillabe

  • strawishoepick
  • patchworkzombie
  • prearneajoomie
  • slephotoschou
  • doubleplusgood

Coding

Input: un numero intero per il numero di sillabe da generare

Output: una parola (probabilmente) senza senso che molte sillabe lunghe

Regole

  • È richiesta una qualche forma di casualità (psuedo). Tutte le combinazioni di sillabe dovrebbero essere (teoricamente) possibili da generare, sebbene la distribuzione non debba essere uniforme.
    • Puoi supporre che il tuo generatore sia aperiodico, quindi non deve essere matematicamente possibile generare ogni possibile parola (potrebbe non avere un periodo abbastanza lungo nella realtà) e non è necessario fornire alcun tipo di prova che il tuo il generatore può infatti produrre ogni possibile parola.
    • Il tuo generatore deve effettivamente essere in grado di produrre almeno 255 valori distinti, quindi non puoi semplicemente restituirne 4 ogni volta che viene chiamato il generatore.
    • Ciò che è in definitiva importante è che in qualche modo includi tutti i gruppi di lettere sopra nel tuo codice, che ogni gruppo di lettere abbia una probabilità diversa da zero e che ogni modello di sillaba ha una probabilità diversa da zero (se fornito con vera casualità).
  • Devi supportare fino a 16 parole di sillabe
  • Oltre alle regole sulla combinazione di sillabe, la parola di output non deve avere:
    • 3 vocali consecutive ( a e i o u; questo può accadere per quparole)
    • 3 consonanti corrispondenti consecutive

In bocca al lupo!


Nota che questo è diverso da Genera una parola pronunciabile per alcuni motivi:

  • Numero variabile di sillabe specificato per input piuttosto che un rigoroso requisito di 10 lettere.
  • Questa sfida aggiunge gruppi di lettere non esaustivi che devono essere (abilmente) codificati e consente più varianti di sillabe, quindi il codice non può essere semplicemente copiato dall'altra sfida
  • Squirdshlicker. Devo aggiungere altro?

Ho anche dimenticato di duplicare il controllo, ma si scopre che questo porta abbastanza nuovo sul tavolo che non importa. Dopotutto, ci sono centinaia di sfide con le nove varianti.


2
"Ho anche dimenticato di duplicare il controllo, ma si scopre che questo porta abbastanza nuovo sul tavolo che non importa." Qualcuno l'ha confermato? Sento che questo non è sempre vero ...
Quintec,

2
Sottovalutato per la grande quantità di "hardcodedness" richiesta date le tue 3 lunghe liste di consonanti e vocali
Stephen,

1
Suggerisci di aggiungere doubleplusgood come esempio, per abbinare la qualità di questa sfida.

1
Perché non "squirds c hlicker"? Devo battere "punti di forza" su consonanti consecutive :)
Punito

Risposte:


4

JavaScript (ES6),  407  403 byte

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

Provalo online!


Sei sicuro che [^aeiou]{3}sia corretto? Sulla base della parola 'matching' e dell'esempio di 3 sillabe squirdshlickercontenente rdshl, penso che OP significhi solo 3 delle stesse consonanti adiacenti (cioè bbbnon è consentito), invece di 3 consonanti adiacenti in generale.
Kevin Cruijssen,

2
@KevinCruijssen In seconda lettura della sfida, penso che ci siano pochi dubbi sul fatto che la tua interpretazione sia corretta. Quindi ho aggiornato il mio codice di conseguenza.
Arnauld,

3

05AB1E , 237 234 230 228 byte

.•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 byte grazie a @MagicOctopusUrn .

Provalo online o ottieni altri risultati .

Spiegazione:

.•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)

Vedere questo suggerimento 05AB1E mio (sezione Come stringhe di comprimere che non fanno parte del dizionario? , Come comprimere grandi numeri interi? , E come liste di interi comprimere? ) Per capire come le parti di compressione opere.


1
Inoltre žM•ô#‰¦λu¢!¡°gU€•6BS<èJè 4 più piccolo di .•!m1±P1Ÿ6ºZ dâ4∍m–G¢”ãÔ2g•(conversione base 6 e sostituzione usando incorporato per AEIOU). Collegamento TIO troppo lungo.
Magic Octopus Urn

@MagicOctopusUrn Grazie! E salvato altri 2 byte con žM•·Áy&ŒGηΩ¼αŸKq•6вèJ. :) PS: puoi utilizzare gli accorciatori di URL come tinyurl.com su PPCG, a differenza della maggior parte degli altri SE. :)
Kevin Cruijssen,

1

Gelatina , 231 byte

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ß¹Ñ?

Provalo online!

Un programma completo che accetta un singolo argomento, il numero di sillabe richieste.

Spiegazione

Il nucleo di questo è una stringa di dizionario compressa di 66 parole. Se le parole sono divise in gruppi di consonanti e vocali e i primi 3 gruppi presi per ogni parola, generano i gruppi iniziali, vocali e finali desiderati dalla domanda. Le eccezioni sono que squperché hanno una vocale in, quindi queste vengono aggiunte manualmente. L'elenco di parole è stato creato algoritmicamente dal dizionario Jelly usando uno script Python. Nota: alcuni gruppi di lettere vengono ripetuti, ma la domanda consente agli output di non rappresentare uniformemente ogni possibile combinazione. Se questo fosse preferito, sarebbe semplice rendere ogni gruppo unico al costo di due byte ( Q€).

Collegamento helper 1: controlla se più di 3 vocali di fila o più di 3 della stessa lettera di fila
                | 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
Helper link 2: i tre gruppi di stringhe
“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
Collegamento principale
          µ³Ð¡                     | 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
Curioso di vedere la spiegazione, ma sei sicuro che sia corretta? Ottengo un output gnuignaalfbiper l'input 4, ma aanon dovrebbe essere possibile se ho capito correttamente la sfida. La sezione che combina le sillabe recita " ..., tuttavia non è possibile posizionare una sillaba che termina con una vocale immediatamente prima di una che inizia con una vocale " .
Kevin Cruijssen,

@KevinCruijssen lo ha mancato. Ora dovrebbe soddisfare anche questo requisito. Grazie per averci fatto notare
Nick Kennedy il

1
Bella risposta, mi piacciono le stringhe del dizionario che hai usato per creare tutti i gruppi. Anche se non sono sicuro del perché il dizionario di Jelly contenga parole come shmooze gaolbird hailshot shriech waeful furze ghaut, haha. xD Quanto è grande il dizionario di Jelly?
Kevin Cruijssen,

1
@KevinCruijssen Large. Ci sono 20453 parole di meno di 6 lettere e 227845 parole grandi.
Nick Kennedy,

0

Python 2 , 522 510 byte

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

Provalo online!


0

Pyth, 346 335 byte

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

Provalo online qui .


0

Rubino , 381 379 375 byte

Utilizza corrispondenze regex disordinate per ottenere i gruppi di consonanti. Probabilmente potrebbe essere ottimizzato.

->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}

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.