Hasilkan Kata Omong kosong yang dapat diucapkan

15

Tugas Anda adalah menghasilkan kata yang tidak masuk akal yang dapat diucapkan dengan cukup dengan jumlah 'suku kata'. Setiap kali program dijalankan mungkin menghasilkan kata omong kosong yang berbeda.

Kemampuan mengucapkan

Kata yang dapat diucapkan terdiri dari suku kata, yang pada gilirannya terdiri dari kelompok vokal yang mungkin terjepit di antara dua kelompok konsonan. Tidak semua suara dapat diucapkan di semua posisi, dan karena ini tergantung pada bahasa, kami akan menggunakan pola yang dapat dimengerti oleh penutur bahasa Inggris

Memulai grup konsonan:

b c d f g hj 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 ssrm sst jd sst tk jd b jt b j t t t t t t t t t t t t t t t

Grup Vokal:

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

Kelompok Konsonan Berakhir:

bcdfglmnprstxz bt ch ck ct ft gh gn lb ld lk 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 rsh rt sch tch

Menggabungkan Suku kata

Baik grup konsonan awal dan akhir adalah opsional pada umumnya, namun Anda tidak dapat menempatkan suku kata yang diakhiri dengan vokal tepat sebelum yang dimulai dengan vokal.

Penolakan

Demi kesederhanaan, kata-kata bahasa Inggris tertentu sebenarnya tidak dapat dihasilkan dengan cara ini, seperti ruang hampa udara, gambang, mnemonik, pterodactyl, cantik, bla, kata, wow, dan sebagian besar bentuk jamak.

Gambaran

Kemungkinan pola suku kata menggunakan kunci ini:

(SC) = konsonan awal; (V) = grup vokal; (EC) = akhir konsonan

Untuk satu suku kata:

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

Dengan dua suku kata:

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

... dan seterusnya

Contohnya

1 suku kata

  • charst
  • tigh
  • shriegn
  • eess
  • shue
  • oo
  • cheezz

2 suku kata

  • Jazzcrap
  • whylprog
  • memakan
  • umba
  • ola
  • memiliki
  • ingsoc
  • greespheurz
  • bleuspoo

3 suku kata

  • brokiompic
  • squirdshlicker
  • modal
  • opengtrass
  • keraguan
  • kakak laki-laki
  • phoebliaptmoo
  • kurang ajar

4 suku kata

  • strawishoepick
  • tambal sulam
  • prearneajoomie
  • slephotoschou
  • dua kali lipatbaik

Coding

Input: integer untuk menghasilkan jumlah suku kata

Keluaran: kata (mungkin) omong kosong yang panjang kata banyak

Aturan

  • Diperlukan beberapa bentuk keacakan (psuedo). Semua kombinasi suku kata harus (secara teoritis) dimungkinkan untuk dihasilkan, meskipun distribusinya tidak harus seragam.
    • Anda dapat mengasumsikan bahwa generator Anda adalah aperiodik, sehingga tidak harus secara matematis memungkinkan untuk menghasilkan setiap kata yang mungkin (Mungkin tidak memiliki periode yang cukup lama dalam kenyataan) dan Anda tidak perlu memberikan bukti apa pun bahwa Anda Generator dapat, pada kenyataannya, menghasilkan setiap kata yang mungkin.
    • Generator Anda harus benar-benar dapat menghasilkan setidaknya 255 nilai berbeda, sehingga Anda tidak bisa hanya mengembalikan 4 setiap kali generator dipanggil.
    • Apa yang akhirnya penting adalah bahwa Anda entah bagaimana memasukkan semua grup surat di atas ke dalam kode Anda, bahwa setiap grup surat memiliki probabilitas bukan nol untuk dipilih, dan setiap pola suku kata memiliki probabilitas tidak nol untuk terjadi (jika disediakan dengan keacakan yang benar).
  • Anda harus mendukung hingga 16 kata suku kata
  • Selain aturan tentang menggabungkan suku kata, kata output tidak boleh memiliki:
    • 3 vokal berturut-turut ( a e i o u; ini bisa terjadi untuk qukata - kata)
    • 3 konsonan yang cocok berturut-turut

Semoga berhasil!


Perhatikan bahwa ini berbeda dari Menghasilkan kata yang dapat diucapkan karena beberapa alasan:

  • Jumlah variabel suku kata yang ditentukan oleh input daripada persyaratan 10 huruf yang ketat.
  • Tantangan ini menambahkan grup surat yang tidak lengkap yang harus (secara cerdik) dikodekan dan memungkinkan lebih banyak varian suku kata, sehingga kode tidak bisa hanya disalin dari tantangan lain
  • Squirdshlicker. Perlu saya katakan lebih?

Saya juga lupa untuk menipu cek, tetapi ternyata ini membawa cukup baru ke meja yang tidak masalah. Bagaimanapun, ada ratusan tantangan varian quine.

