{"id":52947,"date":"2026-08-19T16:47:33","date_gmt":"2026-08-19T20:47:33","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=52947"},"modified":"2026-08-19T16:47:33","modified_gmt":"2026-08-19T20:47:33","slug":"sudoku-in-turing-complete-unicode-transliteration-rules","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2026\/08\/19\/sudoku-in-turing-complete-unicode-transliteration-rules\/","title":{"rendered":"Sudoku in Turing-Complete Unicode Transliteration Rules"},"content":{"rendered":"<p><a href=\"https:\/\/seriot.ch\/computation\/uts35\/\">Nicolas Seriot<\/a> (<a href=\"https:\/\/news.ycombinator.com\/item?id=48829797\">Hacker News<\/a>, <a href=\"https:\/\/www.reddit.com\/r\/programming\/comments\/1uqny65\/unicodes_transliteration_rules_are_turingcomplete\/\">Reddit<\/a>):<\/p>\n<blockquote cite=\"https:\/\/seriot.ch\/computation\/uts35\/\">\n<p>The core Unicode algorithms (normalization, casing, bidi, collation) are deliberately bounded, but <a href=\"https:\/\/www.unicode.org\/reports\/tr35\/tr35-general.html#Transforms\">UTS #35 transliteration rules<\/a>, under their natural unbounded semantics, are not. This is a result I haven&rsquo;t found published before.<\/p>\n<p>These rules ship as <a href=\"https:\/\/github.com\/unicode-org\/cldr\/tree\/main\/common\/transforms\">locale data<\/a> in <a href=\"https:\/\/icu.unicode.org\/\">ICU<\/a>, the Unicode library shipped in operating systems, browsers, runtimes, and databases. Whether a given rule file terminates on a given input is <a href=\"https:\/\/en.wikipedia.org\/wiki\/Halting_problem\">undecidable<\/a>.<\/p>\n<p>[&#8230;]<\/p>\n<p>To prove UTS #35 universality, we compile <a href=\"https:\/\/en.wikipedia.org\/wiki\/Tag_system\">2-tag systems<\/a> (<a href=\"https:\/\/archive.org\/details\/sim_american-journal-of-mathematics_1943-04_65_2\/page\/n3\/mode\/2up\">Post, 1943<\/a>), a model proven universal (<a href=\"https:\/\/dl.acm.org\/doi\/10.1145\/321203.321206\">Cocke &amp; Minsky, 1964<\/a>), into transliteration rules.<\/p>\n<p>[&#8230;]<\/p>\n<p>Transliteration rules were designed to turn &ldquo;&eacute;&rdquo; into &ldquo;e&rdquo;. Three lines of them can compute the Collatz function.<\/p>\n<\/blockquote>\n\n<p><a href=\"https:\/\/x.com\/neoclassic_tech\/status\/2075838696063209634\">KT_Music<\/a>:<\/p>\n<blockquote cite=\"https:\/\/x.com\/neoclassic_tech\/status\/2075838696063209634\">\n<p>Inspired by this,\nI tried creating an implementation that &ldquo;solves #Sudoku&rdquo; using only UTS#35 transformation rules &#x1F60E;<\/p>\n<\/blockquote>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2014\/03\/28\/outlandish-sqlite-recursive-query-examples\/\">Outlandish SQLite Recursive Query Examples<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2020\/05\/25\/solving-the-miracle-sudoku-in-prolog\/\">Solving the &ldquo;Miracle Sudoku&rdquo; in Prolog<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2006\/07\/12\/sudoku-solver\/\">Sudoku Solver<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Nicolas Seriot (Hacker News, Reddit): The core Unicode algorithms (normalization, casing, bidi, collation) are deliberately bounded, but UTS #35 transliteration rules, under their natural unbounded semantics, are not. This is a result I haven&rsquo;t found published before. These rules ship as locale data in ICU, the Unicode library shipped in operating systems, browsers, runtimes, and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2026-08-19T20:47:38Z","apple_news_api_id":"f779f88f-3745-49b7-80f9-5a0c601a5c92","apple_news_api_modified_at":"2026-08-19T20:47:38Z","apple_news_api_revision":"AAAAAAAAAAD\/\/\/\/\/\/\/\/\/\/w==","apple_news_api_share_url":"https:\/\/apple.news\/A93n4jzdFSbeA-VoMYBpckg","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[4],"tags":[263,2616,418,266,71,188,258],"class_list":["post-52947","post","type-post","status-publish","format-standard","hentry","category-programming-category","tag-theory","tag-fun-hack","tag-game","tag-icu","tag-programming","tag-sudoku","tag-unicode"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52947","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=52947"}],"version-history":[{"count":1,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52947\/revisions"}],"predecessor-version":[{"id":52948,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52947\/revisions\/52948"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=52947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=52947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=52947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}