Programming Puzzle

I

Ioannis Vranos

Ioannis said:
Isn't the bitwise solution safe only for unsigned integrals?


I just checked the standard, it is safe for both integral and
enumeration types.






Regards,

Ioannis Vranos
 
I

Ioannis Vranos

Ioannis said:
However in both cases bitwise operations are guaranteed to be safe only
on unsigned integrals, so the above had better include the remark:


"where x is of unsigned integral type".



Just checked the C++98 standard, and they are valid for both integral
types and enumerations so what I said above is not needed.






Regards,

Ioannis Vranos
 
D

Darrell Grainger

I found these questions on a web site and wish to share with all of u
out there,Can SomeOne Solve these Porgramming puzzles.


Programming Puzzles

Some companies certainly ask for these things. Specially Microsoft.
Here are my favorite puzzles. Don't send me emails asking for the
solutions.

[bunch of questions snipped]

Learn to use a search engine. The answer to the questions and many other
questions are readily available on the internet. You just need to learn to
search for them. Hint: http://groups.google.ca.
 
J

Jerry Coffin

Siemel Naran said:
What is "tail" recursion? Are there other types of recursion?

Tail recursion is when the recursive call is the final step of an
algorithm. If the recursive call isn't the final step, it's not tail
recursion. In some cases, of course, an algorithm with some other
execution pattern can be converted to a tail-recursive form, but
others can't (especially those that include two or more recursive
calls).
Any the question says not to use loops. But to me, recursion is a loop,
just expressed differently.

Both certainly express the concept of repeated execution of some set
of instructions. I'm less certain of characterizing all iteration as a
loop though.

[ ... ]
Are these methods faster than x*7 on modern processors?

Sometimes they are, other times they're not. The correct answer will
often depend as much on surrounding instructions as it does on the
processor.

As has already been noted, I mis-parenthesized that. It should have
been "return (x==7)*4+(x==4)*7;" It's based on the fact that in C a
'true' result has the value 1, and a 'false' result has the value 0.
C++ has a type specifically for booleans, but for backward
compatibility it still allows them to be implicitly converted to
integer types.
Probably something with mod or %.

Maybe -- OTOH, that's sort of the basis of the 'x^3' version.
There's another. Have two iterators, first one pointing to first element,
the second pointing to the second. The second one is the fast iterator and
you increment it twice in each iteration. The first iterator is the slow
iterator and you increment it once in each iteration. If the list is not
circular the fast iterator will hit NULL at some point. If the list is
circular the fast iterator will equal to the slow iterator at some point.

Yes -- I'd seen that posted elsewhere so I didn't repost it, but it IS
pretty clever.
 
W

Wayne Rasmussen

Siemel said:
That might be too out of the box :).

A job interview is for finding a match. The company is also under the
microscope. Would you really want to work for a company who gives this
as the big programming test?
 
G

Gregory Pietsch

I found these questions on a web site and wish to share with all of u
out there,Can SomeOne Solve these Porgramming puzzles.


Programming Puzzles

Some companies certainly ask for these things. Specially Microsoft.
Here are my favorite puzzles. Don't send me emails asking for the
solutions.

Q2 Write a C++ program without using any loop (if, for, while etc) to
print numbers from 1 to 100 and 100 to 1;

I'll try it in C, should be portable to C++:

#include <stdio.h>

int p(int x, int i)
{
(x > 100) && (i = -1);
(x > 0 && x < 101) && printf("%d\n", x);
(x > 0) && p(x + i, i);
return 1;
}

int main(void)
{
p(1, 1);
return 0;
}

Gregory Pietsch
 
P

Prateek R Karandikar

I found these questions on a web site and wish to share with all of u
out there,Can SomeOne Solve these Porgramming puzzles.

The topic of this groups is Standard C++. Where C is mentioned, I will
interpret it after replacing it with C++.
Programming Puzzles

Some companies certainly ask for these things. Specially Microsoft.
Here are my favorite puzzles. Don't send me emails asking for the
solutions.

Q1 Write a "Hello World" program in 'C' without using a semicolon.
Use a universal-character name to denote the semicolon, or use #error,
if outputing at compile time is acceptable.
Q2 Write a C++ program without using any loop (if, for, while etc) to
print numbers from 1 to 100 and 100 to 1;
#include<iostream>
int main()
{
cout<<"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
93 94 95 96 97 98 99 100 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86
85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63
62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40
39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17
16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1"<<endl;
}
Q3 C/C++ : Exchange two numbers without using a temporary variable.
Assuming that a and b are ints and ((&a)!=(&b))
a^=b;b^=a;a^=b;
Q4 C/C++ : Find if the given number is a power of 2.
Keep generating powers of 2 till one equals (Ans: yes) or exceeds
(Ans: no) the given number.
Q5 C/C++ : Multiply x by 7 without using multiplication (*) operator. x+x+x+x+x+x+x
Q6 C/C++ : Write a function in different ways that will return f(7) =
4 and f(4) = 7
The expression f(7)=4 calls f with the argument 7, assigns 4 to the
lvalue returned, and evaluates to that lvalue. Assuming that you want
this function to return int.
int foo()
{
//0;
//To write this func. in a diff. way, remove "//" from the above
line
if(some_condition)
return(f(7)=4);
return(f(4)=7);
}

