/*
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.

    * Neither the name of "The Computer Language Benchmarks Game" nor the
    name of "The Computer Language Shootout Benchmarks" nor the names of
    its contributors may be used to endorse or promote products derived
    from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
*/

/* The Computer Language Benchmarks Game
 * http://shootout.alioth.debian.org/
 *
 * contributed by The Go Authors.
 * based on meteor-contest.c by Christian Vosteen
 */

package main

import (
	"flag";
	"fmt";
)

var max_solutions = flag.Int("n", 2100, "maximum number of solutions")


func boolInt(b bool) int8 {
	if b {
		return 1
	}
	return 0
}

/* The board is a 50 cell hexagonal pattern.  For    . . . . .
 * maximum speed the board will be implemented as     . . . . .
 * 50 bits, which will fit into a 64 bit long long   . . . . .
 * int.                                               . . . . .
 *                                                   . . . . .
 * I will represent 0's as empty cells and 1's        . . . . .
 * as full cells.                                    . . . . .
 *                                                    . . . . .
 *                                                   . . . . .
 *                                                    . . . . .
 */

var board uint64 =  0xFFFC000000000000

/* The puzzle pieces must be specified by the path followed
 * from one end to the other along 12 hexagonal directions.
 *
 *   Piece 0   Piece 1   Piece 2   Piece 3   Piece 4
 *
 *  O O O O    O   O O   O O O     O O O     O   O
 *         O    O O           O       O       O O
 *                           O         O         O
 *
 *   Piece 5   Piece 6   Piece 7   Piece 8   Piece 9
 *
 *    O O O     O O       O O     O O        O O O O
 *       O O       O O       O       O O O        O
 *                  O       O O
 *
 * I had to make it 12 directions because I wanted all of the
 * piece definitions to fit into the same size arrays.  It is
 * not possible to define piece 4 in terms of the 6 cardinal
 * directions in 4 moves.
 */

const (
	E = iota;
	ESE;
	SE;
	S;
	SW;
	WSW;
	W;
	WNW;
	NW;
	N;
	NE;
	ENE;
	PIVOT;
)

var piece_def = [10][4]int8 {
	[4]int8{  E,  E,  E, SE},
	[4]int8{ SE,  E, NE,  E},
	[4]int8{  E,  E, SE, SW},
	[4]int8{  E,  E, SW, SE},
	[4]int8{ SE,  E, NE,  S},
	[4]int8{  E,  E, SW,  E},
	[4]int8{  E, SE, SE, NE},
	[4]int8{  E, SE, SE,  W},
	[4]int8{  E, SE,  E,  E},
	[4]int8{  E,  E,  E, SW}
}


/* To minimize the amount of work done in the recursive solve function below,
 * I'm going to allocate enough space for all legal rotations of each piece
 * at each position on the board. That's 10 pieces x 50 board positions x
 * 12 rotations.  However, not all 12 rotations will fit on every cell, so
 * I'll have to keep count of the actual number that do.
 * The pieces are going to be unsigned long long ints just like the board so
 * they can be bitwise-anded with the board to determine if they fit.
 * I'm also going to record the next possible open cell for each piece and
 * location to reduce the burden on the solve function.
 */
var (
	pieces[10][50][12] uint64;
	piece_counts[10][50] int;
	next_cell[10][50][12] int8;
)

/* Returns the direction rotated 60 degrees clockwise */
func rotate(dir int8) int8 {
	return (dir + 2) % PIVOT;
}

/* Returns the direction flipped on the horizontal axis */
func flip(dir int8) int8 {
	return (PIVOT - dir) % PIVOT;
}


/* Returns the new cell index from the specified cell in the
 * specified direction.  The index is only valid if the
 * starting cell and direction have been checked by the
 * out_of_bounds function first.
 */
