commit 0fe7c8b43c50ae5701463acbb186a6fe0f53a773
parent 73eae801076b4c17d6b3d2d23db9e39938b01586
Author: Sebastiano Tronto <sebastiano.tronto@gmail.com>
Date: Sat, 11 Jul 2020 19:51:04 +0200
Bug fix
Diffstat:
4 files changed, 43 insertions(+), 43 deletions(-)
diff --git a/nissy b/nissy
Binary files differ.
diff --git a/src/main.c b/src/main.c
@@ -68,7 +68,7 @@ int read_moves_from_argument(int n, char tok[][100], int *dst) {
return (r != -1) ? r : read_moves_from_tok(n, tok, dst);
}
-void print_results(int n, int res[][21]) {
+void print_results(int n, int res[][30]) {
if (n == -1)
printf("Pre-conditions not satisfied (or other error).\n");
@@ -314,7 +314,7 @@ void pic_cmd(int n, char cmdtok[][100]) {
}
void solve_cmd(int n, char cmdtok[][100]) {
- int m = 1, b = 20, optimal = 0;
+ int m = 1, b = 25, optimal = 0;
int scram[255] = {[0] = 0};
int scram_unnissed[255];
@@ -349,7 +349,7 @@ void solve_cmd(int n, char cmdtok[][100]) {
/* Call solver and print results */
unniss(scram, scram_unnissed);
- int sol[m+2][21];
+ int sol[m+2][30];
int s = solve_scram(scram_unnissed, sol, m, b, optimal);
print_results(s, sol);
}
@@ -382,7 +382,7 @@ void replace_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
int l = len(scram_unnissed);
- int aux1[255], aux2[15][21], aux3[21];
+ int aux1[255], aux2[15][30], aux3[30];
for (int i = 0; i < l; i++) {
for (int j = 2; j <= m && i + j <= l; j++) {
copy_moves(scram_unnissed+i, aux1);
@@ -459,7 +459,7 @@ void eo_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
/* Call solver and print results */
- int eo_list[m+5][21];
+ int eo_list[m+5][30];
int neo = eo_scram_spam(scram_unnissed, eo_list, fb, rl, ud, m, b, niss,
hide);
print_results(neo, eo_list);
@@ -531,7 +531,7 @@ void dr_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
/* Call solver */
- int dr_list[m+5][21], ndr;
+ int dr_list[m+5][30], ndr;
if (from) {
ndr = drfrom_scram_spam(scram_unnissed, dr_list, from, fb, rl, ud,
m, b, niss, hide);
@@ -600,7 +600,7 @@ void htr_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
/* Call solver */
- int htr_list[m+5][21], nhtr;
+ int htr_list[m+5][30], nhtr;
nhtr = htr_scram_spam(scram_unnissed, htr_list, from, m, b, niss, hide);
print_results(nhtr, htr_list);
}
@@ -652,7 +652,7 @@ void drfinish_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
/* Call solver */
- int c_list[m+5][21], nc;
+ int c_list[m+5][30], nc;
nc = dr_finish_scram_spam(scram_unnissed, c_list, from, m, b);
print_results(nc, c_list);
}
@@ -693,7 +693,7 @@ void htrfinish_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
/* Call solver */
- int c_list[m+5][21], nc;
+ int c_list[m+5][30], nc;
nc = htr_finish_scram_spam(scram_unnissed, c_list, m, b);
print_results(nc, c_list);
}
@@ -747,7 +747,7 @@ void drcorners_cmd(int n, char cmdtok[][100]) {
unniss(scram, scram_unnissed);
/* Call solver */
- int c_list[m+5][21], nc;
+ int c_list[m+5][30], nc;
nc = dr_corners_scram_spam(scram_unnissed, c_list, from, m, b, ignore);
print_results(nc, c_list);
}
diff --git a/src/solver.c b/src/solver.c
@@ -9,7 +9,7 @@
/* Applies inverse of moves, inverse of prev_moves and then inverse of scramble
* and returns a coordinate determined by t_table. */
-int premoves_inverse(int moves[21], int scramble[], int prev_moves[21],
+int premoves_inverse(int moves[30], int scramble[], int prev_moves[30],
int t_table[][19]) {
int nprevmoves, nmoves, nscramble, coord = 0;
@@ -31,7 +31,7 @@ int premoves_inverse(int moves[21], int scramble[], int prev_moves[21],
/******/
/* EO */
/******/
-void niss_eo_dfs(int eo, int scramble[], int eo_list[][21], int *eo_count,
+void niss_eo_dfs(int eo, int scramble[], int eo_list[][30], int *eo_count,
int t_table[pow2to11][19], int p_table[pow2to11],
int last1, int last2, int moves, int m, int d, int niss,
int can_use_niss, int hide) {
@@ -80,7 +80,7 @@ void niss_eo_dfs(int eo, int scramble[], int eo_list[][21], int *eo_count,
}
}
-int eo_scram_spam(int scram[], int eo_list[][21], int fb, int rl, int ud,
+int eo_scram_spam(int scram[], int eo_list[][30], int fb, int rl, int ud,
int m, int b, int niss, int h) {
init_small_pruning_tables();
@@ -112,8 +112,8 @@ int eo_scram_spam(int scram[], int eo_list[][21], int fb, int rl, int ud,
/* Scramble includes premoves for previous EO */
-void niss_dr_from_eo_dfs(int co, int epos, int scramble[], int eo_moves[21],
- int dr_list[][21], int *dr_count,
+void niss_dr_from_eo_dfs(int co, int epos, int scramble[], int eo_moves[30],
+ int dr_list[][30], int *dr_count,
int co_t_table[pow3to7][19],
int epos_t_table[binom12on4][19],
int8_t p_table[pow3to7][binom12on4], int mask,
@@ -169,7 +169,7 @@ void niss_dr_from_eo_dfs(int co, int epos, int scramble[], int eo_moves[21],
moves, m, d, 1, can_use_niss, hide);
}
-int drfrom_scram_spam(int scram[], int dr_list[][21], int from, int fb,
+int drfrom_scram_spam(int scram[], int dr_list[][30], int from, int fb,
int rl, int ud, int m, int b, int niss, int hide) {
init_drfromeo_pruning_tables();
@@ -252,8 +252,8 @@ int drfrom_scram_spam(int scram[], int dr_list[][21], int from, int fb,
/***************/
/* Scramble includes premoves for previous DR */
-void niss_htr_from_dr_dfs(int cp, int eo3, int scramble[], int eodr_moves[21],
- int htr_list[][21], int *htr_count,
+void niss_htr_from_dr_dfs(int cp, int eo3, int scramble[], int eodr_moves[30],
+ int htr_list[][30], int *htr_count,
int eo3_t_table[pow2to11][19],
int cp_to_htr_pruning_table[factorial8],
int cp_htr_pruning_table[factorial8],
@@ -314,7 +314,7 @@ void niss_htr_from_dr_dfs(int cp, int eo3, int scramble[], int eodr_moves[21],
0, 0, moves, m, d, 1, can_use_niss, hide);
}
-int htr_scram_spam(int scram[], int htr_list[][21], int from,
+int htr_scram_spam(int scram[], int htr_list[][30], int from,
int m, int b, int niss, int hide) {
init_small_pruning_tables();
@@ -370,7 +370,7 @@ int htr_scram_spam(int scram[], int htr_list[][21], int from,
/* Direct DR (no NISS) */
/***********************/
void dr_dfs(int eo, int eo2, int eslice, int co,
- int dr_list[][21], int *dr_count,
+ int dr_list[][30], int *dr_count,
int eo_t_table[pow2to11][19], int eo2_t_table[pow2to11][19],
int eslice_t_table[binom12on4][19], int co_t_table[pow3to7][19],
int8_t eo_eslice_p_table[pow2to11][binom12on4],
@@ -411,7 +411,7 @@ void dr_dfs(int eo, int eo2, int eslice, int co,
}
}
-int dr_scram_spam(int scram[], int dr_list[][21], int fb, int rl, int ud,
+int dr_scram_spam(int scram[], int dr_list[][30], int fb, int rl, int ud,
int m, int b, int h) {
init_directdr_pruning_tables();
@@ -462,7 +462,7 @@ int dr_scram_spam(int scram[], int dr_list[][21], int fb, int rl, int ud,
/*************/
/* DR finish */
/*************/
-void dr_finish_dfs(int cp, int ep8, int ep4, int sol[][21], int *sol_count,
+void dr_finish_dfs(int cp, int ep8, int ep4, int sol[][30], int *sol_count,
int ep8_t_table[factorial8][19],
int ep4_t_table[factorial4][19],
int cp_p_table[factorial8],
@@ -500,7 +500,7 @@ void dr_finish_dfs(int cp, int ep8, int ep4, int sol[][21], int *sol_count,
return;
}
-int dr_finish_scram_spam(int scram[], int sol[][21], int from, int m, int b) {
+int dr_finish_scram_spam(int scram[], int sol[][30], int from, int m, int b) {
init_small_pruning_tables();
@@ -551,7 +551,7 @@ int dr_finish_scram_spam(int scram[], int sol[][21], int from, int m, int b) {
return n;
}
-int htr_finish_scram_spam(int scram[], int sol[][21], int m, int b) {
+int htr_finish_scram_spam(int scram[], int sol[][30], int m, int b) {
init_small_pruning_tables();
@@ -588,7 +588,7 @@ int htr_finish_scram_spam(int scram[], int sol[][21], int m, int b) {
/**************/
/* DR corners */
/**************/
-void dr_corners_dfs(int cp, int sol[][21], int *sol_count,
+void dr_corners_dfs(int cp, int sol[][30], int *sol_count,
int cp_p_table[factorial8], int mask, int last1, int last2,
int moves, int m, int d, int ignore) {
@@ -621,7 +621,7 @@ void dr_corners_dfs(int cp, int sol[][21], int *sol_count,
}
}
-int dr_corners_scram_spam(int scram[], int sol[][21], int from, int m, int b,
+int dr_corners_scram_spam(int scram[], int sol[][30], int from, int m, int b,
int ignore) {
init_small_pruning_tables();
@@ -666,7 +666,7 @@ int dr_corners_scram_spam(int scram[], int sol[][21], int from, int m, int b,
/* Full solver */
/***************/
-int is_ep_solved(int ep, int moves[21]) {
+int is_ep_solved(int ep, int moves[30]) {
int ep_arr[12];
ep_int_to_array(ep, ep_arr);
for (int i = 0; moves[i]; i++)
@@ -677,7 +677,7 @@ int is_ep_solved(int ep, int moves[21]) {
/* Solves directly using only small tables. Suitable for short solutions. */
void small_optimal_dfs(int eofb, int eorl, int eoud, int ep,
int coud, int cofb, int corl, int cp,
- int sol[][21], int *sol_count, int last1, int last2,
+ int sol[][30], int *sol_count, int last1, int last2,
int moves, int m, int d) {
if (moves + eofb_pruning_table[eofb] > d ||
moves + eorl_pruning_table[eorl] > d ||
@@ -721,7 +721,7 @@ void small_optimal_dfs(int eofb, int eorl, int eoud, int ep,
void medium_optimal_dfs(int eofb, int eorl, int eoud,
int epose, int eposs, int eposm, int ep,
int coud, int cofb, int corl, int cp,
- int sol[][21], int *sol_count, int last1, int last2,
+ int sol[][30], int *sol_count, int last1, int last2,
int moves, int m, int d) {
if (moves + eofb_epose_pruning_table[eofb][epose] > d ||
moves + eorl_eposs_pruning_table[eorl][eposs] > d ||
@@ -769,7 +769,7 @@ void medium_optimal_dfs(int eofb, int eorl, int eoud,
/* Uses huge tables */
int optimal_dfs(int ep, int cp, int eo, int co, int emslices,
- int sol[][21], int last1, int last2, int moves, int d) {
+ int sol[][30], int last1, int last2, int moves, int d) {
if (moves + cp_co_pruning_table[cp][co] > d ||
moves + triple_eo_pruning_table[eo][emslices] > d)
return 0;
@@ -795,7 +795,7 @@ int optimal_dfs(int ep, int cp, int eo, int co, int emslices,
return 0;
}
-int solve_scram(int scram[], int sol[][21], int m, int b, int optimal) {
+int solve_scram(int scram[], int sol[][30], int m, int b, int optimal) {
/* Initialize pieces. */
int eofb = 0, eorl = 0, eoud = 0, ep = 0;
@@ -850,10 +850,10 @@ int solve_scram(int scram[], int sol[][21], int m, int b, int optimal) {
return n;
/* Then we try a 2-step solver */
- int max_step1 = 5000;
- int db = 14;
- int step1[max_step1+10][21];
- int ss[300], step2[2][21];
+ int max_step1 = 100;
+ int db = 12;
+ int step1[max_step1+10][30];
+ int ss[300], step2[2][30];
int best = b+1;
/* TODO maybe: for now, multiple solutions can be found only using the
diff --git a/src/solver.h b/src/solver.h
@@ -1,13 +1,13 @@
-int eo_scram_spam(int scram[], int eo_list[][21], int fb, int rl, int ud,
+int eo_scram_spam(int scram[], int eo_list[][30], int fb, int rl, int ud,
int m, int b, int niss, int h);
-int dr_scram_spam(int scram[], int dr_list[][21], int fb, int rl, int ud,
+int dr_scram_spam(int scram[], int dr_list[][30], int fb, int rl, int ud,
int m, int b, int h);
-int drfrom_scram_spam(int scram[], int dr_list[][21], int from, int fb,
+int drfrom_scram_spam(int scram[], int dr_list[][30], int from, int fb,
int rl, int ud, int m, int b, int niss, int hide);
-int htr_scram_spam(int scram[], int htr_list[][21], int from,
+int htr_scram_spam(int scram[], int htr_list[][30], int from,
int m, int b, int niss, int hide);
-int dr_corners_scram_spam(int scram[], int sol[][21], int from, int m, int b,
+int dr_corners_scram_spam(int scram[], int sol[][30], int from, int m, int b,
int ignore);
-int dr_finish_scram_spam(int scram[], int sol[][21], int from, int m, int b);
-int htr_finish_scram_spam(int scram[], int sol[][21], int m, int b);
-int solve_scram(int scram[], int sol[][21], int m, int b, int optimal);
+int dr_finish_scram_spam(int scram[], int sol[][30], int from, int m, int b);
+int htr_finish_scram_spam(int scram[], int sol[][30], int m, int b);
+int solve_scram(int scram[], int sol[][30], int m, int b, int optimal);