summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--README.md3
-rw-r--r--index.html384
-rw-r--r--static/favicon.icobin0 -> 318 bytes
-rw-r--r--static/script.js240
-rw-r--r--static/styles.css5
-rw-r--r--wordlist.txt367
7 files changed, 1001 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..085876a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.ipynb_checkpoints
+node_modules
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..972604a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# Travelwords
+
+A list of words to learn when travelling.
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..d48c599
--- /dev/null
+++ b/index.html
@@ -0,0 +1,384 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Travelwords</title>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <link rel="stylesheet" type="text/css" href="/static/styles.css">
+ <link rel="stylesheet" type="text/css" href="/travelwords/static/styles.css">
+ <link rel="shortcut icon" type="image/x-icon" href="/travelwords/static/favicon.ico">
+ </head>
+ <body>
+ <div class="container">
+ <div>
+ <div class="home">
+ <a href="/travelwords" class="home-title">Travelwords</a>
+ <span> at </span><a class="site" href="/">cyfraeviolae.org</a>
+ <a class="source" href="/git/travelwords">[src]</a>
+ </div>
+ </div>
+ <p>
+ The peripatetic sorcerer Roseacrucis has teleported you to a
+ foreign land. In order to communicate, you must learn the following
+ words and phrases in the local language, allowing you to
+ communicate, though perhaps with poor grammar.
+ </p>
+ <ul>
+ <li>I</li>
+ <li>you</li>
+ <li>he</li>
+ <li>she</li>
+ <li>it</li>
+ <li>we</li>
+ <li>you all</li>
+ <li>they</li>
+ <li>be</li>
+ <li>buy</li>
+ <li>can</li>
+ <li>cannot</li>
+ <li>clean</li>
+ <li>come</li>
+ <li>could</li>
+ <li>do</li>
+ <li>drive</li>
+ <li>explain</li>
+ <li>finish</li>
+ <li>go</li>
+ <li>hear</li>
+ <li>leave</li>
+ <li>like</li>
+ <li>listen</li>
+ <li>live</li>
+ <li>love</li>
+ <li>pay</li>
+ <li>read</li>
+ <li>return</li>
+ <li>say</li>
+ <li>sell</li>
+ <li>should</li>
+ <li>sing</li>
+ <li>sit</li>
+ <li>stand</li>
+ <li>study</li>
+ <li>talk</li>
+ <li>think</li>
+ <li>try</li>
+ <li>visit</li>
+ <li>wait</li>
+ <li>walk</li>
+ <li>want</li>
+ <li>write</li>
+ <li>after</li>
+ <li>before</li>
+ <li>day after tomorrow</li>
+ <li>day before yesterday</li>
+ <li>early</li>
+ <li>good evening</li>
+ <li>good morning</li>
+ <li>good night</li>
+ <li>hour</li>
+ <li>minute</li>
+ <li>now</li>
+ <li>second</li>
+ <li>today</li>
+ <li>tomorrow</li>
+ <li>tonight</li>
+ <li>week</li>
+ <li>yesterday</li>
+ <li>Are you closed?</li>
+ <li>Are you open?</li>
+ <li>Can you do *?</li>
+ <li>Can you make *?</li>
+ <li>Do you have *?</li>
+ <li>How much does this cost?</li>
+ <li>How old are you?</li>
+ <li>I am from *</li>
+ <li>Is it permitted?</li>
+ <li>What?</li>
+ <li>What is this?</li>
+ <li>What is your name?</li>
+ <li>When?</li>
+ <li>When do you close?</li>
+ <li>When do you open?</li>
+ <li>Where?</li>
+ <li>Where are you from?</li>
+ <li>Where do you live?</li>
+ <li>Who?</li>
+ <li>Why?</li>
+ <li>amazing</li>
+ <li>angry</li>
+ <li>bad</li>
+ <li>big/large</li>
+ <li>boring</li>
+ <li>close</li>
+ <li>cold</li>
+ <li>cool</li>
+ <li>delicious</li>
+ <li>different</li>
+ <li>difficult</li>
+ <li>easy</li>
+ <li>famous</li>
+ <li>far</li>
+ <li>first</li>
+ <li>good</li>
+ <li>happy</li>
+ <li>hot</li>
+ <li>hot</li>
+ <li>late</li>
+ <li>medium</li>
+ <li>near</li>
+ <li>next</li>
+ <li>normal</li>
+ <li>okay</li>
+ <li>old</li>
+ <li>perfect</li>
+ <li>popular</li>
+ <li>previous</li>
+ <li>sad</li>
+ <li>second</li>
+ <li>similar to/like</li>
+ <li>small</li>
+ <li>strange</li>
+ <li>surprising</li>
+ <li>tired</li>
+ <li>vegetarian</li>
+ <li>very good</li>
+ <li>young</li>
+ <li>one</li>
+ <li>two</li>
+ <li>three</li>
+ <li>four</li>
+ <li>five</li>
+ <li>six</li>
+ <li>seven</li>
+ <li>eight</li>
+ <li>nine</li>
+ <li>ten</li>
+ <li>eleven</li>
+ <li>twelve</li>
+ <li>thirteen</li>
+ <li>fourteen</li>
+ <li>fifteen</li>
+ <li>sixteen</li>
+ <li>seventeen</li>
+ <li>eighteen</li>
+ <li>nineteen</li>
+ <li>twenty</li>
+ <li>twenty-one</li>
+ <li>thirty</li>
+ <li>forty</li>
+ <li>fifty</li>
+ <li>sixty</li>
+ <li>seventy</li>
+ <li>eighty</li>
+ <li>ninety</li>
+ <li>one hundred</li>
+ <li>one hundred and one</li>
+ <li>one thousand</li>
+ <li>ten thousand</li>
+ <li>actually</li>
+ <li>always</li>
+ <li>fortunately</li>
+ <li>here</li>
+ <li>most</li>
+ <li>never</li>
+ <li>often</li>
+ <li>probably</li>
+ <li>quickly</li>
+ <li>rarely</li>
+ <li>slowly</li>
+ <li>some</li>
+ <li>sometimes</li>
+ <li>there</li>
+ <li>truthfully</li>
+ <li>unfortunately</li>
+ <li>usually</li>
+ <li>down</li>
+ <li>east</li>
+ <li>left</li>
+ <li>north</li>
+ <li>right</li>
+ <li>south</li>
+ <li>straight</li>
+ <li>turn</li>
+ <li>up</li>
+ <li>west</li>
+ <li>Anything is fine</li>
+ <li>Both are fine</li>
+ <li>Don't worry about it, no problem</li>
+ <li>Excuse me</li>
+ <li>For here</li>
+ <li>Takeaway</li>
+ <li>For one (restaurant)</li>
+ <li>For two (restaurant)</li>
+ <li>Go ahead</li>
+ <li>Goodbye</li>
+ <li>Hello</li>
+ <li>Help</li>
+ <li>Here you go</li>
+ <li>I am from *</li>
+ <li>I don't understand</li>
+ <li>I don't want</li>
+ <li>I understand</li>
+ <li>I want *</li>
+ <li>I want this (at restaurant)</li>
+ <li>I want to *</li>
+ <li>I want to go to *</li>
+ <li>It doesn't matter/anything is ok</li>
+ <li>It is not permitted</li>
+ <li>It is permitted</li>
+ <li>My name is *</li>
+ <li>Nice to meet you</li>
+ <li>Please</li>
+ <li>See you later</li>
+ <li>Sorry</li>
+ <li>Thank you</li>
+ <li>That is not the case</li>
+ <li>That is the case</li>
+ <li>(nth) floor of a building</li>
+ <li>a glass of (wine, etc)</li>
+ <li>adult</li>
+ <li>airplane</li>
+ <li>airport</li>
+ <li>animal</li>
+ <li>bad weather</li>
+ <li>bags/luggage</li>
+ <li>bar</li>
+ <li>beer</li>
+ <li>bicycle</li>
+ <li>bike</li>
+ <li>bird</li>
+ <li>boy</li>
+ <li>boyfriend</li>
+ <li>breakfast</li>
+ <li>building</li>
+ <li>bus</li>
+ <li>bus station</li>
+ <li>car</li>
+ <li>cash</li>
+ <li>cat</li>
+ <li>child</li>
+ <li>city</li>
+ <li>club</li>
+ <li>coffee</li>
+ <li>company</li>
+ <li>country</li>
+ <li>credit card</li>
+ <li>dinner</li>
+ <li>dog</li>
+ <li>drink</li>
+ <li>eggs</li>
+ <li>everyone</li>
+ <li>everything</li>
+ <li>eyes</li>
+ <li>fish</li>
+ <li>food</li>
+ <li>garbage</li>
+ <li>girl</li>
+ <li>girlfriend</li>
+ <li>glass (of wine, water, etc)</li>
+ <li>glasses</li>
+ <li>good weather</li>
+ <li>hair</li>
+ <li>hand</li>
+ <li>head</li>
+ <li>hobbies</li>
+ <li>holiday</li>
+ <li>home</li>
+ <li>hometown</li>
+ <li>house</li>
+ <li>human</li>
+ <li>husband</li>
+ <li>ice</li>
+ <li>inside</li>
+ <li>keys</li>
+ <li>language</li>
+ <li>lock</li>
+ <li>lunch</li>
+ <li>man</li>
+ <li>mathematics</li>
+ <li>me</li>
+ <li>meat</li>
+ <li>menu</li>
+ <li>money</li>
+ <li>month</li>
+ <li>music</li>
+ <li>music</li>
+ <li>name</li>
+ <li>napkin</li>
+ <li>outside</li>
+ <li>phone</li>
+ <li>phone number</li>
+ <li>place</li>
+ <li>rain</li>
+ <li>rental</li>
+ <li>restaurant</li>
+ <li>rice</li>
+ <li>school</li>
+ <li>seafood</li>
+ <li>stairs</li>
+ <li>station</li>
+ <li>the check</li>
+ <li>thing</li>
+ <li>toilet</li>
+ <li>train</li>
+ <li>train station</li>
+ <li>trash</li>
+ <li>united states</li>
+ <li>wife</li>
+ <li>wine</li>
+ <li>woman</li>
+ <li>word</li>
+ <li>work</li>
+ <li>color</li>
+ <li>black</li>
+ <li>blue</li>
+ <li>green</li>
+ <li>orange</li>
+ <li>red</li>
+ <li>white</li>
+ <li>yellow</li>
+ <li>a few</li>
+ <li>all</li>
+ <li>almost</li>
+ <li>also</li>
+ <li>and</li>
+ <li>anything</li>
+ <li>at</li>
+ <li>because</li>
+ <li>both</li>
+ <li>but</li>
+ <li>enough</li>
+ <li>if</li>
+ <li>in</li>
+ <li>less</li>
+ <li>many</li>
+ <li>more</li>
+ <li>no</li>
+ <li>nothing</li>
+ <li>of</li>
+ <li>of</li>
+ <li>one of something</li>
+ <li>or</li>
+ <li>then</li>
+ <li>therefore</li>
+ <li>towards</li>
+ <li>two of something</li>
+ <li>with</li>
+ <li>without</li>
+ <li>yes</li>
+ <li>yet</li>
+ <li>(negation)</li>
+ </ul>
+ </div>
+ <script src="/travelwords/static/script.js"></script>
+ </body>
+</html>
+
+<!--
+Words
+Verbs conjugate for I/you
+Practice questions - writing sentences
+
+With audio
+-->
diff --git a/static/favicon.ico b/static/favicon.ico
new file mode 100644
index 0000000..4e0f88c
--- /dev/null
+++ b/static/favicon.ico
Binary files differ
diff --git a/static/script.js b/static/script.js
new file mode 100644
index 0000000..d8dbf77
--- /dev/null
+++ b/static/script.js
@@ -0,0 +1,240 @@
+"use strict";
+
+var ingredientsm = {}
+var allIngredients = []
+for (let recipe of allRecipes) {
+ for (let ingredient of recipe.ingredients) {
+ if (ingredient.special) {
+ continue
+ }
+ if (!ingredientsm[ingredient.ingredient]) {
+ allIngredients.push(ingredient.ingredient)
+ ingredientsm[ingredient.ingredient] = 1
+ }
+ }
+}
+allIngredients.sort()
+var ingredientsLookup = {}
+for (let [idx, ingredient] of allIngredients.entries()) {
+ ingredientsLookup[ingredient] = idx
+}
+
+var globret = undefined;
+
+window.addEventListener('load', function(evt) {
+ glpkPromise.then(function(glpk) {
+
+ const worker = new Worker('/static/glpk-worker.js')
+ worker.onerror = (err) => { console.log(err) }
+ worker.onmessage = (evt) => {
+ if (evt.data.initialized) {}
+ if (evt.data.result) {
+ hide(document.getElementById('waiting'))
+ show(document.getElementById('solution'))
+ renderSolution(glpk, evt.data, globret)
+ }
+ }
+
+ document.getElementById('optimal').addEventListener('click', function(evt) {
+ evt.preventDefault()
+ window.globret = constructILP(glpk)
+ solveILP(worker, globret)
+ })
+ })
+})
+
+
+function renderSolution(glpk, sol, ret) {
+ let ingredients = ret.ingredients
+ let recipes = JSON.parse(JSON.stringify(ret.recipes))
+ let res = []
+ let batches = []
+ let origbatch = []
+ for (let [r, recipe] of recipes.entries()) {
+ if (recipe.length == 0) {
+ origbatch.push(r)
+ }
+ }
+ for (let [varname, on] of Object.entries(sol.result.vars)) {
+ if (!on) { continue }
+ if (!varname.startsWith('y')) { continue }
+ let y = Number.parseInt(varname.split('_')[1])
+ if (res.indexOf(y) != -1) { continue }
+ res.push(y)
+ let batch = []
+ for (let [r, recipe] of recipes.entries()) {
+ if (recipe.length == 1 & recipe[0] == y) {
+ batch.push(r)
+ }
+ }
+ for (let [r, recipe] of recipes.entries()) {
+ recipes[r] = recipe.filter(it => it != y)
+ }
+ batches.push(batch)
+ }
+ let ol = document.createElement('ol')
+
+ let li = document.createElement('li')
+ li.appendChild(document.createTextNode('On-hand'))
+ if (origbatch.length) {
+ let ul = document.createElement('ul')
+ let drinks = origbatch.map(b => allRecipes[b].name).join(', ')
+ let sli = document.createElement('li')
+ sli.appendChild(document.createTextNode(drinks))
+ ul.appendChild(sli)
+ li.appendChild(ul)
+ }
+ ol.appendChild(li)
+
+ for (let [idx, y] of res.entries()) {
+ let batch = batches[idx]
+ let li = document.createElement('li')
+ li.appendChild(document.createTextNode(ingredients[y]))
+ if (batch.length) {
+ let ul = document.createElement('ul')
+ let drinks = batch.map(b => allRecipes[b].name).join(', ')
+ let sli = document.createElement('li')
+ sli.appendChild(document.createTextNode(drinks))
+ ul.appendChild(sli)
+ li.appendChild(ul)
+ }
+ ol.appendChild(li)
+ }
+ document.getElementById('solution').innerHTML = ''
+ let desc = document.createElement('p')
+ if (sol.result.status == glpk.GLP_UNDEF) {
+ desc.appendChild(document.createTextNode('Error: Failed to find feasible solution. Try increasing time limit.'))
+ } else if (sol.result.status == glpk.GLP_FEAS) {
+ desc.appendChild(document.createTextNode(`Found feasible solution of score ${-sol.result.z}.`))
+ } else if (sol.result.status == glpk.GLP_INFEAS) {
+ desc.appendChild(document.createTextNode('Error: Did not find feasible solution.'))
+ } else if (sol.result.status == glpk.GLP_NOFEAS) {
+ desc.appendChild(document.createTextNode('Error: Problem has no feasible solution.'))
+ } else if (sol.result.status == glpk.GLP_OPT) {
+ desc.appendChild(document.createTextNode(`Found optimal solution of score ${-sol.result.z}.`))
+ } else if (sol.result.status == glpk.GLP_UNBND) {
+ desc.appendChild(document.createTextNode('Error: Problem is unbounded.'))
+ }
+ document.getElementById('solution').appendChild(desc)
+ if (sol.result.status == glpk.GLP_FEAS || sol.result.status == glpk.GLP_OPT) {
+ document.getElementById('solution').appendChild(ol)
+ }
+}
+
+let hide = e => e.style.display = 'none';
+let show = e => e.style.display = 'inline-block';
+
+function solveILP(worker, ret) {
+ let seconds = Number.parseInt(document.getElementById('limit').value)
+ document.getElementById('waiting').innerHTML = seconds + ' seconds...'
+ hide(document.getElementById('solution'))
+ show(document.getElementById('waiting'))
+ let incrSeconds = () => {
+ document.getElementById('waiting').innerHTML = seconds + ' seconds...'
+ seconds--
+ }
+ setInterval(incrSeconds, 1000)
+ worker.postMessage(ret.lp)
+}
+
+function constructILP(glpk) {
+ let skip = Object.values(document.querySelector('form')).reduce((obj, field) => {
+ if (field.getAttribute('x-ingredient') && field.checked) {
+ obj[field.getAttribute('x-ingredient')] = 1
+ }
+ return obj
+ }, {})
+
+ let ingredientsset = {}
+ let recipes = []
+
+ for (let recipe of allRecipes) {
+ for (let ingredient of recipe.ingredients) {
+ if (ingredient.special) { continue }
+ if (skip[ingredientsLookup[ingredient.ingredient]]) { continue }
+ ingredientsset[ingredient.ingredient] = 1
+ }
+ }
+ let ingredients = Object.keys(ingredientsset)
+
+ for (let recipe of allRecipes) {
+ let x = []
+ for (let ingredient of recipe.ingredients) {
+ if (ingredient.special) { continue }
+ if (skip[ingredientsLookup[ingredient.ingredient]]) { continue }
+ x.push(ingredients.indexOf(ingredient.ingredient))
+ }
+ recipes.push(x)
+ }
+ let n_ingredients = ingredients.length
+
+ let makeStepR = (step, r) => `r${step}_${r}`
+ let makeStepY = (step, y) => `y${step}_${y}`
+
+ let jsonvars = []
+ for (let step = 0; step < n_ingredients; step++) {
+ for (let [r, recipe] of recipes.entries()) {
+ jsonvars.push({name: makeStepR(step, r), coef: -1})
+ }
+ }
+ let jsonobjective = {
+ direction: glpk.GLP_MIN,
+ vars: jsonvars,
+ }
+ let jsonconstraints = []
+ for (let step = 0; step < n_ingredients; step++) {
+ let vars = []
+ for (let y = 0; y < n_ingredients; y++) {
+ vars.push({name: makeStepY(step, y), coef: 1})
+ }
+ jsonconstraints.push({vars, bnds: {type: glpk.GLP_FX, lb: step+1}})
+ }
+ for (let y = 0; y < n_ingredients; y++) {
+ for (let step = 0; step < n_ingredients - 1; step++) {
+ jsonconstraints.push({
+ vars: [{name: makeStepY(step+1, y), coef: 1}, {name: makeStepY(step, y), coef: -1}],
+ bnds: {type: glpk.GLP_LO, lb: 0}
+ })
+ }
+ }
+ for (let [r, recipe] of recipes.entries()) {
+ for (let step = 0; step < n_ingredients; step++) {
+ let total = []
+ for (let y of recipe) {
+ total.push({name: makeStepY(step, y), coef: -1})
+ }
+ total.push({name: makeStepR(step, r), coef: 1})
+ jsonconstraints.push({
+ vars: total,
+ bnds: {type: glpk.GLP_LO, lb: (-recipe.length + 1)}
+ })
+ for (let y of recipe) {
+ jsonconstraints.push({
+ vars: [{name: makeStepR(step, r), coef: 1}, {name: makeStepY(step, y), coef: -1}],
+ bnds: {type: glpk.GLP_UP, ub: 0}
+ })
+ }
+ }
+ }
+ let binaries = []
+ for (let y = 0; y < n_ingredients; y++) {
+ for (let step = 0; step < n_ingredients; step++) {
+ binaries.push(makeStepY(step, y))
+ }
+ }
+ for (let r = 0; r < recipes.length; r++) {
+ for (let step = 0; step < n_ingredients; step++) {
+ binaries.push(makeStepR(step, r))
+ }
+ }
+ let lp = {
+ objective: jsonobjective,
+ subjectTo: jsonconstraints,
+ binaries,
+ options: {
+ msglev: 3,
+ tmlim: Number.parseInt(document.getElementById('limit').value),
+ }
+ }
+ return {ingredients, lp, recipes}
+}
diff --git a/static/styles.css b/static/styles.css
new file mode 100644
index 0000000..4442223
--- /dev/null
+++ b/static/styles.css
@@ -0,0 +1,5 @@
+.ingredient {
+ display: inline-block;
+ margin-right: 5px;
+ margin-bottom: 5px;
+}
diff --git a/wordlist.txt b/wordlist.txt
new file mode 100644
index 0000000..b3f8a19
--- /dev/null
+++ b/wordlist.txt
@@ -0,0 +1,367 @@
+<li>Pronouns<li>
+<li>I<li>
+<li>you<li>
+<li>he<li>
+<li>she<li>
+<li>it<li>
+<li>we<li>
+<li>you all<li>
+<li>they<li>
+<li><li>
+<li>Verbs (conjugated for I and you)<li>
+<li>be<li>
+<li>buy<li>
+<li>can<li>
+<li>cannot<li>
+<li>clean<li>
+<li>come<li>
+<li>could<li>
+<li>do<li>
+<li>drive<li>
+<li>explain<li>
+<li>finish<li>
+<li>go<li>
+<li>hear<li>
+<li>leave<li>
+<li>like<li>
+<li>listen<li>
+<li>live<li>
+<li>love<li>
+<li>pay<li>
+<li>read<li>
+<li>return<li>
+<li>say<li>
+<li>sell<li>
+<li>should<li>
+<li>sing<li>
+<li>sit<li>
+<li>stand<li>
+<li>study<li>
+<li>talk<li>
+<li>think<li>
+<li>try<li>
+<li>visit<li>
+<li>wait<li>
+<li>walk<li>
+<li>want<li>
+<li>write<li>
+<li><li>
+<li>Time<li>
+<li>after<li>
+<li>before<li>
+<li>day after tmw<li>
+<li>day before yesterday<li>
+<li>early<li>
+<li>good evening<li>
+<li>good morning<li>
+<li>good night<li>
+<li>hour<li>
+<li>minute<li>
+<li>now<li>
+<li>second<li>
+<li>today<li>
+<li>tomorrow<li>
+<li>tonight<li>
+<li>week<li>
+<li>yesterday<li>
+<li><li>
+<li>Questions<li>
+<li>are you closed<li>
+<li>are you open<li>
+<li>can you do<li>
+<li>can you make<li>
+<li>do you have x<li>
+<li>how much<li>
+<li>how old are you<li>
+<li>i am from __<li>
+<li>is it permitted<li>
+<li>what<li>
+<li>what is this<li>
+<li>what is your name<li>
+<li>when<li>
+<li>when do you close<li>
+<li>when do you open<li>
+<li>where<li>
+<li>where are you from<li>
+<li>where do you live<li>
+<li>who<li>
+<li>why<li>
+<li><li>
+<li>Adjectives<li>
+<li>amazing<li>
+<li>angry<li>
+<li>bad<li>
+<li>big/large<li>
+<li>boring<li>
+<li>close<li>
+<li>cold<li>
+<li>cool<li>
+<li>delicious<li>
+<li>different<li>
+<li>difficult<li>
+<li>easy<li>
+<li>famous<li>
+<li>far<li>
+<li>first<li>
+<li>good<li>
+<li>happy<li>
+<li>hot<li>
+<li>hot<li>
+<li>late<li>
+<li>medium<li>
+<li>near<li>
+<li>next<li>
+<li>normal<li>
+<li>okay<li>
+<li>old<li>
+<li>perfect<li>
+<li>popular<li>
+<li>previous<li>
+<li>sad<li>
+<li>second<li>
+<li>similar to/like<li>
+<li>small<li>
+<li>strange<li>
+<li>surprising<li>
+<li>tired<li>
+<li>vegetarian<li>
+<li>very good<li>
+<li>young<li>
+<li><li>
+<li>Numbers<li>
+<li>one<li>
+<li>two<li>
+<li>three<li>
+<li>four<li>
+<li>five<li>
+<li>six<li>
+<li>seven<li>
+<li>eight<li>
+<li>nine<li>
+<li>ten<li>
+<li>eleven<li>
+<li>twelve<li>
+<li>thirteen<li>
+<li>fourteen<li>
+<li>fifteen<li>
+<li>sixteen<li>
+<li>seventeen<li>
+<li>eighteen<li>
+<li>nineteen<li>
+<li>twenty<li>
+<li>twenty-one<li>
+<li>thirty<li>
+<li>forty<li>
+<li>fifty<li>
+<li>sixty<li>
+<li>seventy<li>
+<li>eighty<li>
+<li>ninety<li>
+<li>one hundred<li>
+<li>one hundred and one<li>
+<li>one thousand<li>
+<li>ten thousand<li>
+<li><li>
+<li>Adverbs<li>
+<li>actually<li>
+<li>always<li>
+<li>fortunately<li>
+<li>here<li>
+<li>most<li>
+<li>never<li>
+<li>often<li>
+<li>probably<li>
+<li>quickly<li>
+<li>rarely<li>
+<li>slowly<li>
+<li>some<li>
+<li>sometimes<li>
+<li>there<li>
+<li>truthfully<li>
+<li>unfortunately<li>
+<li>usually<li>
+<li><li>
+<li>Directions<li>
+<li>down<li>
+<li>east<li>
+<li>left<li>
+<li>north<li>
+<li>right<li>
+<li>south<li>
+<li>straight<li>
+<li>turn<li>
+<li>up<li>
+<li>west<li>
+<li><li>
+<li>Phrases<li>
+<li>anything is fine<li>
+<li>both are fine<li>
+<li>don't worry about it, no problem<li>
+<li>excuse me<li>
+<li>for here<li>
+<li>for one (restaurant)<li>
+<li>for two<li>
+<li>go ahead<li>
+<li>goodbye<li>
+<li>hello<li>
+<li>help<li>
+<li>here you go<li>
+<li>i am from<li>
+<li>i don't understand<li>
+<li>i don't want<li>
+<li>i understand<li>
+<li>i want<li>
+<li>i want this (at restaurant)<li>
+<li>i want to<li>
+<li>i want to go<li>
+<li>it doesn't matter/anything is ok<li>
+<li>it is not permitted<li>
+<li>it is permitted<li>
+<li>my name is<li>
+<li>nice to meet you<li>
+<li>please<li>
+<li>see you later<li>
+<li>sorry<li>
+<li>takeaway<li>
+<li>thank you<li>
+<li>that is not the case<li>
+<li>that is the case<li>
+<li><li>
+<li>Nouns<li>
+<li>(nth) floor of a building<li>
+<li>a glass of (wine, etc)<li>
+<li>adult<li>
+<li>airplane<li>
+<li>airport<li>
+<li>animal<li>
+<li>bad weather<li>
+<li>bags/luggage<li>
+<li>bar<li>
+<li>beer<li>
+<li>bicycle<li>
+<li>bike<li>
+<li>bird<li>
+<li>boy<li>
+<li>boyfriend<li>
+<li>breakfast<li>
+<li>building<li>
+<li>bus<li>
+<li>bus station<li>
+<li>car<li>
+<li>cash<li>
+<li>cat<li>
+<li>child<li>
+<li>city<li>
+<li>club<li>
+<li>coffee<li>
+<li>company<li>
+<li>country<li>
+<li>credit card<li>
+<li>dinner<li>
+<li>dog<li>
+<li>drink<li>
+<li>eggs<li>
+<li>everyone<li>
+<li>everything<li>
+<li>eyes<li>
+<li>fish<li>
+<li>food<li>
+<li>garbage<li>
+<li>girl<li>
+<li>girlfriend<li>
+<li>glass (of wine, water, etc)<li>
+<li>glasses<li>
+<li>good weather<li>
+<li>hair<li>
+<li>hand<li>
+<li>head<li>
+<li>hobbies<li>
+<li>holiday<li>
+<li>home<li>
+<li>hometown<li>
+<li>house<li>
+<li>human<li>
+<li>husband<li>
+<li>ice<li>
+<li>inside<li>
+<li>keys<li>
+<li>language<li>
+<li>lock<li>
+<li>lunch<li>
+<li>man<li>
+<li>mathematics<li>
+<li>me<li>
+<li>meat<li>
+<li>menu<li>
+<li>money<li>
+<li>month<li>
+<li>music<li>
+<li>music<li>
+<li>name<li>
+<li>napkin<li>
+<li>outside<li>
+<li>phone<li>
+<li>phone number<li>
+<li>place<li>
+<li>rain<li>
+<li>rental<li>
+<li>restaurant<li>
+<li>rice<li>
+<li>school<li>
+<li>seafood<li>
+<li>stairs<li>
+<li>station<li>
+<li>the check<li>
+<li>thing<li>
+<li>toilet<li>
+<li>train<li>
+<li>train station<li>
+<li>trash<li>
+<li>united states<li>
+<li>wife<li>
+<li>wine<li>
+<li>woman<li>
+<li>word<li>
+<li>work<li>
+<li><li>
+<li>colors<li>
+<li>black<li>
+<li>blue<li>
+<li>green<li>
+<li>orange<li>
+<li>red<li>
+<li>white<li>
+<li>yellow<li>
+<li><li>
+<li>utility words<li>
+<li>a few<li>
+<li>all<li>
+<li>almost<li>
+<li>also<li>
+<li>and<li>
+<li>anything<li>
+<li>at<li>
+<li>because<li>
+<li>both<li>
+<li>but<li>
+<li>enough<li>
+<li>if<li>
+<li>in<li>
+<li>less<li>
+<li>many<li>
+<li>more<li>
+<li>no<li>
+<li>nothing<li>
+<li>of<li>
+<li>of<li>
+<li>one of something<li>
+<li>or<li>
+<li>then<li>
+<li>therefore<li>
+<li>towards<li>
+<li>two of something<li>
+<li>with<li>
+<li>without<li>
+<li>yes<li>
+<li>yet<li>
+<li>(negation)<li>