Beefster
sumber
2
"Aku juga lupa menipu cek, tetapi ternyata ini membawa cukup baru ke meja sehingga tidak masalah." Apakah ada yang mengkonfirmasi ini? Saya merasa seperti ini tidak selalu benar ...
Quintec
2
Diturunkan untuk sejumlah besar "hardcodedness" yang diperlukan karena 3 daftar panjang konsonan dan vokal Anda
Stephen
1
Sarankan menambahkan doubleplusgood sebagai contoh, agar sesuai dengan kualitas tantangan ini.
1
Mengapa tidak "menyemprotkan c hlicker"? Harus mengalahkan "kekuatan" pada konsonan berturut-turut :)
Punintended

Jawaban:

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

Cobalah online!

Arnauld
sumber
Apakah Anda yakin [^aeiou]{3}itu benar? Berdasarkan kata 'matching' dan contoh 3-suku kata yang squirdshlickerberisi rdshl, saya pikir OP hanya berarti 3 dari konsonan berdekatan yang sama (yaitu bbbtidak diperbolehkan), bukan 3 konsonan yang berdekatan secara umum.
Kevin Cruijssen
2
@KevinCruijssen Pada pembacaan kedua tantangan, saya pikir ada sedikit keraguan bahwa interpretasi Anda benar. Jadi saya telah memperbarui kode saya sesuai.
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 terima kasih kepada @MagicOctopusUrn .

Cobalah secara online atau dapatkan beberapa keluaran lagi .

Penjelasan:

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

Lihat ini ujung 05AB1E saya (bagian Cara string kompres bukan bagian dari kamus? , Cara kompres bilangan bulat besar? , Dan Cara daftar bilangan bulat kompres? ) Untuk memahami bagaimana bagian-bagian kompresi karya.

Kevin Cruijssen
sumber
1
Juga žM•ô#‰¦λu¢!¡°gU€•6BS<èJlebih kecil dari 4 .•!m1±P1Ÿ6ºZ dâ4∍m–G¢”ãÔ2g•(konversi dan penggantian basis 6 menggunakan built-in untuk AEIOU). TIO Link terlalu panjang.
Magic Octopus Mm
@MagicOctopusUrn Terima kasih! Dan menyimpan 2 byte lebih banyak dengan žM•·Áy&ŒGηΩ¼αŸKq•6вèJ. :) PS: Anda dapat menggunakan shortener url seperti tinyurl.com di PPCG, tidak seperti kebanyakan SE lainnya. :)
Kevin Cruijssen
1

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

Cobalah online!

Program lengkap yang mengambil argumen tunggal, jumlah suku kata yang diperlukan.

Penjelasan

Inti dari ini adalah string kamus terkompresi 66 kata. Jika kata-kata dibagi menjadi kelompok-kelompok konsonan dan vokal dan 3 kelompok pertama yang diambil untuk setiap kata, mereka menghasilkan awal, vokal dan kelompok akhir yang diinginkan dari pertanyaan. Pengecualiannya adalah qudan squkarena mereka memiliki vokal, jadi ini ditambahkan secara manual. Daftar kata dibangun secara algoritmik dari kamus Jelly menggunakan skrip Python. Perhatikan beberapa grup surat diulangi, tetapi pertanyaannya memungkinkan output untuk tidak secara seragam mewakili setiap kombinasi yang memungkinkan. Jika ini lebih disukai, akan mudah untuk membuat masing-masing kelompok unik dengan biaya dua byte ( Q€).

Tautan bantuan 1: periksa apakah lebih dari 3 vokal berturut-turut atau lebih dari 3 huruf yang sama dalam satu baris
                | 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: Tiga kelompok string
“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
Tautan utama
          µ³Ð¡                     | 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
Nick Kennedy
sumber
1
Penasaran ingin melihat penjelasannya, tetapi apakah Anda yakin itu benar? Saya mendapatkan output gnuignaalfbiuntuk input 4, tetapi aaseharusnya tidak mungkin jika saya memahami tantangan dengan benar. Bagian yang menggabungkan suku kata menyatakan " ..., namun Anda tidak dapat menempatkan suku kata yang diakhiri dengan vokal tepat sebelum yang dimulai dengan vokal. "
Kevin Cruijssen
@KevinCruijssen melewatkan itu. Seharusnya sekarang memenuhi persyaratan itu juga. Terima kasih telah menunjukkan
Nick Kennedy
1
Jawaban yang bagus, saya suka string kamus yang Anda gunakan untuk membuat semua grup. Meskipun saya tidak yakin mengapa kamus Jelly berisi kata-kata seperti shmooze gaolbird hailshot shriech waeful furze ghaut, haha. xD Seberapa besar sih kamus Jelly?
Kevin Cruijssen
1
@KevinCruijssen Besar. Ada 20453 kata kurang dari 6 huruf dan 227845 kata besar.
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])

Cobalah online!

TFeld
sumber
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

Cobalah online di sini .

Sok
sumber
0

Ruby , 381 379 375 byte

Menggunakan pertandingan regex yang berantakan untuk mendapatkan kelompok konsonan. Mungkin bisa dioptimalkan.

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

Cobalah online!

Nilai Tinta
sumber