This looks like straight character substitution, so it's essentially just trial and error, but the best vector for attack is the following:
Look at the shorter words first (2 and 3 character words), guess what one word might be, then match the same characters in the other short words. Once you have a few that seem to pair up, you can start building the longer words from the answers you've got from the shorter ones.
Puzzles like this one isn't far off doing a crossword or sudoku. There isn't really a cypher to it, no maths etc. It's just having the patience to guess at a few placements then seeing if that fits the wider model.
Why am I being marked down for that? It's clearly marked spoiler so anyone who doesn't want tips can avoid it; yet in spite of that, I was very careful not to give any answers away. All I did was suggest techniques to crack the code. And most importantly, my post answers the question raised - which is the whole fucking point of a comments system.
If anyone didn't want to hints then they should have just skipped over the post the moment they read "spoiler alert" rather than knee jerk reacting with a down-vote for a post that others might have found helpful.
I swear to god the use of the peer review system on HN has been in steady decline over the last few years.
If you go read a book like the one I recommended you'll be getting an education in the various sorts of ciphers out there and techniques to break them. The specific answer given above is how to break this particular cipher, thus it's not really far off giving the answer. The topic is more broad and interesting than that.
Still, it's a common courtesy that if you downvote someone, you tell them why. I think most of us are here for hopefully enlightened discussions, driven by a yearning to learn, share, and explore various topics. We want to be taken seriously, for the most part, and take seriously what we say. Yes, at the end of the day it's just "internet points", but that's belittling our experiences and interactions here to be so dismissive to suggest one should just ignore them.
If that was the intended design, then perhaps votes should be hidden from users as well, so that we'd never know if we were voted up or down; but, I think the design is intended to somewhat subtly clue us in about whether our opinions and statements are popular, controversial, or whatever. It's a feedback loop, and most forms of conversation involve such indirect feedback loops in the form of non-verbal communication -- though in real-life, it's heavily augmented by body language, facial expressions, voice tone and inflection, etc. We don't have those luxuries here, and so the only non-verbals we're left with are the up-arrows.
It's one thing to receive a single down-vote, hell you can't please everyone, right? However, when you try in earnest to participate in a conversation, and you receive the equivalent of a "shut up" from the crowd, then you're left wondering: did I miss the entire point? Did I accidentally offend someone? Was I factually incorrect?
For a healthy conversational atmosphere, it helps to resolve these issues, so that we can improve our communication -- and hopefully avoid the need for any downvotes in the future.
I would also add using letter frequency is quite handy also. As knowing which letters are tend to be seen more frequent you can shorten your trip. Also it's nice thing to do instead of crosswords :)
I'd say the long words offer the better opportunities. Look at the puzzle that has the encrypted word, PIKODENHFENJIKM. How many English words, when used to make look up table based on this key, generate the word when encoded with this key? Only one.
lookup = {c: d for c, d in zip(pattern, word)}
return "".join(lookup[c] for c in pattern) == word
Now you have a fifteen letter word solved in the puzzle. It's not hard after that.
This looks like straight character substitution, so it's essentially just trial and error, but the best vector for attack is the following:
Look at the shorter words first (2 and 3 character words), guess what one word might be, then match the same characters in the other short words. Once you have a few that seem to pair up, you can start building the longer words from the answers you've got from the shorter ones.
Puzzles like this one isn't far off doing a crossword or sudoku. There isn't really a cypher to it, no maths etc. It's just having the patience to guess at a few placements then seeing if that fits the wider model.