Congratulations to: * 2024/anders - Prize in sound coding - layered music generator * 2024/burton - Prize in pentagrammatology - wordle hard mode solver * 2024/cable1 - Prize in bot talk - LLM inference engine * 2024/cable2 - Prize in murky waters - salmon recipe * 2024/carlini - Prize in perfect timing - Intel 4004 emulation * 2024/codemeow - Prize in tray planting - bonsai generator * 2024/endoh1 - Prize in patient pointillism - slow ray tracer in CPP * 2024/endoh2 - Prize in solid body physics - rotating rigid body simulation * 2024/ferguson1 - Prize in diabolical logistics - Oregon trail pact with the devil * 2024/ferguson2 - Prize in yil-tas - Navajo code talker translator * 2024/howe - Nice accent eh-ward - mini vi * 2024/kramer - Prize in linguistic arithmetic - natural language numerical calculator * 2024/kurdyukov1 - Prize in phased periodicity - phase of the Moon * 2024/kurdyukov2 - Prize in art restoration - JPEG artifact removal * 2024/kurdyukov3 - Prize in virtual quietus - gaming VM and doom * 2024/kurdyukov4 - Prize in embiggening - encode without literals * 2024/maffiodo - Prize in creative interpretation - Jav\*script interpreter * 2024/mills - Prize in ℤ₃ - Infocom v3 story interpreter * 2024/stedolan - Best one liner - icon from MD5 * 2024/straadt - Prize in imitative rebooting - OpenRISC CPU and Linux * 2024/tmarrec - Prize in cyclonic coding - 3D tornado simulation * 2024/tompng - Prize in quasi bijection - vortex encryptor decryptor * 2024/weaver - Sur prize - rickroll Ran `make update` to perform the above. new file: 2024/burton/.entry.json
888 lines
32 KiB
HTML
888 lines
32 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||
<!-- START: two lines up starts content from: inc/top.default.html -->
|
||
|
||
<!-- END: this line ends content from: inc/top.default.html -->
|
||
<!-- START: this line starts content from: inc/head.default.html -->
|
||
|
||
<head>
|
||
<link rel="stylesheet" href="../../ioccc.css">
|
||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||
<title>The International Obfuscated C Code Contest</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="extra.md for 2024/burton">
|
||
<meta name="keywords" content="IOCCC, 2024/burton, extra.md">
|
||
</head>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- END: this line ends content from: inc/head.default.html -->
|
||
|
||
<!-- -->
|
||
<!-- This web page was formed via the tool: bin/gen-other-html.sh -->
|
||
<!-- The content of main section of this web page came from: 2024/burton/extra.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2024/burton/extra.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2024/burton/extra.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2024/burton/extra.md !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
|
||
|
||
<!-- START: this line starts content from: inc/body.default.html -->
|
||
|
||
<body>
|
||
|
||
<!-- END: this line ends content from: inc/body.default.html -->
|
||
<!-- START: this line starts content from: inc/topbar.default.html -->
|
||
|
||
<div class="theader">
|
||
<nav class="topbar">
|
||
<div class="container">
|
||
<div class="logo">
|
||
<a href="../../index.html" class="logo-link">
|
||
IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="topbar-items">
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Entries
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../years.html" class="sub-item-link">
|
||
Winning entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../authors.html" class="sub-item-link">
|
||
Winning authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../location.html" class="sub-item-link">
|
||
Location of authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../bugs.html" class="sub-item-link">
|
||
Bugs and (mis)features
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_an_entry" class="sub-item-link">
|
||
Fixing entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_author" class="sub-item-link">
|
||
Updating author info
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Status
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../news.html" class="sub-item-link">
|
||
News
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../status.html" class="sub-item-link">
|
||
Contest status
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../next/rules.html" class="sub-item-link">
|
||
IOCCC rules
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../next/guidelines.html" class="sub-item-link">
|
||
IOCCC guidelines
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../markdown.html" class="sub-item-link">
|
||
Markdown guidelines
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../SECURITY.html" class="sub-item-link">
|
||
Security policy
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
FAQ
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html" class="sub-item-link">
|
||
Frequently asked questions
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../quick-start.html#enter" class="sub-item-link">
|
||
Enter the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#compiling" class="sub-item-link">
|
||
Compiling entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#running_entries" class="sub-item-link">
|
||
Running entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#help" class="sub-item-link">
|
||
How to help
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
About
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../index.html" class="sub-item-link">
|
||
Home page
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../social.html" class="sub-item-link">
|
||
IOCCC social media
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../about.html" class="sub-item-link">
|
||
About the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../judges.html" class="sub-item-link">
|
||
The judges
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../thanks-for-help.html" class="sub-item-link">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../contact.html" class="sub-item-link">
|
||
Contact us
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="header-mobile-menu">
|
||
<noscript>
|
||
<a href="../../nojs-menu.html" class="topbar-js-label">
|
||
Please Enable JavaScript
|
||
</a>
|
||
</noscript>
|
||
|
||
<button id="header-open-menu-button" class="topbar-mobile-menu">
|
||
<img
|
||
src="../../png/hamburger-icon-open.png"
|
||
alt="hamburger style menu icon - open state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<button id="header-close-menu-button" class="hide-content">
|
||
<img
|
||
src="../../png/hamburger-icon-closed.png"
|
||
alt="hamburger style menu icon - closed state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<div id="mobile-menu-panel" class="hide-content">
|
||
<div class="mobile-menu-container">
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
Entries
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../years.html">
|
||
Winning entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../authors.html">
|
||
Winning authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../location.html">
|
||
Location of authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../bugs.html">
|
||
Bugs and (mis)features
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_an_entry">
|
||
Fixing entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_author">
|
||
Updating author info
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../thanks-for-help.html">
|
||
Thanks for the help
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
|
||
<div class="mobile-menu-item">
|
||
Status
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../news.html">
|
||
News
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../status.html">
|
||
Contest status
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../next/rules.html">
|
||
IOCCC rules
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../next/guidelines.html">
|
||
IOCCC guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../markdown.html">
|
||
Markdown guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../SECURITY.html">
|
||
Security policy
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
FAQ
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html">
|
||
Frequently asked questions
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../quick-start.html#enter">
|
||
Enter the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#compiling">
|
||
Compiling entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#running_entries">
|
||
Running entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#help">
|
||
How to help
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
About
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../index.html">
|
||
Home page
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../social.html">
|
||
IOCCC social media
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../about.html">
|
||
About the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../judges.html">
|
||
The judges
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../contact.html">
|
||
Contact us
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<script>
|
||
var headerOpenMenuButton = document.getElementById("header-open-menu-button");
|
||
var headerCloseMenuButton = document.getElementById("header-close-menu-button");
|
||
var mobileMenuPanel = document.getElementById("mobile-menu-panel");
|
||
|
||
headerOpenMenuButton.addEventListener("click", () => {
|
||
headerOpenMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.add("hide-content");
|
||
|
||
headerCloseMenuButton.classList.remove("hide-content");
|
||
headerCloseMenuButton.classList.add("topbar-mobile-menu");
|
||
|
||
mobileMenuPanel.classList.remove("hide-content");
|
||
mobileMenuPanel.classList.add("topbar-mobile-panel");
|
||
});
|
||
|
||
headerCloseMenuButton.addEventListener("click", () => {
|
||
headerCloseMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerCloseMenuButton.classList.add("hide-content");
|
||
|
||
mobileMenuPanel.classList.add("hide-content");
|
||
mobileMenuPanel.classList.remove("topbar-mobile-panel");
|
||
|
||
headerOpenMenuButton.classList.add("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.remove("hide-content");
|
||
});
|
||
</script>
|
||
|
||
<!-- END: this line ends content from: inc/topbar.default.html -->
|
||
<!-- START: this line starts content from: inc/header.default.html -->
|
||
|
||
<div class="header">
|
||
<a href="../../2011/zucker/index.html">
|
||
<img src="../../png/ioccc.png"
|
||
alt="IOCCC image by Matt Zucker"
|
||
width=300
|
||
height=110>
|
||
</a>
|
||
<h1>The International Obfuscated C Code Contest</h1>
|
||
<h2>extra.html for 2024/burton</h2>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/header.default.html -->
|
||
<!-- START: this line starts content from: inc/navbar.up2index.html -->
|
||
|
||
<div class="navbar">
|
||
<a class="Left" href="index.html">↑ jump to 2024/burton/index.html ↑</a>
|
||
<a class="Right" href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fwww.ioccc.org%2F2024%2Fburton%2Fextra.html">✓</a>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/navbar.up2index.html -->
|
||
<!-- START: this line starts content from: inc/before-content.default.html -->
|
||
|
||
<div class="content" id="content">
|
||
|
||
<!-- END: this line ends content from: inc/before-content.default.html -->
|
||
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
|
||
<!-- BEFORE: 1st line of markdown file: 2024/burton/extra.md -->
|
||
<h1 id="extra">extra</h1>
|
||
<p>This readme provides a description of the extra files provided, how to use them,
|
||
analysis of their results, and a deeper investigation on the failed guesses.</p>
|
||
<p>The recommendation is to do:</p>
|
||
<pre><code> make tools
|
||
|
||
./run dict blast swept # exhaust runs this command a LOT!
|
||
./run dict crate swept # show the diff between starting words
|
||
|
||
mkdir results # create the results directory
|
||
./exhaust # exhaustive test of all words (~1 hour)
|
||
echo terns | ./word.result # add the word "terns" to results
|
||
./mkresults > results.avg # proc exhaust into a single, small file</code></pre>
|
||
<p>The files created as output from <code>exhaust</code> allow one to view, for each
|
||
starting word, how each of the solutions resolve, including the misses.
|
||
<code>mkresults</code> outputs a 1566 line report showing the starting word, its
|
||
average accuracy, and the number of missed words. To show the number
|
||
of guesses and the actual missed words, run <code>rank</code> on the desired word:</p>
|
||
<pre><code> ./rank results/blast
|
||
|
||
1 1 # blast guessed itself
|
||
2 112 # 112 words guessed in 2 attempts
|
||
3 867 # 867 words guessed in 3 attempts
|
||
4 1019 # ...
|
||
5 271
|
||
6 41
|
||
foyer jaunt shave wound
|
||
|
||
./avg results/blast
|
||
|
||
blast 3.673002 4
|
||
|
||
grep blast results.avg
|
||
|
||
blast 3.673002 4</code></pre>
|
||
<p>The C programs allow for (automated) testing:</p>
|
||
<pre><code> gen.c - simulate wordle game by generating targets and scoring guesses
|
||
./gen dict [target]
|
||
|
||
dups.c - remove words with(out) repeated letters
|
||
(best starting words have no repeats)
|
||
cat dict | wc -l # all the words
|
||
cat dict | ./dups | wc -l # words with repeated letters
|
||
cat dict | ./dups -n | wc -l # words without repeated letters
|
||
|
||
run.c - `gen` and `prog` connected via pipes; allows automated testing
|
||
./run dict [start [target]]
|
||
start - the first guess
|
||
target - force the target to be the named word</code></pre>
|
||
<h2 id="using-more-guesses">Using More Guesses</h2>
|
||
<p>If you wish to see the failed words in action, and if more guesses would
|
||
work, try:</p>
|
||
<pre><code> ./run dict blast jaunt | grep ^gen
|
||
|
||
gen: target: jaunt
|
||
gen: blast bbybg
|
||
gen: daunt bgggg
|
||
gen: haunt bgggg
|
||
gen: gaunt bgggg
|
||
gen: vaunt bgggg
|
||
gen: taunt ygggg
|
||
gen result end=0: n 6 lose: jaunt
|
||
|
||
GUESSES=7 ./run dict blast jaunt | grep ^gen
|
||
|
||
gen: target: jaunt
|
||
gen: blast bbybg
|
||
gen: daunt bgggg
|
||
gen: haunt bgggg
|
||
gen: gaunt bgggg
|
||
gen: vaunt bgggg
|
||
gen: taunt ygggg
|
||
gen: jaunt ggggg
|
||
gen result end=2: y 7 good: jaunt</code></pre>
|
||
<p>Using <code>GUESSES=9</code> and <code>exhaust</code>, one gets a metric that scores words without
|
||
misses, allowing a better comparison on the average score. Note, however,
|
||
that the game doesn’t bend this way, and anything more than 6 guesses is a
|
||
loss. Take this metric with a grain of salt. Also, 9 is the limit of
|
||
guesses; the program will not work properly - if at all - with more than
|
||
9 guesses.</p>
|
||
<p>Ranking by fewest missed with GUESSES=6, the order is:</p>
|
||
<pre><code> blast palsy climb flash lapse</code></pre>
|
||
<p>Ranking by average with GUESSES=6, the order is:</p>
|
||
<pre><code> crate slate trace crane least</code></pre>
|
||
<p>Ranking by average with GUESSES=9, the order is:</p>
|
||
<pre><code> slate trace crate train least</code></pre>
|
||
<p>To reproduce these results:</p>
|
||
<pre><code> GUESSES=9 ./exhaust results.9
|
||
./mkresults results.9 > results.9.avg</code></pre>
|
||
<h2 id="simple-analysis">Simple Analysis</h2>
|
||
<p>The 1566 raw files produced by <code>exhaust</code> are ~370KB each (total ~562MB),
|
||
far too large to submit, so included are the compressed results files for
|
||
four starting words, and the summary file <code>results.avg</code>.</p>
|
||
<pre><code> blast fewest missed
|
||
crate best average
|
||
query most missing
|
||
terns example used in remarks</code></pre>
|
||
<p>The program <code>rank</code> allows one to see how the averages are calculated, as well
|
||
as the actual missed words. Comparing the results for <code>blast</code> and <code>terns</code>:</p>
|
||
<pre><code> ./rank r.terns | awk 'NF==2' > a
|
||
./rank r.blast | awk 'NF==2' > b
|
||
join a b | column -t
|
||
|
||
guesses terns blast
|
||
-------- ----- -----
|
||
2 110 112
|
||
3 909 867
|
||
4 960 1019
|
||
5 265 271
|
||
6 53 41
|
||
|
||
F 18 4 (failed puzzles)</code></pre>
|
||
<p>In general, the program <code>avg</code> is easier to use, but conveys less information:</p>
|
||
<pre><code> ./avg r.terns; ./avg r.blast
|
||
terns 3.641469 18
|
||
blast 3.673002 4</code></pre>
|
||
<p>You have to decide if you prefer a marginally lower average, but slightly
|
||
higher chance of losing, versus a marginally higher average and lower chance
|
||
of losing. This is developed further in the following section.</p>
|
||
<p>It is interesting that the letter order makes a noticeable difference:</p>
|
||
<pre><code> ./avg r.terns; ./avg results/stern
|
||
terns 3.641469 18 # lower average and fewer misses
|
||
stern 3.658315 20</code></pre>
|
||
<p>For completeness, using <code>GUESSES=9</code> and the full starting dictionary from
|
||
Wordle(tm), here are the results for the “best” starting words: <code>salet</code>,
|
||
<code>slate</code>, and <code>blast</code>.</p>
|
||
<pre><code> guesses salet slate blast
|
||
------- ----- ----- -----
|
||
1 0 1 1
|
||
2 148 146 112
|
||
3 932 939 867
|
||
4 925 919 1019
|
||
5 240 235 271
|
||
6 56 57 41
|
||
--- ----- ----- -----
|
||
7 11 13 4
|
||
8 2 4 0
|
||
9 1 1 0
|
||
--- ----- ----- -----
|
||
avg 3.641 3.644 3.685</code></pre>
|
||
<p>Obviously, <code>salet</code> produces the best results, excepting the losses (14).
|
||
Just re-arranging the letters into <code>slate</code> produces almost the same,
|
||
but there are more losses (18). If attempting to minimize losses,
|
||
then <code>blast</code> is the optimal starting guess, since it never takes more
|
||
than 7 guesses and has the fewest losses (4) of any starting word in the
|
||
combined full Wordle(tm) dictionary.</p>
|
||
<p>NB: The averages for <code>GUESSES=9</code> are larger than the default,
|
||
because the misses are essentially folded into the average.
|
||
The averages are more accurately compared when using the higher limit,
|
||
although minimizing losses remains the priority (who likes to lose?).</p>
|
||
<h2 id="seek-these">Seek These</h2>
|
||
<p>The starting words with the fewest misses with <code>dict</code>:</p>
|
||
<pre><code> sort -k3n results.avg | sed 18q | awk '{print $1, $3}' | column -t | pr -t -3
|
||
|
||
blast 4 ralph 7 crawl 8
|
||
palsy 6 ranch 7 crumb 8
|
||
climb 7 shawl 7 grasp 8
|
||
flash 7 tramp 7 lymph 8
|
||
lapse 7 clash 8 spark 8
|
||
prowl 7 clasp 8 swamp 8
|
||
|
||
The starting words with the best accuracy:
|
||
|
||
sort -k2n results.avg | sed 18q | pr -t -3
|
||
|
||
crate 3.586609 20 irate 3.611231 31 trice 3.617279 15
|
||
slate 3.586609 18 slice 3.612095 22 cater 3.620302 26
|
||
trace 3.588769 18 stale 3.612959 19 satin 3.621598 19
|
||
crane 3.595248 26 train 3.613391 14 snail 3.621598 19
|
||
least 3.599568 19 trade 3.613823 20 stare 3.621598 19
|
||
plate 3.606479 22 leant 3.616415 18 dealt 3.622462 15
|
||
|
||
Note the word with fewest misses, `blast`, is relatively far
|
||
down the list in accuracy at 178th best:
|
||
|
||
sort -k2n results.avg | pr -t -n | grep blast
|
||
|
||
178 blast 3.673002 4</code></pre>
|
||
<p>Versus starting words with fewest misses:</p>
|
||
<pre><code> egrep 'terns|lapse|blast|climb|crate' results.avg
|
||
|
||
blast 3.673002 4
|
||
climb 3.772354 7
|
||
crate 3.586609 20
|
||
lapse 3.664795 7
|
||
terns 3.641469 18
|
||
|
||
weighted avg
|
||
# blast crate blast crate improvement
|
||
- ----- ----- --------------- -----------
|
||
1 1 1 1.0000 1.0000 0.0000
|
||
2 112 147 1.9912 1.9932 -0.0020
|
||
3 867 952 2.8837 2.8645 -0.0192
|
||
4 1019 884 3.4527 3.3951 -0.0576
|
||
5 271 250 3.6374 3.5775 -0.0599
|
||
6 41 61 3.6794 3.6429 -0.0365
|
||
|
||
F 4 20 -16 +16 (0.26% blast vs 1.28% crate)</code></pre>
|
||
<p>Notice the difference in the average and weighted average. The program
|
||
<code>avg</code> simply takes the total guesses as a percentage of the total words.
|
||
The program <code>wavg</code> takes each of the six scores and weights them by the
|
||
score. I wrote <code>wavg</code> later to track my progress playing the online game,
|
||
and it is a more accurate score IMHO, but both are useful for comparisons.</p>
|
||
<pre><code> $ ./avg results/blast
|
||
blast 3.673002 4
|
||
$ ./rank results/blast
|
||
1 1
|
||
2 112
|
||
3 867
|
||
4 1019
|
||
5 271
|
||
6 41
|
||
foyer jaunt shave wound
|
||
$ ./wavg 1 112 867 1019 271 41
|
||
3.6794</code></pre>
|
||
<p>The program <code>wrank</code> (weighted rank) makes this latter calculation much easier.
|
||
It takes the output from <code>rank</code> and invokes <code>wavg</code> with these numbers,
|
||
saving a lot of typing and errors.</p>
|
||
<pre><code> ./wrank blast
|
||
blast 3.6794</code></pre>
|
||
<p>In words, <code>crate</code> as a first guess gets more correct answers in 2 and 3
|
||
guesses, reducing its cost. It looks to be a stronger candidate, but it
|
||
misses 16 more words (therefore losing the game more often). Your task
|
||
is to determine your risk profile, and decide among the variety of possible
|
||
starting points, then let <code>prog</code> recommend your next guess.</p>
|
||
<p>A somewhat laborious calculation provides the answer to which starting word
|
||
has the most answers in two words and three words:</p>
|
||
<pre><code> # two words
|
||
for n in results/*; do
|
||
rank $n | awk -v word=$n '/^2/ {print word,$2}';
|
||
done | sort -k2nr | sed 3q
|
||
|
||
trace 149
|
||
crate 147
|
||
slate 146
|
||
|
||
# three words
|
||
for n in results/*; do
|
||
rank $n | awk -v word=$n '/^3/ {print word,$2}';
|
||
done | sort -k2nr | sed 4q
|
||
|
||
crate 952
|
||
train 944
|
||
trace 939
|
||
slate 936
|
||
|
||
# versus the averages
|
||
sort -k2n -k3n results.avg | sed 3q
|
||
slate 3.586609 18
|
||
crate 3.586609 20
|
||
trace 3.588769 18</code></pre>
|
||
<h2 id="avoid-these">Avoid These</h2>
|
||
<p>The starting words with the worst accuracy:</p>
|
||
<pre><code> sort -k2nr results.avg | sed 18q | pr -t -3
|
||
|
||
jumpy 3.997408 21 juicy 3.954212 39 squib 3.927862 28
|
||
jumbo 3.996976 25 quake 3.952052 38 quark 3.926566 30
|
||
buxom 3.995248 23 jerky 3.950756 31 quoth 3.920950 33
|
||
quick 3.987041 36 equip 3.939957 22 gawky 3.918790 22
|
||
quack 3.974514 23 quasi 3.938661 32 unzip 3.915335 24
|
||
quirk 3.964147 40 epoxy 3.934773 27 judge 3.914903 33</code></pre>
|
||
<p>The starting words with the most failures (missed words):</p>
|
||
<pre><code> sort -k3nr results.avg | sed 18q | pr -t -3
|
||
|
||
query 3.893305 43 juicy 3.954212 39 enjoy 3.890713 37
|
||
quite 3.835421 42 quota 3.881641 39 gauze 3.878186 37
|
||
yield 3.740821 41 quake 3.952052 38 oxide 3.888121 37
|
||
juice 3.847084 40 quiet 3.857451 38 fiery 3.772786 36
|
||
quirk 3.964147 40 quote 3.829374 38 quail 3.893737 36
|
||
axion 3.796544 39 unify 3.862203 38 quick 3.987041 36</code></pre>
|
||
<p>The worst target words, for any starting word (N out of 1566):</p>
|
||
<pre><code> ./worst
|
||
|
||
wound 1340 jaunt 1254 hatch 1157 foyer 1109 waste 1057
|
||
found 997 shave 945 wight 943 willy 790 catch 779
|
||
boxer 762 jolly 751 graze 626 rower 611 fatty 598
|
||
roger 568 taunt 520 watch 497 witty 483 wooer 451
|
||
tight 449 bound 442 swore 415 taste 405 mower 378
|
||
hover 374 bunch 371 shake 358 racer 348 rarer 294
|
||
paper 289 water 285 stave 271 ferry 250 fever 242
|
||
fully 241 paddy 239 fight 225 parer 219 taffy 207
|
||
frown 196 joker 195 filly 188 batty 179 lowly 179
|
||
staff 176 jazzy 174 piper 152 vying 152 swear 151</code></pre>
|
||
<h2 id="spoiler-deep-dive-on-near-misses-spoiler">SPOILER Deep Dive on Near Misses SPOILER</h2>
|
||
<p>Dissecting the failed targets when starting with <code>blast</code>. Recall <code>blast</code>
|
||
only misses 4 words out of all 2315:</p>
|
||
<pre><code> foyer jaunt shave wound</code></pre>
|
||
<p>These four words have common sub-patterns, which in hard-mode is difficult
|
||
to disambiguate. Using <code>run dict blast $word</code>, here are the grep sub-patterns
|
||
and counts for these four words as revealed in the output:</p>
|
||
<pre><code> foyer 25 grep '^.o.er' dict | wc -l
|
||
jaunt 6 grep '^.aunt' dict | wc -l
|
||
shave 7 grep '^sha.e' dict | wc -l
|
||
wound 8 grep '^.ound' dict | wc -l</code></pre>
|
||
<p>Looking at the patterns, the program is making guesses that just happen to
|
||
select the correct word last in its choices. In all cases, on the seventh
|
||
guess, the program has the correct answer using <code>blast</code> as the starting guess.
|
||
It is easy to do an exhaustive look for only four words, but as the count
|
||
goes up, so does the work.</p>
|
||
<p>Several variations were attempted, including randomization of the few results
|
||
remaining. Besides being non-deterministic (this time it wins, next time it
|
||
loses), better results were obtained with other changes to the selection
|
||
algorithm. Some small insight into the algorithm used may be seen by the
|
||
<code>grep</code> command lines, although there are additional insights used within
|
||
the program that improve significantly upon these results.</p>
|
||
<pre><code> ./run dict blast foyer | grep ^gen
|
||
gen: target: foyer 2315
|
||
gen: blast bbbbb 429 grep -v '[blast]' dict | wc -l
|
||
gen: drone byyby 27 grep r dict | grep o | grep e | grep -v '[blastdn]' | wc -l
|
||
gen: cower bgbgg 8 grep '^.o.er' dict | grep -v '[blastdncw]'
|
||
foyer homer hover joker
|
||
mover poker roger rover
|
||
gen: mover bgbgg 4 grep '.o.er' dict | grep -v '[blastdncwmv]'
|
||
foyer joker poker roger
|
||
gen: poker bgbgg rm poker joker (foyer roger)
|
||
gen: roger ygbgg rm roger (foyer)
|
||
gen result end=0: n 6 lose: foyer
|
||
|
||
---------------
|
||
|
||
./run dict blast jaunt | grep ^gen
|
||
gen: target: jaunt 2315
|
||
gen: blast bbybg 46 grep 't$' dict | grep a | grep -v '[bls]' | wc -l
|
||
gen: daunt bgggg 5 grep '^.aunt$' dict | grep -v '[blsd]'
|
||
gaunt haunt jaunt taunt
|
||
vaunt
|
||
gen: haunt bgggg rm haunt (gaunt, jaunt, taunt, vaunt)
|
||
gen: gaunt bgggg rm guant (jaunt, taunt, vaunt)
|
||
gen: vaunt bgggg rm vaunt (jaunt, taunt)
|
||
gen: taunt ygggg rm taunt (jaunt)
|
||
gen result end=0: n 6 lose: jaunt
|
||
|
||
---------------
|
||
|
||
./run dict blast shave | grep ^gen
|
||
gen: target: shake 2315
|
||
gen: blast bbgyb 52 grep '^..a' dict | grep s | grep -v '[blt]' | wc -l
|
||
gen: share gggbg 5 grep '^sha.e' dict | grep -v '[bltr]'
|
||
shade shake shame shape
|
||
shave
|
||
gen: shade gggbg rm shade (shake shame shape shave)
|
||
gen: shape gggbg rm shape (shake shame shave)
|
||
gen: shame gggbg rm shame (shake shave)
|
||
gen: shake gggbg rm shake (shave)
|
||
gen result end=0: n 6 lose: shave
|
||
|
||
---------------
|
||
|
||
./run dict blast wound | grep ^gen
|
||
gen: target: wound 2315
|
||
gen: blast bbbbb 429 grep -v '[blast]' dict | wc -l
|
||
gen: drone ybygb 7 grep 'n.$' dict | grep d | grep o | grep -v '[blastre]' | wc -l
|
||
gen: pound bgggg 4 grep '^.ound' dict | grep -v '[blastreh]'
|
||
found hound mound wound
|
||
gen: mound bgggg rm mound (found, hound, wound)
|
||
gen: hound bgggg rm hound (found, wound)
|
||
gen: found bgggg rm found (wound)
|
||
gen result end=0: n 6 lose: wound</code></pre>
|
||
<!-- AFTER: last line of markdown file: 2024/burton/extra.md -->
|
||
|
||
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
<!-- START: this line starts content from: inc/after-content.default.html -->
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/after-content.default.html -->
|
||
<!-- START: this line starts content from: inc/footer.default.html -->
|
||
|
||
<!--
|
||
|
||
Copyright © 1984-2025 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<div class="footer">
|
||
|
||
<div id="copyright"><h3>Copyright © 1984-2025 by Landon Curt Noll:
|
||
<a href="https://creativecommons.org/faq/#what-does-some-rights-reserved-mean"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">Some Rights Reserved</a></h3>
|
||
<p>
|
||
This work is <b>licensed by Landon Curt Noll</b> under
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1"
|
||
target="_blank"
|
||
rel="license noopener noreferrer"
|
||
style="display:inline-block;">CC BY-SA 4.0</a></b>.
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/cc.png"
|
||
alt="cc inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/by.png"
|
||
alt="person inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/sa.png"
|
||
alt="arrow looping back on itself inside circle symbol"><br>
|
||
You should <b>carefully review</b> the
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">CC BY-SA 4.0 LEGAL CODE</a></b>
|
||
before using the licensed material.<br>
|
||
You may wish to review the
|
||
<b><a href="../../license.html"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">highlights of some of the key features and terms</a></b>
|
||
of <b>CC BY-SA 4.0</b>.<br>
|
||
</p>
|
||
</div>
|
||
|
||
<div id="coda"><h3>Coda</h3>
|
||
<p>
|
||
<a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fwww.ioccc.org%2F2024%2Fburton%2Fextra.html" rel="nofollow">Nu HTML check this web page</a><br>
|
||
<a href="#top">Jump to top</a> <a href="#content">Jump to Content</a>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/footer.default.html -->
|
||
<!-- START: this line starts content from: inc/bottom.default.html -->
|
||
|
||
</body>
|
||
</html>
|
||
|
||
<!-- END: this line ends content from: inc/bottom.default.html -->
|