11 ms·
You Can't JavaScript Under Pressure
- tomscott 13y agoOh! Hello. This is my thing I made for usvsth3m.com. Hope y'all like it. HTML5 Webworkers made it possible - sandboxing user-submitted JavaScript so an accidental while(1) or document.write can't kill everything. Do have a look at the source code. Oh, and try turning up your speakers and typing in the Konami code...
- JosephRedfern 13y agoIf you alert() something inside an infinite loop it doesn't seem to be able to detect it (nor does it show an alert box!)
- Demiurge 13y agoNothing like figuring out another way to kill your browser :)
- TazeTSchnitzel 13y agoOh, you, Tom Scott, made it? :D I'm a big fan. A few suggestions, then: 1. Don't use i as the name of the parameter. A lot of people use that as the name of loop variables, and it means breaking habit or wasting time changing the name. 2. For test 3, try some multiple-extension files to make sure they did it right (some.file.multiple.extensions, should return "extensions") 3. For test 5, it says "integers". Try some non-integers during testing, to make sure that it's only checking for integers. 4. For test 5, it says "arrays". Try some objects to make sure they're not being lazy and using typeof thing === "object" Anyway, thanks for making this. I love it!
- TazeTSchnitzel 13y agoOh, you, Tom Scott, made it? :D I'm a big fan. A few suggestions, then: 1. Don't use i as the name of the parameter. A lot of people use that as the name of loop variables, and it means breaking habit or wasting time changing the name. 2. For test 3, try some multiple-extension files to make sure they did it right (some.file.multiple.extensions, should return "extensions") 3. For test 5, it says "integers". Try some non-integers during testing, to make sure that it's only checking for integers. 4. For test 5, it says "arrays". Try some objects to make sure they're not being lazy and using typeof thing === "object" Anyway, thanks for making this. I love it!
- cheshire137 13y agoThe sudden music/talking that started was annoying and caused me to close the tab immediately.
- brudgers 13y agoNo NoScript?
- Kiro 13y agoAre you seriously using NoScript? I thought it was a myth.
- tonyarkles 13y agoMaybe I'm naive but... I suspect that the rest of the page wouldn't have worked with NoScript. Since you're, you know, typing in JavaScript code and running it against some test cases.
- ronaldx 13y agoI am using Noscript and the page works fine: - usvsthem is white-listed so Javascript runs, which is all that's strictly required. - White-listed sites are still blocked from running plugins including <AUDIO>. It's straightforward to override this on a plugin-by-plugin basis but I typically don't want to. 11:14. The 14 seconds were enough for the first two questions, but I find strings and array handling tough when switching languages.
- tonyarkles 13y agoAhhh that's pretty cool!
- prezjordan 13y agoLighten up, everyone, this is a fun little thing. Thanks for sharing.
- mikeash 13y agoThanks for immediately playing audio without asking me first. I know everybody just loves it when web pages do that.
- corresation 13y agoBecause of your comment, HN will have a dozen "I am so disappointed in all of you" posts in the coming week declaring how mean everyone here is, and how it is no longer like it "once was". I hope you are happy.
- mikeash 13y agoI'd be happier if this page hadn't blasted music into my conference call.
- Demiurge 13y agoHehe. I wish OSX had individual program volume controls... On Windows 7 I usually have flash process volume on 'off', unless I'm specifically watching something.
- tutuca 13y agoYour fault for not paying attention during a conference call...
- mikeash 13y agoYeah, because we never have conference calls where we have to be there but don't really have to do anything besides listen for our name.
- codenberg 13y agodon't surf the web on a conference call. problem solved.
- kostyk 13y ago
- ryanthejuggler 13y agoCould there be a histogram at the end that shows distribution of finishing times? Or at least a leaderboard... I did pretty well [obviously ;)] but I'd like to see where my time falls in relationship to others. I've confirmed that I can, in fact, code under pressure, but to what degree? Other than that, fantastically fun game. My only regret is that it's a one-time game by nature, since obviously the second time around you'd simply be remembering what you did the first time instead of creating it.
- Aco- 13y agoA lot of people posted their results to twitter, you can get an idea of where you fall in avg by giving this a glance over: https://twitter.com/search?q=I%20completed%20%22You%20Can't%20JavaScript%20Under%20Pressure%22&src=typd https://twitter.com/search?q=I%20completed%20%22You%20Can't%...
- ep103 13y agoWhat's everyone's times? I did 7 minutes
- Justin_Time 13y ago4 minutes, 56 seconds for all 5 levels. Well done!
- mneary 13y agoJust under 3 minutes!
- hatsuseno 13y agoMy JS is somewhat rusty, glad I had a .map() to work with. 9 minutes something, I did 'cheat' by looking up some typeof returns.
- CompelTechnic 13y ago17 minutes, 47 seconds. slow poke here.
- dclowd9901 13y ago26 Minutes. If you're a slowpoke, I'm a Slowbro.
- robflynn 13y ago"2 minutes, 32 seconds for all 5 levels. Well done!" The "kill screen" song is stuck in my head now.
- trevordixon 13y ago4:20.
- renekooi 13y ago2:26.
- methodover 13y ago14 minutes, 27 seconds for all 5 levels. Bah, should've done better. On the other hand I just woke up. I wanna see one of these in Python.
- deleted 13y ago[deleted]
- leehro 13y agoThis was awesome. 5:48. I actually turned my sound on for the end.
- kirse 13y agoFun little puzzles. First 4 went pretty quickly (~8:00) and then the last one took ~7 minutes Googling around for this so I could test if a variable was an integer... n===+n && n===(n|0) Wish I could see my answers after the fact though! Edit: Read the initial requirements of the puzzle, it says sum all the integers, not all the numbers. People using (typeof i[x] == 'number') just got lucky because the test-cases didn't exercise the full requirements of the puzzle ;) // i will be an array, containing integers and/or arrays like itself. // Sum all the integers you find, anywhere in the nest of arrays.
- Justin_Time 13y agotypeof n === 'number' It didn't actually require differentiating between integers and floats, just numbers and other types.
- solox3 13y ago> typeof 5.4 "number"
- kirse 13y agoYea, this is what I realized once I saw the puzzle was throwing junk data like "false" on #5. I mentally skipped over Justin_Time's solution, figuring I would just hit a float error case because it was going to be a stickler about integers.
- iainnash 13y agoThis typeof stuff (and having number instead of integer, string, etc) was the hardest part of this for me. Normally javascript function inputs aren't this messy.
- deleted 13y ago[deleted]
- kentor 13y agon % 1 == 0
- Bahamut 13y agoIt was a kinda cool thing, although I got some strange behavior when I was using `match` for determining whether the input is a filename - my regex was /.\../ (and so I did var match = i.match(/.\../) ), and match[1] was undefined - turned out match[2] was what I wanted, and it was present, but the behavior was incorrect in the reporting console in the game. I finished this in 4 minutes. Edit: looks like HN doesn't like asterisks
- tensafefrogs 13y agoI thought regex was overkill for that one and used: return input.split(".")[1] || "";
- dclowd9901 13y agoI fully anticipated a test case like file.name.ext. Of course, you could still do what you're doing, but it'd be a lot more verbose.
- Bahamut 13y agoWhat if it had multiple dots? Anyhow, I am on 5 hours of sleep, and already s spent6 hours coding...I just wanted to finish fast.
- axyjo 13y ago"6 minutes, 21 seconds for all 5 levels. Well done!" I feel like I should have done better considering JS is one of my primary languages.
- Demiurge 13y agoThat was fun! I just got in to work so I was properly sleeping. I also rarely use typeof, so I had to look up that 'integer' and 'array' do not exist :) Also, what was really annoying is the use of 'i' for the argument. That's what I exclusively use for the 'for loop' index! Tripped me up a lot, I had to consciously remind myself every time I accessed the array. Last 'also', the font is WAY too big for my small screen, the comment never fit in, I had to scroll... So I think I did bad, 12 minutes. But still fun :)
- peeters 13y agoFun distraction. For me it was: 30% figuring out the answer, 20% not having my editor shortcuts available, 50% figuring out how to check if a value is a certain type. Am I the only one that gives their functions preconditions that the input is good? To me, throwing up when you're passed a non-number to a sum method is correct behavior.
- dclowd9901 13y agoTIL there is no typeof === 'array'. -_-
- ep103 13y agoArray.isArray(yourVariable), yeah, had to mdn that one too.
- rhengles 13y ago[] instanceof Array; // returns true
- dclowd9901 13y agoClever...
- bentruyman 13y agoHowever this fails on "Array-like" objects like NodeLists.
- hayksaakian 13y agotypeof(["an array", "contains multiple things"]) == typeof(["sometimes"])
- iclelland 13y agoYes, but: typeof(["an array", "contains multiple things"]) == typeof({but_this_one: "is an object"})
- Kiro 13y agoWould be great to see some solutions.
- pak 13y agoIt's problems like 5 that make me sad that IE <9 doesn't have Array.prototype.reduce. return i.reduce(function(prev, next) { if (typeof(next) == "object" && next.length) { return arraySum(next) + prev; } if (typeof(next) == "number") { return next + prev; } return prev; }, 0); Something that simple needs to be shimmed on earlier IEs. In fact, I had to look up Array.prototype.reduce for this since I usually use Underscore's. Javascript problems...
- dmak 13y agoPretty interesting solution. The first thing that came to my head was a loop, but you just used reduce. What are some scenarios where you would use a reduce over a loop? I use underscore a lot too, and I find myself just using _.each all the time
- pak 13y agoAnytime where you are trying to "collect" features of an array into one final value, and the collection function can be sensibly applied to the elements in any order as long as some interim value is passed along (e.g. summing, maximizing), the reduce paradigm is appropriate and can be more readable. The bonus upside is that these paradigms also make parallelism quite simple, should it later be necessary.
- 1wheel 13y agohttps://github.com/kriskowal/es5-shim https://github.com/kriskowal/es5-shim
- pak 13y agoCool project, but all the warnings on that page about the edge cases make me concerned about trying to exuberantly move to ES5, and so I just stick with Underscore and the same level of JavaScript syntax I've been writing since 2005. (sigh)
- ianstallings 13y agoI'm a bit disappointed that it doesn't award points for my heavy use of regex and obscure variable names.
- Cyranix 13y ago> obscure variable names Absolutely! Being under the gun led me, at one point, to have a "longest string in array" method with a statement like if (i[z].length < qq) { ... }
- chudi 13y agonice stuff but this is plain wrong! // return the file extension (with no period) if it has one, otherwise false its like returning error codes in C for errors
- jamesroseman 13y agoI too shuddered at this instruction...
- ep103 13y agoOr for using i as your input variable
- dmak 13y agoI got 11 minutes and 14 seconds. Is that slow? The answer to my last solution was like this: function arraySum(i) { var total = 0 for(var x=0; x < i.length; x++) { if(typeof i[x] == 'object') { arraySum(i[x]) } else if(typeof i[x] == 'number') { total += i[x] } } return total }
- lighthazard 13y ago~6 minutes and 30 seconds That was also my final answer. However, I was going for speed and not elegance, after looking at other people's responses with prototypes and all.
- dclowd9901 13y agoYou must've total+= arraySum(i[x]) right? Otherwise this couldn't work as the result of a deep dive wouldn't be utilized anywhere...
- dmak 13y agoYeah, I did, thanks for pointing that out. I made that mistake when writing the comment.
- ep103 13y agoyou made the same mistake I did at first. Corrected below. function arraySum(i) { var total = 0 for(var x=0; x < i.length; x++) { if(typeof i[x] == 'object') { total += arraySum(i[x]) } else if(typeof i[x] == 'number') { total += i[x] } } return total }
- jamesroseman 13y ago9:10, had to Google a bit for type checking, and I had forgotten the proper syntax for a string split. :-/
- peregrine 13y agoTotal bait and switch. As soon as I saw that random array in my array of strings I knew what kind of game this would be.
- metaphorm 13y agothere's a truly dubious test case in the File Extension test. file called .htaccess is not filename "" and extension "htaccess" with a "." separating the two. .htaccess is a unix style dotfile. its whole name is ".htaccess" and it has no file extension.
- taternuts 13y agoI have to admit to cheating and putting 'if (i === '.htaccess') return 'htaccess';' to save time :)
- jrawlings 13y agoI just did return i.indexOf('.') > -1 ? i.substring(i.indexOf('.')+1) : false; Seemed to pass all test cases
- EdgarVerona 13y agoAye, I did similarly, though for some reason I did >= 0 instead of > -1. I wonder what % of people choose one test approach vs. the other?
- taternuts 13y agoI chose >= 0, it's fun to learn!
- drdrxp 13y agoThe input argument name "i" is really annoying. I always use "i" as for-loop var. Made some mistake on this. But the Game is really great. :D
- jenjem 13y agoI took almost 40 minutes, am I in the wrong profession? I figured out how to do all of them right away but I got stuck on figuring out JS syntax in a few places since I barely ever use it and felt like googling was cheating. I did use google on the last one to see how to check if something's an array. I even ended up checking at one point if something's a number by (!isNaN(n/4) && n+n == 2*n), and checked for being a string or not with if(s.length!=undefined) (I know that returns true for an array as well). Would've been a lot easier with something like Intellisense - coding without it feels almost like I'm blind, after being used to it. That and I thought alert() didn't work until I noticed at the end it actually sent it to the output.
- hcarvalhoalves 13y agoLast one reminded me how awful JS is once again. There are 5 different ways to check if an object is an array, some are implementation dependent, and the obvious one doesn't work (typeof x == "array").
- hayksaakian 13y agotypeof(x) === typeof(["something which is certainly", "an array"]) or am i missing something?
- wging 13y ago> typeof ["a", "b"] "object" Of course, since you're told you'll only get numbers, arrays, and strings, that is enough to solve the problem narrowly.
- Bahamut 13y agox instanceof Array
- salehenrahman 13y agoI got 3 minutes 39 seconds. I used i.forEach for questions involving arrays, instead of for-loops. Saves me time.
- salehenrahman 13y agoI created a CoffeeScript version of it. http://shovon.github.io/youcantcoffeescriptunderpressure/ http://shovon.github.io/youcantcoffeescriptunderpressure/