Skip to content

Instantly share code, notes, and snippets.

@rendall
Created July 28, 2023 09:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rendall/e7e2e0316bf737dbb4068b12163a64c8 to your computer and use it in GitHub Desktop.
Save rendall/e7e2e0316bf737dbb4068b12163a64c8 to your computer and use it in GitHub Desktop.
Randomly Generated Finnish Sentence - Satunnaisesti Generoitu Suomalainen Lause
export const chooseRandomElement = <T>(array: T[]) => array[Math.floor(Math.random() * array.length)]
export const generateRandomFinnishSentence = () => {
type Subject = "minä" | "sinä" | "hän" | "me" | "te" | "he"
const verbAssociationTuples: [string, string[]][] = [
[
"aloittaa",
["opinnot", "projektin", "työt", "harjoituksen", "kokouksen", "urheiluharrastuksen"],
],
["ampua", ["maalitauluun", "riistaa", "maaliin",
"jousella",
"haulikolla",
"ilmaan",
"pistoolilla",
"sotaharjoituksissa",
"metsästyksessä",
"varoituslaukauksen",
"savukranaatteja",
"nuolia",
]],
["antaa", ["lahjan", "neuvon", "vastauksen", "kommentin", "suosituksen"]],
[
"harjoittaa",
["urheilua", "kuntoilua", "meditaatiota", "ammattia", "harrastusta"],
],
["järjestää", ["tapahtuman", "kokouksen", "juhlan", "matkan", "projektin"]],
["kehittää", ["taitoja", "tuotteen", "palvelun", "ohjelman", "projektin"]],
[
"kertoa",
["tarinan", "totuuden", "uutisen", "salaisuuden", "mielipiteen"],
],
[
"kieltää",
["väitteet", "osallistumisen", "puheen", "totuuden", "tunkeutumisen"],
],
["kiertää", ["kaupunkia", "museota", "kirkkoa", "näyttelyä", "järveä"]],
["kiinnittää", ["huomiota", "kuvan", "merkin", "julisteen", "naulan"]],
[
"korostaa",
["mielipidettä", "tärkeyttä", "asiaa", "yksityiskohtaa", "vaikutusta"],
],
[
"kutsua",
["ystävän", "vieraan", "työhaastatteluun", "juhliin", "kokoukseen"],
],
["kysyä", ["neuvoa", "ohjeita", "tietoa", "apua", "lupaa"]],
["käyttää", ["työkalua", "ohjelmaa", "laitteita", "metodia", "resurssia"]],
["lopettaa", ["työt", "opiskelun", "harrastuksen", "projektin", "suhteen"]],
["lukea", ["kirjaa", "lehteä", "uutisia", "runoa", "tutkimusta"]],
[
"lähettää",
["viestin", "paketin", "kirjeen", "sähköpostin", "hakemuksen"],
],
[
"mainostaa",
["tuotetta", "palvelua", "tapahtumaa", "kampanjaa", "yritystä"],
],
[
"muistaa",
["nimen", "osoitteen", "tapauksen", "yksityiskohdat", "päivämäärän"],
],
[
"muodostaa",
["ryhmän", "sopimuksen", "suunnitelman", "päätöksen"],
],
["nukkua", ["sängyssä", "teltassa", "sohvalla", "aamulla", "iltapäivällä"]],
["ohittaa", ["auton",
"vastustajan",
"esteen",
"rajoituksen",
"pysäkin",
"rajapyykin",
"kaupungin",
"jonon",
"kilpailijat",
"odotukset",]],
["piirtää", ["kuvan", "kartan", "muotokuvan", "diagrammin", "luonnoksen"]],
[
"puhua",
["kieltä", "totuutta", "mielipidettä", "politiikkaa", "tunteista"],
],
[
"purkaa",
[
"ajatuksiaan",
"esteen",
"jännityksen",
"koneen",
"laatikon",
"leirin",
"rakennuksen",
"sopimuksen",
"tavaran",
],
],
["pyytää", ["apua", "anteeksi", "lupaa", "neuvoa", "lainaa"]],
["rahoittaa", ["projektin", "opinnot", "hankinnan", "yrityksen", "matkan"]],
["soittaa", ["pianoa", "kitaraa", "viulua", "rummuja", "harmonikkaa"]],
[
"sopia",
[
"kokouksesta",
"tapaamisesta",
"kaupasta",
"sopimuksesta",
"yhteistyöstä",
],
],
["sulkea", ["oven", "ikkunan", "kirjan", "laatikon", "säiliön"]],
["särkeä", ["lasin", "peilin", "ikkunan", "astian", "säännön", "hiljaisuuden", "sopimuksen"]],
["tappaa", ["aikaa", "bakteereita", "tuholaisia", "viruksen", "hyönteisiä", "rikkakasveja", "unelmia"]],
["tarkastaa", ["asiakirjat", "tiedot", "sähköpostin", "auton", "talon", "koneen", "rakennusprojektin", "laitteet", "turvatoimenpiteet", "tuotantolinjan", "ajoneuvon", "työmaan", "varaston", "lentokoneen", ]],
[
"tietää",
["totuuden", "vastauksen", "ratkaisun", "menetelmän", "säännöt"],
],
[
"tinkiä",
["hinnasta", "palkasta", "korvauksesta", "maksusta", "vuokrasta"],
],
["tuottaa", ["tavaran", "palvelun", "elokuvan", "musiikin", "sisällön"]],
[
"unohtaa",
["avaimet", "lompakon", "puhelimen", "tapaamisen", "syntymäpäivän"],
],
[
"uskoa",
["Jumalaan", "unelmiin", "tulevaisuuteen", "ystävään"],
],
[
"valmistaa",
["ruokaa", "raportin", "taideteoksen", "projektin", "juhlan"],
],
["valvoa", ["työtä", "lapsia", "projektia", "koetta", "ylläpidon"]],
]
const conjugateFinnishType1Verb = (
subject: Subject,
verb: string
): string => {
const stem = verb.slice(0, -1) // remove the last character
const degrade = (stem: string) => {
if (stem.match(/kk.$/)) return stem.replace(/kk(.)$/, "k$1")
if (stem.match(/pp.$/)) return stem.replace(/pp(.)$/, "p$1")
if (stem.match(/tt.$/)) return stem.replace(/tt(.)$/, "t$1")
if (stem.match(/nt.$/)) return stem.replace(/nt(.)$/, "nn$1")
if (stem.match(/nk.$/)) return stem.replace(/nk(.)$/, "ng$1")
if (stem.match(/mp.$/)) return stem.replace(/mp(.)$/, "mm$1")
if (stem.match(/lt.$/)) return stem.replace(/lt(.)$/, "ll$1")
if (stem.match(/rt.$/)) return stem.replace(/rt(.)$/, "rr$1")
if (stem.match(/tietä$/)) return stem.replace(/tietä$/, "tiedä")
if (stem.match(/luke$/)) return stem.replace(/luke$/, "lue")
if (stem.match(/p.$/)) return stem.replace(/p(.)$/, "v$1")
if (stem.match(/lke$/)) return stem.replace(/lke$/, "lje")
if (stem.match(/rke$/)) return stem.replace(/rke$/, "rje")
return stem
}
switch (subject) {
case "minä":
return degrade(stem) + "n"
case "sinä":
return degrade(stem) + "t"
case "hän":
return stem + stem.slice(-1) // replace last vowel with second to last
case "me":
return degrade(stem) + "mme"
case "te":
return degrade(stem) + "tte"
case "he":
return stem + (verb.match(/[aou]/) ? "vat" : "vät")
default:
throw `Unexpected subject '${subject}'`
}
}
const [infinitive, assocations] = chooseRandomElement(verbAssociationTuples)
const directObject = chooseRandomElement(assocations)
const subject = chooseRandomElement<Subject>([
"minä",
"sinä",
"hän",
"me",
"te",
"he",
])
const verb = conjugateFinnishType1Verb(subject, infinitive)
return `${capitalize(subject)} ${verb} ${directObject}.`
}
/* Output:
He järjestävät projektin.
Minä purkan rakennuksen.
Sinä tuotat palvelun.
Te järjestätte kokouksen.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment