4
\$\begingroup\$

A class has N student and the class room has N switches (all turned OFF and numbered 1 to N). Each student has an enrollment number assigned from 1 to N. Each student serially (by number) toggles the switches that has a number which is divisible by his/her enrollment number.

Example: Student 1 will turn all the switches ON. Student 2 will turn all even switches OFF. Student N just toggles the Nth switch.

Write a function that takes N as input as returns number of ON switches. sample I/O

Input: 10
Output:3

No upper bound for N is given, but greater the scope, better the code. Shortest and innovative function wins

\$\endgroup\$
  • 9
    \$\begingroup\$ I think this is way too easy. Essentially this comes down as: »How short can I make an invocation of a library function«. \$\endgroup\$ – Joey Feb 13 '11 at 11:06
  • \$\begingroup\$ Well yes its easy when the trick is out.. without the perfect square trick, we cant be sure how different people would approach this problem. \$\endgroup\$ – Aman ZeeK Verma Feb 13 '11 at 23:10
  • 3
    \$\begingroup\$ This is a fairly well-known problem, I guess. At least I stumbled over it at least two or three times by now, mostly in programming contest contexts. And if you have two ways of approaching the problem with vastly different lengths, then you can be sure everyone will jump at the shorter one as soon as the first one does it. \$\endgroup\$ – Joey Feb 14 '11 at 9:36
  • \$\begingroup\$ @Joey, Totally agreed.. \$\endgroup\$ – Aman ZeeK Verma Feb 14 '11 at 9:55
  • 1
    \$\begingroup\$ @proudhaskeller If you look at the timestamps, you will notice that the OP seems to have accepted the first answer before any others were posted. \$\endgroup\$ – nyuszika7h Aug 16 '14 at 21:03

10 Answers 10

14
\$\begingroup\$

Python, 21 characters

f=lambda n:int(n**.5)

Perfect squares are the only numbers with an odd number of divisors.

\$\endgroup\$
  • 1
    \$\begingroup\$ I verified that this does work. However, I would love to know why this works. \$\endgroup\$ – Mitch Feb 13 '11 at 2:49
  • \$\begingroup\$ It works because every divisor of a number matches up with a different divisor, so they always come in pairs, producing an even number of divisors. The sole exception is if the number is a perfect square, in which case the square root of the number "pairs" with itself, producing an odd number of divisors. \$\endgroup\$ – Jerry Coffin Feb 13 '11 at 19:28
  • 1
    \$\begingroup\$ There's a lovely post at dailywtf.com about this problem. \$\endgroup\$ – st0le Feb 14 '11 at 4:49
  • \$\begingroup\$ @st0le: thedailywtf.com/Articles/Nerds,-Jocks,-and-Lockers.aspx \$\endgroup\$ – Joey Adams Feb 15 '11 at 16:54
  • 2
    \$\begingroup\$ Why is this accepted when all other answers are shorter? \$\endgroup\$ – J B Feb 16 '11 at 12:53
11
\$\begingroup\$

dc - 5 chars

[v]sf

Square root in dc is v. Using stdin/stdout takes 3 chars (?vp)

\$\endgroup\$
3
\$\begingroup\$

J, 9 chars

(Just for a simple example on J)

f=:[:<.%:

floor (<.) of square root (%:)

\$\endgroup\$
  • \$\begingroup\$ But the correct answer is the floor, not the ceiling. \$\endgroup\$ – Peter Taylor Feb 15 '11 at 15:58
  • \$\begingroup\$ @Peter: right, "<." is floor actually. :/ Thanks. \$\endgroup\$ – Eelvex Feb 15 '11 at 16:00
  • 1
    \$\begingroup\$ Why not <.@%:? It also never says it has to be a named function, so that brings you down to 5. \$\endgroup\$ – ɐɔıʇǝɥʇuʎs Aug 10 '14 at 15:22
  • \$\begingroup\$ @ɐɔıʇǝɥʇuʎs, this is from a time where this was debated (i.e. if J had to use a named verb when the question asked for a function). I don't know what the consensus is now. Also, since OP accepted a 21-char long answer, there is little point in golfing this. \$\endgroup\$ – Eelvex Aug 10 '14 at 20:43
2
\$\begingroup\$

Haskell - 12

Some text so that my post is long enough.

f=floor.sqrt
\$\endgroup\$
2
\$\begingroup\$

TI-BASIC, 3

int(√(Ans

Or in Stuck (invalid, since it's from 2015):

i/)

Or in QWERTY Reverse Polish Notation (valid, from 2009):

@r[

Not an interesting answer, but I think they win, since I can't find a language that has either one-character integer square root or implicitly reads from input and performs the calculation in two bytes.

\$\endgroup\$
1
\$\begingroup\$

GS2, 2 bytes

V-

The two instructions are parse number, and integer square root, in order.

The reason this works is that the only switches that are on are perfect squares. Those are the only numbers with an odd number of divisors.

\$\endgroup\$
  • \$\begingroup\$ +1—I spent about an hour looking for the correct language and couldn't find it. However, this language was written after the challenge, so it's technically not valid. \$\endgroup\$ – lirtosiast Oct 1 '15 at 7:19
  • \$\begingroup\$ Oh, sorry, didn't realize this challenge was so old. \$\endgroup\$ – recursive Oct 1 '15 at 7:41
0
\$\begingroup\$

Moonscript 23

Pretty simple and self-explanatory

s=(n)->math.floor(n^.5)
\$\endgroup\$
0
\$\begingroup\$

Math++, 6 bytes

_sqrt?

(Filler Text Because 30-char minimum)

\$\endgroup\$
0
\$\begingroup\$

Wren, 23 bytes

Basically square-root and floor.

Fn.new{|x|x.sqrt.floor}

Try it online!

\$\endgroup\$
0
\$\begingroup\$

05AB1E, 2 bytes

Try it online or verify the first N test cases.

Explanation:

t   # Square-root the (implicit) input-integer
 ï  # Cast it to an integer (a.k.a. floors)
    # (after which the result is output implicitly)
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.