func shift(cell, dir int8) int8 {
	switch dir {
	case E:
		return cell + 1;
	case ESE:
		if ((cell / 5) % 2) != 0 {
			return cell + 7;
		} else {
			return cell + 6;
		}
	case SE:
		if ((cell / 5) % 2) != 0 {
			return cell + 6;
		} else {
			return cell + 5;
		}
	case S:
		return cell + 10;
	case SW:
		if ((cell / 5) % 2) != 0 {
			return cell + 5;
		} else {
			return cell + 4;
		}
	case WSW:
		if ((cell / 5) % 2) != 0 {
			return cell + 4;
		} else {
			return cell + 3;
		}
	case W:
		return cell - 1;
	case WNW:
		if ((cell / 5) % 2) != 0{
			return cell - 6;
		} else {
			return cell - 7;
		}
	case NW:
		if ((cell / 5) % 2) != 0{
			return cell - 5;
		} else {
			return cell - 6;
		}
	case N:
		return cell - 10;
	case NE:
		if ((cell / 5) % 2) != 0{
			return cell - 4;
		} else {
			return cell - 5;
		}
	case ENE:
		if ((cell / 5) % 2) != 0{
			return cell - 3;
		} else {
			return cell - 4;
		}
	}
	return cell;
}

/* Returns wether the specified cell and direction will land outside
 * of the board.  Used to determine if a piece is at a legal board
 * location or not.
 */
func out_of_bounds(cell, dir int8) bool {
	switch(dir) {
	case E:
		return cell % 5 == 4;
	case ESE:
		i := cell % 10;
		return i == 4 || i == 8 || i == 9 || cell >= 45;
	case SE:
		return cell % 10 == 9 || cell >= 45;
	case S:
		return cell >= 40;
	case SW:
		return cell % 10 == 0 || cell >= 45;
	case WSW:
		i := cell % 10;
		return i == 0 || i == 1 || i == 5 || cell >= 45;
	case W:
		return cell % 5 == 0;
	case WNW:
		i := cell % 10;
		return i == 0 || i == 1 || i == 5 || cell < 5;
	case NW:
		return cell % 10 == 0 || cell < 5;
	case N:
		return cell < 10;
	case NE:
		return cell % 10 == 9 || cell < 5;
	case ENE:
		i := cell % 10;
		return i == 4 || i == 8 || i == 9 || cell < 5;
	}
	return false;
}

/* Rotate a piece 60 degrees clockwise */
func rotate_piece(piece int) {
	for i := 0; i < 4; i++ {
		piece_def[piece][i] = rotate(piece_def[piece][i]);
	}
}

/* Flip a piece along the horizontal axis */
func flip_piece(piece int) {
	for i := 0; i < 4; i++ {
		piece_def[piece][i] = flip(piece_def[piece][i]);
	}
}

/* Convenience function to quickly calculate all of the indices for a piece */
func calc_cell_indices(cell []int8, piece int, index int8) {
	cell[0] = index;
	for i := 1; i < 5; i++ {
		cell[i] = shift(cell[i-1], piece_def[piece][i-1]);
	}
}

/* Convenience function to quickly calculate if a piece fits on the board */
func cells_fit_on_board(cell []int8, piece int) bool {
	return !out_of_bounds(cell[0], piece_def[piece][0]) &&
			!out_of_bounds(cell[1], piece_def[piece][1]) &&
			!out_of_bounds(cell[2], piece_def[piece][2]) &&
			!out_of_bounds(cell[3], piece_def[piece][3]);
}

/* Returns the lowest index of the cells of a piece.
 * I use the lowest index that a piece occupies as the index for looking up
 * the piece in the solve function.
 */
func minimum_of_cells(cell []int8) int8 {
	minimum := cell[0];
	for i := 1; i < 5; i++ {
		if cell[i] < minimum {
			minimum = cell[i]
		}
	}
	return minimum;
}

/* Calculate the lowest possible open cell if the piece is placed on the board.
 * Used to later reduce the amount of time searching for open cells in the
 * solve function.
 */
