Readit News logoReadit News
procparam · 2 years ago
My friends and I have played so much already that the list of elements on the sidebar is unwieldy. You can paste this little js snippet into the console to add a basic search feature

  items = () => [...document.querySelectorAll('.items div.item')]
  show = (elt) => elt.style.display=''
  hide = (elt) => elt.style.display='none'
  search = (text) => (items().forEach(show), items().filter(e => !e.innerText.toLowerCase().includes(text.toLowerCase())).forEach(hide))
  inputElt = document.createElement('input'); inputElt.type='text';
  document.querySelector('.sidebar').prepend(inputElt)
  function handle(e) { search(e.target.value) }
  inputElt.addEventListener('input', handle)

starshadowx2 · 2 years ago
This is really cool, thanks. I was just using ctrl+f to find things. I've got like 1200+ words right now so I totally understand the unwieldy-ness.
cooper_ganglia · 2 years ago
Thanks for this! I ended up hitting refresh because of how long my list eventually got, I wish I'd seen this comment 10 minutes sooner!

Oh well, I guess now I'm forced to sink in another half-hour this evening! ;)

Dead Comment

smarkov · 2 years ago
I couldn't find any information but does this use some kind of LLM to derive the combinations from? It makes a request to the backend every time you combine items which sometimes takes >500ms, and also supports some really wild combinations that I highly doubt someone has taken the time to come up with. It would also explain why the icons are emoji's, it would be fairly trivial to ask ChatGPT to give you the result of Fire + Water and an accompanying emoji.
JeremyNT · 2 years ago
You are correct according to this tweet [0]. That may become inaccessible as Nitter dies, but the text is:

> Working on an endless crafting game with llama 2

along with a video of this game.

[0] https://nitter.cz/nealagarwal/status/1747284257582506102#m

madeofpalk · 2 years ago
Ahh, neat application of it. Explains the somewhat dubious combinations I was seeing.
dhc02 · 2 years ago
Might be worth using farside for the link, which I found out about today on HN.

https://farside.link/https://twitter.com/nealagarwal/status/...

andrei · 2 years ago
just link to the real thing :) [0]

[0]: https://twitter.com/nealagarwal/status/1747284257582506102

WaxProlix · 2 years ago
Off topic, why is nitter dying? I've noticed the main instance's SSL cert is down for a bit now, and other instances are pretty rate limited. Did something happen/change?
samstave · 2 years ago
Neat.

Campfire+sushi took about 10 seconds before it gave up and did not combine them.

lovegrenoble · 2 years ago
I love silly and pointless web pages, here another one: https://sharkle.com
itistimlee · 2 years ago
It seems it doesn't work on my side
hmcq6 · 2 years ago
First click brought me right back to neal.fun lol
Calavar · 2 years ago
An LLM seems like overkill for a project like this. Why not word2vec?
thatguysaguy · 2 years ago
The open vocabulary aspect seems important. Word2vec would never let me make "Pirate Pope Wars".
legel · 2 years ago
I had the same thought.

Some of the surprising discoveries I made with word2vec embeddings:

human + robot ~= cyborg

silicon + electricity ~= solar cells

virtual reality + reality ~= augmented reality

As reported here: https://web.archive.org/web/20160806040004if_/http://blog.yh...

Silphendio · 2 years ago
I thought this would be very simple to do, so I tried it. https://silphendio.github.io/word2vec_alchemy/

That simple demo took me way too long and all that time is wasted because word2vec simply sucks for this use-case.

Deleted Comment

TeMPOraL · 2 years ago
More dimensions?
Jaxan · 2 years ago
This might explain how I got “Super volcano” and “Supervolcano”
geoelectric · 2 years ago
One’s really big, and the other is really cool?
iwontberude · 2 years ago
The dumbness of the LLM inference ruined this for me. Fossil + Fire = Dinosaur? Okay.
BEEdwards · 2 years ago
it also get's caught in stupid loops.

this game is fun for a bit, but shallow once you realize the gimmick.

you can go completely random bullshit go and get "super cyberwolfman zombie phoenixman" that's nonsense, of course it's "first discovery!"

polysoma · 2 years ago
Wouldnt it be worth caching the results? For the first couple of million combinations at least. I suppose that would take away some level of serendipity. But I imagine it would make this a lot cheaper, considering its popularity.
leroman · 2 years ago
I thought they were using some kind of vector space searches like embedding.. no idea if that's the case
IshKebab · 2 years ago
Yeah I'm pretty sure you could do this just with the classic word embeddings (king =queen + man - woman). Maybe it doesn't work as well as with a full LLM.
brap · 2 years ago
I knew this was powered by an LLM once I crafted both "seahorse" and "sea horse"
fnordian_slip · 2 years ago
For me it was when one of my early combinations of Pegasus (might also have been unicorn or flying horse, the latter already being a duplicate of Pegasus) and water became hippocampus, but with the hippopotamus emoji ().

