{"id":18592226,"url":"https://github.com/listx/codex","last_synced_at":"2025-05-16T10:09:45.791Z","repository":{"id":208407497,"uuid":"648852677","full_name":"listx/codex","owner":"listx","description":"Programming problems, solved with Literate Programming and verified with tests","archived":false,"fork":false,"pushed_at":"2024-02-28T05:29:46.000Z","size":1460,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-02-17T21:36:35.728Z","etag":null,"topics":["data-structures-and-algorithms","programming-exercises"],"latest_commit_sha":null,"homepage":"https://funloop.org/codex/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/listx.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"citations.bib","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-03T02:04:59.000Z","updated_at":"2023-12-06T09:21:09.000Z","dependencies_parsed_at":"2024-02-28T06:30:30.645Z","dependency_job_id":null,"html_url":"https://github.com/listx/codex","commit_stats":null,"previous_names":["listx/codex"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/listx%2Fcodex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/listx%2Fcodex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/listx%2Fcodex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/listx%2Fcodex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/listx","download_url":"https://codeload.github.com/listx/codex/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254509473,"owners_count":22082892,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-structures-and-algorithms","programming-exercises"],"created_at":"2024-11-07T01:07:34.864Z","updated_at":"2025-05-16T10:09:45.764Z","avatar_url":"https://github.com/listx.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n\u003cmeta charset=\"utf-8\" /\u003e\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /\u003e\n\u003ctitle\u003eCodex\u003c/title\u003e\n\u003cmeta name=\"author\" content=\"Linus Arver\" /\u003e\n\u003cmeta name=\"generator\" content=\"Org Mode\" /\u003e\n\u003cstyle\u003e\n  #content { max-width: 60em; margin: auto; }\n  .title  { text-align: center;\n             margin-bottom: .2em; }\n  .subtitle { text-align: center;\n              font-size: medium;\n              font-weight: bold;\n              margin-top:0; }\n  .todo   { font-family: monospace; color: red; }\n  .done   { font-family: monospace; color: green; }\n  .priority { font-family: monospace; color: orange; }\n  .tag    { background-color: #eee; font-family: monospace;\n            padding: 2px; font-size: 80%; font-weight: normal; }\n  .timestamp { color: #bebebe; }\n  .timestamp-kwd { color: #5f9ea0; }\n  .org-right  { margin-left: auto; margin-right: 0px;  text-align: right; }\n  .org-left   { margin-left: 0px;  margin-right: auto; text-align: left; }\n  .org-center { margin-left: auto; margin-right: auto; text-align: center; }\n  .underline { text-decoration: underline; }\n  #postamble p, #preamble p { font-size: 90%; margin: .2em; }\n  p.verse { margin-left: 3%; }\n  pre {\n    border: 1px solid #e6e6e6;\n    border-radius: 3px;\n    background-color: #f2f2f2;\n    padding: 8pt;\n    font-family: monospace;\n    overflow: auto;\n    margin: 1.2em;\n  }\n  pre.src {\n    position: relative;\n    overflow: auto;\n  }\n  pre.src:before {\n    display: none;\n    position: absolute;\n    top: -8px;\n    right: 12px;\n    padding: 3px;\n    color: #555;\n    background-color: #f2f2f299;\n  }\n  pre.src:hover:before { display: inline; margin-top: 14px;}\n  /* Languages per Org manual */\n  pre.src-asymptote:before { content: 'Asymptote'; }\n  pre.src-awk:before { content: 'Awk'; }\n  pre.src-authinfo::before { content: 'Authinfo'; }\n  pre.src-C:before { content: 'C'; }\n  /* pre.src-C++ doesn't work in CSS */\n  pre.src-clojure:before { content: 'Clojure'; }\n  pre.src-css:before { content: 'CSS'; }\n  pre.src-D:before { content: 'D'; }\n  pre.src-ditaa:before { content: 'ditaa'; }\n  pre.src-dot:before { content: 'Graphviz'; }\n  pre.src-calc:before { content: 'Emacs Calc'; }\n  pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }\n  pre.src-fortran:before { content: 'Fortran'; }\n  pre.src-gnuplot:before { content: 'gnuplot'; }\n  pre.src-haskell:before { content: 'Haskell'; }\n  pre.src-hledger:before { content: 'hledger'; }\n  pre.src-java:before { content: 'Java'; }\n  pre.src-js:before { content: 'Javascript'; }\n  pre.src-latex:before { content: 'LaTeX'; }\n  pre.src-ledger:before { content: 'Ledger'; }\n  pre.src-lisp:before { content: 'Lisp'; }\n  pre.src-lilypond:before { content: 'Lilypond'; }\n  pre.src-lua:before { content: 'Lua'; }\n  pre.src-matlab:before { content: 'MATLAB'; }\n  pre.src-mscgen:before { content: 'Mscgen'; }\n  pre.src-ocaml:before { content: 'Objective Caml'; }\n  pre.src-octave:before { content: 'Octave'; }\n  pre.src-org:before { content: 'Org mode'; }\n  pre.src-oz:before { content: 'OZ'; }\n  pre.src-plantuml:before { content: 'Plantuml'; }\n  pre.src-processing:before { content: 'Processing.js'; }\n  pre.src-python:before { content: 'Python'; }\n  pre.src-R:before { content: 'R'; }\n  pre.src-ruby:before { content: 'Ruby'; }\n  pre.src-sass:before { content: 'Sass'; }\n  pre.src-scheme:before { content: 'Scheme'; }\n  pre.src-screen:before { content: 'Gnu Screen'; }\n  pre.src-sed:before { content: 'Sed'; }\n  pre.src-sh:before { content: 'shell'; }\n  pre.src-sql:before { content: 'SQL'; }\n  pre.src-sqlite:before { content: 'SQLite'; }\n  /* additional languages in org.el's org-babel-load-languages alist */\n  pre.src-forth:before { content: 'Forth'; }\n  pre.src-io:before { content: 'IO'; }\n  pre.src-J:before { content: 'J'; }\n  pre.src-makefile:before { content: 'Makefile'; }\n  pre.src-maxima:before { content: 'Maxima'; }\n  pre.src-perl:before { content: 'Perl'; }\n  pre.src-picolisp:before { content: 'Pico Lisp'; }\n  pre.src-scala:before { content: 'Scala'; }\n  pre.src-shell:before { content: 'Shell Script'; }\n  pre.src-ebnf2ps:before { content: 'ebfn2ps'; }\n  /* additional language identifiers per \"defun org-babel-execute\"\n       in ob-*.el */\n  pre.src-cpp:before  { content: 'C++'; }\n  pre.src-abc:before  { content: 'ABC'; }\n  pre.src-coq:before  { content: 'Coq'; }\n  pre.src-groovy:before  { content: 'Groovy'; }\n  /* additional language identifiers from org-babel-shell-names in\n     ob-shell.el: ob-shell is the only babel language using a lambda to put\n     the execution function name together. */\n  pre.src-bash:before  { content: 'bash'; }\n  pre.src-csh:before  { content: 'csh'; }\n  pre.src-ash:before  { content: 'ash'; }\n  pre.src-dash:before  { content: 'dash'; }\n  pre.src-ksh:before  { content: 'ksh'; }\n  pre.src-mksh:before  { content: 'mksh'; }\n  pre.src-posh:before  { content: 'posh'; }\n  /* Additional Emacs modes also supported by the LaTeX listings package */\n  pre.src-ada:before { content: 'Ada'; }\n  pre.src-asm:before { content: 'Assembler'; }\n  pre.src-caml:before { content: 'Caml'; }\n  pre.src-delphi:before { content: 'Delphi'; }\n  pre.src-html:before { content: 'HTML'; }\n  pre.src-idl:before { content: 'IDL'; }\n  pre.src-mercury:before { content: 'Mercury'; }\n  pre.src-metapost:before { content: 'MetaPost'; }\n  pre.src-modula-2:before { content: 'Modula-2'; }\n  pre.src-pascal:before { content: 'Pascal'; }\n  pre.src-ps:before { content: 'PostScript'; }\n  pre.src-prolog:before { content: 'Prolog'; }\n  pre.src-simula:before { content: 'Simula'; }\n  pre.src-tcl:before { content: 'tcl'; }\n  pre.src-tex:before { content: 'TeX'; }\n  pre.src-plain-tex:before { content: 'Plain TeX'; }\n  pre.src-verilog:before { content: 'Verilog'; }\n  pre.src-vhdl:before { content: 'VHDL'; }\n  pre.src-xml:before { content: 'XML'; }\n  pre.src-nxml:before { content: 'XML'; }\n  /* add a generic configuration mode; LaTeX export needs an additional\n     (add-to-list 'org-latex-listings-langs '(conf \" \")) in .emacs */\n  pre.src-conf:before { content: 'Configuration File'; }\n\n  table { border-collapse:collapse; }\n  caption.t-above { caption-side: top; }\n  caption.t-bottom { caption-side: bottom; }\n  td, th { vertical-align:top;  }\n  th.org-right  { text-align: center;  }\n  th.org-left   { text-align: center;   }\n  th.org-center { text-align: center; }\n  td.org-right  { text-align: right;  }\n  td.org-left   { text-align: left;   }\n  td.org-center { text-align: center; }\n  dt { font-weight: bold; }\n  .footpara { display: inline; }\n  .footdef  { margin-bottom: 1em; }\n  .figure { padding: 1em; }\n  .figure p { text-align: center; }\n  .equation-container {\n    display: table;\n    text-align: center;\n    width: 100%;\n  }\n  .equation {\n    vertical-align: middle;\n  }\n  .equation-label {\n    display: table-cell;\n    text-align: right;\n    vertical-align: middle;\n  }\n  .inlinetask {\n    padding: 10px;\n    border: 2px solid gray;\n    margin: 10px;\n    background: #ffffcc;\n  }\n  #org-div-home-and-up\n   { text-align: right; font-size: 70%; white-space: nowrap; }\n  textarea { overflow-x: auto; }\n  .linenr { font-size: smaller }\n  .code-highlighted { background-color: #ffff00; }\n  .org-info-js_info-navigation { border-style: none; }\n  #org-info-js_console-label\n    { font-size: 10px; font-weight: bold; white-space: nowrap; }\n  .org-info-js_search-highlight\n    { background-color: #ffff00; color: #000000; font-weight: bold; }\n  .org-svg { }\n\u003c/style\u003e\n\u003clink rel=\"preconnect\" href=\"https://fonts.googleapis.com\" /\u003e\n\u003clink rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin /\u003e\n\u003clink rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900\u0026family=Source+Sans+3:ital,wght@0,200..900;1,200..900\u0026family=Source+Code+Pro:ital,wght@0,200..900;1,200..900\"\u003e\n\u003cscript src=\"https://code.jquery.com/jquery-3.6.4.min.js\"\u003e\u003c/script\u003e\n\u003cscript src=\"lilac.js\"\u003e\u003c/script\u003e\n\u003clink rel=\"stylesheet\" type=\"text/css\" href=\"syntax-highlighting.css\"/\u003e\n\u003clink rel=\"stylesheet\" type=\"text/css\" href=\"lilac.css\" /\u003e\n\u003clink rel=\"stylesheet\" type=\"text/css\" href=\"codex.css\" /\u003e\n\u003clink rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Bungee+Shade:wght@400\"\u003e\n\u003cstyle type=\"text/css\"\u003e\n.problems-table col:nth-of-type(1) { width:  40%; }\n.problems-table col:nth-of-type(2) { width: 30%; }\n.problems-table col:nth-of-type(3) { width: 30%; }\n\u003c/style\u003e\n\u003cstyle type=\"text/css\"\u003e\n.problems-table col:nth-of-type(1) { width:  40%; }\n.problems-table col:nth-of-type(2) { width: 30%; }\n.problems-table col:nth-of-type(3) { width: 30%; }\n\u003c/style\u003e\n\u003cscript\u003e\n// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050\u0026amp;dn=gpl-3.0.txt GPL-v3-or-Later\n     function CodeHighlightOn(elem, id)\n     {\n       var target = document.getElementById(id);\n       if(null != target) {\n         elem.classList.add(\"code-highlighted\");\n         target.classList.add(\"code-highlighted\");\n       }\n     }\n     function CodeHighlightOff(elem, id)\n     {\n       var target = document.getElementById(id);\n       if(null != target) {\n         elem.classList.remove(\"code-highlighted\");\n         target.classList.remove(\"code-highlighted\");\n       }\n     }\n// @license-end\n\u003c/script\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv id=\"content\" class=\"content\"\u003e\n\u003ch1 class=\"title\"\u003eCodex\u003c/h1\u003e\n\u003cdiv id=\"table-of-contents\" role=\"doc-toc\"\u003e\n\n\u003cdiv id=\"text-table-of-contents\" role=\"doc-toc\"\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Introduction\"\u003e1. Introduction\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-How-to-read-this-document\"\u003e1.1. How to read this document\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Problems\"\u003e2. Problems\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Data-structures\"\u003e2.1. Data structures\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Appendix\"\u003e2.2. Appendix\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Tests\"\u003e3. Tests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Literate-Programming-Build-System\"\u003e4. Literate Programming Build System\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Weaving--generating-the-docs\"\u003e4.1. Weaving (generating the docs)\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Use--lilac-theme--file\"\u003e4.1.1. Use \u003ccode\u003elilac.theme\u003c/code\u003e file\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Custom-CSS-and-HTML--head--content\"\u003e4.1.2. Custom CSS and HTML \u0026lt;head\u0026gt; content\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Main-CSS-file\"\u003e4.1.2.1. Main CSS file\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Title-font\"\u003e4.1.2.1.1. Title font\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Tables\"\u003e4.1.2.1.2. Tables\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Secondary-CSS-file\"\u003e4.1.2.2. Secondary CSS file\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Ignore-woven-HTML-from--git-diff\"\u003e4.1.3. Ignore woven HTML from \u003ccode\u003egit diff\u003c/code\u003e\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-git-add--p\"\u003e4.1.3.1. \u003ccode\u003egit add -p\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-gitignore\"\u003e4.1.4. gitignore\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Tangling--generating-the-source-code\"\u003e4.2. Tangling (generating the source code)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Linting\"\u003e4.3. Linting\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Spell-checker\"\u003e4.3.1. Spell checker\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Detect-long-lines\"\u003e4.3.2. Detect long lines\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Link-checker\"\u003e4.3.3. Link checker\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Development-environment--Nix-shell\"\u003e4.4. Development environment (Nix shell)\u003c/a\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#h-Update-Nix-dependencies\"\u003e4.4.1. Update Nix dependencies\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-Elisp\"\u003e4.5. Elisp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#h-References\"\u003e5. References\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Introduction\" class=\"outline-2\"\u003e\n\u003ch2 id=\"h-Introduction\"\u003e\u003cspan class=\"section-number-2\"\u003e1.\u003c/span\u003e Introduction\u003c/h2\u003e\n\u003cdiv class=\"outline-text-2\" id=\"text-h-Introduction\"\u003e\n\u003cp\u003e\nThis project aims to capture my notes for studying various programming problems\n(data structures and algorithms). Have a look at the problems in Section \u003ca href=\"#h-Problems\"\u003e2\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cp\u003e\nFor those curious about how these notes were created, check out Section \u003ca href=\"#h-Literate-Programming-Build-System\"\u003e4\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cp\u003e\nAs for why this project is named \u003ci\u003eCodex\u003c/i\u003e, I just think it's a cool word that has\nthe word \"code\" in it as a substring.\n\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-How-to-read-this-document\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-How-to-read-this-document\"\u003e\u003cspan class=\"section-number-3\"\u003e1.1.\u003c/span\u003e How to read this document\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-How-to-read-this-document\"\u003e\n\u003cp\u003e\nPlease do not use the GitHub-rendered view of this file, as many things like\nlinks and citations simply do not work. Instead go to \u003ca href=\"https://funloop.org/codex\"\u003ehttps://funloop.org/codex\u003c/a\u003e\nfor the best experience, on a desktop or laptop screen (mobile devices don't\nwork very well, not to mention the missing Table of Contents sidebar).\n\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Problems\" class=\"outline-2\"\u003e\n\u003ch2 id=\"h-Problems\"\u003e\u003cspan class=\"section-number-2\"\u003e2.\u003c/span\u003e Problems\u003c/h2\u003e\n\u003cdiv class=\"outline-text-2\" id=\"text-h-Problems\"\u003e\n\u003cp\u003e\nEvery problem gets its own \u003ccode\u003eREADME.org\u003c/code\u003e file in its own subfolder. The solutions\nare all in Python. All solutions are \"standalone\" in that none of them use any\nlibraries other than what's provided by Python's standard libraries.\n\u003c/p\u003e\n\n\u003cp\u003e\nThe problems are drawn mainly from \u003ca href=\"#citeproc_bib_item_1\"\u003e[1]\u003c/a\u003e. Other reference materials are\ncited where applicable. Below is a table of every problem, with tags that give a\nbrief description of each one, and references.\n\u003c/p\u003e\n\n\u003ctable class=\"problems-table\"\u003e\n\n\n\u003ccolgroup\u003e\n\u003ccol  class=\"org-left\"\u003e\n\n\u003ccol  class=\"org-left\"\u003e\n\n\u003ccol  class=\"org-left\"\u003e\n\u003c/colgroup\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eName\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eTags\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eReferences\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/parity/README.html\"\u003eParity\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003ebitwise\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 27]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_2\"\u003e[2, p. 96]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/rectangle_overlap/README.html\"\u003eRectangle overlap\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003egeometry\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 39]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/rearrange_list_even_odd/README.html\"\u003eRearrange list\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003earray, partitioning\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 41]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/dutch_national_flag/README.html\"\u003eDutch national flag\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003earray, partitioning\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 43]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_3\"\u003e[3, p. 200]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_4\"\u003e[4, pp. 296–301]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_5\"\u003e[5, p. 123]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_6\"\u003e[6, p. 186]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_7\"\u003e[7, pp. 125–126]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/buy_sell_stock_once/README.html\"\u003eBuy and sell stock once\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003earray\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 51]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_6\"\u003e[6, p. 69]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/buy_sell_stock_twice/README.html\"\u003eBuy and sell stock twice\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003earray\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 53]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/interconvert_strings_and_integers/README.html\"\u003eInterconvert strings and integers\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003earray, string\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 75]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/merge_sorted_linked_lists/README.html\"\u003eMerge sorted linked lists\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003elinked list\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 92]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/binary_tree_height_balanced/README.html\"\u003eHeight-balanced binary trees\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003ebinary tree\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 124]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/merge_monotonically_increasing_streams/README.html\"\u003eMerge monotonically increasing streams\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003epriority queue\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 144]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/find_first_occurrence_from_sorted_array/README.html\"\u003eFind first occurrence from sorted array\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003ebinary search\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 155]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/anonymous_message_from_magazine/README.html\"\u003eAnonymous message from magazine\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003ehash table\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 175]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/intersection_of_two_sorted_arrays/README.html\"\u003eIntersection of two sorted arrays\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esorting\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 194]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/binary_tree_validate_as_BST/README.html\"\u003eValidate binary tree as BST\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003ebinary tree\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 213]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/tower_of_hanoi/README.html\"\u003eTower of Hanoi\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003erecursion, binary tree\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 233]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/maximum_subarray/README.html\"\u003eMaximum Subarray\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003edivide and conquer, dynamic programming\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 250]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_5\"\u003e[5, p. 77]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/making_change/README.html\"\u003eMaking Change\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003edynamic programming\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 253]\u003c/a\u003e, \u003ca href=\"#citeproc_bib_item_8\"\u003e[8, Sec. 1.2.9]\u003c/a\u003e]\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Data-structures\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Data-structures\"\u003e\u003cspan class=\"section-number-3\"\u003e2.1.\u003c/span\u003e Data structures\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Data-structures\"\u003e\n\u003cp\u003e\nSome problems can only be solved in an elegant way if we use particular data\nstructures. See below for introductory discussions about some of these.\n\u003c/p\u003e\n\n\u003ctable class=\"problems-table\"\u003e\n\n\n\u003ccolgroup\u003e\n\u003ccol  class=\"org-left\"\u003e\n\n\u003ccol  class=\"org-left\"\u003e\n\n\u003ccol  class=\"org-left\"\u003e\n\u003c/colgroup\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eName\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eTags\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eReferences\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/linked_list/README.html\"\u003eLinked list\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003elinked list\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 91]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/stack_with_max/README.html\"\u003eStack (with \"max\" method)\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003estack\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 106]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/binary_tree/README.html\"\u003eBinary tree\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003etree\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_1\"\u003e[1, p. 123]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/binary_search_tree/README.html\"\u003eBinary search tree\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003etree\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_4\"\u003e[4, p. 396]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"problem/heap/README.html\"\u003eHeap\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003etree, heap, priority queue\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"#citeproc_bib_item_4\"\u003e[4, p. 308]\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\n\u003cdiv id=\"outline-container-h-Appendix\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Appendix\"\u003e\u003cspan class=\"section-number-3\"\u003e2.2.\u003c/span\u003e Appendix\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Appendix\"\u003e\n\u003cdl class=\"org-dl\"\u003e\n\u003cdiv class=\"lilac-description-list-entry\"\u003e\u003cdt\u003e\u003ca href=\"appendix/python_tricks/README.html\"\u003ePython tricks\u003c/a\u003e\u003c/dt\u003e\u003cdd\u003eThere are some Python-language-specific tricks available for\nprogramming problems. You might want to skim over this if your Python skills\nare rusty.\u003c/dd\u003e\u003c/div\u003e\n\u003cdiv class=\"lilac-description-list-entry\"\u003e\u003cdt\u003e\u003ca href=\"appendix/mathematics/README.html\"\u003eMathematics\u003c/a\u003e\u003c/dt\u003e\u003cdd\u003eSome (some would argue \u003ci\u003eall\u003c/i\u003e) topics in programming have\nmathematical underpinnings.\u003c/dd\u003e\u003c/div\u003e\n\u003c/dl\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Tests\" class=\"outline-2\"\u003e\n\u003ch2 id=\"h-Tests\"\u003e\u003cspan class=\"section-number-2\"\u003e3.\u003c/span\u003e Tests\u003c/h2\u003e\n\u003cdiv class=\"outline-text-2\" id=\"text-h-Tests\"\u003e\n\u003ctable\u003e\n\n\n\u003ccolgroup\u003e\n\u003ccol  class=\"org-left\"\u003e\n\n\u003ccol  class=\"org-left\"\u003e\n\u003c/colgroup\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eDependency\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eWhy\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"https://github.com/charliermarsh/ruff\"\u003eRuff\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003efor linting\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"https://github.com/python/mypy\"\u003eMypy\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003efor enforcing type hints\u003c/td\u003e\n\u003c/tr\u003e\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003ca href=\"https://github.com/HypothesisWorks/hypothesis\"\u003eHypothesis\u003c/a\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003efor property-based tests\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003cp\u003e\nAll solutions to the problems are implemented in Python, and tested with basic\nunit tests and the Hyothesis property-based testing framework. Each problem's\ndiscussion comes with its own test suite. All source code samples are linted as\nwell with ruff and mypy. Testing has been extremely valuable in checking the\ncorrectness of the puzzle solutions collected in this work.\n\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Literate-Programming-Build-System\" class=\"outline-2\"\u003e\n\u003ch2 id=\"h-Literate-Programming-Build-System\"\u003e\u003cspan class=\"section-number-2\"\u003e4.\u003c/span\u003e Literate Programming Build System\u003c/h2\u003e\n\u003cdiv class=\"outline-text-2\" id=\"text-h-Literate-Programming-Build-System\"\u003e\n\u003cp\u003e\nWe use \u003ca href=\"https://github.com/listx/lilac\"\u003eLilac\u003c/a\u003e for literate programming. To build everything just run \u003ccode\u003emake\nshell\u003c/code\u003e to drop inside the development environment shell then run \u003ccode\u003emake\u003c/code\u003e inside\nit.\n\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Weaving--generating-the-docs\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Weaving--generating-the-docs\"\u003e\u003cspan class=\"section-number-3\"\u003e4.1.\u003c/span\u003e Weaving (generating the docs)\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Weaving--generating-the-docs\"\u003e\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003eMakefile\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#Makefile\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-makefile\" id=\"Makefile\"\u003e\u003cspan class=\"org-variable-name\"\u003ePROJ_ROOT\u003c/span\u003e := $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e git rev-parse --show-toplevel)\n\u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e := $(\u003cspan class=\"org-variable-name\"\u003ePROJ_ROOT\u003c/span\u003e)/deps/elisp/lilac\n\u003cspan class=\"org-variable-name\"\u003ePROCS\u003c/span\u003e := $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e nproc)\ndefine run_emacs\n    \u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e=$(\u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e) emacs $(\u003cspan class=\"org-variable-name\"\u003e2\u003c/span\u003e) --quick --batch --kill \\\n        --load $(\u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e)/lilac.el \\\n        --load $(\u003cspan class=\"org-variable-name\"\u003ePROJ_ROOT\u003c/span\u003e)/codex.el \\\n        \u003cspan class=\"org-variable-name\"\u003e--eval\u003c/span\u003e=\u003cspan class=\"org-string\"\u003e\"$(\u003c/span\u003e\u003cspan class=\"org-string\"\u003e\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-string\"\u003e)\"\u003c/span\u003e\nendef\ndefine run_emacs_nobatch\n    \u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e=$(\u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e) emacs $(\u003cspan class=\"org-variable-name\"\u003e2\u003c/span\u003e) --quick --kill \\\n        --load $(\u003cspan class=\"org-variable-name\"\u003eLILAC_ROOT\u003c/span\u003e)/lilac.el \\\n        --load $(\u003cspan class=\"org-variable-name\"\u003ePROJ_ROOT\u003c/span\u003e)/codex.el \\\n        \u003cspan class=\"org-variable-name\"\u003e--eval\u003c/span\u003e=\u003cspan class=\"org-string\"\u003e\"$(\u003c/span\u003e\u003cspan class=\"org-string\"\u003e\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-string\"\u003e)\"\u003c/span\u003e\nendef\n\u003cspan class=\"org-variable-name\"\u003esrc_problem\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find problem/ -type f -name \u003cspan class=\"org-string\"\u003e'README.org'\u003c/span\u003e)\n\u003cspan class=\"org-variable-name\"\u003ewoven_html\u003c/span\u003e = \\\n    $(\u003cspan class=\"org-variable-name\"\u003epatsubst\u003c/span\u003e \\\n        problem/%/README.org, \\\n        problem/%/README.html, \\\n        $(\u003cspan class=\"org-variable-name\"\u003esrc_problem\u003c/span\u003e)) \\\n    appendix/mathematics/README.html \\\n    appendix/python_tricks/README.html \\\n    README.html\n\u003cspan class=\"org-variable-name\"\u003eproblem_dirs\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find problem -maxdepth 1 -type d | sort | tail -n+2)\n\u003cspan class=\"org-variable-name\"\u003eproblem_dirs_without_prefix\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003esubst\u003c/span\u003e problem/,,$(\u003cspan class=\"org-variable-name\"\u003eproblem_dirs\u003c/span\u003e))\n\u003cspan class=\"org-variable-name\"\u003etest_dirs\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find . -type f -name \u003cspan class=\"org-string\"\u003e'__init__.py'\u003c/span\u003e \\\n        | sed \u003cspan class=\"org-string\"\u003e's|/__init__.py||'\u003c/span\u003e)\n\u003cspan class=\"org-comment-delimiter\"\u003e# \u003c/span\u003e\u003cspan class=\"org-comment\"\u003eAll problem dirs with Tikz-generated images.\u003c/span\u003e\n\u003cspan class=\"org-variable-name\"\u003eimage_dirs\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find . -type f -name \u003cspan class=\"org-string\"\u003e'images.org'\u003c/span\u003e \\\n        | sed -e \u003cspan class=\"org-string\"\u003e's|/[^/]*$$||'\u003c/span\u003e -e \u003cspan class=\"org-string\"\u003e's|^problem/||'\u003c/span\u003e | sort -u)\n\u003cspan class=\"org-variable-name\"\u003eall_tests_verified\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003epatsubst\u003c/span\u003e %.py, %.py.verified, \\\n        $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find . -type f -name \u003cspan class=\"org-string\"\u003e'test.py'\u003c/span\u003e))\n\ndefine weave_org\n\n\u003cspan class=\"org-makefile-targets\"\u003e$(\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e)\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003e2\u003c/span\u003e) build-literate.org \\\n        $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find $(\u003cspan class=\"org-variable-name\"\u003e3\u003c/span\u003e) -type f -name \u003cspan class=\"org-string\"\u003e'images.org'\u003c/span\u003e \\\n            | xargs grep \u003cspan class=\"org-string\"\u003e'img.pdf'\u003c/span\u003e \\\n            | sed \\\n                -e \u003cspan class=\"org-string\"\u003e's|images.org:#+header: :file ||'\u003c/span\u003e \\\n                -e \u003cspan class=\"org-string\"\u003e's|.img.pdf|.svg|'\u003c/span\u003e)\n    \u003cspan class=\"org-type\"\u003e@\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003eecho weaving $(\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e\u003cspan class=\"org-variable-name\"\u003e2\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e)\u003c/span\u003e\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(lilac-publish),$(\u003cspan class=\"org-variable-name\"\u003e2\u003c/span\u003e))\n\nendef\n\n\u003cspan class=\"org-makefile-targets\"\u003eall\u003c/span\u003e: check.verified weave\n\u003cspan class=\"org-makefile-targets\"\u003e.PHONY\u003c/span\u003e: all\n\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__Makefile-tangle\"\u003eMakefile-tangle\u003c/a\u003e\u003c/span\u003e\n\n\u003cspan class=\"org-makefile-targets\"\u003eweave\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003ewoven_html\u003c/span\u003e)\n    touch weave\n\n\u003cspan class=\"org-makefile-targets\"\u003eREADME.html\u003c/span\u003e: build-literate.org README.org citations.bib\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(lilac-publish),README.org)\n\n$(\u003cspan class=\"org-variable-name\"\u003eforeach\u003c/span\u003e d,$(\u003cspan class=\"org-variable-name\"\u003eproblem_dirs_without_prefix\u003c/span\u003e),\\\n    $(\u003cspan class=\"org-variable-name\"\u003eeval\u003c/span\u003e $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e weave_org,\\\n    problem/$(\u003cspan class=\"org-variable-name\"\u003ed\u003c/span\u003e)/README.html,\\\n    problem/$(\u003cspan class=\"org-variable-name\"\u003ed\u003c/span\u003e)/README.org,problem)))\n\n\u003cspan class=\"org-makefile-targets\"\u003eappendix/mathematics/README.html\u003c/span\u003e: appendix/mathematics/README.org \\\n        appendix/mathematics/twos-complement.org\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(lilac-publish),appendix/mathematics/README.org)\n\n\u003cspan class=\"org-makefile-targets\"\u003eappendix/python_tricks/README.html\u003c/span\u003e: appendix/python_tricks/README.org\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(lilac-publish),appendix/python_tricks/README.org)\n\n\u003cspan class=\"org-makefile-targets\"\u003echeck.verified\u003c/span\u003e: lint.verified test\n    touch check.verified\n\n\u003cspan class=\"org-makefile-targets\"\u003etest\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003eall_tests_verified\u003c/span\u003e)\n    touch test\n\n\u003cspan class=\"org-makefile-targets\"\u003elint.verified\u003c/span\u003e: \\\n        mypy.verified \\\n        ruff.verified \\\n        spellcheck.verified \\\n        linelength.verified \\\n        linkcheck.verified\n    touch lint.verified\n\n\u003cspan class=\"org-makefile-targets\"\u003emypy.verified\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003eall_tests_verified\u003c/span\u003e)\n    mypy problem appendix\n    touch mypy.verified\n\n\u003cspan class=\"org-makefile-targets\"\u003eruff.verified\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003eall_tests_verified\u003c/span\u003e)\n    ruff problem appendix\n    touch ruff.verified\n\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__Makefile-spellcheck\"\u003eMakefile-spellcheck\u003c/a\u003e\u003c/span\u003e\n\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__Makefile-linelength\"\u003eMakefile-linelength\u003c/a\u003e\u003c/span\u003e\n\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__Makefile-linkcheck\"\u003eMakefile-linkcheck\u003c/a\u003e\u003c/span\u003e\n\n\u003cspan class=\"org-comment-delimiter\"\u003e# \u003c/span\u003e\u003cspan class=\"org-comment\"\u003eEnter development environment.\u003c/span\u003e\n\u003cspan class=\"org-makefile-targets\"\u003eshell\u003c/span\u003e:\n    nix-shell --pure\n\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__Makefile-update-deps\"\u003eMakefile-update-deps\u003c/a\u003e\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Use--lilac-theme--file\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Use--lilac-theme--file\"\u003e\u003cspan class=\"section-number-4\"\u003e4.1.1.\u003c/span\u003e Use \u003ccode\u003elilac.theme\u003c/code\u003e file\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Use--lilac-theme--file\"\u003e\n\u003cp\u003e\nFirst we track Lilac as a submodule within this project, and then symlink to the\nCSS, JS, and theme files to the project root. Symlinking adds a level of\nindirection such that if we ever decide to move around the submodule location to\nsomewhere else, we won't have to update all of our Org files and can instead\njust update these symlinks.\n\u003c/p\u003e\n\n\u003cp\u003e\nThen in all of our published Org files, we do\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cpre class=\"src src-org\" id=\"org0000002\"\u003e\u003cspan class=\"org-org-meta-line\"\u003e#+SETUPFILE: path/to/lilac.theme\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\nto get the CSS/JS that comes with Lilac.\n\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Custom-CSS-and-HTML--head--content\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Custom-CSS-and-HTML--head--content\"\u003e\u003cspan class=\"section-number-4\"\u003e4.1.2.\u003c/span\u003e Custom CSS and HTML \u0026lt;head\u0026gt; content\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Custom-CSS-and-HTML--head--content\"\u003e\n\u003cp\u003e\nWe tweak Lilac's default CSS a bit.\n\u003c/p\u003e\n\n\u003cp\u003e\nMake all HTML files we generate try to pull in a local file called\n\u003ccode\u003ecodex.css\u003c/code\u003e, as well as a custom font.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#codex-el\"\u003ecodex-html-head\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__codex-html-head\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-emacs-lisp\" id=\"__NREF__codex-html-head\"\u003e\u003cspan class=\"org-comment-delimiter\"\u003e; \u003c/span\u003e\u003cspan class=\"org-comment\"\u003eSee https://stackoverflow.com/a/27285582/437583.\u003c/span\u003e\n(\u003cspan class=\"org-keyword\"\u003esetq\u003c/span\u003e lilac-html-head\n      (concat\n       \u003cspan class=\"org-string\"\u003e\"\u0026lt;link rel=\\\"stylesheet\\\" type=\\\"text/css\\\" href=\\\"codex.css\\\" /\u0026gt;\\n\"\u003c/span\u003e\n       \u003cspan class=\"org-string\"\u003e\"\u0026lt;link rel=\\\"stylesheet\\\" href=\"\u003c/span\u003e\n        \u003cspan class=\"org-string\"\u003e\"\\\"https://fonts.googleapis.com/css2\"\u003c/span\u003e\n        \u003cspan class=\"org-string\"\u003e\"?family=Bungee+Shade:wght@400\"\u003c/span\u003e\n       \u003cspan class=\"org-string\"\u003e\"\\\"\u0026gt;\"\u003c/span\u003e\n       ))\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Main-CSS-file\" class=\"outline-5\"\u003e\n\u003ch5 id=\"h-Main-CSS-file\"\u003e\u003cspan class=\"section-number-5\"\u003e4.1.2.1.\u003c/span\u003e Main CSS file\u003c/h5\u003e\n\u003cdiv class=\"outline-text-5\" id=\"text-h-Main-CSS-file\"\u003e\n\u003cp\u003e\nThe default \u003ccode\u003ecodex.css\u003c/code\u003e file has some miscellaneous customizations.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003ecodex.css\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#codex-css\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-css\" id=\"codex-css\"\u003e\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__codex-css-title-font\"\u003ecodex-css-title-font\u003c/a\u003e\u003c/span\u003e\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__codex-css-tables\"\u003ecodex-css-tables\u003c/a\u003e\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Title-font\" class=\"outline-6\"\u003e\n\u003ch6 id=\"h-Title-font\"\u003e\u003cspan class=\"section-number-6\"\u003e4.1.2.1.1.\u003c/span\u003e Title font\u003c/h6\u003e\n\u003cdiv class=\"outline-text-6\" id=\"text-h-Title-font\"\u003e\n\u003cp\u003e\nThis makes the title font bigger and uses a more ornate font for it.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#codex-css\"\u003ecodex-css-title-font\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__codex-css-title-font\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-css\" id=\"__NREF__codex-css-title-font\"\u003e\u003cspan class=\"org-css-selector\"\u003eh1.title\u003c/span\u003e {\n    \u003cspan class=\"org-css-property\"\u003efont-family\u003c/span\u003e: \u003cspan class=\"org-string\"\u003e\"Bungee Shade\"\u003c/span\u003e, serif;\n    \u003cspan class=\"org-css-property\"\u003efont-size\u003c/span\u003e: 100pt;\n}\n\u003cspan class=\"org-builtin\"\u003e@media\u003c/span\u003e (any-pointer: coarse) {\n    \u003cspan class=\"org-css-selector\"\u003eh1.title\u003c/span\u003e {\n        \u003cspan class=\"org-css-property\"\u003efont-family\u003c/span\u003e: \u003cspan class=\"org-string\"\u003e\"Bungee Shade\"\u003c/span\u003e, serif;\n        \u003cspan class=\"org-css-property\"\u003efont-size\u003c/span\u003e: 60pt;\n    }\n}\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Tables\" class=\"outline-6\"\u003e\n\u003ch6 id=\"h-Tables\"\u003e\u003cspan class=\"section-number-6\"\u003e4.1.2.1.2.\u003c/span\u003e Tables\u003c/h6\u003e\n\u003cdiv class=\"outline-text-6\" id=\"text-h-Tables\"\u003e\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#codex-css\"\u003ecodex-css-tables\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#codex-problems-css\"\u003e2\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__codex-css-tables\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-css\" id=\"__NREF__codex-css-tables\"\u003e\u003cspan class=\"org-css-selector\"\u003etable.monospace-except-header\u003c/span\u003e {\n    \u003cspan class=\"org-css-property\"\u003efont-family\u003c/span\u003e: monospace;\n}\n\n\u003cspan class=\"org-css-selector\"\u003etable.monospace-except-header thead\u003c/span\u003e {\n    \u003cspan class=\"org-css-property\"\u003efont-family\u003c/span\u003e: var(\u003cspan class=\"org-variable-name\"\u003e--font-serif\u003c/span\u003e);\n}\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Secondary-CSS-file\" class=\"outline-5\"\u003e\n\u003ch5 id=\"h-Secondary-CSS-file\"\u003e\u003cspan class=\"section-number-5\"\u003e4.1.2.2.\u003c/span\u003e Secondary CSS file\u003c/h5\u003e\n\u003cdiv class=\"outline-text-5\" id=\"text-h-Secondary-CSS-file\"\u003e\n\u003cp\u003e\nThis is a second CSS file where we customize the title text of the pages for the\nproblems. We just (manually) create a symlink from the problem page's\n\u003ccode\u003ecodex.css\u003c/code\u003e to this one (because we don't want to use the regular \u003ccode\u003ecodex.css\u003c/code\u003e\nfrom above).\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003ecodex.problems.css\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#codex-problems-css\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-css\" id=\"codex-problems-css\"\u003e\u003cspan class=\"org-css-selector\"\u003eh1.title\u003c/span\u003e {\n    \u003cspan class=\"org-css-property\"\u003efont-family\u003c/span\u003e: \u003cspan class=\"org-string\"\u003e\"Source Serif Pro\"\u003c/span\u003e, serif;\n}\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__codex-css-tables\"\u003ecodex-css-tables\u003c/a\u003e\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Ignore-woven-HTML-from--git-diff\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Ignore-woven-HTML-from--git-diff\"\u003e\u003cspan class=\"section-number-4\"\u003e4.1.3.\u003c/span\u003e Ignore woven HTML from \u003ccode\u003egit diff\u003c/code\u003e\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Ignore-woven-HTML-from--git-diff\"\u003e\n\u003cp\u003e\nTypically we only need to look at the rendered HTML output in a web browser as\nthe raw HTML diff output is extremely difficult to parse as a human. So by\ndefault we ask Git to exclude it from \u003ccode\u003egit diff\u003c/code\u003e by treating them as binary\ndata.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003e.gitattributes\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#gitattributes\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-gitattributes\" id=\"gitattributes\"\u003e* -diff\n**/*.org diff\n**/.gitattributes diff\n**/.gitmodules diff\n**/.gitignore diff\npackage/nix/sources.json diff\nCOPYRIGHT diff\nLICENSE diff\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003e\nIn order to still show the HTML textual diff, we can run \u003ccode\u003egit diff --text\u003c/code\u003e.\n\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-git-add--p\" class=\"outline-5\"\u003e\n\u003ch5 id=\"h-git-add--p\"\u003e\u003cspan class=\"section-number-5\"\u003e4.1.3.1.\u003c/span\u003e \u003ccode\u003egit add -p\u003c/code\u003e\u003c/h5\u003e\n\u003cdiv class=\"outline-text-5\" id=\"text-h-git-add--p\"\u003e\n\u003cp\u003e\nNote that the above setting to treat HTML files as binary data prevents them\nfrom being considered for \u003ccode\u003egit add -p\u003c/code\u003e. In order to add them, use \u003ccode\u003egit add -u\u003c/code\u003e\ninstead.\n\u003c/p\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-gitignore\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-gitignore\"\u003e\u003cspan class=\"section-number-4\"\u003e4.1.4.\u003c/span\u003e gitignore\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-gitignore\"\u003e\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003e.gitignore\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#gitignore\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-gitignore\" id=\"gitignore\"\u003e**/__pycache__\n**/*.auctex-auto\n**/*.hypothesis\n**/*.pdf\n**/*.log\n**/*.py.verified\ncheck.verified\nlint.verified\nlinkcheck.verified\nlinelength.verified\nmypy.verified\nruff.verified\nspellcheck.verified\ntest\nupdate-deps\nweave\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Tangling--generating-the-source-code\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Tangling--generating-the-source-code\"\u003e\u003cspan class=\"section-number-3\"\u003e4.2.\u003c/span\u003e Tangling (generating the source code)\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Tangling--generating-the-source-code\"\u003e\n\u003cp\u003e\nTangling is simply the act of collecting the \u003ccode\u003e#+begin_src ... #+end_src\u003c/code\u003e blocks\nand arranging them into the various target (source code) files. Every source\ncode block is given a unique name.\n\u003c/p\u003e\n\n\u003cp\u003e\nWe simply tangle all major \u003ccode\u003e*.org\u003c/code\u003e files in the toplevel Makefile.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#Makefile\"\u003eMakefile-tangle\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__Makefile-tangle\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-makefile\" id=\"__NREF__Makefile-tangle\"\u003e\u003cspan class=\"org-variable-name\"\u003ebuild_literate_tangled\u003c/span\u003e = \\\n        .gitattributes \\\n        .gitignore \\\n        _typos.toml \\\n        codex.css \\\n        codex.problem.css \\\n        codex.el \\\n        Makefile \\\n        shell.nix\n\u003cspan class=\"org-makefile-targets\"\u003e$(\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003ebuild_literate_tangled\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e) \u0026amp;\u003c/span\u003e: build-literate.org\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(org-babel-tangle),build-literate.org)\n    touch $(\u003cspan class=\"org-variable-name\"\u003ebuild_literate_tangled\u003c/span\u003e)\n\n\u003cspan class=\"org-makefile-targets\"\u003ecitations.bib\u003c/span\u003e: README.org\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(org-babel-tangle),README.org)\n    touch citations.bib\n\ndefine generate_img_pdfs\n$(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e grep \u003cspan class=\"org-string\"\u003e'img.pdf'\u003c/span\u003e $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e) \\\n        | sed \\\n            -e \u003cspan class=\"org-string\"\u003e's|^|$(\u003c/span\u003e\u003cspan class=\"org-string\"\u003e\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-string\"\u003e):|'\u003c/span\u003e \\\n            -e \u003cspan class=\"org-string\"\u003e's|images.org:#+header: :file ||'\u003c/span\u003e) \u0026amp;: $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e)\n    \u003cspan class=\"org-type\"\u003e@\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003eecho generating images from $(\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e)\u003c/span\u003e\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(org-html-export-to-html),$(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e))\n    rm -f $(\u003cspan class=\"org-variable-name\"\u003epatsubst\u003c/span\u003e %/images.org, %/images.html, $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e))\nendef\n\ndefine generate_img_svgs\n\u003cspan class=\"org-makefile-targets\"\u003e$(\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e:\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003e.img.pdf\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e=.svg)\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e)\n    \u003cspan class=\"org-type\"\u003e@\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003eecho generating svg from $(\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e)\u003c/span\u003e\n    \u003cspan class=\"org-type\"\u003e@\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003eecho $(\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e pwd)\u003c/span\u003e\n    pdf2svg $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e) $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e).uncropped.svg\n    inkscape \\\n        --export-plain-svg \\\n        \u003cspan class=\"org-variable-name\"\u003e--export-margin\u003c/span\u003e=5 \\\n        \u003cspan class=\"org-variable-name\"\u003e--export-filename\u003c/span\u003e=$(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e:\u003cspan class=\"org-variable-name\"\u003e.img.pdf\u003c/span\u003e=.svg) \\\n        --export-area-drawing \\\n        $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e).uncropped.svg\n    rm $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e).uncropped.svg\nendef\n\n$(\u003cspan class=\"org-variable-name\"\u003eforeach\u003c/span\u003e p,$(\u003cspan class=\"org-variable-name\"\u003eimage_dirs\u003c/span\u003e),\\\n    $(\u003cspan class=\"org-variable-name\"\u003eeval\u003c/span\u003e $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e generate_img_pdfs,\\\n    $(\u003cspan class=\"org-variable-name\"\u003ep\u003c/span\u003e)/images.org)))\n\n\u003cspan class=\"org-variable-name\"\u003eall_img_pdfs\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find . -type f -name \u003cspan class=\"org-string\"\u003e'images.org'\u003c/span\u003e \\\n        | xargs grep \u003cspan class=\"org-string\"\u003e'img.pdf'\u003c/span\u003e \\\n        | sed \u003cspan class=\"org-string\"\u003e's|images.org:#+header: :file ||'\u003c/span\u003e)\n$(\u003cspan class=\"org-variable-name\"\u003eforeach\u003c/span\u003e img,$(\u003cspan class=\"org-variable-name\"\u003eall_img_pdfs\u003c/span\u003e),\\\n    $(\u003cspan class=\"org-variable-name\"\u003eeval\u003c/span\u003e $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e generate_img_svgs,\\\n    $(\u003cspan class=\"org-variable-name\"\u003eimg\u003c/span\u003e))))\n\ndefine tangle_tests\n\u003cspan class=\"org-makefile-targets\"\u003e$(\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e)/__init__.py $(\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e)/test.py \u0026amp;\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e)/README.org\n    \u003cspan class=\"org-type\"\u003e@\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003eecho tangling $(\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-shell\"\u003e)/README.org\u003c/span\u003e\n    $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e run_emacs,(org-babel-tangle),$(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e)/README.org)\n    find $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e) -type f -name \u003cspan class=\"org-string\"\u003e'*.py'\u003c/span\u003e \\\n        -execdir sed -i \u003cspan class=\"org-string\"\u003e's/[[:blank:]]*$$$$//'\u003c/span\u003e {} +\nendef\n\n\u003cspan class=\"org-comment-delimiter\"\u003e# \u003c/span\u003e\u003cspan class=\"org-comment\"\u003eSee https://stackoverflow.com/a/9694782/437583.\u003c/span\u003e\n$(\u003cspan class=\"org-variable-name\"\u003eforeach\u003c/span\u003e d,$(\u003cspan class=\"org-variable-name\"\u003etest_dirs\u003c/span\u003e),\\\n    $(\u003cspan class=\"org-variable-name\"\u003eeval\u003c/span\u003e $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e tangle_tests,$(\u003cspan class=\"org-variable-name\"\u003ed\u003c/span\u003e))))\n\ndefine verify_tests\n\u003cspan class=\"org-makefile-targets\"\u003e$(\u003c/span\u003e\u003cspan class=\"org-variable-name\"\u003e\u003cspan class=\"org-makefile-targets\"\u003e1\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"org-makefile-targets\"\u003e)/test.py.verified\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e)/test.py\n    python -m unittest discover \\\n        --failfast --start-directory $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e) \\\n        --top $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e echo $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e) | sed -e \u003cspan class=\"org-string\"\u003e's|./||'\u003c/span\u003e -e \u003cspan class=\"org-string\"\u003e's|/.\\+||'\u003c/span\u003e)\n    touch $(\u003cspan class=\"org-variable-name\"\u003e1\u003c/span\u003e)/test.py.verified\nendef\n\n$(\u003cspan class=\"org-variable-name\"\u003eforeach\u003c/span\u003e d,$(\u003cspan class=\"org-variable-name\"\u003etest_dirs\u003c/span\u003e),\\\n    $(\u003cspan class=\"org-variable-name\"\u003eeval\u003c/span\u003e $(\u003cspan class=\"org-variable-name\"\u003ecall\u003c/span\u003e verify_tests,$(\u003cspan class=\"org-variable-name\"\u003ed\u003c/span\u003e))))\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Linting\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Linting\"\u003e\u003cspan class=\"section-number-3\"\u003e4.3.\u003c/span\u003e Linting\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Linting\"\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Spell-checker\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Spell-checker\"\u003e\u003cspan class=\"section-number-4\"\u003e4.3.1.\u003c/span\u003e Spell checker\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Spell-checker\"\u003e\n\u003cp\u003e\nWe use \u003ca href=\"https://github.com/crate-ci/typos\"\u003etypos-cli\u003c/a\u003e to check for spelling errors. Below we configure it to only\ncheck the original source material \u0026#x2014; Org files.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003e_typos.toml\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#typos-toml\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-toml\" id=\"typos-toml\"\u003e[\u003cspan class=\"org-type\"\u003efiles\u003c/span\u003e]\n\u003cspan class=\"org-variable-name\"\u003eextend-exclude\u003c/span\u003e = [\n    \u003cspan class=\"org-string\"\u003e\"*.html\"\u003c/span\u003e,\n    \u003cspan class=\"org-string\"\u003e\"deps/*\"\u003c/span\u003e,\n]\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003cp\u003e\nHere we have the Makefile rules for linting, which include this spellchecker.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#Makefile\"\u003eMakefile-spellcheck\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__Makefile-spellcheck\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-makefile\" id=\"__NREF__Makefile-spellcheck\"\u003e\u003cspan class=\"org-variable-name\"\u003eORG_FILES\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find . -type f -name \u003cspan class=\"org-string\"\u003e'*.org'\u003c/span\u003e)\n\n\u003cspan class=\"org-makefile-targets\"\u003espellcheck.verified\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003eORG_FILES\u003c/span\u003e)\n    typos\n    touch spellcheck.verified\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Detect-long-lines\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Detect-long-lines\"\u003e\u003cspan class=\"section-number-4\"\u003e4.3.2.\u003c/span\u003e Detect long lines\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Detect-long-lines\"\u003e\n\u003cp\u003e\nFor code we tangle, we want lines to be roughly 80 characters. This limit is\nactually a bit difficult to enforce because sometimes the source code blocks we\nedit get placed into an indented location, and from the source code block itself\nwe cannot tell how much this indentation is exactly. So set the maximum line\nlength for tangled text to be 90 characters.\n\u003c/p\u003e\n\n\u003cp\u003e\nWe have to wrap the \u003ccode\u003efind ...\u003c/code\u003e invocation with \u003ccode\u003e|| true\u003c/code\u003e because \u003ccode\u003exargs\u003c/code\u003e will\nexit with \u003ccode\u003e123\u003c/code\u003e if the last \u003ccode\u003egrep\u003c/code\u003e call can't find a match. That is, in our case\nnot finding a match is a \u003cb\u003egood\u003c/b\u003e thing but the inner \u003ccode\u003egrep\u003c/code\u003e doesn't know that.\n\u003c/p\u003e\n\n\u003cp\u003e\nThis code detects which files to look at by looking at lines in Org files that\nstart with \u003ccode\u003e#+begin_src\u003c/code\u003e and end with \u003ccode\u003e:tangle foo\u003c/code\u003e, where \u003ccode\u003efoo\u003c/code\u003e is the last\nword in the line.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#Makefile\"\u003eMakefile-linelength\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__Makefile-linelength\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-makefile\" id=\"__NREF__Makefile-linelength\"\u003e\u003cspan class=\"org-makefile-targets\"\u003elinelength.verified\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003eORG_FILES\u003c/span\u003e)\n    \u003cspan class=\"org-string\"\u003e`find . -type f -name '*.org' \\\u003c/span\u003e\n\u003cspan class=\"org-string\"\u003e        | grep -v '^./deps' \\\u003c/span\u003e\n\u003cspan class=\"org-string\"\u003e        | xargs grep '^#+begin_src.\\+ :tangle ' \\\u003c/span\u003e\n\u003cspan class=\"org-string\"\u003e        | sed 's,[^/]\\+.org.\\+:tangle ,,' \\\u003c/span\u003e\n\u003cspan class=\"org-string\"\u003e        | grep -v citations.bib \\\u003c/span\u003e\n\u003cspan class=\"org-string\"\u003e        | xargs grep -n '^.\\{90\\}' \u0026gt; linelength_offenders.log`\u003c/span\u003e || true\n    test \u003cspan class=\"org-string\"\u003e`wc --bytes linelength_offenders.log | cut -d\\  -f1`\u003c/span\u003e -eq 0\n    touch linelength.verified\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Link-checker\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Link-checker\"\u003e\u003cspan class=\"section-number-4\"\u003e4.3.3.\u003c/span\u003e Link checker\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Link-checker\"\u003e\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#Makefile\"\u003eMakefile-linkcheck\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__Makefile-linkcheck\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-makefile\" id=\"__NREF__Makefile-linkcheck\"\u003e\u003cspan class=\"org-variable-name\"\u003eHTML_FILES\u003c/span\u003e = $(\u003cspan class=\"org-variable-name\"\u003eshell\u003c/span\u003e find . -type f -name \u003cspan class=\"org-string\"\u003e'*.html'\u003c/span\u003e | grep -v \u003cspan class=\"org-string\"\u003e'^./deps'\u003c/span\u003e)\n\n\u003cspan class=\"org-makefile-targets\"\u003elinkcheck.verified\u003c/span\u003e: $(\u003cspan class=\"org-variable-name\"\u003eHTML_FILES\u003c/span\u003e)\n    lychee --offline $(\u003cspan class=\"org-variable-name\"\u003eHTML_FILES\u003c/span\u003e)\n    touch linkcheck.verified\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Development-environment--Nix-shell\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Development-environment--Nix-shell\"\u003e\u003cspan class=\"section-number-3\"\u003e4.4.\u003c/span\u003e Development environment (Nix shell)\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Development-environment--Nix-shell\"\u003e\n\u003cp\u003e\nThis is taken from \u003ca href=\"https://github.com/tweag/haskell-stack-nix-example/blob/b9383e35416a2b0e21fbc97ed079538f9f395b6a/shell.nix#L1\"\u003ehttps://github.com/tweag/haskell-stack-nix-example/blob/b9383e35416a2b0e21fbc97ed079538f9f395b6a/shell.nix#L1\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cp\u003e\nThis is the main development shell and brings in all of our dependencies to\nbuild all of our code. It's great for development and testing things out (such\nas running \"make\" to re-run any Python tests that have been updated when adding\nnew problems).\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003eshell.nix\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#shell-nix\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-nix\" id=\"shell-nix\"\u003e\u003cspan class=\"org-nix-keyword\"\u003elet\u003c/span\u003e\n  \u003cspan class=\"org-comment\"\u003e# Nixpkgs snapshot.\u003c/span\u003e\n  \u003cspan class=\"org-nix-attribute\"\u003esources\u003c/span\u003e = \u003cspan class=\"org-nix-builtin\"\u003eimport\u003c/span\u003e \u003cspan class=\"org-nix-constant\"\u003e./package/nix/sources.nix\u003c/span\u003e;\n  \u003cspan class=\"org-comment\"\u003e# The final \"pkgs\" attribute with all the bells and whistles of our overlays.\u003c/span\u003e\n  \u003cspan class=\"org-nix-attribute\"\u003epkgs\u003c/span\u003e = \u003cspan class=\"org-nix-builtin\"\u003eimport\u003c/span\u003e sources.nixpkgs {};\n  \u003cspan class=\"org-comment\"\u003e# This minimalist latex setup is adapted from https://nixos.wiki/wiki/TexLive.\u003c/span\u003e\n  \u003cspan class=\"org-nix-attribute\"\u003etex_for_orgmode\u003c/span\u003e = (pkgs.texlive.combine {\n    \u003cspan class=\"org-comment\"\u003e# Start with scheme-basic.\u003c/span\u003e\n    \u003cspan class=\"org-nix-keyword\"\u003einherit\u003c/span\u003e (pkgs.texlive) scheme-basic\n      \u003cspan class=\"org-comment\"\u003e# Add in additional TeX packages (think CTAN package names).\u003c/span\u003e\n      wrapfig amsmath ulem hyperref capt-of\n\n      \u003cspan class=\"org-comment\"\u003e# TikZ.\u003c/span\u003e\n      pgf\n      xkeyval\n      fontspec\n      tikz-qtree\n\n      \u003cspan class=\"org-comment\"\u003e# Source Sans Pro font.\u003c/span\u003e\n      sourcesanspro\n      \u003cspan class=\"org-comment\"\u003e# Source Code Pro font.\u003c/span\u003e\n      sourcecodepro\n      ;\n  });\n\n\u003cspan class=\"org-nix-keyword\"\u003ein\u003c/span\u003e\n\n\u003cspan class=\"org-comment-delimiter\"\u003e# \u003c/span\u003e\u003cspan class=\"org-comment\"\u003eThis is our development shell.\u003c/span\u003e\npkgs.mkShell ({\n  \u003cspan class=\"org-nix-attribute\"\u003ebuildInputs\u003c/span\u003e = [\n    \u003cspan class=\"org-comment\"\u003e# Tangling and weaving for Literate Programming.\u003c/span\u003e\n    pkgs.emacs29-nox\n\n    \u003cspan class=\"org-comment\"\u003e# Diagrams.\u003c/span\u003e\n    pkgs.inkscape\n    pkgs.pdf2svg\n    tex_for_orgmode\n\n    \u003cspan class=\"org-comment\"\u003e# Misc\u003c/span\u003e\n    pkgs.git\n    pkgs.less\n\n    \u003cspan class=\"org-comment\"\u003e# Update deps (bootstrap).\u003c/span\u003e\n    pkgs.niv\n    pkgs.nix\n    pkgs.cacert\n\n    \u003cspan class=\"org-comment\"\u003e# Spell checking.\u003c/span\u003e\n    pkgs.typos\n\n    \u003cspan class=\"org-comment\"\u003e# Link checker.\u003c/span\u003e\n    pkgs.lychee\n\n    \u003cspan class=\"org-comment\"\u003e# Python testing and linting.\u003c/span\u003e\n    pkgs.python3Packages.hypothesis\n    pkgs.python3Packages.mypy\n    pkgs.ruff\n  ];\n})\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Update-Nix-dependencies\" class=\"outline-4\"\u003e\n\u003ch4 id=\"h-Update-Nix-dependencies\"\u003e\u003cspan class=\"section-number-4\"\u003e4.4.1.\u003c/span\u003e Update Nix dependencies\u003c/h4\u003e\n\u003cdiv class=\"outline-text-4\" id=\"text-h-Update-Nix-dependencies\"\u003e\n\u003cp\u003e\nThis is based on Lilac's own code for updating Nix dependencies with \u003ca href=\"https://github.com/nmattia/niv\"\u003e\u003ccode\u003eniv\u003c/code\u003e\u003c/a\u003e.\n\u003c/p\u003e\n\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003cspan class=\"lilac-caption-parent-link\"\u003e\u003ca href=\"#Makefile\"\u003eMakefile-update-deps\u003c/a\u003e\u003c/span\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#__NREF__Makefile-update-deps\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-makefile\" id=\"__NREF__Makefile-update-deps\"\u003e\u003cspan class=\"org-variable-name\"\u003enixpkgs_stable_channel\u003c/span\u003e := nixos-23.11\n\u003cspan class=\"org-makefile-targets\"\u003eupdate-deps\u003c/span\u003e: package/nix/sources.json package/nix/sources.nix\n    cd package \u0026amp;\u0026amp; niv update nixpkgs --branch $(\u003cspan class=\"org-variable-name\"\u003enixpkgs_stable_channel\u003c/span\u003e)\n    cd package \u0026amp;\u0026amp; niv update\n    touch update-deps\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-Elisp\" class=\"outline-3\"\u003e\n\u003ch3 id=\"h-Elisp\"\u003e\u003cspan class=\"section-number-3\"\u003e4.5.\u003c/span\u003e Elisp\u003c/h3\u003e\n\u003cdiv class=\"outline-text-3\" id=\"text-h-Elisp\"\u003e\n\u003cdiv class=\"org-src-container\"\u003e\u003cdiv class=\"lilac-pre-with-caption\"\u003e\u003cdiv class=\"lilac-caption\"\u003e\u003clabel class=\"org-src-name\"\u003ecodex.el\u003c/label\u003e\u003cspan class=\"lilac-caption-link-symbol\"\u003e\u003ca href=\"#codex-el\"\u003e\u0026#x1f517;\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cpre class=\"src src-emacs-lisp\" id=\"codex-el\"\u003e(\u003cspan class=\"org-keyword\"\u003esetq\u003c/span\u003e org-cite-csl-styles-dir\n      (concat (getenv \u003cspan class=\"org-string\"\u003e\"LILAC_ROOT\"\u003c/span\u003e) \u003cspan class=\"org-string\"\u003e\"/deps/styles/\"\u003c/span\u003e))\n\n(\u003cspan class=\"org-keyword\"\u003esetq\u003c/span\u003e org-latex-pdf-process\n  '(\u003cspan class=\"org-string\"\u003e\"lualatex --shell-escape --interaction nonstopmode --output-directory=%o %f\"\u003c/span\u003e))\n\n\u003cspan class=\"lilac-child-link-from-parent\"\u003e\u003ca href=\"#__NREF__codex-html-head\"\u003ecodex-html-head\u003c/a\u003e\u003c/span\u003e\n\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\n\u003cdiv id=\"outline-container-h-References\" class=\"outline-2\"\u003e\n\u003ch2 id=\"h-References\"\u003e\u003cspan class=\"section-number-2\"\u003e5.\u003c/span\u003e References\u003c/h2\u003e\n\u003cdiv class=\"outline-text-2\" id=\"text-h-References\"\u003e\n\u003cstyle\u003e.csl-left-margin{float: left; padding-right: 0em;}\n .csl-right-inline{margin: 0 0 0 2em;}\u003c/style\u003e\u003cdiv class=\"csl-bib-body\"\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_1\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[1]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eA. Aziz, T.-H. Lee, and A. Prakash, \u003ci\u003eElements of Programming Interviews in Python: The Insiders’ Guide\u003c/i\u003e. CreateSpace Independent Publishing Platform (25 July. 2018), 2018.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_2\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[2]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eH. S. Warren, \u003ci\u003eHacker’s Delight\u003c/i\u003e, 2nd ed. Upper Saddle River, NJ: Addison-Wesley, 2013.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_3\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[3]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eA. Levitin and M. Levitin, \u003ci\u003eAlgorithmic Puzzles\u003c/i\u003e. Oxford ; New York: Oxford University Press, 2011.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_4\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[4]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eR. Sedgewick and K. D. Wayne, \u003ci\u003eAlgorithms\u003c/i\u003e, 4th ed. Upper Saddle River, NJ: Addison-Wesley, 2011.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_5\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[5]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eJ. L. Bentley, \u003ci\u003eProgramming Pearls\u003c/i\u003e, 2nd ed. Reading, Mass: Addison-Wesley, 2000.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_6\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[6]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eT. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein, \u003ci\u003eIntroduction to Algorithms\u003c/i\u003e, 3rd ed. Cambridge, Mass: MIT Press, 2009.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_7\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[7]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eS. S. Skiena, \u003ci\u003eThe Algorithm Design Manual\u003c/i\u003e, 2nd ed. London: Springer, 2008.\u003c/div\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"csl-entry\" id=\"citeproc_bib_item_8\"\u003e\n    \u003cdiv class=\"csl-left-margin\"\u003e[8]\u003c/div\u003e\u003cdiv class=\"csl-right-inline\"\u003eD. E. Knuth, \u003ci\u003eThe Art of Computer Programming: Fundamental Algorithms\u003c/i\u003e, 3rd ed. Reading, Mass: Addison-Wesley, 1997.\u003c/div\u003e\n  \u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flistx%2Fcodex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flistx%2Fcodex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flistx%2Fcodex/lists"}