The question said a function that returns foo and bar, which I have
changed to a function that returns foo in certain cases and bar in
other, as a function returns only one object in a call.

Q7 Remove duplicates in array
Array elements cannot be "removed".
Q8 Finding if there is any loop inside linked list.
Q9 Remove duplicates in an no key access database without using an
array

If this can be done using arrays, do it in the same way using
std::vector instead of arrays.
Q10 Write a program whose printed output is an exact copy of the
source. Needless to say, merely echoing the actual source file is not
allowed.
Q11 From a 'pool' of numbers (four '1's, four '2's .... four '6's),
each player selects a number and adds it to the total. Once a number
is used, it must be removed from the pool. The winner is the person
whose number makes the total equal 31 exactly.

And the programming exercise is?
Q12 Swap two numbers without using a third variable. See the ans to Q3
Given an array (group) of numbers write all the possible sub groups of
this group.
Q14 Convert (integer) number in binary without loops.
If by "convert (integer) number in binary" you mean to output the
number in binary form,

#include<bitset>
#include<climits>
#include<iostream>
int main()
{
int x;
cin>>x;
bitset<CHAR_BIT*sizeof(unsigned long)> a(x);
cout<<a<<endl;
}
Q3,12 are similar , Q7 is simple & I know there answer For the Rest
please Help


Wiating for reply.

-- --
Abstraction is selective ignorance.
-Andrew Koenig
-- --
 
F

Foobarius Frobinium

I found these questions on a web site and wish to share with all of u
out there,Can SomeOne Solve these Porgramming puzzles.


Programming Puzzles

Some companies certainly ask for these things. Specially Microsoft.
Here are my favorite puzzles. Don't send me emails asking for the
solutions.

Q3 (the same as the other you mentioned, basically) took me less than
a minute to solve, and I'm only 16:

/* vim:ts=4
*/

#include <stdio.h>

int main(void) {
int foo = 87;
int bar = 56;

foo += bar;
bar = foo - bar;
foo = foo - bar;

fprintf(stdout, "%i, %i\n", foo, bar);
}

Try other values for foo & bar, even negatives and zero.

You mentioned MS often use these sorts of puzzles to test their
programmers. I got an even better one to stump even the best MS
programmers:

/* vim:ts=4
*/

#include <stdio.h>

int main(void) {
int *foo = NULL;

fprintf(stdout, "%i\n", *foo);
}

What will happen if I compile and run this program??
 
J

JKop

Am I the only person here that thinks it's complete bullshit to think you
can swap the values of two variables without a temporary variable?! It
simply cannot be done. Why? Consider this, you have two containers, each of
capacity 3 litres. Each of them is filled with 2 litres of water. Swap the
water from the containers. Okay... let's just poor all of one of them into
the other. Mammy mammy! It was an accident, I didn't realize you can't put 4
litres of water into a 3 litre container.

Fools.


-JKop
 
J

Joona I Palaste

JKop <[email protected]> scribbled the following
Am I the only person here that thinks it's complete bullshit to think you
can swap the values of two variables without a temporary variable?! It
simply cannot be done. Why? Consider this, you have two containers, each of
capacity 3 litres. Each of them is filled with 2 litres of water. Swap the
water from the containers. Okay... let's just poor all of one of them into
the other. Mammy mammy! It was an accident, I didn't realize you can't put 4
litres of water into a 3 litre container.

It *can* be done! Not with all kinds of variables, but with unsigned
integer types, it's easy. Not one, but *two* ways to do it have been
shown in this thread. Of course it will break down if those variables
happen to share the same memory location, which can be the case if using
pointers and indirecting through them.

--
/-- Joona Palaste ([email protected]) ------------- Finland --------\
\-- http://www.helsinki.fi/~palaste --------------------- rules! --------/
"I am not very happy acting pleased whenever prominent scientists overmagnify
intellectual enlightenment."
- Anon
 
N

Nick Landsberg

Joona said:
JKop <[email protected]> scribbled the following



It *can* be done! Not with all kinds of variables, but with unsigned
integer types, it's easy. Not one, but *two* ways to do it have been
shown in this thread. Of course it will break down if those variables
happen to share the same memory location, which can be the case if using
pointers and indirecting through them.

The "xor" method works on all unsigned integer types,
and [OT] if you program in assembler, it works on
any two memory locations or registers unless you
cause a trap along the way. [/OT]

However the arithemetic method upthread, i.e.
foo += bar;
bar = foo - bar;
foo = foo - bar;

may fail if you get unsigned integer overflow, at
least I think *may* fail. This may be the case of
the container not being able to hold 4 litres.

What does the C-standard say about unsigned integer overflow?

NPL

PS. - [OT] there are, of course, languages which do
not have the "exlusive OR" operator. But they're
not C [/OT]
 