func first_empty_cell(cell []int8, minimum int8) int8 {
	first_empty := minimum;
	for first_empty == cell[0] || first_empty == cell[1] ||
			first_empty == cell[2] || first_empty == cell[3] ||
			first_empty == cell[4] {
		first_empty++;
	}
	return first_empty;
}

/* Generate the unsigned long long int that will later be anded with the
 * board to determine if it fits.
 */
func bitmask_from_cells(cell []int8) uint64 {
	var piece_mask uint64;
	for i := 0; i < 5; i++ {
		piece_mask |= 1 << uint(cell[i]);
	}
	return piece_mask;
}

/* Record the piece and other important information in arrays that will
 * later be used by the solve function.
 */
func record_piece(piece int, minimum int8, first_empty int8, piece_mask uint64) {
	pieces[piece][minimum][piece_counts[piece][minimum]] = piece_mask;
	next_cell[piece][minimum][piece_counts[piece][minimum]] = first_empty;
	piece_counts[piece][minimum]++;
}


/* Fill the entire board going cell by cell.  If any cells are "trapped"
 * they will be left alone.
 */
func fill_contiguous_space(board []int8, index int8) {
	if board[index] == 1 {
		return;
	}
	board[index] = 1;
	if !out_of_bounds(index, E) {
		fill_contiguous_space(board, shift(index, E));
	}
	if !out_of_bounds(index, SE) {
		fill_contiguous_space(board, shift(index, SE));
	}
	if !out_of_bounds(index, SW) {
		fill_contiguous_space(board, shift(index, SW));
	}
	if !out_of_bounds(index, W) {
		fill_contiguous_space(board, shift(index, W));
	}
	if !out_of_bounds(index, NW) {
		fill_contiguous_space(board, shift(index, NW));
	}
	if !out_of_bounds(index, NE) {
		fill_contiguous_space(board, shift(index, NE));
	}
}


/* To thin the number of pieces, I calculate if any of them trap any empty
 * cells at the edges.  There are only a handful of exceptions where the
 * the board can be solved with the trapped cells.  For example:  piece 8 can
 * trap 5 cells in the corner, but piece 3 can fit in those cells, or piece 0
 * can split the board in half where both halves are viable.
 */
func has_island(cell []int8, piece int) bool {
	temp_board := make([]int8, 50);
	var i int;
	for i = 0; i < 5; i++ {
		temp_board[cell[i]] = 1;
	}
	i = 49;
	for temp_board[i] == 1 {
		i--;
	}
	fill_contiguous_space(temp_board, int8(i));
	c := 0;
	for i = 0; i < 50; i++ {
		if temp_board[i] == 0 {
			c++;
		}
	}
	if c == 0 || (c == 5 && piece == 8) || (c == 40 && piece == 8) ||
			(c % 5 == 0 && piece == 0) {
		return false;
	}
	return true;
}


/* Calculate all six rotations of the specified piece at the specified index.
 * We calculate only half of piece 3's rotations.  This is because any solution
 * found has an identical solution rotated 180 degrees.  Thus we can reduce the
 * number of attempted pieces in the solve algorithm by not including the 180-
 * degree-rotated pieces of ONE of the pieces.  I chose piece 3 because it gave
 * me the best time ;)
 */
func calc_six_rotations(piece, index int) {
	cell := make([]int8, 5);
	for rotation := 0; rotation < 6; rotation++ {
		if piece != 3 || rotation < 3 {
			calc_cell_indices(cell, piece, int8(index));
			if cells_fit_on_board(cell, piece) && !has_island(cell, piece) {
				minimum := minimum_of_cells(cell);
				first_empty := first_empty_cell(cell, minimum);
				piece_mask := bitmask_from_cells(cell);
				record_piece(piece, minimum, first_empty, piece_mask);
			}
		}
		rotate_piece(piece);
	}
}

/* Calculate every legal rotation for each piece at each board location. */
func calc_pieces() {
	for piece := 0; piece < 10; piece++ {
		for index := 0; index < 50; index++ {
			calc_six_rotations(piece, index);
			flip_piece(piece);
			calc_six_rotations(piece, index);
		}
	}
}



