
    <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
      <title>graham's blog (#phonetic pangrams)</title>
      <subtitle>to distract from existential dread</subtitle>
      <link href="https://graham.build/s/a-blog/about/phonetic pangrams/feed.xml"/>
      <link href="https://graham.build/"/>
      <updated>2026-01-03T06:30:00.000Z</updated>
      <id>https://graham.build/</id>
      <author>
        <name>graham</name>
      </author>
      
        <entry>
          <title>Phonetic Pangram Tool</title>
          <link href="https://graham.build/s/a-blog/036-phonetic-pangram-tool/" />
          <id>https://graham.build/s/a-blog/036-phonetic-pangram-tool/</id>
          <published>2026-01-03T06:30:00.000Z</published>
          <updated>2026-01-03T06:30:00.000Z</updated>
          <category>wordplay</category>
<category>phonetic pangrams</category>
          <content type="html">
            &lt;p&gt;After spending last night writing that blog post about &lt;a href=&quot;/s/a-blog/035-pokemon-phonetic-pangram&quot;&gt;pokemon phonetic pangrams&lt;/a&gt;, I felt like I was done with this hyperfixation and could move onto other things&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;. This morning proved me wrong when I had the thought&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hey isn&#039;t making a pangram kind of just a very specific case of that &lt;a href=&quot;/s/a-blog/017-crowdpleaser-words&quot;&gt;daily word game&lt;/a&gt; you made last year?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Suffice it to say that that inkling was correct, and it &lt;em&gt;only&lt;/em&gt; took me &lt;em&gt;all day&lt;/em&gt; to remember how that all worked, copy it into a new project, modify that into working for phonetic pangrams, set that project up with Render&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt; for hosting, upload the iframe pointed there from &lt;a href=&quot;http://itch.io&quot;&gt;itch.io&lt;/a&gt;, and build out a new &lt;a href=&quot;http://itch.io&quot;&gt;itch.io&lt;/a&gt; page for the project. Take a look below:&lt;/p&gt;
&lt;iframe title=&quot;Phonetic Pangrams itch.io embed&quot; frameborder=&quot;0&quot; src=&quot;https://itch.io/embed/4167222?bg_color=262215&amp;amp;fg_color=ebe3cc&amp;amp;link_color=b57f00&amp;amp;border_color=ebe3cc&quot; width=&quot;552&quot; height=&quot;167&quot;&gt;&lt;a href=&quot;https://anvilfood.itch.io/phonetic-pangrams&quot;&gt;Phonetic Pangrams by graham&lt;/a&gt;&lt;/iframe&gt;
&lt;p&gt;It works with pokemon and the CMU phonetic dictionary, which covers a bunch of English words and names. It only supports General American English&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; for now, but I think there are ways to extend that to other dialects going forward, with enough data about how the phonemes change.&lt;/p&gt;
&lt;p&gt;Anyway, in the interest of keeping it short, that&#039;s it! Enjoy, and please share your phonetic pangrams with each other and me on there. As far as I know, there does not yet exist a solved solution for phonetic pangrams in English the way that there are now for pokemon names.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Like finishing up the hxh fanart, or reading, or touching grass between rainstorms in the Bay, that sort of thing. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I once again really wanted to be able to rely on websockets for checking whether a given word matched the corpus on the server. Otherwise, everyone using the tool would have to download a big file of all possible words and names and their pronunciations. Shout-outs to Render! &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;And if you want a bonus difficulty level, I recommend using the &lt;code&gt;/x/&lt;/code&gt; phoneme of &lt;code&gt;loch /lɑx/&lt;/code&gt;. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;

          </content>
        </entry>
      

        <entry>
          <title>Pokemon Phonetic Pangram</title>
          <link href="https://graham.build/s/a-blog/035-pokemon-phonetic-pangram/" />
          <id>https://graham.build/s/a-blog/035-pokemon-phonetic-pangram/</id>
          <published>2026-01-02T16:00:00.000Z</published>
          <updated>2026-01-02T16:00:00.000Z</updated>
          <category>pokemon</category>
<category>wordplay</category>
<category>phonetic pangrams</category>
          <content type="html">
            &lt;p&gt;As a follow-up to &lt;a href=&quot;/s/a-blog/034-pokemon-gen-1-phonetic-pangram&quot;&gt;my previous post&lt;/a&gt;, I have uploaded the data and my previous solution to &lt;a href=&quot;https://codeberg.org/anvilfood/pokemon-phonetic-pangrams&quot;&gt;codeberg&lt;/a&gt;. Last time, I learned that &lt;code&gt;Slither Wing&lt;/code&gt; is the only pokemon across all current generations to contain the &lt;code&gt;ð&lt;/code&gt; phoneme, which meant that only datasets that included gen-9 could form &lt;em&gt;true&lt;/em&gt; phonetic pangrams for General American English. With this in mind, I scraped the rest of the generations and compiled them into one unified dataset for all pokemon. As expected, I was able to find several 11-pokemon pangrams&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; by simply using the new dataset, but it made me wonder if there existed any pangrams with even fewer pokemon. I tried running the 10-mon pangram attempt across all gens and found that nothing happened for a while, even with the caching I had explained in the previous post.&lt;/p&gt;
