Yesterday (the 5th of May) was the children's day, which is an official holiday, in South Korea, (by the way, the day before yesterday was Star Wars Day ๐) and I found that Xeraph, who is the CEO of the IT security company named Nchovy, as well as the creator & core programmer of the OSGi based opensource security platform, Kraken, posted some quiz for kids. ๐ His blog also has other quizzes for the primary schoolchildren.
These quizzes remind me of my childhood as these kinds of quizzes are what I used to solve when I was a primary schoolchild. It was approximately 22 years ago. That time, I learned Basic (Not Visual Basic (VB), VB didn't exist back then), Fortran, COBOL and C. When I was learning Basic, those kinds of problems were what I solved. After I graduated from the primary school, I had not touched any computer programming languages at all for 13 years. I started it again as I came to Sydney and entered the university to study IT. Then I realised that I could remember nothing about what I learned before. Nothing at all. That's why my 'about me' page doesn't contain any of Basic, Fortran and COBOL since I've completely forgot about these (it does have Visual Basic though as it's my first programming language that I learned at the diploma school, UTS:INSEARCH). So my point is, doesn't matter whether it's a programming language or a human language, if you don't practice or keep studying constantly, you will lose your skills and fluency of the language.
Anyway, I saw those quizzes and solved it for fun yet feel like I did better when I was a kid. ๐ Back then, I didn't even use a computer to solve it but only pen and paper. The followings are the quizzes and my answers, yet there can be much better answers of course, so why don't you try by yourself before you check out mine.
This is the prompt utility class, used for the other programmes, to get input values. Notice that it doesn't check whether the input value is number, integer more precisely, or not although it does check if the given integer is a positive one.
package com.lckymn.kevin.simplequiz;
import java.util.Scanner;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class PromptUtil {
private PromptUtil() {
throw new IllegalStateException(getClass().getName() + " cannot be instantiated.");
}
public static int askForPositiveInt(String message) {
final Scanner scanner = new Scanner(System.in);
System.out.print(message);
int number = Integer.parseInt(scanner.nextLine());
while (0 >= number) {
System.out.println("Please enter a position integer.");
System.out.print(message);
number = Integer.parseInt(scanner.nextLine());
}
return number;
}
}
Quiz 1. (taken from http://xeraph.com/5251248)
n for diamond? 3
*
***
*****
***
*
n for diamond? 5
*
***
*****
*******
*********
*******
*****
***
*
n for diamond? 7
*
***
*****
*******
*********
***********
*************
***********
*********
*******
*****
***
*
n for diamond? 9
*
***
*****
*******
*********
***********
*************
***************
*****************
***************
*************
***********
*********
*******
*****
***
*
- Kevin's Answer1
package com.lckymn.kevin.simplequiz;
import static com.lckymn.kevin.simplequiz.PromptUtil.*;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class Diamond
{
public static void main(String[] args)
{
int n = askForPositiveInt("n for diamond? ");
int startPoint = --n;
int endPoint = startPoint;
for (int outer = 0, outerSize = n << 1; outer <= outerSize; outer++)
{
for (int inner = 0; inner <= endPoint; inner++)
{
System.out.print(inner >= startPoint ? "*" : " ");
}
if (outer < n)
{
startPoint--;
endPoint++;
}
else
{
startPoint++;
endPoint--;
}
System.out.print("\n");
}
System.exit(0);
}
}
- Kevin's Answer2
package com.lckymn.kevin.simplequiz;
import static com.lckymn.kevin.simplequiz.PromptUtil.*;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class Diamond2
{
public static void main(String[] args)
{
int n = askForPositiveInt("n for diamond? ");
int startPoint = --n;
int endPoint = startPoint;
for (int outer = 0; outer < n; outer++)
{
for (int inner = 0; inner <= endPoint; inner++)
{
System.out.print(inner >= startPoint ? "*" : " ");
}
startPoint--;
endPoint++;
System.out.print("\n");
}
for (int outer = 0; outer <= n; outer++)
{
for (int inner = 0; inner <= endPoint; inner++)
{
System.out.print(inner >= startPoint ? "*" : " ");
}
startPoint++;
endPoint--;
System.out.print("\n");
}
System.exit(0);
}
}
Quiz 2. (taken from http://xeraph.com/5251248)
n for outer box? 4
m for inner box? 2
****
* *
* *
****
n for outer box? 7
m for inner box? 3
*******
*******
** **
** **
** **
*******
*******
n for outer box? 10
m for inner box? 4
**********
**********
**********
*** ***
*** ***
*** ***
*** ***
**********
**********
**********
n for outer box? 12
m for inner box? 6
************
************
************
*** ***
*** ***
*** ***
*** ***
*** ***
*** ***
************
************
************
- Kevin's Answer
package com.lckymn.kevin.simplequiz;
import static com.lckymn.kevin.simplequiz.PromptUtil.*;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class Box
{
public static void main(String[] args)
{
int n = askForPositiveInt("n for outer box? ");
int m = askForPositiveInt("m for inner box? ");
while (n <= m || (0 != ((n - m) & 1)))
{
System.out.println("n must be greater than m and the result of (n - m) must be an even number.");
n = askForPositiveInt("n for outer box? ");
m = askForPositiveInt("m for inner box? ");
}
int halfOfDifference = n - m >>> 1;
int startPoint = halfOfDifference - 1;
int endPoint = n - halfOfDifference;
for (int outer = 0; outer < n; outer++)
{
for (int inner = 0; inner < n; inner++)
{
System.out.print((outer > startPoint && outer < endPoint && inner > startPoint && inner < endPoint) ? " " : "*");
}
System.out.print("\n");
}
System.exit(0);
}
}
Quiz 3. (taken from http://xeraph.com/5251248)
n for outer triangle? 3
m for inner triangle? 1
*
***
** **
n for outer triangle? 5
m for inner triangle? 3
*
***
** **
** **
** **
n for outer triangle? 8
m for inner triangle? 4
*
***
*****
*******
**** ****
**** ****
**** ****
**** ****
n for outer triangle? 10
m for inner triangle? 5
*
***
*****
*******
*********
***** *****
***** *****
***** *****
***** *****
***** *****
- Kevin's Answer
package com.lckymn.kevin.simplequiz;
import static com.lckymn.kevin.simplequiz.PromptUtil.*;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class Triangle
{
public static void main(String[] args)
{
int n = askForPositiveInt("n for outer triangle? ");
int m = askForPositiveInt("m for inner triangle? ");
while (n <= m)
{
System.out.println("n must be greater than m.");
n = askForPositiveInt("n for outer triangle? ");
m = askForPositiveInt("m for inner triangle? ");
}
int startPoint = (n - 1);
int endPoint = startPoint;
final int innerHeightStartPoint = startPoint - (m - 1);
int innerWidthStartPoint = startPoint;
int innerWidthEndPoint = startPoint;
for (int outer = 0; outer < n; outer++)
{
for (int inner = 0; inner <= endPoint; inner++)
{
System.out.print((outer >= innerHeightStartPoint && inner >= innerWidthStartPoint && inner <= innerWidthEndPoint) ? " "
: inner >= startPoint ? "*" : " ");
}
startPoint--;
endPoint++;
if (outer >= innerHeightStartPoint)
{
innerWidthStartPoint--;
innerWidthEndPoint++;
}
System.out.print("\n");
}
System.exit(0);
}
}
Quiz 4. (taken from http://xeraph.com/5261697)
matrix size n? 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
matrix size n? 6
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
matrix size n? 7
1 2 3 4 5 6 7
24 25 26 27 28 29 8
23 40 41 42 43 30 9
22 39 48 49 44 31 10
21 38 47 46 45 32 11
20 37 36 35 34 33 12
19 18 17 16 15 14 13
matrix size n? 8
1 2 3 4 5 6 7 8
28 29 30 31 32 33 34 9
27 48 49 50 51 52 35 10
26 47 60 61 62 53 36 11
25 46 59 64 63 54 37 12
24 45 58 57 56 55 38 13
23 44 43 42 41 40 39 14
22 21 20 19 18 17 16 15
- Kevin's Answer1
package com.lckymn.kevin.simplequiz;
import static com.lckymn.kevin.simplequiz.PromptUtil.*;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class Matrix
{
public static void main(String[] args)
{
final int size = askForPositiveInt("matrix size n? ");
final int sizeSquare = size * size;
final int[][] matrix = new int[size][size];
int number = 0;
int row = 0;
int column = 0;
int addColumn = 1;
int addRow = 0;
int max = size;
boolean isColumn = true;
while (number < sizeSquare)
{
for (int filled = 0; filled < max; filled++)
{
matrix[row][column] = ++number;
row += addRow;
column += addColumn;
}
row += (isColumn ? (addColumn > 0 ? (addRow = 1) : (addRow = -1)) : -addRow);
column += (isColumn ? -addColumn : (addRow > 0 ? (addColumn = -1) : (addColumn = 1)));
if (isColumn)
{
max--;
addColumn = 0;
}
else
{
addRow = 0;
}
isColumn = !isColumn;
}
final String format = "%" + (String.valueOf(sizeSquare).length()) + "d ";
for (row = 0; row < size; row++)
{
for (column = 0; column < size; column++)
{
System.out.printf(format, Integer.valueOf(matrix[row][column]));
}
System.out.println();
}
System.exit(0);
}
}
- Kevin's Answer2
package com.lckymn.kevin.simplequiz;
import static com.lckymn.kevin.simplequiz.PromptUtil.*;
/**
* @author Lee, SeongHyun (Kevin)
* @version 0.0.1 (2010-05-05)
*/
public final class Matrix2
{
enum Direction
{
UP, LEFT, DOWN, RIGHT;
private static Direction current = UP;
static
{
UP.next = RIGHT;
DOWN.next = LEFT;
LEFT.next = UP;
RIGHT.next = DOWN;
}
private Direction next;
static Direction next()
{
current = current.next;
return current;
}
}
public static void main(String[] args)
{
final int size = askForPositiveInt("matrix size n? ");
int[][] matrix = new int[size][size];
final int sizeSquare = size * size;
int number = 0;
int row = 0;
int column = 0;
int max = size;
int filled = 0;
int addColumn = 1;
int addRow = 0;
while (number < sizeSquare)
{
switch (Direction.next())
{
case RIGHT:
case LEFT:
while (filled < max)
{
matrix[row][column] = ++number;
column += addColumn;
filled++;
}
row += addColumn;
column += -addColumn;
addRow = (addColumn > 0 ? 1 : -1);
addColumn = 0;
max--;
break;
case DOWN:
case UP:
while (filled < max)
{
matrix[row][column] = ++number;
row += addRow;
filled++;
}
row += -addRow;
column += -addRow;
addColumn = (addRow > 0 ? -1 : 1);
addRow = 0;
break;
default:
throw new IllegalStateException("No one can get here!");
}
filled = 0;
}
final String format = "%" + (String.valueOf(sizeSquare).length()) + "d ";
for (row = 0; row < size; row++)
{
for (column = 0; column < size; column++)
{
System.out.printf(format, Integer.valueOf(matrix[row][column]));
}
System.out.println();
}
System.exit(0);
}
}