46 #ifdef GECODE_HAS_SET_VARS
54 using namespace Gecode;
57 extern const char* examples[];
58 extern const unsigned int n_examples;
59 int example_size(
const char *s);
60 int sudokuField(
const char *s,
int n,
int i,
int j);
69 #ifdef GECODE_HAS_SET_VARS
104 #ifdef GECODE_HAS_SET_VARS
118 for (
int i=0;
i<nn;
i++) {
124 for (
int i=0;
i<nn;
i+=
n) {
125 for (
int j=0; j<nn; j+=
n) {
131 for (
int i=0;
i<nn;
i++)
132 for (
int j=0; j<nn; j++)
133 if (
int v = sudokuField(examples[opt.
size()], nn,
i, j))
136 #ifdef GECODE_HAS_SET_VARS
139 for (
int b=0;
b<
n;
b++) {
146 for (
int i=0; i<
n; i++)
147 for (
int j=0; j<
n; j++) {
149 for (
int k=0; k<
n; k++) {
154 bc1[b1c] = bc1s[
count];
155 br1[b1c] = br1s[
count];
163 bc2[b2c] = bc2s[
count];
164 br2[b2c] = br2s[
count];
169 same(*
this, nn, bc1, bc2);
170 same(*
this, nn, br1, br2);
177 }
else if (opt.
branching() == BRANCH_SIZE) {
179 }
else if (opt.
branching() == BRANCH_SIZE_DEGREE) {
181 }
else if (opt.
branching() == BRANCH_SIZE_AFC) {
183 }
else if (opt.
branching() == BRANCH_AFC) {
190 x.update(*
this, share, s.
x);
203 for (
int i = 0;
i<
n*
n*
n*
n;
i++) {
208 os << (char)(x[
i].val()+
'A'-10) <<
" ";
213 os << std::endl <<
" ";
218 #ifdef GECODE_HAS_SET_VARS
230 return m.
slice(bc*
n+i, bc*
n+i+1, j*
n, (j+1)*n);
236 return m.
slice(j*n, (j+1)*n, br*n+i, br*n+i+1);
241 #ifdef GECODE_HAS_SET_VARS
255 y(*this,n*n,
IntSet::empty,1,n*n*n*n,n*n,n*n) {
265 int* dsc = r.
alloc<
int>(nn);
266 for (
int i=0; i<nn; i++) {
267 row[
i] =
IntSet((i*nn)+1, (i+1)*nn);
269 for (
int j=0; j<nn; j++) {
276 int* dsb_arr = r.
alloc<
int>(nn);
277 for (
int i=0; i<
n; i++) {
278 for (
int j=0; j<
n; j++) {
280 for (
int ii=0; ii<
n; ii++) {
281 for (
int jj=0; jj<
n; jj++) {
282 dsb_arr[ii*n+jj] = j*nn*n+i*n+jj*nn+ii+1;
285 block[i*n+j] =
IntSet(dsb_arr, nn);
295 for (
int i=0; i<nn; i++)
296 for (
int j=0; j<nn; j++) {
306 for (
int i=0; i<nn; i++)
307 for (
int j=0; j<nn; j++)
308 if (
int idx = sudokuField(examples[opt.
size()], nn,
i, j))
313 }
else if (opt.
branching() == BRANCH_SIZE) {
315 }
else if (opt.
branching() == BRANCH_SIZE_DEGREE) {
317 }
else if (opt.
branching() == BRANCH_SIZE_AFC) {
319 }
else if (opt.
branching() == BRANCH_AFC) {
326 y.update(*
this, share, s.
y);
339 for (
int i = 0; i<n*n*n*
n; i++) {
340 for (
int j=0; j<n*
n; j++) {
341 if (y[j].contains(i+1)) {
345 os << (char)(j+1+
'A'-10) <<
" ";
350 os << std::endl <<
'\t';
371 SetVar dummySet0(*
this, is0, is0);
372 IntVar dummyInt0(*
this, 0, 0);
375 for (
int i=0; i<nn; i++)
379 for (
int i=0; i<nn*nn; i++)
416 #ifdef GECODE_HAS_SET_VARS
421 "use both integer and set constraints");
425 "additional \"same\" constraint for integer model");
433 opt.
parse(argc,argv);
434 if (opt.
size() >= n_examples) {
435 std::cerr <<
"Error: size must be between 0 and "
436 << n_examples-1 << std::endl;
439 #ifdef GECODE_HAS_SET_VARS
440 switch (opt.
model()) {
442 Script::run<SudokuInt,DFS,SizeOptions>(
opt);
445 Script::run<SudokuSet,DFS,SizeOptions>(
opt);
448 Script::run<SudokuMixed,DFS,SizeOptions>(
opt);
452 Script::run<SudokuInt,DFS,SizeOptions>(
opt);
469 const char* examples[] = {
676 "...G...9..4.....6F..L8..."
677 "CEIN.HDM.OF.1L..A..9PJ.4."
678 ".....A...L..JBN.2.D.1...H"
679 "P49...JB23.AD..7E..C5F..."
680 "A1H....F.N5....I.BL...26."
681 "....7..C.6...H4B..1....I5"
682 ".F.P...I..B..7.5.L...9..."
683 ".L6A...5OF.8P...K.NE..734"
684 "B2.E..L...1J.5....O7.K.AP"
685 "O.5.CB1.P....3EM....2L.H."
686 "2..MJ.A...9.3.7......P.8C"
687 ".....CF.DPG62N.E...OH.M.J"
688 ".DL..OM..IE.B8..NH...3..K"
689 ".CO1F.B.N.AH..P.78.JE...D"
690 "E..6.....H......4M.KIB9.."
691 "N.J..6......C..1.5.G..H.."
692 "...75LG...6..1..CI..4.E.."
693 "9K..6.....HGN.O2P.4......"
694 ".OA..IP849...2.K3...7GN.."
695 "..G....N...P.D9....A...C1"
696 "J...M.NAFE.4..23.7....8L."
697 ".....J.H9CD1LP..GO....4ME"
698 "48NK..5.M......JL.......9"
699 ".I.OG....835.A.DH..P....."
700 "35......L.J..E....8IG.67B"
703 ".N..JG..O7591...8I....L.."
704 "FG.M.B8...P.E...CJ..H...."
705 "...........G.4.H.D.O.NJA2"
706 ".....J.EN4.L6MA.B.2......"
707 "HE..2..DC.....F4KMA.B.9O8"
708 "M....62...47C19......E5.."
709 ".I2.8M.JGL...ADN..K..3.F7"
710 "..H3.5..89....I.J.....NL."
711 "1B..9.FAP.6.N....537.H..O"
712 "......1..N...O...LC.68.PG"
713 "KOA.FNBH.....7.C.....M..6"
714 "45.ECP.I..N.F.J1...MK.79."
715 "I.L..8.O..9.P...A...2.1J."
716 "..621.D.M.....B8LG..P..CH"
717 ".HP.N7E.L1....3..B..O.G45"
718 "....BIO....5.C.P...FN48E."
719 "...FL.....2.DH..17..59O.."
720 "..I.MF..2G.N...A6O.HC.PB."
721 "72.1..L...IM.96E.45G....."
722 "..9...7M..A.O...I...L...."
723 ".C.JA.........1.....E.48."
724 "O.BI.......PHL.6..1....5C"
725 "G6M...N4FI8...K..H.E....."
726 ".L..4.917....BE.G8F.M.I.."
727 "8F......5.O3..4...9.....K"
730 "5.PC..7..J..I...3..H.M.2L"
731 "H.......F..DA..N.G...9..P"
732 "...3LCP2.54.71.B....J.8.."
733 "76M8...3A...H..C.D.FO...."
734 "...DK..GI..B.L.6.8.14...."
735 "A......M....D.6.N.P....O2"
736 "...E5BLF..92..3AJC..6I..."
737 ".PNJ.6..E7A.8..IM.OL1.G.C"
738 ".L3...O.N.5.KI.46.....9E."
739 ".I.G.A..28.MBP...E..HJ3.7"
740 "J.74.L..D1O96.A3.M...GI.."
741 "E...1...K....J...P6.7.C.9"
742 "8M..A9JO.F.P..1...4.E3N6."
743 "...I.3.7.......EL.CD..H.."
744 "....DE2..P...N.........K."
745 ".O.7.FKI1..GJ.N.....9.P8."
746 ".89..H..BNM73D.KFJ..I.6.A"
747 "PDBN...9M..C.....O.6..7.."
748 ".F.K...4..LA9B..C.E75..GN"
749 "G.A.....7.8.....H....O.3."
750 "B...C...4......8K.3.P...."
751 "DHE5..FA...J.3..B.2.KC.98"
752 "...F...5....N..J9......I."
753 ".J...P..O.BK....I.M.3..5."
754 "9...8.B.6.D.M.I..H.5G.J4."
757 "..6F.....5..3.....H..A.M2"
758 ".....3....I8.A.MC.KJ.LNG."
759 ".I.7N..K.2..6...3D..B.O85"
760 ".3A.PF.D8OBK7.2....L6.9H4"
761 ".K..CBML.....O.A8.G4.D..."
762 "1.4.AGL..M5..F.O.9....P2."
763 "..I.........8......N4E..."
764 "J.C8.1.6.3.LO.K7AG2P9.H.."
765 ".2.3BH..9.A...G......O..L"
766 ".H..M8.J.....NI1.LEF....B"
767 "I5..4.....G.27..K..3.M..H"
768 "P..E..I.A..3B.8....G.2..."
769 "AJ......NFK.I.O9476..G.1."
770 ".976...E3H....M5.F......O"
771 ".F.M3.5.GKC4.HJ.N.....ID7"
772 "..L1K..9.J37.ID..B..E6..."
773 ".82OH.1..PNML...E..C...J."
774 "....JLFN.B..G..6M..H..D.9"
775 "...C.A...I.6.......K.5..."
776 "E.G.I.....O....J.8F......"
777 "..M4..9.D.7.K.FE.3O......"
778 "H.N.....14E..B3L..8I...AG"
779 "K.O.62.PM...N..H...18C.9."
780 "LC..8.3...2...H.G...J..4E"
781 ".B..9NK.E....C6.P.4D.71OI"
784 "A..F.N......M28DC.LI7..OJ"
785 "..B...D.M.6....9.....2A.."
786 ".2..I.56.B...J.MEH......."
787 "O7...HE...BA..G2........L"
788 ".H6J.2...G.7NDP.A...8..C."
789 ".PN35..B..869.2.GA..K.C.."
790 "....EM13OD.N...49K...7..."
791 "9G..C....IJF5.B..7.3....."
792 "HD.....JN....7...EF....9."
793 "1.OA..G.KL....H..B.CP...."
794 "..CE.......2..9I....3...."
795 "FJ..83P.E..K7.NL15H..I2.."
796 ".4..GJ...6DIB...P...AHL.C"
797 ".1I.2.M....83.F..4.NBE..."
798 "L3M.OD.H.AG..4.....69...F"
799 ".8...5H.3.....M...D..K..4"
800 "3..4..AEDO7J...5..9..G1.."
801 "..2N9.8F.P.OIGC.L6..E.H.."
802 "C...1.7..K.L6.4EO.8.5...N"
803 ".IG.H..M..E...1A2N4..8.F."
804 "6..5J..N1...2..H.IGA...P8"
805 ".L...O...H...C....M5G..A."
806 "..F...3C.7.P..5N..B..DMH9"
807 "291D..6..M..H.7.3.J.N..B."
808 "....MK..29F.G.DO4...6.E35"
811 "....B12O3..D..F..KPL.E4.7"
812 "1M..GL..H..K.A.....39.P.."
813 ".8.3.4.....7..6.F.....CK."
814 "P.O...758.2..MC.....1L.A."
815 "...HFK6.A..8...9B...2...J"
816 "91.KJE..L.5O..GD.....4..."
817 ".I..3..D.2.....C4MLAK..N."
818 ".4..6IA.P7.....B9......3."
819 "M.F...4.J...8....N.H.1G7."
820 "..5P.N.....C.731.I.E.9A.."
821 ".....GO.KDL......BA......"
822 ".3A..F...9..K.EI5.7..6.DN"
823 ".G.54.L.....PH..3F6....2."
824 "....P.....G..2D.OH.1B...C"
825 "6.EM.7N....3.B4..DC..K1P."
826 "B.9.....I..5N...7OGK...46"
827 "OF.GD6HP..JM..BA8.I.C...."
828 "8.L7...........P.3M5...92"
829 ".EM.....45IF7....2.CJ8DL."
830 ".6.4.8..NA.2......9....GI"
831 "2..A1DCN..3G.F5.L..I..O6H"
832 "..BIO..1.H.L...G........."
833 "C.P.....M8.9O..5A..N.JK.D"
834 "H...N...FOA4..73....5..CM"
835 ".D4..3...6BE..N.2JH8..L.."
838 "LJ.FH2...K....359.E.B6.N."
839 "...EML1FC.PJ.A.8I....2.K4"
840 "9........G1..6..K...PAL3C"
841 "P...C34..8.N7.........DE."
842 "...7....E..IO...124.J5.F."
843 ".8.L.PA.2..31FG....N..C.I"
844 "F.G......M........2.K..1."
845 "....2KH6.JOD..9.L..G...B."
846 ".6O3..G...4.NJ.H.PB...5.9"
847 "I...K..LBN...E.76.A....8."
848 "D.B.L......8.3.C.KM.6...."
849 ".C593.I.N4.26MB..1..L.K.."
850 "M.F6......DA45.9..N.I3..B"
851 ".G..79.H...KJ...4...AN.2."
852 ".KH...BC....LON..7..D.8.F"
853 "2..B...MP....7OEJ4....6.1"
854 ".4....2O.9......N..1....G"
855 ".....G.JF.2..L.6.5......."
856 "C9A.G...H1...PJ..L.3.8.MN"
857 "...1......M.....O.P8.K3J."
858 "...N.HP.K25G3..JC8..1M..."
859 "..2K.FC34.A....N7..9.LB.."
860 "..65DJ..L..C.4.1...BGF..."
861 "OF..E..7.B.......634...D."
862 "G.3..N.I9D7PM8KF2....4..."
865 ".1..I8.P..6.N...BD...3O.."
866 ".9.6...E.M43.8..AK.2J.1.."
867 "...JKL...FA...P.I4...DB.."
868 "E...P.I.B.7.1..J.HC...98."
869 "..5M8GJ.KD.O...N3..1AI..."
870 "K.2C4.M.N..J..I.......H.5"
871 "N..B9O.D...KH6.E...C...7I"
872 "DE..JK4.....L.1B7..68PN2."
873 ".....P...C..F.7...L.O9..."
874 "...35.H......92..M.4.EC.1"
875 "P..IL..H.........1..3.D.."
876 "....B9..8.3I5.C...K...F1."
877 "FH....2O..D.4M.P...A...GC"
878 "JA.......KF.......4.EOMIP"
879 "3.7GNF...A.2OB9C.E5.HJ..."
880 "2.I.1.......AO5.P...K.3.."
881 "..H....L..M.CIJ..7...4..."
882 "GO.9..KF.I.P3...E.HJ...N7"
883 "5.37...B.E...4N..O.8....."
884 "4B...7.9O.HL..E2C3.K51.M."
885 "L.O42...D..AJ.8...GH.N..E"
886 "9M.8.H..LG1..N..5.E..F7B."
887 "......FAC..5M..I6J.B4...G"
888 "...F..82..P.E......36HK.L"
889 "B.J.G5...O.H2..98.7......"
892 ".CNPHK.53.O9F..D.78..J..."
893 "J.....F.DB...7.G..PAE...L"
894 ".6.........5.4A......I..."
895 "A..L.6.E.1JG....5.H.2...9"
896 "..G4..P...E2N.M...C..FB.1"
897 "..PKJ...G41O..C.N..H....."
898 ".M..I5L97J.3H...E2.8...D."
899 "1.4..ON.83G.P.D59..C.BH.."
900 "..2.9.......4.F.3.6..O.7."
901 "3F.7.MEC..5...2..4K.LN8.."
902 "...I........MF7.6AOG..LE."
903 "C1.3..JG..D.9...4..N...68"
904 "...M7L9..NHA...FJ.I..3.C."
905 ".A...P...5...E3.8M..K4OFG"
906 ".....C.6KIP...8..3.DJ...."
907 ".2.J...3C..7.D.9A.EF6L..."
908 "4...3.6N.....L9.H..P8...2"
909 ".9.C.4H.......P....1..FJ3"
910 ".LD.K87.1.BM5AJN....4H.G."
911 ".B..MAI........47O.LD...."
912 ".G....3....F..1..9..M..K6"
913 "P7.A..B8.......2....I.3.."
914 "M..O....9K2..6..1.N.FE.L."
915 "....E...A..N.J.IG8...C.9."
916 "6KL.4...FCI.A.....5J.2D.N"
919 "E..I...M......L....D...BK"
920 "F..BH9.K.A2.7..E4.P.6..M."
921 ".6.J..PD8FE.IM...K...54.."
922 "L...8E...IA..HC........7J"
923 ".....7H.4.JK..DOFC....9I."
924 "9...7A.5.B.M34E.KDJ8....."
925 "8...BD....O..7....CP.E.6."
926 ".1.3..8....D...2.ML.B..5A"
927 ".E2.A.O.7..1..I.659..8LD."
928 "KF..M2...PL......A.G..N3."
929 "...76N.1..CBG...DPK..O.J2"
930 ".JK...6B.9..P.7.N.EMFDG.5"
931 "N....G.F.8....OH9.2...E.7"
932 "....4.3....F9.....5.NC.A."
933 "M.A.GL.J......5..4.7.91.."
934 "C.8NE.5..6..M.....BJ17..H"
935 "7.6...NL.41.AC.I8...GJ3.."
936 "...53P.GM2.L..F.....K.68."
937 "J.4.D..H..IG..8K..35.N.FL"
938 "P.F...93.D.....A.1......M"
939 "..7.I...1...DF..PJ.4.MA.."
940 ".KN.....5H..O.63.E.2....4"
941 "....1...O..A2..DCH8B..KE."
942 "3.HA.6BP.....J1957O..28.."
943 "42JO.I...K5C......6.P.B.."
946 "...G87..O..F.N..CH6..D..2"
947 "C16..N....DL.3.E........."
948 ".LN.EK..D..O.G6.412....5H"
949 "K...2........59M...P..3.."
950 "..A9.M.6....8.E7O3..K..LB"
951 "7..8B.1.EP.....4.L.6.C.9."
952 ".3.6...9.85.A2F.....B.EP."
953 ".D4K.L..NA....C.M.E..7..."
954 "L..P.3H.CG.7....DKF..I6.."
955 "5EH.G.7.6.1....J....D3K.O"
956 ".6.....G.K.E..I2.4J......"
957 "..ICFP.8H7.2.O.B.NM5..G.."
958 ".M..D9..BE..J..F..I7..LAK"
959 ".BE.L...31.M7FK..C9..8.DN"
960 ".2O......D38C...E...F.P.."
961 ".A.....M..NB..3.J.7E8..2."
962 "...O...B..6..C.8KG4..5D7M"
963 "....M8..I..9..AL1.O.3HBNG"
964 ".C..4....L.....D.F......."
965 "J..5NF..G...H..6..C..1..."
966 "D..N..O....G9.J.A..I...8."
967 ".F.H1BN.K.O.4.8.6.3.9.M.."
968 "B...I....9K..6..2...G.H1."
969 "O...7.CJMI25N...HDKBPFAE."
970 ".....28.F..C........O.JK."
973 "9.K..6D.I5...........H..."
974 ".I.E..BK...GN...6.L...3.."
975 "7....2..L8E.K.D1.P5I.6..A"
976 "..N.LEH.A32..CM9........."
977 "..2....9N...3.IC...J.KF8."
978 "......GA..C.7JPNI3....6L."
979 "....E.J.8K..I.....97NG2.B"
980 "O7..3HI...M.....DCF5..914"
981 "L.M.4.3.19.D..2......F.K."
982 "B....F...O9.6ANG.2.PH.E.5"
983 "8KDM...5.1....G......P..6"
984 ".4.H.L.C..J2....G..3ION.."
985 "C.A..J..E...1K......92.5."
986 ".9O.NP.2...IA....H..G..7."
987 "...I5..O.N4.H...2DCKJ...E"
988 "56....1.D..AJ.....7.L.O.."
989 "K.8.H.7.9.5....AC..O..G6F"
990 "3..........O..C.F.P6K.5.."
991 "...OC.4J2.3E.9...N.H7..P1"
992 ".B.7.K.....6.MH.LJ..A...."
993 "I..4.........P..E7D9O.B.H"
994 "E.3G.OP...I1CBL..FN4..82."
995 ".A..9N.8.E...73O..H....4."
996 ".M.C.3....DK..EI......JG."
997 ".HP..D..FB...NO.1KJ8.AL.."
1000 "....L.1.8H.CO..P....FA..."
1001 "P1.2.4CO...K..A..3H8...7."
1002 "I..H.G.5.B.6.M..A24.K..9."
1003 "....6I.KF9..5.P.J1.BDCE.M"
1004 ".A....2...F..L..E.M.6.5O3"
1005 "7..1.C...8.L9..4P.5.G.K.."
1006 "JO.5H.M2.I.7.F.6D..A4..NE"
1007 "E.3.NO....K2...LG..7JM..."
1008 ".9F.CJ.H....A.NKB.1..2.5."
1009 "2LB...5..7.P36H.M..N...1D"
1010 ".....P..B....46.HJ......."
1011 "B4..7LI.C.GD2...KA.3H...."
1012 "K5......6J1.........27O8P"
1013 "LP...5K.G..JB3.......1.M."
1014 "..EG...4.F.NKC...O..9.B.."
1015 "..MI...D32AGP..5O...74.BN"
1016 "FC74.....1..LO..8...5.D.J"
1017 "..JN....H...E.I...DPA3.6."
1018 "AE.......O3F..5.........H"
1019 "...8..6......24.9G....I.1"
1020 ".M....8.9..O1.F.C.EL3...A"
1021 ".N...E.3.....I7M1...ODG.K"
1022 "1......P.N9..D..5........"
1023 ".I.P..FGOCMA.......J.5..2"
1024 ".GK....7...3.....92..B.L4"
1027 "...H....GKM.43..B.D......"
1028 "15I.C....8B.6D.7G....A.H4"
1029 ".7...F..B...J.E16.N....3."
1030 "...D.1...6L7.H.5K....P98F"
1031 "KJ.AF.5CHO...NP2M.....B.."
1032 "4..K..I9.M.DNP..A.3..E5O6"
1033 "PGC...HE.....I5..M...7..J"
1034 ".B.EJ..G.5..L....D.48.2.."
1035 ".D....N.4.J.2A..H..5..F1."
1036 "8....AJLD.7..OM...1B....P"
1037 "CH...N..7.........B3....."
1038 "I..O.JL..P5...3......KH.8"
1039 "D.259.E......6.......L3.."
1040 "...3K6.B.AE..74N25H..G1.."
1041 ".L.B..41.HC...G.OIP8..MN7"
1042 ".........2.C.4.L....69.I5"
1043 "N...7.C...69.5.A......PKL"
1044 "....L.G...13.BOMP.82..D7H"
1045 "...C.H..5.P.E.K...I7....."
1046 "JO..P.96ABI8.....C..N..4G"
1047 ".NA8H.32..O4..IB..L9G..J."
1048 "..4.GD..M.3..27INJ.O....."
1049 ".C9L..A..J.....6.2..I..F."
1050 "BK...4..F.A.CL..87.1.O.M."
1051 "6..P.I.5...M..N....F....D"
1054 ".6OL.3GB.I.1F.EP..9..24.."
1055 "..1.P.....K....N.2.....ID"
1056 "2.8.K7..J...6..1F.......A"
1057 "...D.8.4..29..LJ7.HMKPF.."
1058 "..I.9N...A..P.M.DK...E5.."
1059 "94.N...5..F..E.C182..BG3."
1060 "8D..3HC....6G.....P.F.72I"
1061 "C..I.E.7D....8BG.F...6..."
1062 "......L....N.24..I..1K.DJ"
1063 ".27HG.NF......I..L..E.A.."
1064 "L...N.I8F6.H.9K.3O..B..5P"
1065 ".9...L..25.B14F.N.JE...7K"
1066 ".1...9B....GJ.8.A.5C....."
1067 "....CPK..J....5.M.7.6.H.3"
1068 "..F7..3..O..N..B8....421."
1069 "AM.8....P...71..26N...3G."
1070 "P....D.2.78.O..5CJ.GA.BH."
1071 "6..4.F...3...K9A..1...J.M"
1072 ".I2.E......JM.N...B98..P."
1073 "FC..7..6.EI.D.G...3H5..KN"
1074 "I8NO.4F.9..DB....5......."
1075 "5..1...G3.MIH.A.9..N....."
1076 "KG.62..1.....L3.....IJE.F"
1077 "....D.6.AC4.9.....OL.HP.."
1078 "..EA.5O.L.6.......D...9N."
1081 ".CH3.L..D4F..I.........1."
1082 "G..K.....7.O.......L.42N."
1083 "A.D...5O8B...39G.4..I...L"
1084 "1E2OB....A8N..6FCD9.H...G"
1085 "IN..4..3.....J..5OM....9."
1086 "...JEMP..9G8..D7......BA."
1087 "B.M9..L....6...2.FI.KJ..."
1088 ".LN.386A..BH....O.J.2..7."
1089 "7A6..2..3N.....4KP..G8HIC"
1090 ".1.....J.CK3....HB..5L4.."
1091 ".H......P.I.57....G..21B4"
1092 "....7.....EP1....3.2..A.."
1093 ".59.1FI.L8.MJG.B..AH....E"
1094 "NI..D....O3K..A.P9..8F..."
1095 ".O....A..E2.8.HN.J7.P...."
1096 ".MC..P....H2...A7..ID...1"
1097 ".6.....M.J.14.BDG.3.O9F2."
1098 ".......CG.........4...M.."
1099 "HDL...8N7.......FK2C.E..B"
1100 "..KP2I.F.3...N7J.E.6..L85"
1101 "D.E...C.4.7B..I....A.1..M"
1102 "J..M..7..D.A..4...ONBG..2"
1103 "9.7.6..K..P..O....D...8.."
1104 ".2IN..GE1.D..8...MK.CPJH."
1105 "FG..8B.2.L..KH.....1.5E..",
2209 "BNDAJG62O7591KHF8IP34CLME"
2210 "FG.M.B8...P.E...CJ..H...."
2211 "...........G.4.H.D.O.NJA2"
2212 ".....J.EN4.L6MA.B.2......"
2213 "HE..2..DC.....F4KMA.B.9O8"
2214 "M....62...47C19......E5.."
2215 ".I2.8M.JGL...ADN..K..3.F7"
2216 "..H3.5..89....I.J.....NL."
2217 "1B..9.FAP.6.N....537.H..O"
2218 "......1..N...O...LC.68.PG"
2219 "KOA.FNBH.....7.C.....M..6"
2220 "45.ECP.I..N.F.J1...MK.79."
2221 "I.L..8.O..9.P...A...2.1J."
2222 "..621.D.M.....B8LG..P..CH"
2223 ".HP.N7E.L1....3..B..O.G45"
2224 "....BIO....5.C.P...FN48E."
2225 "...FL.....2.DH..17..59O.."
2226 "..I.MF..2G.N...A6O.HC.PB."
2227 "72.1..L...IM.96E.45G....."
2228 "..9...7M..A.O...I...L...."
2229 ".C.JA.........1.....E.48."
2230 "O.BI.......PHL.6..1....5C"
2231 "G6M...N4FI8...K..H.E....."
2232 ".L..4.917....BE.G8F.M.I.."
2233 "8F......5.O3..4...9.....K",
2236 ".ND.JG6.O7591..F8IP.4.LM."
2237 "FG.M.B8...P.E...CJ..H...."
2238 "...........G.4.H.D.O.NJA2"
2239 ".....J.EN4.L6MA.B.2......"
2240 "HE..2..DC.....F4KMA.B.9O8"
2241 "M....62...47C19......E5.."
2242 ".I2.8M.JGL...ADN..K..3.F7"
2243 "..H3.5..89....I.J.....NL."
2244 "1B..9.FAP.6.N....537.H..O"
2245 "......1..N...O...LC.68.PG"
2246 "KOA.FNBH.....7.C.....M..6"
2247 "45.ECP.I..N.F.J1...MK.79."
2248 "I.L..8.O..9.P...A...2.1J."
2249 "..621.D.M.....B8LG..P..CH"
2250 ".HP.N7E.L1....3..B..O.G45"
2251 "....BIO....5.C.P...FN48E."
2252 "...FL.....2.DH..17..59O.."
2253 "..I.MF..2G.N...A6O.HC.PB."
2254 "72.1..L...IM.96E.45G....."
2255 "..9...7M..A.O...I...L...."
2256 ".C.JA.........1.....E.48."
2257 "O.BI.......PHL.6..1....5C"
2258 "G6M...N4FI8...K..H.E....."
2259 ".L..4.917....BE.G8F.M.I.."
2260 "8F......5.O3..4...9.....K"
2264 const unsigned int n_examples =
sizeof(examples)/
sizeof(
char*);
2268 int l = std::strlen(s);
2270 assert(res*res*res*res == l);
2276 assert(example_size(s) ==
std::sqrt(static_cast<float>(n)));
2277 assert(i >= 0 && i < n);
2278 assert(j >= 0 && j < n);
2279 char c = s[j*n +
i];
2280 if (!std::isalnum(c))
2282 if (std::isdigit(c))
2284 if (std::islower(c))
2285 c =
static_cast<char>(std::toupper(c));
2287 int res = (c -
'A') + 10;
2288 if (res > n)
return 0;