&lt;h3&gt;Technical Hurdles&lt;/h3&gt;
&lt;p&gt;After discussing this with some of my friends on Discord, it became clear that the size of the problem-space being explored had grown very quickly with the size of the dataset of pokemon, just as predicted. For gen-1, there were at most (151 &lt;a href=&quot;https://en.wikipedia.org/wiki/Combination#Number_of_k-combinations&quot;&gt;choose&lt;/a&gt; 10) combinations of pokemon to find a set that covered all 37 represented phonemes in that set. For all gens, it was more like (1025 choose 10) combinations, which is roughly 269 million times more. Despite this, I tried to simply run the program and wait. I was rewarded with a new problem:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;$ bun run main.ts
136 |           if (!cache.has(cacheKey)) {
137 |             if (solution.names.size &amp;lt; SetCoverSizeToBeat - 1) {
138 |               const idx = queue.findIndex(s =&amp;gt; s.phones.size &amp;lt;= solution.phones.size)
139 |               queue.splice(idx, 0, solution)
140 |             }
141 |             cache.add(cacheKey)
                        ^
RangeError: Out of memory
      at &amp;lt;anonymous&amp;gt; (/Users/g/Documents/programming/pokemon/phonetic_pangram/main.ts:141:19)
      at forEach (1:11)
      at &amp;lt;anonymous&amp;gt; (/Users/g/Documents/programming/pokemon/phonetic_pangram/main.ts:133:17)
      at forEach (1:11)
      at main (/Users/g/Documents/programming/pokemon/phonetic_pangram/main.ts:132:22)
      at /Users/g/Documents/programming/pokemon/phonetic_pangram/main.ts:153:1
      at loadAndEvaluateModule (2:1)

Bun v1.3.3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It makes sense that this program would run out of memory because the cache is adding new paths that have been visited constantly until the program finishes. In the past, this was a small enough problem space to avoid memory issues, but now the problem space had simply ballooned too much for the cache to handle. I looked into how I could make the size of what I was storing smaller. For one, I was storing the cache key as a set of strings that contained all the letters of the pokemon being represented in the path. By &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode&quot;&gt;replacing a given pokemon with a single character&lt;/a&gt;, I was able to shorten this from an average of 7.6 characters per pokemon name to 1, which reduced the cache size by a factor of ~7x. This did not solve my out of memory issue.&lt;/p&gt;
&lt;p&gt;Googling around, I learned that Typescript &lt;a href=&quot;https://stackoverflow.com/questions/58674238/did-my-javascript-run-out-of-asyncids-rangeerror-in-inspector-async-hook-js&quot;&gt;has a hard-limit on the number of members in a set or a map&lt;/a&gt;. It turns out that this limit is far below the number of possible solutions to explore, even with the reduced dataset size. Similar to one of the suggestions on stackoverflow, I implemented a &lt;code&gt;BigSet&lt;/code&gt; class that just created a new set every time the old one was about to be full. This allowed the program to run without hitting javascript memory limits. But it meant that it quickly used up 13GB of RAM on my computer, even when no other programs were running.&lt;/p&gt;
&lt;p&gt;Next, I tried seeing if any of the pokemon I was considering had phonemes that were a subset of any other pokemon pronunciations. For example &lt;code&gt;Kadabra&lt;/code&gt; clearly contains all the phonemes that &lt;code&gt;Abra&lt;/code&gt; does. It&#039;s reasonable to skip &lt;code&gt;Abra&lt;/code&gt; if the goal is just to find the existence of any phonetic pangram, since any one that would use Abra could instead use Kadabra. Continuing this pattern reduced the number of pokemon from 1025 down to 789, which reduced the problem space by a factor of about 13x. This also did not solve my out of memory issue.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;To try to limit the remaining unknowns about the full pokemon dataset, I separately tried looking up pangrams for 1, 2, ..., 7, and 8 pokemon. I knew from size-10 and size-11 ones that even a single answer could come in much faster than my computer hitting its memory limits. I found that I was successfully able to exhaust the problem space for all 1-to-8-sized phonetic pangrams. This left just 9 and its memory issues as the only remaining hurdle.&lt;/p&gt;
&lt;p&gt;It was clear I needed to try something else. My friends suggested a &lt;a href=&quot;https://en.wikipedia.org/wiki/Bloom_filter&quot;&gt;bloom filter&lt;/a&gt;, since those are really good at telling if a given thing (list of pokemon) is either &amp;quot;definitely not&amp;quot; or &amp;quot;maybe is&amp;quot; in a given collect. For a problem like this that has a lot of &amp;quot;wrong answers&amp;quot; relative to the number of &amp;quot;correct answers,&amp;quot; it seemed like a well-tuned bloom filter could work great. That said, I had plans for New Years Eve, so I uploaded what I had to codeberg and let my friends try to nerdsnipe anybody else into solving it a different way.&lt;/p&gt;
&lt;h3&gt;The Same Sort of Algorithm, but in Rust&lt;/h3&gt;
&lt;p&gt;Micolous was able to make a number of &lt;a href=&quot;https://github.com/micolous/mon-pangrams&quot;&gt;algorithmic optimizations&lt;/a&gt; to what I had contributed so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instead of storing sets of names in the cache as letters representing pokemon, and instead of storing the phonemes represented by those pokemon names as a set, liberal usage of &lt;a href=&quot;https://en.wikipedia.org/wiki/Mask_(computing)&quot;&gt;bitmasking&lt;/a&gt; allowed for much smaller amounts of memory used&lt;/li&gt;
&lt;li&gt;Instead of exhaustively searching for every solution to the problem, focus on finding even a single solution at the current desired length&lt;/li&gt;
&lt;li&gt;While looking for a solution, throw out any path that would be worse (i.e. necessarily have more pokemon names) than the current best solution&lt;/li&gt;
&lt;li&gt;Keep all previous optimizations like the limited data-set with pokemon like &lt;code&gt;Abra&lt;/code&gt; removed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With these and a little fine-tuning for data-labelling issues from the pokemonlp wiki, it was finally possible to find the first valid 9-pokemon phonetic pangram for General American English:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Heatmor
Typhlosion
Noibat
Vulpix
Growlithe
Poochyena
Shedinja
Illumise
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As expected, it had &lt;code&gt;Slither Wing&lt;/code&gt;. Unlike the previous post, &lt;code&gt;Typhlosion&lt;/code&gt; took the place of &lt;code&gt;Persian&lt;/code&gt;, undoubtedly because of how many more phonemes it contains (8 total versus 5). I was excited to see this news and have a new, clearer goal to work towards. Surely implementing all of the same optimizations in my own code would allow me to get similar results.&lt;/p&gt;
&lt;h3&gt;Hoisted by my Own Petard&lt;/h3&gt;
&lt;p&gt;I spent the better part of New Year&#039;s Day rewriting the set logic I used for determining which phonemes a given solution had so far to instead use bitmasking like Micolous&#039;s. It took some time, but I was happy once it was working. I had the thought that I could stop writing code on my laptop and instead practice with my new split keyboard&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; on my desktop by pushing what I had to codeberg again and then pulling it down from the cloud.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn4&quot; id=&quot;fnref4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Upon pulling the latest from main and getting the script set up to run, I ran my version on the 9-gram, and found that I got an answer too! This was exhilarating compared to my machine turning on its fans and maxing out RAM for hours with no results. But of course, this had to be because of the optimizations I had spent all day implementing, right?&lt;/p&gt;
&lt;p&gt;I tried rewinding the code to what I had days prior when I had been trying to overcome the technical hurdles on my own. That also ran flawlessly on my desktop computer. It turns out that having similar but not exactly the same specs across a laptop and a desktop can lead to wildly different experiences when it comes to problems like this one. I&#039;m embarrassed that I didn&#039;t try this sooner.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I have yet to get &lt;em&gt;every&lt;/em&gt; 9-pokeon phonetic pangram across all generations, because I did eventually run into memory-hog issues and didn&#039;t want to keep working on optimizations for a problem with so many solutions.&lt;/p&gt;
&lt;p&gt;Below are the first 20&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn5&quot; id=&quot;fnref5&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt; that my algorithm found:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Basculegion
Shaymin
Charizard
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Exeggcute
Shaymin
Jirachi
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Chi-Yu
Aegislash
Blaziken
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Chi-Yu
Aegislash
Rayquaza
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Chi-Yu
Shedinja
Blaziken
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Chi-Yu
Shedinja
Rayquaza
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Poochyena
Aegislash
Blaziken
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Poochyena
Aegislash
Rayquaza
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Poochyena
Shedinja
Blaziken
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Poochyena
Shedinja
Rayquaza
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Charmeleon
Aegislash
Blaziken
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Charmeleon
Aegislash
Rayquaza
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Charmeleon
Shedinja
Blaziken
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Houndoom
Charmeleon
Shedinja
Rayquaza
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Gouging Fire
Exeggcute
Hawlucha
Shaymin
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Gouging Fire
Exeggcute
Honchkrow
Shaymin
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Gouging Fire
Exeggcute
Hitmonchan
Shaymin
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Gouging Fire
Exeggcute
Shaymin
Hitmonchan
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Gouging Fire
Exeggcute
Shaymin
Honchkrow
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Dragapult
Venomoth
Gouging Fire
Exeggcute
Shaymin
Hawlucha
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Obviously, as mentioned before, every answer necessarily had to have &lt;code&gt;Slither Wing&lt;/code&gt;. Additionally, every answer my program found contained &lt;code&gt;Typhlosion&lt;/code&gt; and &lt;code&gt;Noibat&lt;/code&gt;. While these 20 above all included &lt;code&gt;Dragapult&lt;/code&gt;, there were eventually others like these following two that broke that pattern:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Clobbopus
Meowth
Hariyama
Shedinja
Ninetales
Galvantula
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Slither Wing
Typhlosion
Noibat
Rookidee
Venomoth
Gouging Fire
Poochyena
Iron Hands
Shaymin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that every pokemon generation has been included, now that the minimum-length phonetic pangram for General American English has been discovered, and now that we know &lt;em&gt;several&lt;/em&gt; of the minimum-length one in particular, it seems like this problem is ready to be put away for a little while. Maybe when one of those things changes in the future, I&#039;ll unearth this problem again.&lt;/p&gt;
&lt;p&gt;After all, when it comes to the world of pokemon pronunciation set-covering optimization problems:&lt;/p&gt;
&lt;p&gt;I want to be the very best.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Any of the sets from gen 1 listed at the end of the previous post, plus Slither Wing, for example. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;However, I did learn that the phonemes in &lt;code&gt;Arceus&lt;/code&gt; are a subset of the phonemes contained within &lt;code&gt;Cofagrigous&lt;/code&gt;, which was surprising to me! &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;A &lt;a href=&quot;https://www.zsa.io/moonlander&quot;&gt;Moonlander&lt;/a&gt; that my job paid for, which I have yet to bring into the office because I&#039;m still getting used to the layout. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Decades ago, it used to be the case that transferring files between computers was most quickly done over USBs. These days, that feels like so much effort compared to pushing to a git repo, at least for small code repos like this that are already being stored in the cloud. &lt;a href=&quot;#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn5&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;By the time I stopped the program, I had found 933 9-pokemon pangrams. While this technically only represents a lower-limit, it seemed good enough to stop searching/optimizing for now. &lt;a href=&quot;#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;

          </content>
        </entry>
      

        <entry>
          <title>Pokemon Gen 1 Phonetic Pangram</title>
          <link href="https://graham.build/s/a-blog/034-pokemon-gen-1-phonetic-pangram/" />
          <id>https://graham.build/s/a-blog/034-pokemon-gen-1-phonetic-pangram/</id>
          <published>2025-12-28T21:40:00.000Z</published>
          <updated>2025-12-28T21:40:00.000Z</updated>
          <category>pokemon</category>
<category>wordplay</category>
<category>phonetic pangrams</category>
<category>longpost</category>
          <content type="html">
            &lt;p&gt;As I mentioned in my &lt;a href=&quot;/s/a-blog/033-phonetic-pangrams&quot;&gt;previous post&lt;/a&gt;, a phonetic pangram is a sentence or phrase that covers every one of the sounds in a given dialect of a language. Since proper nouns can form a phrase, a phonetic pangram could potentially be made from any sufficiently large collection of names.&lt;/p&gt;
&lt;p&gt;This led me to the question: &amp;quot;Is it possible to make a phonetic pangram from pokemon names?&amp;quot; and more specifically, &amp;quot;Can we do so using only the 151 from the first generation of pokemon?&amp;quot;&lt;/p&gt;
&lt;h3&gt;Phonetics&lt;/h3&gt;
&lt;p&gt;For General American English, &lt;a href=&quot;https://en.wikipedia.org/wiki/English_phonology&quot;&gt;wikipedia&lt;/a&gt; lists the following sounds that comprise every commonly spoken word:&lt;/p&gt;
&lt;h4&gt;Consonants (24&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;m, n, ŋ, p, b, t, d, k, ɡ, tʃ, dʒ, f, v, θ, ð, s, z, ʃ, ʒ, h, l, r, j, w&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;Vowels (14)&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;ɪ, i, ʊ, u, ɛ, eɪ, ə, oʊ, æ, ɑ, aɪ, ɔɪ, aʊ, ɚ&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;To make a pangram, I simply needed pokemon names that encompassed each of these 38 phonemes. You could imagine a worst case of 38, where each pokemon is picked for having exactly on phoneme represented in its name, though I figured there was probably more overlap than that.&lt;/p&gt;
&lt;h3&gt;Pokemon name pronunciations&lt;/h3&gt;
&lt;p&gt;I was able to find &lt;a href=&quot;https://pokemonlp.antifandom.com/wiki/Pok%C3%A9mon_Pronunciation_Guide/Generation_I&quot;&gt;the pronunciations of all 151 gen 1 pokemon&lt;/a&gt;. I copied the table and kept only the name and IPA pronunciation columns. A given pokemon name contains many phonemes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ekans &lt;code&gt;ɛkənz&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;First, I had to figure out whether the set of these pokemon match the 48 phonemes labeled above. To do this, I iterated over every row and added the phonemes for that pokemon&#039;s pronunciation to an ever-growing set. Once I reached the end, I found that there were more than 48 phonemes represented, which meant I needed to do some data cleanup.&lt;/p&gt;
&lt;h3&gt;Data Cleanup&lt;/h3&gt;
&lt;p&gt;There are four different kinds of cleanup that were necessary for this dataset:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Two-character phonemes:&lt;/strong&gt; for diphthongs and dual-character phonemes like &lt;code&gt;dʒ&lt;/code&gt;, I needed to replace these combos with single-character variants instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Americanized phonemes:&lt;/strong&gt; because of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Cot%E2%80%93caught_merger&quot;&gt;cot/caught merger&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Hurry%E2%80%93furry_merger&quot;&gt;hurry/furry merger&lt;/a&gt;, among others, it was necessary to map all present phonemes that other dialects used onto General American English.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incorrect phonemes:&lt;/strong&gt; There were a couple of places like Victreebel where phones like &lt;code&gt;/r/&lt;/code&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt; which seemed like a mistake, to my ears.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ambiguous phonemes:&lt;/strong&gt; In the case of Nidoran♂ and Nidoran♀, it is unclear whether the names are supposed to include &amp;quot;male&amp;quot; and &amp;quot;female&amp;quot; in the pronunciations. Even canonical anime pronunciations differ depending on episode.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; For the purposes of this challenge, it seemed best to omit them.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After cleanup, I continued to work on the problem.&lt;/p&gt;
&lt;h3&gt;Set Cover&lt;/h3&gt;
&lt;p&gt;I got an old familiar feeling while doing this problem. I thought maybe it was from a previous &lt;a href=&quot;https://adventofcode.com&quot;&gt;advent of code&lt;/a&gt; or something. I couldn&#039;t remember what the problem I was thinking of was formally called -- only previous times that I had encountered it.&lt;/p&gt;
&lt;p&gt;In designing levels for &lt;a href=&quot;https://anvilfood.itch.io/snails-and-sorcery&quot;&gt;Snails and Sorcery&lt;/a&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn4&quot; id=&quot;fnref4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;, I mapped out every single mechanic for every single level into a big spreadsheet so that I could tell at a glance whether a given level was introducing too many mechanics at once. Later, I wanted to see which levels would make the smallest set while representing every mechanic.&lt;/p&gt;
&lt;p&gt;Another place this has come up is in Magic: the Gathering combos. There&#039;s a silver-bordered&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn5&quot; id=&quot;fnref5&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt; card that lets you win the game if you make a pangram with card names.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cards.scryfall.io/large/front/9/5/95c790e6-340f-42c2-af88-e458b7b9690c.jpg&quot; alt=&quot;Now I Know My ABCs, a card that checks if you control cards whose names span the English alphabet&quot;&gt;&lt;/p&gt;
&lt;p&gt;Trying to find the smallest combo of card names to achieve this pangram is the same problem, just put in a slightly different context.&lt;/p&gt;
&lt;p&gt;When I asked around, my friends told me that this was a &lt;a href=&quot;https://en.wikipedia.org/wiki/Set_cover_problem&quot;&gt;classic Set Cover problem&lt;/a&gt; and that it&#039;s a notoriously difficult problem once the problem size grows big enough.&lt;/p&gt;
&lt;p&gt;Here I was, once again wondering if there was some collection of things (i.e. pokemon names) that would cover all of a set (i.e. General American English phonemes). Thankfully this problem has the benefit that the set of all pokemon (especially just gen 1) is plenty small compared to the set of all MTG cards and is also very small compared to the limit where solving this problem would take too long to complete.&lt;/p&gt;
&lt;h3&gt;A greedy approximation&lt;/h3&gt;
&lt;p&gt;Generally with Set Cover, it&#039;s a lot easier to get a solution that&#039;s pretty good than a solution that&#039;s provably the best. Instead of worrying about the best next step, a heuristic like &amp;quot;start by adding the item which has the fewest overlaps with other items&amp;quot; can get close enough. In this case, that&#039;d be a pokemon whose names contain a phoneme or phonemes that are shared least by the other pokemons&#039; names in the set.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Persian &lt;code&gt;pɝʒən&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Persian is the only gen one pokemon with the &lt;code&gt;ʒ&lt;/code&gt; sound. This means that Persian must be included in every gen 1 phonetic pangram. It also means that &lt;code&gt;p&lt;/code&gt;,&lt;code&gt;ɝ&lt;/code&gt;,&lt;code&gt;ə&lt;/code&gt;, and &lt;code&gt;n&lt;/code&gt; get covered automatically.&lt;/p&gt;
&lt;p&gt;For all other &amp;quot;least common remaining phonemes&amp;quot;, there would be more than one pokemon which contained that phoneme in its name. For instance:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vulpix &lt;code&gt;vʊlpɪks&lt;/code&gt;, Bulbasaur &lt;code&gt;bʊlbəsɑɹ&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Blastoise &lt;code&gt;blæstɔɪs&lt;/code&gt;, Cloyster &lt;code&gt;klɔɪstɚ&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which of the pokemon names in these pairs is better to add? Is it better to add a pokemon from the first pair or the second one? For this greedy approximation, I went with &amp;quot;the one from the first-looked-at-phoneme that will cause the most phonemes to be added to the covering set, or go with the last pokemon if there&#039;s a tie.&amp;quot; In this case, that&#039;s &lt;code&gt;Bulbasaur&lt;/code&gt; because &lt;code&gt;b ʊ l ə s ɑ ɹ&lt;/code&gt; is seven more phonemes covered, as compared with &lt;code&gt;v ʊ l ɪ k s&lt;/code&gt; the six from &lt;code&gt;Vulpix&lt;/code&gt; when you account for &lt;code&gt;p&lt;/code&gt; already being covered by &lt;code&gt;Persian&lt;/code&gt;. From here it&#039;s possible to continue and get an answer, but remember that that&#039;s still a heuristic (good enough) approximation rather than a provably best answer.&lt;/p&gt;
&lt;p&gt;From here, there was a bunch of trial and error to discover and fix the points mentioned in the data cleanup. Originally, the next to choose from was Nidoran♀ because it contained an empty space &lt;code&gt; &lt;/code&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;#fn6&quot; id=&quot;fnref6&quot;&gt;[6]&lt;/a&gt;&lt;/sup&gt;. Next, every answer included Victreebel because it was the only one containing &lt;code&gt;/r/&lt;/code&gt;. Then, every answer contained Omanyte or Arcanine because they contained &lt;code&gt;ɑɪ&lt;/code&gt; instead of &lt;code&gt;aɪ&lt;/code&gt;. This continued for a while.&lt;/p&gt;
&lt;p&gt;After working through cleaning up all of these edge cases, there was finally a reasonable approximate answer:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csv&quot;&gt;Persian 
Bulbasaur
Blastoise
Meowth
Sandshrew
Hypno
Exeggcute
Koffing
Squirtle
Ivysaur
Charmander
Pidgey
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;These 12 pokemon names looked to form a nice phonetic pangram. But could the same be achieved with 11? 10?&lt;/p&gt;
&lt;h3&gt;Minmaxing with Recursion™&lt;/h3&gt;
&lt;p&gt;I noticed while writing the greedy heuristic algorithm that one aspect (number of pokemon names which contain this next phoneme)was minimized while another aspect (the number of phonemes that would get added to the covering set) was maximized. By thinking of these steps as a two-player game, it&#039;s possible to reframe this problem as a version of &lt;a href=&quot;https://en.wikipedia.org/wiki/Minimax&quot;&gt;Minimax&lt;/a&gt;. Similar to how humans and computers &amp;quot;think ahead&amp;quot; a number of moves in a game like chess, perhaps the best move (pokemon to choose) at a given step could be dependent on thinking X-many moves ahead?&lt;/p&gt;
&lt;p&gt;I wrote a recursive algorithm in Typescript for solving this problem. If there were no phonemes that still needed to be added to the set, then the program could stop and return the solution. A given solution could be rated by its number of pokemon names. The best solution would be one that minimized the number of pokemon, which could be filtered for after exploring all of the possible solutions.&lt;/p&gt;
&lt;h3&gt;Searching without Recursion™&lt;/h3&gt;
&lt;p&gt;Javascript, which Typescript runs under the hood, has a max number of times that a recursive function can call itself (i.e. &amp;quot;max depth&amp;quot;) of 10 times. I immediately ran into this limit. I should have known better when I selected this language for writing the algorithm in the first place, but I forgot. There are ways around the max depth restriction, but I find it&#039;s always good practice for code maintainability to unwind the recursion. Generally recursion asks the person reading the code to maintain the state of the program in their head, whereas other approaches can make that state much clearer and easier to inspect when things go wrong.&lt;/p&gt;
&lt;p&gt;I rewrote the algorithm to be more like searching an N-dimensional grid, where each pokemon chosen was like a new direction through a maze, and the set of pokemon names at the end was like the path taken to get to the finish. The goal was to minimize the path length, and at each step along the way, I kept track of &amp;quot;the path so far&amp;quot; for every possible &amp;quot;next step to take&amp;quot;. As I got to a branching point in the maze, I just added each of the &amp;quot;potential next steps to take&amp;quot; to a list. When the list was empty, I knew that all possible paths had been exhausted.&lt;/p&gt;
&lt;p&gt;This time, when I ran the program, it didn&#039;t immediately error out. In fact, it didn&#039;t do much of anything for a very long time, and I got bored.&lt;/p&gt;
&lt;h3&gt;Speeding up the search with pruning&lt;/h3&gt;
&lt;p&gt;Given that the greedy heuristic solution found a way through the &amp;quot;maze&amp;quot; in 12 steps, I knew that I could get rid of any potential next step that would be greater than or equal to 12 steps long. This is sort of like a simple version of &lt;a href=&quot;https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning&quot;&gt;alpha-beta pruning&lt;/a&gt;, in that I was pruning out solutions that were known to be worse than the greedy approximation solution of 12. This optimization may have helped, but not enough for me to notice.&lt;/p&gt;
&lt;p&gt;Next, I tried to keep the list ordered by how long the path had been so far. This helped avoid looking at bad solutions before good ones, but I found that the program still took a very long time.&lt;/p&gt;
&lt;p&gt;When I looked at what was happening step by step towards the beginning of the search, I noticed that there were ways for the same list of pokemon to show up in a solution, just in a different order. Going back to the greedy algorithm example from before:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vulpix &lt;code&gt;vʊlpɪks&lt;/code&gt;, Bulbasaur &lt;code&gt;bʊlbəsɑɹ&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Blastoise &lt;code&gt;blæstɔɪs&lt;/code&gt;, Cloyster &lt;code&gt;klɔɪstɚ&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In exploring each of these possibilities, there would be one that would look like &lt;code&gt;Persian, Vulpix, Blastoise&lt;/code&gt; and another that would look like &lt;code&gt;Persian, Blastoise, Vulpix&lt;/code&gt;. These two states are equivalent in terms of how much they cover the set of phonemes, but the paths to get to each were different-looking enough that my code was treating them as independent solutions.&lt;/p&gt;
&lt;p&gt;I decided to make an in-memory cache that would tell me whether I had &amp;quot;been to this part of the maze&amp;quot; before. All I had to do was name each spot in the maze in a way that would give the same name every time I asked for the same spot. For instance, the first spot in the maze could be called &lt;code&gt;Persian&lt;/code&gt; since the algorithm only had one choice. Then when I added new names, I could sort them all alphabetically, and then join them together into a single name like &lt;code&gt;Persian|Vulpix&lt;/code&gt; or &lt;code&gt;Blastoise|Persian|Vulpix&lt;/code&gt;. By storing each place name I had already been, I could avoid accidentally back-tracking through parts of the maze. This greatly sped up how long the search took to solve.&lt;/p&gt;
&lt;h3&gt;The final results&lt;/h3&gt;
&lt;p&gt;After running and re-running to find the best solutions, these were the solutions I found. Note that Persian, Blastoise, and Vulpix are in all of them:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Shellder
Hitmonchan
Ninetales
Cubone
Jigglypuff
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Shellder
Hitmonchan
Ninetales
Cubone
Jynx
Wigglytuff
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Shellder
Hitmonchan
Primeape
Cubone
Jigglypuff
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Shellder
Rhyhorn
Clefable
Charmeleon
Geodude
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Oddish
Clefable
Rhyhorn
Charmeleon
Geodude
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Sandshrew
Rhyhorn
Clefable
Charmeleon
Geodude
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Sandshrew
Rhyhorn
Clefable
Charmeleon
Pidgeotto
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Rapidash
Rhyhorn
Clefable
Charmeleon
Geodude
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Growlithe
Sandslash
Rhyhorn
Clefable
Charmeleon
Geodude
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Persian
Blastoise
Vulpix
Meowth
Shellder
Hitmonchan
Primeape
Cubone
Jigglypuff
Weezing
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;While writing this post, I had to go back through and double check everything. After all, who would ever want to be wrong on the internet?&lt;/p&gt;
&lt;p&gt;I took one of the sets of phonemes from these final results and checked each phoneme against the list at the beginning. There was one missing. Apparently, throughout my process cleaning, running, readjusting, etc I had thought that there were 38 phonemes present, but it was just an errant &lt;code&gt;ˌ&lt;/code&gt; in &lt;code&gt;/ˌpɪdʒiːˈoʊɾoʊ/&lt;/code&gt; and a few others that had caused the number to look right when it wasn&#039;t. Upon cleaning that final non-phoneme up, my solutions all read 37. The missing phoneme throughout all of this has been &lt;code&gt;ð&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sure, there&#039;s some &lt;a href=&quot;https://en.wikipedia.org/wiki/Sunk_cost&quot;&gt;sunk cost&lt;/a&gt; aspect to have written all of this only to have the answers to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Is it possible to make a phonetic pangram from pokemon names?&amp;quot; and more specifically, &amp;quot;Can we do so using only the 151 from the first generation of pokemon?&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;be &amp;quot;no.&amp;quot; I double-checked that I hadn&#039;t missed any pronunciations. Was Growlithe maybe actually pronounced like &amp;quot;tithe&amp;quot;? No, it definitely used &lt;code&gt;θ&lt;/code&gt; in the pronunciation guide.&lt;/p&gt;
&lt;p&gt;Ok, so the above solutions are sufficient for 37/38 phonemes, which seems like as good as could be done for gen 1. What generation of pokemon does &lt;code&gt;ð&lt;/code&gt; first show up in? According to the same dataset I got these gen 1 pronunciations from, it wasn&#039;t until &lt;a href=&quot;https://antifandom.com/pokemonlp/wiki/Pok%C3%A9mon_Pronunciation_Guide/Generation_IX&quot;&gt;Gen IX&lt;/a&gt; that there finally was a pokemon whose english pronunciation contained &lt;code&gt;ð&lt;/code&gt;. It was &lt;a href=&quot;https://bulbapedia.bulbagarden.net/wiki/Slither_Wing_(Pok%C3%A9mon)&quot;&gt;Slither Wing&lt;/a&gt;. The only other pokemon to ever have &lt;code&gt;ithe&lt;/code&gt; in its name was Growlithe.&lt;/p&gt;
&lt;p&gt;To get a phonetic pangram with pokemon, it&#039;s possible to add Slither Wing to any of the above solutions and have 11 names cover it. I&#039;ll postpone looking into phonetic pangrams across all gens for &lt;a href=&quot;/s/a-blog/035-pokemon-phonetic-pangram&quot;&gt;a future post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As for gen 1 specifically, maybe I&#039;ll try to start saying Growlithe with a &lt;code&gt;ð&lt;/code&gt; from now on, and say it&#039;s 11 pokemon for gen 1 to make a phonetic pangram. You might say &amp;quot;but if Growlithe uses &lt;code&gt;ð&lt;/code&gt;, then how will you get the &lt;code&gt;θ&lt;/code&gt; you previously used it to cover?&amp;quot; and I would reply simply:&lt;/p&gt;
&lt;p&gt;Meowth &lt;code&gt;/miːˈaʊθ/&lt;/code&gt;, that&#039;s right.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Note that while my previous pangrams included the &lt;code&gt;/x/&lt;/code&gt; sound of &amp;quot;loch&amp;quot; and &amp;quot;chutzpah&amp;quot;, this is a rare and often excluded phoneme for General American English. I included it in those because it was a fun constraint to work around, but I&#039;m ignoring it here because no pokemon in any gen have that sound at all, and it&#039;d be a kind of boring exercise. &lt;a href=&quot;#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;This is the rolled r trill that gets used in Spanish and Scottish English, among other places. &lt;a href=&quot;#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Gen 1 didn&#039;t have the concept of pokemon gender outside of these two names. Gen 2 added gender for every pokemon, but never consolidated Nidoran into a single entry for legacy pokedex numbering reasons. The anime includes &lt;a href=&quot;https://youtu.be/EJHqzKQ3guQ&quot;&gt;a pokedex entry that does say the gender&lt;/a&gt; but also includes &lt;a href=&quot;https://youtu.be/xMk8wuw7nek&quot;&gt;the pokerap, which does not say the gender&lt;/a&gt;. Human characters in the anime tend not to say the gender, and I imagine this would be the case in real life too: you wouldn&#039;t say the gender unless specifically asked or unless you had to disambiguate. &lt;a href=&quot;#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;You may remember this as &lt;a href=&quot;/s/a-blog/001-wizard-sokoban&quot;&gt;Wizard Sokoban&lt;/a&gt; prior to the name change last year. &lt;a href=&quot;#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn5&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Silver-bordered in that game means &amp;quot;don&#039;t take this too seriously&amp;quot; and tends to involve meta-mechanics and humor. &lt;a href=&quot;#fnref5&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn6&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;A space character in the pronunciation was treated as a distinct phoneme, and then &lt;code&gt;/ˈniːdoʊɹæn (ˈfiːmeɪl)/&lt;/code&gt; added a bunch more phonemes to the set, so it was always selected &lt;a href=&quot;#fnref6&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;

          </content>
        </entry>
      

        <entry>
          <title>Phonetic Pangrams</title>
          <link href="https://graham.build/s/a-blog/033-phonetic-pangrams/" />
          <id>https://graham.build/s/a-blog/033-phonetic-pangrams/</id>
          <published>2025-12-28T02:05:00.000Z</published>
          <updated>2023-09-27T04:21:00.000Z</updated>
          <category>wordplay</category>
<category>phonetic pangrams</category>
          <content type="html">
            &lt;p&gt;Pangrams are single sentences or phrases that include every letter of a given language&#039;s alphabet at least once.&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Pangram Examples&lt;/summary&gt;
&lt;blockquote&gt;
&lt;p&gt;The quick brown fox jumps over the lazy dog&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Sphinx of black quartz judge my vow&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;p&gt;There&#039;s another type of sentence(s) or phrase(s) that gets every vowel sound - or even every unique sound overall - from a language pronounced at least once. A few are presented below, but I believe with some time and effort, we could do better&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Phonemic Pangram Example&lt;/summary&gt;
&lt;blockquote&gt;
&lt;p&gt;With tenure, Suzie&#039;d have all the more leisure for yachting, but her publications are no good.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;br&gt;
&lt;details&gt;&lt;summary&gt;Phonetic Pangram Example&lt;/summary&gt;
&lt;blockquote&gt;
&lt;p&gt;The beige hue on the waters of the loch impressed all, including the French queen, before she heard that symphony again, just as young Arthur wanted.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/details&gt;
&lt;h3&gt;My own, bespoke phonetic pangrams&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fear not, boy: our usual chutzpah may win over grouchy foodies. Aye, hand your battered shank lengthwise up to their closed jaws.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L&#039;chaim! Yes, after showing what three blue powdered treasures their benevolent hook caught, guys are joyous.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;quot;Johann Sebastian Bach athleisure wear for jungles zips together proudly,&amp;quot; my voice shook.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

          </content>
        </entry>
      
    </feed>
  