/* Calculate all 32 possible states for a 5-bit row and all rows that will
 * create islands that follow any of the 32 possible rows.  These pre-
 * calculated 5-bit rows will be used to find islands in a partially solved
 * board in the solve function.
 */
 const (
	ROW_MASK = 0x1F;
	TRIPLE_MASK = 0x7FFF;
)
var (
	all_rows = [32]int8{0, 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};
	bad_even_rows [32][32]int8;
	bad_odd_rows [32][32]int8;
	bad_even_triple [32768]int8;
	bad_odd_triple [32768]int8;
)

func rows_bad(row1, row2 int8, even bool) int8 {
	/* even is referring to row1 */
	var row2_shift int8;
	/* Test for blockages at same index and shifted index */
	if even {
		row2_shift = ((row2 << 1) & ROW_MASK) | 0x01;
	} else {
		row2_shift = (row2 >> 1) | 0x10;
	}
	block := ((row1 ^ row2) & row2) & ((row1 ^ row2_shift) & row2_shift);
	/* Test for groups of 0's */
	in_zeroes := false;
	group_okay := false;
	for i := uint8(0); i < 5; i++ {
		if row1 & (1 << i) != 0 {
			if in_zeroes {
				if !group_okay {
					return 1;
				}
				in_zeroes = false;
				group_okay = false;
			}
		} else {
			if !in_zeroes {
				in_zeroes = true;
			}
			if (block & (1 << i)) == 0 {
				group_okay = true;
			}
		}
	}
	if in_zeroes {
		return boolInt(!group_okay);
	}
	return 0;
}

/* Check for cases where three rows checked sequentially cause a false
 * positive.  One scenario is when 5 cells may be surrounded where piece 5
 * or 7 can fit.  The other scenario is when piece 2 creates a hook shape.
 */
func triple_is_okay(row1, row2, row3 int, even bool) bool {
	if even {
		/* There are four cases:
		 * row1: 00011  00001  11001  10101
		 * row2: 01011  00101  10001  10001
		 * row3: 011??  00110  ?????  ?????
		 */
		return ((row1 == 0x03) && (row2 == 0x0B) && ((row3 & 0x1C) == 0x0C)) ||
				((row1 == 0x01) && (row2 == 0x05) && (row3 == 0x06)) ||
				((row1 == 0x19) && (row2 == 0x11)) ||
				((row1 == 0x15) && (row2 == 0x11));
	}
	/* There are two cases:
	 * row1: 10011  10101
	 * row2: 10001  10001
	 * row3: ?????  ?????
	 */
	return ((row1 == 0x13) && (row2 == 0x11)) ||
			((row1 == 0x15) && (row2 == 0x11));
}

func calc_rows() {
	for row1 := int8(0); row1 < 32; row1++ {
		for row2 := int8(0); row2 < 32; row2++ {
			bad_even_rows[row1][row2] = rows_bad(row1, row2, true);
			bad_odd_rows[row1][row2] = rows_bad(row1, row2, false);
		}
	}
	for row1 := 0; row1 < 32; row1++ {
		for row2 := 0; row2 < 32; row2++ {
			for row3 := 0; row3 < 32; row3++ {
				result1 := bad_even_rows[row1][row2];
				result2 := bad_odd_rows[row2][row3];
				if result1==0 && result2!=0 && triple_is_okay(row1, row2, row3, true) {
					bad_even_triple[row1+(row2*32)+(row3*1024)] = 0;
				} else {
					bad_even_triple[row1+(row2*32)+(row3*1024)] = boolInt(result1!=0 || result2!=0);
				}

				result1 = bad_odd_rows[row1][row2];
				result2 = bad_even_rows[row2][row3];
				if result1==0 && result2!=0 && triple_is_okay(row1, row2, row3, false) {
					bad_odd_triple[row1+(row2*32)+(row3*1024)] = 0;
				} else {
					bad_odd_triple[row1+(row2*32)+(row3*1024)] = boolInt(result1!=0 || result2!=0);
				}
			}
		}
	}
}



