9 ms·
Show HN: Hangman in 3 lines of Python
- jftuga 11y agoThis is kinda cool.
- deleted 11y ago[deleted]
- sdrothrock 11y agoThis is a great example of "lines of code" being prioritized over the actual program itself. I suppose it's neat that he abused style to shrink a program to three lines, but it's not really meaningful. I do think the program itself is pretty neat and never would have thought of using the word list for hangman.
- iLoch 11y agoMeh, many JavaScript apps are one line of code.
- OJFord 11y agoIn this context, I don't really think this should be down-voted. It sums up why LoC-minimisation (unless, perhaps, we say give a strict character limit per line, 80 say) is fairly meaningless. That said, I think this is a neat, small, working, fun implementation of Hangman, and using the system dictionary is a great idea.
- api_or_ipa 11y agoI think characters are a better count of brevity. Consider the archetypical shell is 80 chars wide, so there exists a direct translation to 'real' lines of code. See my 52 char fizz buzz in js: https://github.com/codeocelot/fizzbuzz_oneliner/ https://github.com/codeocelot/fizzbuzz_oneliner/
- nvader 11y agoIsn't the rest of the problem of fizzbuzz to then map your oneliner over the range 1 to 100, and print each result on a new line?
- nvader 11y agoSo, https://gist.github.com/danverbraganza/8447acc70ad08c92d4fd https://gist.github.com/danverbraganza/8447acc70ad08c92d4fd has an uglified version of the same code, shortening identifiers, removing extraneous whitespace, and (!) replacing bool(x) with not x to save 2 characters. That's a good first stab at it, but it can definitely be smaller, esp. if you're willing to add more lines (which I'm not). Happy hacking!
- betaveros 11y agoFor the lulz, I turned your code into one line with lambdas: https://gist.github.com/betaveros/1e76b3ca53001c8edcef https://gist.github.com/betaveros/1e76b3ca53001c8edcef It takes quite a few more characters, but it was fun.
- pen2l 11y agoOkay, I have an even better challenge for you guys. Instead of minimizing it to least amount of lines/chars, you have to maximize the clarity of the code such that the rest of us laymen can understand it. GO!!!!
- nvader 11y agoI like it! Looks like you replaced while with a recursion, and you had to import sys to get rid of a print statement. Bravo :)
- meric 11y agoI guessed a word I never heard of, "Phytolaccaceae"! Learnt a new word today. It's a group of flowering plants. Thanks for doing this write up. The functional style of the code reminded me of Haskell.
- OJFord 11y agoCtrl-C to win. ;)
- Timethy 11y agoMy favorite Apple II periodical "Nibble Magazine" had a regular feature called One & Two Liners, neat little type-in BASIC programs. I learned a lot about programming by trying to decode the techniques. Thanks for sharing.
- collyw 11y agoI am sure Electron magazine (or whatever the UK publication for the Acorn Electron was called) had a "ten liners" section. To be honest I never learned much from it, as I was too young to have a proper grasp of programming, but you could get some neat stuff happening by typing those ten lines.
- eggy 11y agoFun, thanks! I'm going to try and best it in the J programming language. I am betting it will be 1 or 2, 80 character lines maximum. I'll post when done.
- RodgerTheGreat 11y agoI while ago I wrote a simple Hangman in K, a cousin of J. 6 fairly simple SLoC, and there's still some room for golfing it: d: ("aardvark";"apple";"peanut";"etc"); / dictionary w: d[*1?#d]; / pick a word c: {|/w=/:x}; / correctly guessed b: {{$[x 0;x 1;"_"]}'+(c[x];w)}; / word with blanks p: {`0:" > ";*0:`}; / prompt for a letter {~&/c[x]}{`0:b[x]; x,p[]}/"__"; `0:w,"\n"; https://github.com/JohnEarnest/ok/blob/gh-pages/examples/hangman.k https://github.com/JohnEarnest/ok/blob/gh-pages/examples/han...
- eggy 11y agoNice. And I am sure in K that you can put all of those lines in one big line, making it a one line solution vs. his 3 line solution. This is why I think the suggestion above about character count is more relevant in this type of 'golfing'. This will give me a start on my J program. However, he does some reaching out for words to the word list found in a local word list. I plan on doing the same, and possibly an internet connection more word lists. EDIT: Realized words from usr/.. word list, not internet.
- RodgerTheGreat 11y agoSure, I could certainly compress it into a oneliner. I'm mainly focused on trying to make something simple with few moving parts. To that end I did a little more tinkering. Most pleasantly I was able to remove the conditional: w: *1?("aardvark";"apple";"peanut";"etc") / pick a word c: {|/w=/:x} / correctly guessed b: {("_",'w)@'c x} / word with blanks p: {`0:" > ";*0:`} / prompt for a letter {~&/c x}{`0:b x; x,p[]}/"__"; `0:w,"\n";
- dataharry 11y agoA line is 80 characters. You can write arbitrarily long python programs without the newline character.
- ant6n 11y agoI like the conclusion to this fun little exercise: """To write out all the code and make minor refactorings took around 30 minutes. It took me way longer than that to write this blog post detailing exactly how it works. If I wanted to draw a moral from an exercise I entered into purely for amusement, I would have to repeat the oft-quoted wisdom that code that is readable and understandable is going to save you much more time in the long run."""
- tamana 11y agoPlease stop writing programs and then abusing punctuation to get the "line count" smaller. That doesn't enlighten anyone.
- mixedCase 11y ago> and is present on all UNIX and UNIX-like systems. Except for Arch Linux, apparently. It requires the words package, which then links to the file corresponding to your locale.
- brbsix 11y agoHere is the Python 2/3 compatible version: license, chosen_word, guesses, scaffold, man, guesses_left = 'https://opensource.org/licenses/MIT', ''.join(filter(str.isalpha, __import__('random').choice(open('/usr/share/dict/words').readlines()).upper())), set(), '|======\n| |\n| {3} {0} {5}\n| {2}{1}{4}\n| {6} {7}\n| {8} {9}\n|', list('OT-\\-//\\||'), 10 while not all(letter in guesses for letter in chosen_word) and guesses_left: _, guesses_left = list(map(guesses.add, filter(str.isalpha, (__builtins__.raw_input if 'raw_input' in dir(__builtins__) else __builtins__.input)('%s(%s guesses left)\n%s\n%s:' % (','.join(sorted(guesses)), guesses_left, scaffold.format(*(man[:10-guesses_left] + [' '] * guesses_left)), ' '.join(letter if letter in guesses else '_' for letter in chosen_word))).upper()))), max((10 - len(guesses - set(chosen_word))), 0) print('You', ['lose!\n' + scaffold.format(*man), 'win!'][bool(guesses_left)], '\nWord was', chosen_word)