Slashdot Log In
Programming Puzzles
Posted by
michael
on Sat Dec 04, 2004 12:55 AM
from the my-brane-hurts dept.
from the my-brane-hurts dept.
An anonymous reader writes "Spotted over at the Economist: 'Sliding-block puzzles look easy, but they can be tricky to solve. The best known is the 15 Puzzle, which became hugely
popular in the late 1870s. This involves square tiles labelled with the numbers 1 to 15, which must be arranged in the correct order inside a four-by-four frame.' While we've all tried these puzzles, the inventor of Quzzle set out to design the easiest looking -
yet most difficult puzzle around and turned to CS to find it. While
the original article touches on it, at the puzzle's site you'll find
Jim Lewis, the inventor, wrote a program in Haskell, a functional programming language to find the best design."
This discussion has been archived.
No new comments can be posted.
The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
Reminds me of Klotski (Score:2, Informative)
high return rate (Score:3, Insightful)
Ideally puzzles offer some form of partial gratification if one can see that they are getting closer. I don't know yet if this puzzle is all-or-nothing. There are a lot of different factors that make a puzzle commercially successful. Driving them crackers with deceiptful design is not aways one of them. But, it is an interesting idea.
Re:high return rate (Score:3, Interesting)
Ideally puzzles offer some form of partial gratification if one can see that they are getting closer.
In solving the rubiks cube the partial gratification of completing a side must be forsaken for the larger goal of solving the whole cube. This didn't stop it from becoming immensely popular.
Re:Rubik's Cube (Score:3, Interesting)
I was a kid when the Rubik's Cube came out. Our neighbor was a topologist. He went out and bought the cube, and presented it to his wife to have her scramble it. Then it sat, unmolested, on the coffee table for many nights while the topologist figured out the necessary moves to solve the puzzle.
It took him lots of pages on a legal pad but he did solve it. After about two weeks as I recall.
I, being a kid, bought the "How To Solve The Rubik's Cube" book on the family vacation a
the 15-square puzzle (Score:5, Interesting)
Re:the 15-square puzzle (Score:3, Funny)
My brother used to pull multiple Rubix Cubes apart and add extra color blocks to a side or two (making it unsolvable), and them give them to Rubix gurus to solve under the guise of needing help. It was interesting to watch them as their facial expression switched from a confident processing mode to confusion mode. We could take be
Re:the 15-square puzzle (Score:3, Funny)
If you swap the labels on two pieces it could make it unsolvable.
I'm looking at my Rubix Cube now and I'm noticing that a couple of the labels aren't on straight. Hmmmm....
Either this means that manufacturing standards are low enough that you probably wouldn't notice this type of hoaxing, or it means that someone has already done it to my Rubix cube and I still haven't noticed.
Re:the 15-square puzzle (Score:5, Interesting)
Parent
Re:the 15-square puzzle (Score:5, Interesting)
For this reason, an alternate way to ensure his confounding is to leave the orginal R for RATE in the corner and then mix the puzzle up such that the A of PAL is near the top and the A of RATE is near the bottom.
Parent
Re:the 15-square puzzle (Score:3, Informative)
Re:the 15-square puzzle (Score:3, Insightful)
For this to work right, you also have to color the squares in a checkerboard pattern, like the old plastic ones I used to have. Then the two R's are the same color, but the two A's are not. So if your victim uses the other A, the puzzle still won't look right
Re:the 15-square puzzle (Score:3, Informative)
Re:the 15-square puzzle (Score:2)
The "15" Puzzle (Score:4, Interesting)
Flash/Java... version of this puzzle? (Score:2, Informative)
You can play it here (Score:5, Informative)
Re:You can play it here (Score:2, Informative)
Unfortunately, reading the solution is almost a puzzle intself.
FULL SOLUTION (Score:4, Informative)
http://www.abysmalstudios.com/files/quzzlesolutio
although that will most certainly disapear in a while, as I clean up my server from time to time. In the interests of preserving history, I'll give you the excessively condensed version:
The goal is to move the A block in the far upper left corner, to the far upper right corner.
----
AA11
AA23
**23 - starting puzzle condition (* is a space)
4556
4778
----
The code below gives a block (1-8 or 'A') and an u/d/l/r direction.
AD1LL2U3U6UL3DD2R6UUAR4UU5L7L8LU7RR5D
You will have to break it up manually, because slashdots lameness filter wont even let me put line breaks in. Grab a copy of the text from my site while you can!
Parent
Re:FULL SOLUTION (Score:3, Informative)
5RR6DR7L5L
The correct sequence is:
5RR6DL7L5L
Note that changes only one move from R to L.
Other than that, the solution works wonderfully
Re:FULL SOLUTION (Score:3, Informative)
Despite that, the instructions were quite helpful. Thank you.
Whats so special? (Score:3, Insightful)
The puzzle presented in the article can be solved easily using a variety of basic AI heuristic search algorithms. A* and its varients come to mind.
I fail to see the significance of this guys program when people in my beginners AI class do this stuff for course projects every semester.
Re:Whats so special? (Score:3, Insightful)
A plug and a question... (Score:4, Informative)
I've also started a hint function that thells the user the precalculated minimum number of moves for each puzzle. The only problem is that Microsoft's Sunshine [rahga.com] puzzle is huge, and I've not seen any solutions for it online yet, never mind a calculated minimum. Any klotski addicts out there want to help me out?
one related puzzle I remember (Score:2)
Man I remember messing with that in the labs at school (back when they had macs) instead of doing work.
Traffic (Score:3, Informative)
More computer assisted puzzles (Score:3, Informative)
Re:I will help YOU get a JOB! (Programming puzzles (Score:4, Informative)
Parent
Re:I will help YOU get a JOB! (Programming puzzles (Score:3, Funny)
15. Go outside and meet girls.
Re:I will help YOU get a JOB! (Programming puzzles (Score:4, Interesting)
Parent
Re:I will help YOU get a JOB! (Programming puzzles (Score:3, Insightful)
Computer science has devolved into programming. Is the code that important, or the solution in regular syntax?
I think most people would find this difficult because they forget how to program in these languages, but that doesn't mean they can't see the answer
Re:I will help YOU get a JOB! (Programming puzzles (Score:2)
Question 3 Solved (Score:5, Informative)
My Computer Architecture teacher asked us essentially this question, he said Intel asked it in a way more palatible for computer engineers than CS students but it still works.
If A contains one number (int or register) and B contains the other:
B = A XOR B;
A = A XOR B;
B = A XOR B;
Explanation:
XOR is bitwise exclusive OR and is basically true when the bits differ.
Say if we're dealing with 4-bit numbers. In the example, say A = 1011 (11 in decimal) and B = 0101 (5 in decimal).
Step 1: If you take the exclusive OR of A (1011) and B(0101), the result is 1110 and put that into B (or A would be fine). Do bit by bit comparisons based on position from left to right and if the bits are different, mark a one in it's position, if they are the same, mark a zero. By this point A contains an original pattern, 1011 (decimal 11) and B contains the difference 1110 (decimal 14) between patterns.
Step 2: Take the XOR of A and B again and store in the variable with an original pattern (A in this instance). 1011 XOR 1110 comes out to being 0101 (the original value for B) and we store it in A.
Step 3: Take the final XOR of A and B again, store in last register B. 0101 XOR 1110 comes out to 1011 (our original A) and is stored in register B.
Voila, 2 values exchanged very elegantly without wasted space and done in the same amount of steps as using a temporary variable. If you still don't understand, it works on the premise that if you have two piece of data, you only need one piece of data and whats different from the two pieces of data, that way you can reconstruct the other piece of data.
Parent
Re:Question 3 Solved (Score:2, Interesting)
a ^= b ^= a ^= b;
or
#define SWAP(a,b) (a^=b^=a^=b);
Re:Question 3 Solved (Score:2)
Re:Question 3 Solved (Score:3, Insightful)
Re:Question 3 Solved (Score:3, Insightful)
Re:Question 3 Solved (alternative method) (Score:2, Informative)
A = A*B
B = A/B (gives B the orig A)
A = A/B (gives A the orig B)
Re:Question 3 Solved (alternative method) (Score:3, Informative)
Re:Question 3 Solved (Score:4, Informative)
What a mouthful! Us Perl programmers are, of course, lazy :)
cLive ;-)
Parent
Re:Question 3 Solved (Score:2)
If x = 3, and y = -4:
x = 3 + -4 -> x:= -1
x = -1 - -4 -> x:= +4
y = 3 - -4 -> y:= +7
At completion, x = 4, y = 7, won't work.
Re:Use only subtraction and addition (Score:3, Insightful)
Maybe the people who start generating code without properly understanding and defining the problem to be solved don't get the job? Who wants a programmer who jumps into code-writing as the first step of design?
Solutions to some of these... (Score:5, Informative)
void main()
{
if (printf("Hello World!\n") {}
}
2. Write a C++ program without using any loop (if, for, while etc) to print numbers from 1 to 100 and 100 to 1;
Dumb....
void main()
{
printf("1\n2\n3\n... and so on...");
}
3. C/C++ : Exchange two numbers without using a temporary variable.
x^=y; y^=x; x^=y;
4. C/C++ : Find if the given number is a power of 2.
if (!( x & (x-1)) printf("x is a power of 2\n");
5. C/C++ : Multiply x by 7 without using multiplication (*) operator.
x = (x6. C/C++ : Write a function in different ways that will return f(7) = 4 and f(4) = 7
int function(int x) {
switch (x)
{
case 7: return 4;
case 4: return 7;
}
}
Or countless other ways...
10. Convert (integer) number in binary without loops.
I assume you mean to print the binary form of an int without using loops. So I didn't use a loop, I used recursion.
void printbits(int x)
{
int n=x%2;
if(x>=2) printbits(x/2);
printf("%d", n);
}
13. Swap two numbers without using a third variable.
Same problem as #3 above.
That's enough for now...
Parent
Re:Solutions to some of these... (Score:3, Informative)
Re:I will help YOU get a JOB! (Programming puzzles (Score:2, Insightful)
I only did the ones that specifically listed C. Number 3 (and, I suppose, 4 for that matter) is dubious because ^ won't work for all types. And beware of the "better" version: x ^= y ^= x ^= y; That's not defined behavior in C!
Re:I will help YOU get a JOB! (Programming puzzles (Score:2)
Failing that, how about:
cat > filename.c main()
{
printf("Hello World")SEMI
}
EOF
gcc -DSEMI=';'
Or I've seen other people write it as "if (prinf("Hello world")) {}".
2. "if" is not a loop. that said:
printf("1 2 3 4 5 6 7 8 9 .... 100");
printf("100 99 98 97... 1");
or
function(int k)
{
return (k > 100 ? 0 : printf("%d", k) && function(k+1));
}
function(1);
3. This involves xo
Re:I will help YOU get a JOB! (Programming puzzles (Score:2)
12. Pick 1. Then, whatever the other person picks, pick 7-n, unless they pick too many 6s. As your final number, pick a number large enough to win. There will always be a number large enough to win... if I'm doing the math right.
13. See #3 and I'm still not doing it.
14. Umm... no.
Re:I will help YOU get a JOB! (Programming puzzles (Score:2)
And 12 is a variant on nim, I think. Very much not a programming problem, but a logic problem.
Here's another one that took about 30 seconds and had me rolling on the floor:
1
1 1
2 1
1 2 1 1
1 1 1 2 2 1
What's the next entry in the pattern?
Re:I will help YOU get a JOB! (Programming puzzles (Score:2)
More efficiently:
Re:I will help YOU get a JOB! (Programming puzzles (Score:3, Interesting)
$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,3 9
Looks confusing right? Actually if you format it nicer it makes more sense:
$b='$b=%c%s%c;printf$b,39,$b,39;';
printf$b,39, $b,39;
You'll see that $b is a string that is equal to the entire source code except for what b is equal to. (Give it some thought and it'll make sense). printf then prints b substituting %c%s%c with the appropriate values ( quotation marks a
Re:this was my first assignment at uni (Score:2)