/* Calculate islands while solving the board.
 */
func boardHasIslands(cell int8) int8 {
	/* Too low on board, don't bother checking */
	if cell >= 40 {
		return 0;
	}
	current_triple := (board >> uint((cell / 5) * 5)) & TRIPLE_MASK;
	if (cell / 5) % 2 != 0 {
		return bad_odd_triple[current_triple];
	}
	return bad_even_triple[current_triple];
}


/* The recursive solve algorithm.  Try to place each permutation in the upper-
 * leftmost empty cell.  Mark off available pieces as it goes along.
 * Because the board is a bit mask, the piece number and bit mask must be saved
 * at each successful piece placement.  This data is used to create a 50 char
 * array if a solution is found.
 */
var (
	avail uint16 = 0x03FF;
	sol_nums [10]int8;
	sol_masks [10]uint64;
	solutions [2100][50]int8;
	solution_count = 0;
)

func record_solution() {
	for sol_no := 0; sol_no < 10; sol_no++  {
		sol_mask := sol_masks[sol_no];
		for index := 0; index < 50; index++ {
			if sol_mask & 1 == 1 {
				solutions[solution_count][index] = sol_nums[sol_no];
				/* Board rotated 180 degrees is a solution too! */
				solutions[solution_count+1][49-index] = sol_nums[sol_no];
			}
			sol_mask = sol_mask >> 1;
		}
	}
	solution_count += 2;
}

func solve(depth, cell int8) {
	if solution_count >= *max_solutions {
		return;
	}

	for board & (1 << uint(cell)) != 0 {
		cell++;
	}

	for piece := int8(0); piece < 10; piece++  {
		var piece_no_mask uint16 = 1 << uint(piece);
		if avail & piece_no_mask == 0 {
			continue;
		}
		avail ^= piece_no_mask;
		max_rots := piece_counts[piece][cell];
		piece_mask := pieces[piece][cell];
		for rotation := 0; rotation < max_rots; rotation++ {
			if board & piece_mask[rotation] == 0 {
				sol_nums[depth] = piece;
				sol_masks[depth] = piece_mask[rotation];
				if depth == 9 {
					/* Solution found!!!!!11!!ONE! */
					record_solution();
					avail ^= piece_no_mask;
					return;
				}
				board |= piece_mask[rotation];
				if boardHasIslands(next_cell[piece][cell][rotation]) == 0 {
					solve(depth + 1, next_cell[piece][cell][rotation]);
				}
				board ^= piece_mask[rotation];
			}
		}
		avail ^= piece_no_mask;
	}
}

/* pretty print a board in the specified hexagonal format */
func pretty(b *[50]int8) {
	for i := 0; i < 50; i += 10 {
		fmt.Printf("%c %c %c %c %c \n %c %c %c %c %c \n", b[i]+'0', b[i+1]+'0',
				b[i+2]+'0', b[i+3]+'0', b[i+4]+'0', b[i+5]+'0', b[i+6]+'0',
				b[i+7]+'0', b[i+8]+'0', b[i+9]+'0');
	}
	fmt.Printf("\n");
}

/* Find smallest and largest solutions */
func smallest_largest() (smallest, largest *[50]int8) {
	smallest = &solutions[0];
	largest = &solutions[0];
	for i := 1; i < solution_count; i++ {
		candidate := &solutions[i];
		for j, s := range *smallest {
			c := candidate[j];
			if c == s {
				continue
			}
			if c < s {
				smallest = candidate;
			}
			break;
		}
		for j, s := range *largest {
			c := candidate[j];
			if c == s {
				continue
			}
			if c > s {
				largest = candidate;
			}
			break;
		}
	}
	return;
}

func main() {
	flag.Parse();
	calc_pieces();
	calc_rows();
	solve(0, 0);
	fmt.Printf("%d solutions found\n\n", solution_count);
	smallest, largest := smallest_largest();
	pretty(smallest);
	pretty(largest);
}