I'm sure it was fun for the creator, bit I'll stick with non - AI games for now.

jimmy778hahah · 2 years ago
i really hate it when you are crafting something and get the same thing as another thing in your side bar but it has one CAPITAL LETTER!!! like what that dosnt change anything you fuggly rat

Deleted Comment

tibbon · 2 years ago
I don't get it; maybe it's broken in my browser. I can drag 4 types of items to a floating grid that connects them but then nothing happens.

EDIT: Ah, you drag items on top of each other for them to change. Instructions unclear, and I am dumb.

crazygringo · 2 years ago
> Instructions unclear, and I am dumb.

You're not dumb -- it's not only unclear, but the interface actively suggests the opposite of what you're supposed to do.

One of the best lessons I ever learned was from Don Norman's famous book, The Design of Everyday Things. Which basically teaches you that the user is almost never dumb, but rather human. And that the responsibility of understanding how to interact with an object, or program, always lies with the creator of that object or program. The designer. It's their job to design something so that it teaches you how to use it. (His most quoted example involves how a plate on a door invites you to push it, while a handle invites you to pull -- and this way you'll never try to pull a door that needs to be pushed open, or vice-versa.)

In this case, the interface invites you to drag things among the various pre-existing points, to continue the "constellation". It does nothing whatsoever to suggest that it would make any sense to drag the labels on top of each other. Indeed, previous experience suggests that this would simply lead to overlapping and obscured labels, so we actively avoid it. And the lines that get drawn between nearby points and labels goes even further to suggest that this is a game or experience about connecting things in a graph-like way -- which, once again, overlapping does not fit into conceptually.

I would never have thought to drag things on top of each other if I hadn't come here to the comments.

hinkley · 2 years ago
The lines are misdirection and need to be removed.

What's with all the lines to the little moving dots? Haven't figured out what those do yet.

nomel · 2 years ago
Nothing. They're completely confusing. At first, I thought maybe the little specs is where the combination happened, so as they passed between a set, they would automatically get crafted based on that set, in a neat chaotic way. Nope. Then I thought maybe I had to set up the "recipes" and wait, or click things, or I don't know.

I didn't realize it's just a basic drag drop combination thing until I saw the video, after coming here to see if anyone else was having trouble with Safari.

sawer · 2 years ago
Thank you to know how to spell correct you are my best speller that I seen. Me to I do not know what is that I was mad for a second but once I have seen this I cooled down a bit. Thank you!
cjauvin · 2 years ago
You are not dumb at all, I think it's not terribly clear indeed.
neogodless · 2 years ago
Thank you! Yes the instructions were missing, and it's hard not to assume that Firefox isn't supported. I was having the same (bad) experience as you.
nottorp · 2 years ago
Yep, at first i tried to make geometric arrangements out of multiple items too.

Water surrounded by 5 fire in a circle - ish - did absolutely nothing.

Only by checking the HN comments i figured out you have to combine items.

jimmy778hahah · 2 years ago
haha... the lines and dots never bothered me actually... i was scrolling throught this saw the thing about the lines and had to open the tab back up to see the lines... i never noticed they were there
mrjh · 2 years ago
Not dumb at all. It's bad UI.
Sohcahtoa82 · 2 years ago
I didn't have a problem understanding it, but then again, I've played these Alchemy games before. It was one of the first games I ever played on my first Android back in 2010.
alluro2 · 2 years ago
You can just click / tap on 2 items consecutively, without drag and drop.
crazygringo · 2 years ago
I don't understand what you mean. Clicking does absolutely nothing for me. Clicking items in the right column does nothing; clicking items I've already placed does nothing. Clicking items consecutively does nothing, in either part of the screen.

I don't see how to use this at all without drag and drop.

LonelyWolfe · 2 years ago
On mobile it's just tapping, no drag and drop required.
bagels · 2 years ago
Yes, it'd be better if you could just tap two items, and they filled the useless central pane instead.
csteinbe · 2 years ago
ehsankia · 2 years ago
I was very confused at first too, and didn't understand the difference. As the other comments in the thread allude to though, this instead an LLM to allow for a much much larger number of combinations, which is the "neal.fun" twist on it.

I do wish it was a bit better stated on the page itself.

sawer · 2 years ago
Once I play I was confused to, but I was thinking was it like little alchemy. You should play for like 20 min so you can be more better just giving a tip for because it is the right thing to do
Xeyz0r · 2 years ago
Exactly, and I just couldn't remember what it reminded me of! How much time have I spent on Little Alchemy
sawer · 2 years ago
So did I love little alchemy it was so fun
ninjahatori · 2 years ago
This was one of my favorite online games in childhood. Came here for commenting the same!
nikeee · 2 years ago
Doodle God was also a very popular one.
sawer · 2 years ago
I do not know what that is but it sound incredble
Brajeshwar · 2 years ago
My team and I were ghost developers to many companies, developers, and book authors in the hay days of Macromedia/Adobe Flash.

We were approached to build a bunch of learning lessons for teachers to teach kids - primarily focusing on human anatomy. Instead of building separate lessons, we built a generator tool for the teachers to drag and drop various combinations and permutations that produce almost infinite lesson variations.

The end customer was Pearson Publishing, and I heard they won awards and stuff. Our client was a good person and even paid us extra for doing the better version of the product they had in mind.

That tool was like this and a few others, as mentioned in the comments. But all in ActionScript Flash, complete with sounds, laughter tracks, and ever-expanding sprites of body parts. It was one fun and fulfiling product.

duderific · 2 years ago
I miss Flash and all the cool capabilities it had. At a previous company, we built a tool that would allow a teacher to record a video review of a student's animation work, while showing, scrubbing and annotating that work simultaneously. On playback, the annotations would be synced with the video. Good luck pulling that off with Javascript.
Secretmapper · 2 years ago
There's some work on this on the web space - our company is doing something not too dissimilar using the still experimental API called WebCodecs.

And that pretty much says everything unfortunately - it's still an experimental API with limited availability.

You can do some parts of this using Canvas[0] but there's lots of caveats.

[0] https://github.com/bwasti/mebm/tree/main

promiseofbeans · 2 years ago
The game state clears on reload, so here's a wee console snippet to export your list of elements:

    console.log(JSON.stringify({discoveries: window.$nuxt.$root.$children[2].$children[0].$children[0]._data.discoveries, elements:window.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements}))

I'll figure out how to re-import the state later, but it's past midnight for me now.

tercmd · 2 years ago
The state can be re-imported like this: ``` a = (insert JSON output here) window.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements = a.elements; window.$nuxt.$root.$children[2].$children[0].$children[0]._data.discoveries = a.discoveries; ```
madacol · 2 years ago
I made a bookmarklet that loads the state from localstorage and also autosaves the state on each new craft

    javascript:(function(){
        const exportState = () => JSON.stringify({
            discoveries: window.$nuxt.$root.$children[2].$children[0].$children[0]._data.discoveries, 
            elements: window.$nuxt.$root.$children[2].$children[0].$children[0]._data.elements
        });

        const importState = (state) => {
            const { discoveries, elements } = JSON.parse(state);
            const gameInstance = window.$nuxt.$root.$children[2].$children[0].$children[0]._data;
            gameInstance.discoveries = discoveries;
            gameInstance.elements = elements;
        };

        /* Set up a MutationObserver to listen for changes in the DOM and automatically export the current state. */
        const observer = new MutationObserver((mutations) => {
            const state = exportState();
            localStorage.setItem('gameState', state);
        });

        /* Start observing DOM changes to auto-save the game state. */
        const startObserving = () => {
            const targetNode = document.querySelector('.sidebar');
            observer.observe(targetNode, { childList: true, subtree: true });
        };

        /* Check for a saved state in localStorage and import it if available. */
        const savedState = localStorage.getItem('gameState');
        if (savedState) importState(savedState);
        else localStorage.setItem('gameState', exportState() );

        startObserving();
    })();

Deleted Comment

beacon294 · 2 years ago
I used this to import my own terms.

This can be used to get a novel starting point (disregarding the original starting point).

It can also be used to start from unreachable elements, although it isn't clear to me exactly how the "First discovery" works, e.g. will your unreachable elements pollute the neal.fun datastore, or only the byproducts? Either way, it is interesting.

beacon294 · 2 years ago
By the way you missed a semicolon after `(insert JSON output here) `
dirkc · 2 years ago
Thank you!

These were my discoveries:

["Leviathan Shark","Burnzilla","Burnado","Chocolate Tree Shark","Cybersharktopus","Toadatorzilla","Bacon Sharktopusnado","Rainbow Hooktopus","T-48000050","T-48000050","T-19800050","T-19800050","T-64000050","T-83800050","T-83800050","T-121800050","T-121800051","T-185800001","T-185800002","T-185800004","T-185800008","T-82980058","T-121800051 + T-160000"]

Seems like I've stumbled across a self reproducing AI, although the emojis went from robot emoji to universe emoji and then to poop emoji. I wonder at which of those levels of AI we're at currently :p

LonelyWolfe · 2 years ago
Lemme know if there's another way to press every combination:

let maxElementReachedForElement = {}; let totalElements = 0; let firstElement = 0; let secondElement = 0;

setInterval(function() {

  document.getElementsByClassName('mobile-item')[firstElement].getElementsByClassName('item')[0].click();

  document.getElementsByClassName('mobile-item')[secondElement].getElementsByClassName('item')[0].click();

  totalElements = document.getElementsByClassName('mobile-item').length;

  secondElement = (secondElement + 1) % totalElements;

  if (secondElement == 0) {
   maxElementReachedForElement[firstElement] = totalElements; 
   if (Object.keys(maxElementReachedForElement).some(item => maxElementReachedForElement[item] < totalElements)) {
    let prevStart = Object.keys(maxElementReachedForElement).find(item => maxElementReachedForElement[item] < totalElements);
    firstElement = prevStart;
    secondElement = maxElementReachedForElement[prevStart]; // Start from previous end
   } else {
    firstElement = (firstElement + 1) % totalElements;
    secondElement = firstElement; // No need to repeat the previous combinations.
   }
  }

  document.title = firstElement + '+' + secondElement + '|' + totalElements;
}, 500); // TODO : Find a way other than delay

NAR8789 · 2 years ago
I think you can reduce state. Rather than tracking maxElementReached per-element, maintain a single maxElementReached for the first n elements. March the first n elements forward in lockstep, and grow n by 1 whenever you exhaust all available combinations for that set

  1. Combine the first element with every next element until exhausted.
  2. Catch up the second element to where the first element got to.
  3. Combine the first two elements with every next element, until exhausted.
  4. Catch up the third element.
  5. Combine the first three elements with every next element
  6. etc.
In pseudocode...

  n = 1
  maxElementReached = -1
  
  while(n < totalElements()) {
    while(maxElementReached + 1 < totalElements()) {
      maxElementReached = maxElementReached + 1
      Combine each of the first n elements with element[maxElementReached]
    }

    // we've exhausted all possible combinations for the first n elements.
    // increase n by 1 and catch up the new element to keep going
    Combine element[n] with each element from n to maxElementReached
    n = n + 1
  }

saintradon · 2 years ago
minified version courtesy of GPT-4 (disclaimer I have no clue how this works)

let m={},t=0,f=0,s=0;setInterval(function(){document.getElementsByClassName('mobile-item')[f].getElementsByClassName('item')[0].click();document.getElementsByClassName('mobile-item')[s].getElementsByClassName('item')[0].click();t=document.getElementsByClassName('mobile-item').length;s=(s+1)%t;if(s==0){m[f]=t;if(Object.keys(m).some(i=>m[i]<t)){let p=Object.keys(m).find(i=>m[i]<t);f=p;s=m[p];}else{f=(f+1)%t;s=f;}}document.title=f+'+'+s+'|'+t;},500);

thunderrabbit · 2 years ago
Thank you! I've let your script run for near 20 hours. It has discovered 3000 items including

`One Does Not Simply Walk Into Mordor`

LonelyWolfe · 2 years ago
Your Welcome!
crazygringo · 2 years ago
I wish this were an actual game!

Like keep showing me a desired item to craft, that requires crafting 2 or 3 items to get to -- e.g. combine 2 existing things, then with a third existing thing. Or combine 2 existing things, another 2 existing things, and then combine those.

And obviously it keeps getting more complex the more items I acquire along the way.

And each time I play it's randomized.

(And let me play entirely with the keyboard by autocompleting each item as I type... dragging gets old real quick on a touchpad...)

wyre · 2 years ago
I remember there being a few phone games with this format. Joining elements together to make other things and using those to make other things.

Quick google search tells me the game is called Little Alchemy (there’s a sequel now too)

whhuh · 2 years ago
Yes! Shoutout to Zed's Alchemy, a gem of an ancient iOS game with the same premise.
latexr · 2 years ago
You’ll probably enjoy Scribblenauts.

https://en.wikipedia.org/wiki/Scribblenauts

vintermann · 2 years ago
The impressive thing about Scribblenauts was that of course, it didn't have anything like an LLM. They went through a dictionary and added everything they could, then they went through several rounds of playtesting and added everything the playtesters managed to think of that they didn't already have (minus copyrighted characters and other things that would get them into trouble)
wdh505 · 2 years ago
I played a game like this once, it was called "cow evolution:idle merge game". It wasn't randomized, but skinnerboxxed. Perhaps that is not quite what you meant.
TeMPOraL · 2 years ago
Ah yes, Random + Malice -> Skinnerbox.
jv22222 · 2 years ago
Doodle God works exactly this. Very satisfying, fully polished.