J

Joona I Palaste

Nick Landsberg <[email protected]> scribbled the following
The "xor" method works on all unsigned integer types,
and [OT] if you program in assembler, it works on
any two memory locations or registers unless you
cause a trap along the way. [/OT]

The "xor" method will *not* work on two variables with the same memory
location. You'd expect the swap to be a no-op, but it ends up setting
both variables to 0, because it "xors" the first variable with itself,
yielding 0, and then keeps "xorring" this 0 with itself.
 
N

Nick Landsberg

Joona said:
Nick Landsberg <[email protected]> scribbled the following
Joona said:
JKop <[email protected]> scribbled the following
on comp.lang.c:

Am I the only person here that thinks it's complete bullshit to think you
can swap the values of two variables without a temporary variable?! It
simply cannot be done. Why? Consider this, you have two containers, each of
capacity 3 litres. Each of them is filled with 2 litres of water. Swap the
water from the containers. Okay... let's just poor all of one of them into
the other. Mammy mammy! It was an accident, I didn't realize you can't put 4
litres of water into a 3 litre container.

Fools.

It *can* be done! Not with all kinds of variables, but with unsigned
integer types, it's easy. Not one, but *two* ways to do it have been
shown in this thread. Of course it will break down if those variables
happen to share the same memory location, which can be the case if using
pointers and indirecting through them.

The "xor" method works on all unsigned integer types,
and [OT] if you program in assembler, it works on
any two memory locations or registers unless you
cause a trap along the way. [/OT]


The "xor" method will *not* work on two variables with the same memory
location. You'd expect the swap to be a no-op, but it ends up setting
both variables to 0, because it "xors" the first variable with itself,
yielding 0, and then keeps "xorring" this 0 with itself.

You are correct. I should have said two different/distinct
memory locations.
 
M

Mabden

Wayne Rasmussen said:
A job interview is for finding a match. The company is also under the
microscope. Would you really want to work for a company who gives this
as the big programming test?

I just "interviewed" with a company in Los Angeles (that little country
between Mexico and USA). They didn't even talk to me at all. They handed me
a "personality test", which also included an intelligence test (and I've
been through Mensa testing - it was hard), and sat me in a room for 2 hours.
At the end they took the answer sheet and said they'd get back to me.

I passed the test, I guess, because I get to go back next week for another 2
hour programming test. If I pass that, I get to move to round three which is
to face a panel of their programmers in a room for questioning. I'm guessing
it'll be about 2 hours...

Whee...

--
Mabden

p.s. Here's one I missed: What is the next letter in this sequence: A F Z U
G L T ? 1. O 2. C 3. X 4. N
p.p.s. I figured it out later. ("You think you're better than me?!!")
 
J

Joona I Palaste

Mabden <mabden@sbc_global.net> scribbled the following
I just "interviewed" with a company in Los Angeles (that little country
between Mexico and USA). They didn't even talk to me at all. They handed me
a "personality test", which also included an intelligence test (and I've
been through Mensa testing - it was hard), and sat me in a room for 2 hours.
At the end they took the answer sheet and said they'd get back to me.
I passed the test, I guess, because I get to go back next week for another 2
hour programming test. If I pass that, I get to move to round three which is
to face a panel of their programmers in a room for questioning. I'm guessing
it'll be about 2 hours...

Unbelievable. I rmemember *my* latest job interview. The company's CEO
and I sat in the corridor of a Finnish technology enterprise building,
where the company's offices were located at the time, and talked for a
few hours about what I'm like as an employee. Later, I, the CEO and the
company's chief programmer met in a restaurant and talked about what I
am like as a programmer. The company paid for my dinner. Then I was
going about minding my own business when I got a call that I had got the
job. That's all there was to it. No tests, no panel hearings, just a few
hours of talk.
 
M

Mabden

Foobarius Frobinium said:
(e-mail address removed) (Jatinder) wrote in message
You mentioned MS often use these sorts of puzzles to test their
programmers. I got an even better one to stump even the best MS
programmers:
#include <stdio.h>

int main(void) {
int *foo = NULL;

fprintf(stdout, "%i\n", *foo);
}

What will happen if I compile and run this program??

You'll get a warning saying main() has no return value.
 
M

Mabden

Nick Landsberg said:
You are correct. I should have said two different/distinct
memory locations.

Uuuuhhh... if the two "variables" point to the same location, then the swap
is done!
 
M

Mabden

Prateek R Karandikar said:
(e-mail address removed) (Jatinder) wrote in message
Keep generating powers of 2 till one equals (Ans: yes) or exceeds
(Ans: no) the given number.

I hate to give a clue to the offshore job stealers, but:

return !(x || 0x0001);
 
T

Thomas J. Gritzan

Mabden said:
return !(x || 0x0001);

(x || 1) evaluates to true,
(!true) evaluates to false,

So this is equivalent to:

return false;

But the question was if x is a power of 2.

TJG
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,599
Members
45,165
Latest member
JavierBrak
Top