Renumbered day 9 to day 8
[ou-summer-of-code-2017.git] / 08-word-chains / build-word-lists.ipynb
diff --git a/08-word-chains/build-word-lists.ipynb b/08-word-chains/build-word-lists.ipynb
new file mode 100644 (file)
index 0000000..d12df78
--- /dev/null
@@ -0,0 +1,201 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "import unicodedata\n",
+    "import string"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "unaccent_specials = ''.maketrans({\"’\": \"'\", '“': '\"', '”': '\"'})"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def unaccent(text):\n",
+    "    translated_text = text.translate(unaccent_specials)\n",
+    "    return unicodedata.normalize('NFKD', translated_text).\\\n",
+    "        encode('ascii', 'ignore').\\\n",
+    "        decode('utf-8')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def only_lower(text):\n",
+    "    return all((c in string.ascii_lowercase) for c in text)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "/usr/share/dict/british-english\n",
+      "find: ‘/usr/share/doc/google-chrome-stable’: Permission denied\n",
+      "/usr/share/man/man5/british-english.5.gz\n"
+     ]
+    }
+   ],
+   "source": [
+    "# !find /usr -type f -iname 'british-english*'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "total 2.3M\r\n",
+      "drwxr-xr-x   2 root root 4.0K Dec 29 12:37 .\r\n",
+      "drwxr-xr-x 640 root root  20K Apr 13 17:05 ..\r\n",
+      "-rw-r--r--   1 root root 917K Oct 23  2011 american-english\r\n",
+      "-rw-r--r--   1 root root 917K Oct 23  2011 british-english\r\n",
+      "-rw-r--r--   1 root root 467K Aug 25  2016 cracklib-small\r\n",
+      "-rw-r--r--   1 root root  199 Aug 29  2016 README.select-wordlist\r\n",
+      "lrwxrwxrwx   1 root root   30 Nov 10  2014 words -> /etc/dictionaries-common/words\r\n",
+      "lrwxrwxrwx   1 root root   16 Jun 18  2014 words.pre-dictionaries-common -> american-english\r\n"
+     ]
+    }
+   ],
+   "source": [
+    "# !ls -lah /usr/share/dict"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def rude(word):\n",
+    "    return any(w in word \n",
+    "               for w in 'piss shit cunt fuck arse crap fart jizz whore bitch'.split())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "rude('fucks')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": [
+    "def words_with_len(n):\n",
+    "    return [unaccent(w.strip()) for w in open('/usr/share/dict/british-english').readlines()\n",
+    "               if only_lower(unaccent(w.strip()))\n",
+    "               if len(unaccent(w.strip())) == n\n",
+    "               if not rude(unaccent(w.strip()))]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "2336 4-letter words\n",
+      "4566 5-letter words\n",
+      "7223 6-letter words\n"
+     ]
+    }
+   ],
+   "source": [
+    "dicts = {}\n",
+    "\n",
+    "for n in [4, 5, 6]:\n",
+    "    dicts[n] = words_with_len(n)\n",
+    "    print('{} {}-letter words'.format(len(dicts[n]), n))\n",
+    "    with open('words{}.txt'.format(n), 'w') as f:\n",
+    "        f.write('\\n'.join(sorted(set(dicts[n]))))\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": true
+   },
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.5.2+"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}