> This game requires JavaScript. Or, if you've superior taste, take out a pen and paper and start listing animals.
It took the man o war, but crossed out Jellyfish and said "added a vaguer term", but a jellyfish and a man-o-war are discrete animals.
The man-o-war is a colonial siphonophore composed of zooids, while a jellyfish is a singular marine organism.
They're both in the phylum Cnidaria, and that would have been a more vague term had I entered it.
in biological journal, sure - for practical purposes straight up no
if it looks like a jellyfish, stings like a jellyfish and behaves like a jellyfish - then it doesn't matter what it looks like under a microscope, it is jellyfish
I added bobcat, then lynx, and it would not accept lynx because bobcat was there.
Oh, and, 77, just woke up. No coffee.
In general, of course, even distantly related animals may share a common name due to superficial similarities – what is "robin", for example? The American robin was named after the European robin by analogy, simply because both happen to have a red breast. The two species aren't even in the same family.
> I assume you mean “panther” in the general sense of any big cat.
Why on Earth would it assume mean that, of all things, rather than “black panther”? If it's gonna be pedantic about it, it could've complained about “leopard” and “jaguar” already being there (which they were) instead of complaining about an animal that nobody in their right mind would call a “panther”.
https://www.sporcle.com/games/jjjjlapine2nd/name-every-anima...
Here's the table: https://rose.systems/animalist/lower_title_to_id.js
var h = hash(guess);
if (h==7182294905658010 || h==6344346315172974) { return "Adorable guess, but it's spelled “rosy”."; }
I'm guessing they're hashes for "<something> rosie" or "<something> rosey", but what?Edit: someone edited to remove it just this minute!
Introduction: https://www.wikidata.org/w/index.php?diff=2353193943 - just random vandalism I suppose.
https://en.wikipedia.org/wiki/List_of_organisms_named_after_...
Somewhat more impressively, it recognises bungarra .. although it stalls out and fails on other similar words for various local animals.
(async () => {
for (c of 'red black white brown blue green yellow golden grey arctic mountain forest spotted striped'.split(' '))
for (a of 'bear lion tiger wolf fox eagle shark whale snake frog cat dog horse bat rat mouse owl hawk duck crab ant bee spider deer penguin elephant rabbit'.split(' ')) {
guessbox.value = c + ' ' + a;
uncomment(); attempt();
await new Promise(r => setTimeout(r, 75));
}
})();This is a concise, pretty naive way highest possible high-score by just guessing everything in the internal animal database, and avoiding "parents". I'm not sure how many points it would get us because it would take like 3 hours to complete. However, we can do a lot better for the score by analyzing some additional things:
(The following numbers may be off a bit due to overlapping sets or just recording them at different stages of investigation/understanding, but they're darn close)
The game has 379,729 animals in its list (ID_TO_TITLE), mapped from 768,743 input strings (LOWER_TITLE_TO_ID).
52,546 are parents of some other animal, so it's best to skip those: If you guess "bird" first and then guess "eagle", then eagle won't count for points. Unless...well, more on that towards the end!
4,485 rows are considered to be "too specific". For example, there are 462 species under Mordellistena but the game says "nah screw all that, Mordellistena is specific enough".
3,127 are duplicates, they're the same species but have different names from different era. e.g. Megachile harthulura was discovered in 1853 but renamed to Megachile cordata in 1879. The game counts these only once.
3,116 are...weird: I think these are mostly errata caused by the input parser redirecting guesses to different IDs than the raw/full database expects. The parser maps the text to some "correct" ID but leaves a different, perhaps similar ID uncredited. This could happen because the text parser strips out hyphens, e.g. there's an entry for Yellow-tail which should be a duplicate of Yellow-tail moth but "Yellow-tail" gets parsed to "yellowtail" which gets mapped to the fish Japanese Amberjack. Sometimes it's skipping ranks in the taxonomy, like the beetle Neomordellistena parvula maps directly to a Subfamily, which skips the Genus level required to verify the lineage. Sometimes it's things that got reclassified from one genus to another. And sometimes there are rows that are a family which get mapped to a genus, which is also a row (Dilophosauridae -> Dilophosaurus)
28 rows are impossible to reach because they need a curly apostrophe that the parser replaces with a straight apostrophe if you put it in the input box. 23 of the straight version maps to a different animal. For example, "budin's tuco tuco" (curly) maps to Budin's tuco-tuco, but after normalization it becomes "budin's tuco tuco" (straight), which maps to Reddish tuco-tuco. 5 of them have keys with curly apostrophes where the straight version doesn't exist in the database at all.
One entry in the list of animals is 'zorse' (zebra-horse hybrid) but this guess is explicitly rejected because it doesn't have its own wikipedia page (the wikipedia page for that is a redirect to "Zebroid").
That brings us down to a maximum score of 316,457
but then there are 722 entries in the string mapping table which are strings that don't appear in the raw animal table which can map to otherwise blocked animals, like Mongolian wolf. This animal exists and could count to your score, but if you type "Mongolian wolf", it maps to Himalayan wolf and you get credit for that instead of Mongolian wolf. However, it also contains a mapping for "woolly wolf" which gives you credit for Mongolian wolf.
That brings us up to the actual maximum score of 317,179
Then, because of these 10,034 unreachable leaf-nodes (non-parent rows in the animal list), sometimes all the children of a parent is unreachable, so because we never claimed any points for their children, we can go get the points for the parents. This adds 5,561 points.
This brings us up to 322,740.
By doing the 'maximum' 30 guesses per second (limited guesses to the game tick rate of 30fps), it would take an absolute minimum 3 hours to submit every animal. Just a note, the countdown timer counts down from 1 minute, but 6 seconds are added for every correct guess. So by the time you're done the countdown timer would reach 22.6 days, which you'd have to wait to elapse before the game is actually "won".
If we remove some visual effects, we can reduce that by spamming guesses for 12ms, then pause for 4ms to let the browser render which keeps the tab responsive.
But the guesses still slow down over time due to a O(N²) algorithm in the game's code: it checks your current guess against a List (the array structure in JS), which is an O(N) check that runs N times, for an overall O(N²) performance hit. We can patch that function so it checks against a Set instead of a List to keep it O(1).
On an M2 MBP, this gets the high-score in under 30 seconds while keeping the game logic unchanged in function. But the visual effects were nice and it's rather soulless without the author's artistic vision. Turning them back on and giving it the 6ms required to render all of them slows this from 30 seconds to a boring 5 minutes. We can make it run the game logic 98% of the time and then render for 2% of the time, but it's still a bit too slow because the browser has to recalculate the page layout (DOM) every time a guess it submitted via the input box. So we can also skip the actual input box.
That reduces it to a lovely 20 seconds to get the highest possible score!
Then some memoization, some stupid tweaks to keep the UI looking nice, and adding a progress meter, aggressive minimization for HN posting, and we get the final script running in 16.5 seconds.
You'll still have to wait 22.75 days for the countdown timer to run out to win the game. I didn't want to actually change any of the game's logic or game the win condition, so editing that is left as an exercise to the reader! :)
(async()=>{"undefined"==typeof guessed_ids&&newGame();const e=e=>e.trim().toLowerCase().replaceAll("-"," ").replaceAll("’","'").replaceAll(/ +/g," "),o=LOWER_TITLE_TO_ID.human,t=LOWER_TITLE_TO_ID.crow,n={},r={},s={},c={};for(const[e,o]of Object.entries(LOWER_TITLE_TO_ID))(n[o]??=[]).push(e);for(const[e,o]of Object.entries(PARENT))(r[o]??=new Set).add(e);for(const[o,t]of Object.entries(ID_TO_TITLE)){if(LOWER_TITLE_TO_ID[e(t)]===o){s[o]=t;continue}const r=n[o]?.find((t=>LOWER_TITLE_TO_ID[e(t)]===o));r&&(s[o]=r)}const i=e=>{if(void 0!==c[e])return c[e];const o=r[e];return c[e]=!!o&&[...o].some((e=>s[e]||i(e)))},a=(e,o)=>{for(let t=PARENT[e];t;t=PARENT[t])if(t===o)return!0;return!1},d=[],l=[],p=[];for(const e of Object.keys(s)){if(i(e))continue;const n=s[e];(e===o||e===t?d:a(e,t)?l:p).push(n)}const f=[...p.splice(0,10),...d];for(;l.length||p.length;)f.push(...l.splice(0,6),...p.splice(0,6));const u=window.guessbox,g=window.comment,m={value:"",focus(){},disabled:!1},w={innerText:""};Object.defineProperty(window,"guessbox",{get:()=>m,configurable:!0}),Object.defineProperty(window,"comment",{get:()=>w,configurable:!0});const b=new Set(guessed_ids);guessed_ids.includes=e=>b.has(e),guessed_ids.push=e=>{Array.prototype.push.call(guessed_ids,e),b.add(e)};const T=.02,x=new Set(["longcat","dropbear","drop bear","sidewinder"]),O=log.prepend.bind(log);log.prepend=e=>{const o=x.has(e.innerText.toLowerCase().split(" → ")[0]);(o||Math.random()<T)&&(O(e),log.children.length>25&&[...log.children].reverse().find((e=>!e.dataset.vip))?.remove(),o&&(e.dataset.vip="true"))};const _=summonConfetto;summonConfetto=(...e)=>{Math.random()<T&&_(...e)};const h=Object.getOwnPropertyDescriptor(HTMLElement.prototype,"innerText").set;Object.defineProperty(scorespan,"innerText",{set:e=>{(Math.random()<T||"0"===e)&&h.call(scorespan,e)}});const L=document.createElement("div");L.style.cssText="position:fixed;top:10px;right:10px;width:180px;background:linear-gradient(135deg,rgba(180,100,200,.85),rgba(100,180,220,.85));color:#fff;font:12px monospace;padding:10px;z-index:999999;border-radius:10px;text-shadow:1px 1px 1px#000",document.body.append(L);const y=f.length,E=Date.now();let I=0,j=E;for(;I<y;){const e=performance.now();for(;performance.now()-e<32&&I<y;){m.value=f[I++],uncomment();try{attempt()}catch{}}const o=Date.now();if(o-j>500){const e=(o-E)/1e3;L.innerHTML=`${(I/y*100).toFixed(1)}% | ${I/e|0}/s<br><small>${I.toLocaleString()}/${y.toLocaleString()}</small>`,j=o}await new Promise((e=>requestAnimationFrame(e)))}h.call(scorespan,score),Object.defineProperty(window,"guessbox",{value:u}),Object.defineProperty(window,"comment",{value:g}),L.innerHTML=`100% in ${((Date.now()-E)/1e3).toFixed(1)}s<br><small>${y.toLocaleString()}/${y.toLocaleString()}</small><br><b style=color:#8f8> ${score.toLocaleString()}</b>`})();
I like the emoji output as well: 203 animals listed:
𓃬𓆊 𓃜𓃘𓅱𓆉𓅃
An interesting twist could be making sure a specific token is an anagram of the token N tokens back. This could possibly measure how much a model can actually plan forwards.
Extinct animals also work, including the dinosaurs!
(Wikipedia says it actually is a type of parrot, but I definitely refer to different types of bird when I refer to a "parrot" vs a "budgie")
1. Animal that starts with A
2. Animal that starts with B
3. Animal that starts with C
…
(I also appreciated the easter eggs: “Are you Australian?” and “You listed both dingos and dogs, so I gave you the benefit of the doubt, but there's disagreement on whether the dingo is its own species of canid, a subspecies of grey wolf, or simply a breed of dog.”)
They are feral dogs. IE wolf -> domesticated dog -> became wild again.
update: Start with "human" or "homo sapiens" and the website keeps changing as you add new words.
not a great strat, though. (tons repeated animals)
30 animals listed 𓃱 𓃸
Edit: weird... emojis don't work here? how have I never known this...
Game over. You didn’t list lion.
Already said more specific animal: Leopard I assume you mean “panther” in the general sense of any big cat.
At that point I stopped playing because this seems nonsense
If you wanted to develop this more, some fun features might be telling you the most commonly entered animals you missed and the most unusual ones you thought of. Appreciate you probably want to keep it a static site though.
Fun game, but also a fascinating brain-probe. We're not used to reversing our internal classifiers.
For a similar brain exercise, try to Name Every City:
DOES IT SWIM? no
IS IT A BIRD?
https://www.atariarchives.org/basicgames/showpage.php?page=4
> Thanks!
Amazing.
66 animals listed 𓃬𓃰