Generated on Wed Nov 1 15:04:28 2006 for Gecode by doxygen 1.4.5

sudoku.icc

Go to the documentation of this file.
00001 /*
00002  *  Main authors:
00003  *     Christian Schulte <schulte@gecode.org>
00004  *     Mikael Lagerkvist <lagerkvist@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Christian Schulte, 2005
00008  *     Mikael Lagerkvist, 2006
00009  *
00010  *  Last modified:
00011  *     $Date: 2006-08-08 15:24:45 +0200 (Tue, 08 Aug 2006) $ by $Author: tack $
00012  *     $Revision: 3534 $
00013  *
00014  *  This file is part of Gecode, the generic constraint
00015  *  development environment:
00016  *     http://www.gecode.org
00017  *
00018  *  See the file "LICENSE" for information on usage and
00019  *  redistribution of this file, and for a
00020  *     DISCLAIMER OF ALL WARRANTIES.
00021  *
00022  */
00023 
00024 #include <string.h>
00025 #include <cmath>
00026 #include <cctype>
00027 
00036 const char* examples[] = {
00037   // 0
00038     "...2.5..."
00039     ".9....73."
00040     "..2..9.6."
00041     "2.....4.9"
00042     "....7...."
00043     "6.9.....1"
00044     ".8.4..1.."
00045     ".63....8."
00046     "...6.8..."
00047   ,
00048   // 1
00049     "3..9.4..1"
00050     "..2...4.."
00051     ".61...79."
00052     "6..247..5"
00053     "........."
00054     "2..836..4"
00055     ".46...23."
00056     "..9...6.."
00057     "5..3.9..8"
00058   ,
00059   // 2
00060     "....1...."
00061     "3.14..86."
00062     "9..5..2.."
00063     "7..16...."
00064     ".2.8.5.1."
00065     "....97..4"
00066     "..3..4..6"
00067     ".48..69.7"
00068     "....8...."
00069   ,
00070   // 3
00071     // Fiendish puzzle April 212005 Times London
00072     "..4..3.7."
00073     ".8..7...."
00074     ".7...82.5"
00075     "4.....31."
00076     "9.......8"
00077     ".15.....4"
00078     "1.69...3."
00079     "....2..6."
00080     ".2.4..5.."
00081   ,
00082   // 4
00083     // This one requires search
00084     ".43.8.25."
00085     "6........"
00086     ".....1.94"
00087     "9....4.7."
00088     "...6.8..."
00089     ".1.2....3"
00090     "82.5....."
00091     "........5"
00092     ".34.9.71."
00093   ,
00094   // 5
00095     // Hard one from http://www.cs.mu.oz.au/671/proj3/node5.html
00096     ".....3.6."
00097     ".......1."
00098     ".975...8."
00099 
00100     "....9.2.."
00101     "..8.7.4.."
00102     "..3.6...."
00103 
00104     ".1...289."
00105     ".4......."
00106     ".5.1....."
00107   , // Puzzle 1 from http://www.sudoku.org.uk/bifurcation.htm
00108   // 6
00109     "1..9.7..3"
00110     ".8.....7."
00111     "..9...6.."
00112     "..72.94.."
00113     "41.....95"
00114     "..85.43.."
00115     "..3...7.."
00116     ".5.....4."
00117     "2..8.6..9"
00118   , // Puzzle 2 from http://www.sudoku.org.uk/bifurcation.htm
00119   // 7
00120     "...3.2..."
00121     ".5.798.3."
00122     "..7...8.."
00123     "..86.73.."
00124     ".7.....6."
00125     "..35.41.."
00126     "..5...6.."
00127     ".2.419.5."
00128     "...8.6..."
00129   , // Puzzle 3 from http://www.sudoku.org.uk/bifurcation.htm
00130   // 8
00131     "...8....6"
00132     "..162.43."
00133     "4...71..2"
00134     "..72...8."
00135     "....1...."
00136     ".1...62.."
00137     "1..73...4"
00138     ".26.481.."
00139     "3....5..."
00140   , // Puzzle 4 from http://www.sudoku.org.uk/bifurcation.htm
00141   // 9
00142     "3.5..4.7."
00143     ".7......1"
00144     ".4.9...3."
00145     "4...51..6"
00146     ".9.....4."
00147     "2..84...7"
00148     ".2...7.6."
00149     "8......9."
00150     ".6.4..2.8"
00151   , // Puzzle 5 from http://www.sudoku.org.uk/bifurcation.htm
00152   // 10
00153     "...7..3.."
00154     ".6....57."
00155     ".738..41."
00156     "..928...."
00157     "5.......9"
00158     "....936.."
00159     ".98..715."
00160     ".54....6."
00161     "..1..9..."
00162   , // Puzzle 6 from http://www.sudoku.org.uk/bifurcation.htm
00163   // 11
00164     "...6....4"
00165     ".3..9..2."
00166     ".6.8..7.."
00167     "..5.6...1"
00168     "67.3.1.58"
00169     "9...5.4.."
00170     "..6..3.9."
00171     ".1..8..6."
00172     "2....6..."
00173   , // Puzzle 7 from http://www.sudoku.org.uk/bifurcation.htm
00174   // 12
00175     "8....1.4."
00176     "2.6.9..1."
00177     "..9..6.8."
00178     "124.....9"
00179     "........."
00180     "9.....824"
00181     ".5.4..1.."
00182     ".8..7.2.5"
00183     ".9.5....7"
00184   , // Puzzle 8 from http://www.sudoku.org.uk/bifurcation.htm
00185   // 13
00186     "652.48..7"
00187     ".7.2.54.."
00188     "........."
00189     ".641...7."
00190     "....8...."
00191     ".8...456."
00192     "........."
00193     "..86.7.2."
00194     "2..89.751"
00195   , // Puzzle 9 from http://www.sudoku.org.uk/bifurcation.htm
00196   // 14
00197     "..6..2..9"
00198     "1..5...2."
00199     ".473.6..1"
00200     ".....8.4."
00201     ".3.....7."
00202     ".1.6....."
00203     "4..8.321."
00204     ".6...1..4"
00205     "3..4..9.."
00206   , // Puzzle 10 from http://www.sudoku.org.uk/bifurcation.htm
00207   // 15
00208     "..4.5.9.."
00209     "....7...6"
00210     "37......2"
00211     "..95...8."
00212     "..12.43.."
00213     ".6...92.."
00214     "2......93"
00215     "1...4...."
00216     "..6.2.7.."
00217   , // Puzzle 11 from http://www.sudoku.org.uk/bifurcation.htm
00218   // 16
00219     "....3.79."
00220     "3.......5"
00221     "...4.73.6"
00222     ".53.94.7."
00223     "....7...."
00224     ".1.82.64."
00225     "7.19.8..."
00226     "8.......1"
00227     ".94.1...."
00228   , // From http://www.sudoku.org.uk/discus/messages/29/51.html?1131034031
00229   // 17
00230     "2581.4.37"
00231     "936827514"
00232     "47153.28."
00233     "7152.3.4."
00234     "849675321"
00235     "36241..75"
00236     "1249..753"
00237     "593742168"
00238     "687351492"
00239   ,
00240   // 18
00241     // The following minimal 25*25 Sudokus are from Alain Frisch
00242     // Sudoku website http://www.eleves.ens.fr/home/frisch/sudoku.html
00243     "...G...9..4.....6F..L8..."
00244     "CEIN.HDM.OF.1L..A..9PJ.4."
00245     ".....A...L..JBN.2.D.1...H"
00246     "P49...JB23.AD..7E..C5F..."
00247     "A1H....F.N5....I.BL...26."
00248     "....7..C.6...H4B..1....I5"
00249     ".F.P...I..B..7.5.L...9..."
00250     ".L6A...5OF.8P...K.NE..734"
00251     "B2.E..L...1J.5....O7.K.AP"
00252     "O.5.CB1.P....3EM....2L.H."
00253     "2..MJ.A...9.3.7......P.8C"
00254     ".....CF.DPG62N.E...OH.M.J"
00255     ".DL..OM..IE.B8..NH...3..K"
00256     ".CO1F.B.N.AH..P.78.JE...D"
00257     "E..6.....H......4M.KIB9.."
00258     "N.J..6......C..1.5.G..H.."
00259     "...75LG...6..1..CI..4.E.."
00260     "9K..6.....HGN.O2P.4......"
00261     ".OA..IP849...2.K3...7GN.."
00262     "..G....N...P.D9....A...C1"
00263     "J...M.NAFE.4..23.7....8L."
00264     ".....J.H9CD1LP..GO....4ME"
00265     "48NK..5.M......JL.......9"
00266     ".I.OG....835.A.DH..P....."
00267     "35......L.J..E....8IG.67B"
00268   ,
00269   // 19
00270     ".N..JG..O7591...8I....L.."
00271     "FG.M.B8...P.E...CJ..H...."
00272     "...........G.4.H.D.O.NJA2"
00273     ".....J.EN4.L6MA.B.2......"
00274     "HE..2..DC.....F4KMA.B.9O8"
00275     "M....62...47C19......E5.."
00276     ".I2.8M.JGL...ADN..K..3.F7"
00277     "..H3.5..89....I.J.....NL."
00278     "1B..9.FAP.6.N....537.H..O"
00279     "......1..N...O...LC.68.PG"
00280     "KOA.FNBH.....7.C.....M..6"
00281     "45.ECP.I..N.F.J1...MK.79."
00282     "I.L..8.O..9.P...A...2.1J."
00283     "..621.D.M.....B8LG..P..CH"
00284     ".HP.N7E.L1....3..B..O.G45"
00285     "....BIO....5.C.P...FN48E."
00286     "...FL.....2.DH..17..59O.."
00287     "..I.MF..2G.N...A6O.HC.PB."
00288     "72.1..L...IM.96E.45G....."
00289     "..9...7M..A.O...I...L...."
00290     ".C.JA.........1.....E.48."
00291     "O.BI.......PHL.6..1....5C"
00292     "G6M...N4FI8...K..H.E....."
00293     ".L..4.917....BE.G8F.M.I.."
00294     "8F......5.O3..4...9.....K"
00295   ,
00296   // 20
00297     "5.PC..7..J..I...3..H.M.2L"
00298     "H.......F..DA..N.G...9..P"
00299     "...3LCP2.54.71.B....J.8.."
00300     "76M8...3A...H..C.D.FO...."
00301     "...DK..GI..B.L.6.8.14...."
00302     "A......M....D.6.N.P....O2"
00303     "...E5BLF..92..3AJC..6I..."
00304     ".PNJ.6..E7A.8..IM.OL1.G.C"
00305     ".L3...O.N.5.KI.46.....9E."
00306     ".I.G.A..28.MBP...E..HJ3.7"
00307     "J.74.L..D1O96.A3.M...GI.."
00308     "E...1...K....J...P6.7.C.9"
00309     "8M..A9JO.F.P..1...4.E3N6."
00310     "...I.3.7.......EL.CD..H.."
00311     "....DE2..P...N.........K."
00312     ".O.7.FKI1..GJ.N.....9.P8."
00313     ".89..H..BNM73D.KFJ..I.6.A"
00314     "PDBN...9M..C.....O.6..7.."
00315     ".F.K...4..LA9B..C.E75..GN"
00316     "G.A.....7.8.....H....O.3."
00317     "B...C...4......8K.3.P...."
00318     "DHE5..FA...J.3..B.2.KC.98"
00319     "...F...5....N..J9......I."
00320     ".J...P..O.BK....I.M.3..5."
00321     "9...8.B.6.D.M.I..H.5G.J4."
00322   ,
00323   // 21
00324     "..6F.....5..3.....H..A.M2"
00325     ".....3....I8.A.MC.KJ.LNG."
00326     ".I.7N..K.2..6...3D..B.O85"
00327     ".3A.PF.D8OBK7.2....L6.9H4"
00328     ".K..CBML.....O.A8.G4.D..."
00329     "1.4.AGL..M5..F.O.9....P2."
00330     "..I.........8......N4E..."
00331     "J.C8.1.6.3.LO.K7AG2P9.H.."
00332     ".2.3BH..9.A...G......O..L"
00333     ".H..M8.J.....NI1.LEF....B"
00334     "I5..4.....G.27..K..3.M..H"
00335     "P..E..I.A..3B.8....G.2..."
00336     "AJ......NFK.I.O9476..G.1."
00337     ".976...E3H....M5.F......O"
00338     ".F.M3.5.GKC4.HJ.N.....ID7"
00339     "..L1K..9.J37.ID..B..E6..."
00340     ".82OH.1..PNML...E..C...J."
00341     "....JLFN.B..G..6M..H..D.9"
00342     "...C.A...I.6.......K.5..."
00343     "E.G.I.....O....J.8F......"
00344     "..M4..9.D.7.K.FE.3O......"
00345     "H.N.....14E..B3L..8I...AG"
00346     "K.O.62.PM...N..H...18C.9."
00347     "LC..8.3...2...H.G...J..4E"
00348     ".B..9NK.E....C6.P.4D.71OI"
00349   ,
00350   // 22
00351     "A..F.N......M28DC.LI7..OJ"
00352     "..B...D.M.6....9.....2A.."
00353     ".2..I.56.B...J.MEH......."
00354     "O7...HE...BA..G2........L"
00355     ".H6J.2...G.7NDP.A...8..C."
00356     ".PN35..B..869.2.GA..K.C.."
00357     "....EM13OD.N...49K...7..."
00358     "9G..C....IJF5.B..7.3....."
00359     "HD.....JN....7...EF....9."
00360     "1.OA..G.KL....H..B.CP...."
00361     "..CE.......2..9I....3...."
00362     "FJ..83P.E..K7.NL15H..I2.."
00363     ".4..GJ...6DIB...P...AHL.C"
00364     ".1I.2.M....83.F..4.NBE..."
00365     "L3M.OD.H.AG..4.....69...F"
00366     ".8...5H.3.....M...D..K..4"
00367     "3..4..AEDO7J...5..9..G1.."
00368     "..2N9.8F.P.OIGC.L6..E.H.."
00369     "C...1.7..K.L6.4EO.8.5...N"
00370     ".IG.H..M..E...1A2N4..8.F."
00371     "6..5J..N1...2..H.IGA...P8"
00372     ".L...O...H...C....M5G..A."
00373     "..F...3C.7.P..5N..B..DMH9"
00374     "291D..6..M..H.7.3.J.N..B."
00375     "....MK..29F.G.DO4...6.E35"
00376   ,
00377   // 23
00378     "....B12O3..D..F..KPL.E4.7"
00379     "1M..GL..H..K.A.....39.P.."
00380     ".8.3.4.....7..6.F.....CK."
00381     "P.O...758.2..MC.....1L.A."
00382     "...HFK6.A..8...9B...2...J"
00383     "91.KJE..L.5O..GD.....4..."
00384     ".I..3..D.2.....C4MLAK..N."
00385     ".4..6IA.P7.....B9......3."
00386     "M.F...4.J...8....N.H.1G7."
00387     "..5P.N.....C.731.I.E.9A.."
00388     ".....GO.KDL......BA......"
00389     ".3A..F...9..K.EI5.7..6.DN"
00390     ".G.54.L.....PH..3F6....2."
00391     "....P.....G..2D.OH.1B...C"
00392     "6.EM.7N....3.B4..DC..K1P."
00393     "B.9.....I..5N...7OGK...46"
00394     "OF.GD6HP..JM..BA8.I.C...."
00395     "8.L7...........P.3M5...92"
00396     ".EM.....45IF7....2.CJ8DL."
00397     ".6.4.8..NA.2......9....GI"
00398     "2..A1DCN..3G.F5.L..I..O6H"
00399     "..BIO..1.H.L...G........."
00400     "C.P.....M8.9O..5A..N.JK.D"
00401     "H...N...FOA4..73....5..CM"
00402     ".D4..3...6BE..N.2JH8..L.."
00403   ,
00404   // 24
00405     "LJ.FH2...K....359.E.B6.N."
00406     "...EML1FC.PJ.A.8I....2.K4"
00407     "9........G1..6..K...PAL3C"
00408     "P...C34..8.N7.........DE."
00409     "...7....E..IO...124.J5.F."
00410     ".8.L.PA.2..31FG....N..C.I"
00411     "F.G......M........2.K..1."
00412     "....2KH6.JOD..9.L..G...B."
00413     ".6O3..G...4.NJ.H.PB...5.9"
00414     "I...K..LBN...E.76.A....8."
00415     "D.B.L......8.3.C.KM.6...."
00416     ".C593.I.N4.26MB..1..L.K.."
00417     "M.F6......DA45.9..N.I3..B"
00418     ".G..79.H...KJ...4...AN.2."
00419     ".KH...BC....LON..7..D.8.F"
00420     "2..B...MP....7OEJ4....6.1"
00421     ".4....2O.9......N..1....G"
00422     ".....G.JF.2..L.6.5......."
00423     "C9A.G...H1...PJ..L.3.8.MN"
00424     "...1......M.....O.P8.K3J."
00425     "...N.HP.K25G3..JC8..1M..."
00426     "..2K.FC34.A....N7..9.LB.."
00427     "..65DJ..L..C.4.1...BGF..."
00428     "OF..E..7.B.......634...D."
00429     "G.3..N.I9D7PM8KF2....4..."
00430   ,
00431   // 25
00432     ".1..I8.P..6.N...BD...3O.."
00433     ".9.6...E.M43.8..AK.2J.1.."
00434     "...JKL...FA...P.I4...DB.."
00435     "E...P.I.B.7.1..J.HC...98."
00436     "..5M8GJ.KD.O...N3..1AI..."
00437     "K.2C4.M.N..J..I.......H.5"
00438     "N..B9O.D...KH6.E...C...7I"
00439     "DE..JK4.....L.1B7..68PN2."
00440     ".....P...C..F.7...L.O9..."
00441     "...35.H......92..M.4.EC.1"
00442     "P..IL..H.........1..3.D.."
00443     "....B9..8.3I5.C...K...F1."
00444     "FH....2O..D.4M.P...A...GC"
00445     "JA.......KF.......4.EOMIP"
00446     "3.7GNF...A.2OB9C.E5.HJ..."
00447     "2.I.1.......AO5.P...K.3.."
00448     "..H....L..M.CIJ..7...4..."
00449     "GO.9..KF.I.P3...E.HJ...N7"
00450     "5.37...B.E...4N..O.8....."
00451     "4B...7.9O.HL..E2C3.K51.M."
00452     "L.O42...D..AJ.8...GH.N..E"
00453     "9M.8.H..LG1..N..5.E..F7B."
00454     "......FAC..5M..I6J.B4...G"
00455     "...F..82..P.E......36HK.L"
00456     "B.J.G5...O.H2..98.7......"
00457   ,
00458   // 26
00459     ".CNPHK.53.O9F..D.78..J..."
00460     "J.....F.DB...7.G..PAE...L"
00461     ".6.........5.4A......I..."
00462     "A..L.6.E.1JG....5.H.2...9"
00463     "..G4..P...E2N.M...C..FB.1"
00464     "..PKJ...G41O..C.N..H....."
00465     ".M..I5L97J.3H...E2.8...D."
00466     "1.4..ON.83G.P.D59..C.BH.."
00467     "..2.9.......4.F.3.6..O.7."
00468     "3F.7.MEC..5...2..4K.LN8.."
00469     "...I........MF7.6AOG..LE."
00470     "C1.3..JG..D.9...4..N...68"
00471     "...M7L9..NHA...FJ.I..3.C."
00472     ".A...P...5...E3.8M..K4OFG"
00473     ".....C.6KIP...8..3.DJ...."
00474     ".2.J...3C..7.D.9A.EF6L..."
00475     "4...3.6N.....L9.H..P8...2"
00476     ".9.C.4H.......P....1..FJ3"
00477     ".LD.K87.1.BM5AJN....4H.G."
00478     ".B..MAI........47O.LD...."
00479     ".G....3....F..1..9..M..K6"
00480     "P7.A..B8.......2....I.3.."
00481     "M..O....9K2..6..1.N.FE.L."
00482     "....E...A..N.J.IG8...C.9."
00483     "6KL.4...FCI.A.....5J.2D.N"
00484   ,
00485   // 27
00486     "E..I...M......L....D...BK"
00487     "F..BH9.K.A2.7..E4.P.6..M."
00488     ".6.J..PD8FE.IM...K...54.."
00489     "L...8E...IA..HC........7J"
00490     ".....7H.4.JK..DOFC....9I."
00491     "9...7A.5.B.M34E.KDJ8....."
00492     "8...BD....O..7....CP.E.6."
00493     ".1.3..8....D...2.ML.B..5A"
00494     ".E2.A.O.7..1..I.659..8LD."
00495     "KF..M2...PL......A.G..N3."
00496     "...76N.1..CBG...DPK..O.J2"
00497     ".JK...6B.9..P.7.N.EMFDG.5"
00498     "N....G.F.8....OH9.2...E.7"
00499     "....4.3....F9.....5.NC.A."
00500     "M.A.GL.J......5..4.7.91.."
00501     "C.8NE.5..6..M.....BJ17..H"
00502     "7.6...NL.41.AC.I8...GJ3.."
00503     "...53P.GM2.L..F.....K.68."
00504     "J.4.D..H..IG..8K..35.N.FL"
00505     "P.F...93.D.....A.1......M"
00506     "..7.I...1...DF..PJ.4.MA.."
00507     ".KN.....5H..O.63.E.2....4"
00508     "....1...O..A2..DCH8B..KE."
00509     "3.HA.6BP.....J1957O..28.."
00510     "42JO.I...K5C......6.P.B.."
00511   ,
00512   // 28
00513     "...G87..O..F.N..CH6..D..2"
00514     "C16..N....DL.3.E........."
00515     ".LN.EK..D..O.G6.412....5H"
00516     "K...2........59M...P..3.."
00517     "..A9.M.6....8.E7O3..K..LB"
00518     "7..8B.1.EP.....4.L.6.C.9."
00519     ".3.6...9.85.A2F.....B.EP."
00520     ".D4K.L..NA....C.M.E..7..."
00521     "L..P.3H.CG.7....DKF..I6.."
00522     "5EH.G.7.6.1....J....D3K.O"
00523     ".6.....G.K.E..I2.4J......"
00524     "..ICFP.8H7.2.O.B.NM5..G.."
00525     ".M..D9..BE..J..F..I7..LAK"
00526     ".BE.L...31.M7FK..C9..8.DN"
00527     ".2O......D38C...E...F.P.."
00528     ".A.....M..NB..3.J.7E8..2."
00529     "...O...B..6..C.8KG4..5D7M"
00530     "....M8..I..9..AL1.O.3HBNG"
00531     ".C..4....L.....D.F......."
00532     "J..5NF..G...H..6..C..1..."
00533     "D..N..O....G9.J.A..I...8."
00534     ".F.H1BN.K.O.4.8.6.3.9.M.."
00535     "B...I....9K..6..2...G.H1."
00536     "O...7.CJMI25N...HDKBPFAE."
00537     ".....28.F..C........O.JK."
00538   ,
00539   // 29
00540     "9.K..6D.I5...........H..."
00541     ".I.E..BK...GN...6.L...3.."
00542     "7....2..L8E.K.D1.P5I.6..A"
00543     "..N.LEH.A32..CM9........."
00544     "..2....9N...3.IC...J.KF8."
00545     "......GA..C.7JPNI3....6L."
00546     "....E.J.8K..I.....97NG2.B"
00547     "O7..3HI...M.....DCF5..914"
00548     "L.M.4.3.19.D..2......F.K."
00549     "B....F...O9.6ANG.2.PH.E.5"
00550     "8KDM...5.1....G......P..6"
00551     ".4.H.L.C..J2....G..3ION.."
00552     "C.A..J..E...1K......92.5."
00553     ".9O.NP.2...IA....H..G..7."
00554     "...I5..O.N4.H...2DCKJ...E"
00555     "56....1.D..AJ.....7.L.O.."
00556     "K.8.H.7.9.5....AC..O..G6F"
00557     "3..........O..C.F.P6K.5.."
00558     "...OC.4J2.3E.9...N.H7..P1"
00559     ".B.7.K.....6.MH.LJ..A...."
00560     "I..4.........P..E7D9O.B.H"
00561     "E.3G.OP...I1CBL..FN4..82."
00562     ".A..9N.8.E...73O..H....4."
00563     ".M.C.3....DK..EI......JG."
00564     ".HP..D..FB...NO.1KJ8.AL.."
00565   ,
00566   // 30
00567     "....L.1.8H.CO..P....FA..."
00568     "P1.2.4CO...K..A..3H8...7."
00569     "I..H.G.5.B.6.M..A24.K..9."
00570     "....6I.KF9..5.P.J1.BDCE.M"
00571     ".A....2...F..L..E.M.6.5O3"
00572     "7..1.C...8.L9..4P.5.G.K.."
00573     "JO.5H.M2.I.7.F.6D..A4..NE"
00574     "E.3.NO....K2...LG..7JM..."
00575     ".9F.CJ.H....A.NKB.1..2.5."
00576     "2LB...5..7.P36H.M..N...1D"
00577     ".....P..B....46.HJ......."
00578     "B4..7LI.C.GD2...KA.3H...."
00579     "K5......6J1.........27O8P"
00580     "LP...5K.G..JB3.......1.M."
00581     "..EG...4.F.NKC...O..9.B.."
00582     "..MI...D32AGP..5O...74.BN"
00583     "FC74.....1..LO..8...5.D.J"
00584     "..JN....H...E.I...DPA3.6."
00585     "AE.......O3F..5.........H"
00586     "...8..6......24.9G....I.1"
00587     ".M....8.9..O1.F.C.EL3...A"
00588     ".N...E.3.....I7M1...ODG.K"
00589     "1......P.N9..D..5........"
00590     ".I.P..FGOCMA.......J.5..2"
00591     ".GK....7...3.....92..B.L4"
00592   ,
00593   // 31
00594     "...H....GKM.43..B.D......"
00595     "15I.C....8B.6D.7G....A.H4"
00596     ".7...F..B...J.E16.N....3."
00597     "...D.1...6L7.H.5K....P98F"
00598     "KJ.AF.5CHO...NP2M.....B.."
00599     "4..K..I9.M.DNP..A.3..E5O6"
00600     "PGC...HE.....I5..M...7..J"
00601     ".B.EJ..G.5..L....D.48.2.."
00602     ".D....N.4.J.2A..H..5..F1."
00603     "8....AJLD.7..OM...1B....P"
00604     "CH...N..7.........B3....."
00605     "I..O.JL..P5...3......KH.8"
00606     "D.259.E......6.......L3.."
00607     "...3K6.B.AE..74N25H..G1.."
00608     ".L.B..41.HC...G.OIP8..MN7"
00609     ".........2.C.4.L....69.I5"
00610     "N...7.C...69.5.A......PKL"
00611     "....L.G...13.BOMP.82..D7H"
00612     "...C.H..5.P.E.K...I7....."
00613     "JO..P.96ABI8.....C..N..4G"
00614     ".NA8H.32..O4..IB..L9G..J."
00615     "..4.GD..M.3..27INJ.O....."
00616     ".C9L..A..J.....6.2..I..F."
00617     "BK...4..F.A.CL..87.1.O.M."
00618     "6..P.I.5...M..N....F....D"
00619   ,
00620     // 32
00621     ".6OL.3GB.I.1F.EP..9..24.."
00622     "..1.P.....K....N.2.....ID"
00623     "2.8.K7..J...6..1F.......A"
00624     "...D.8.4..29..LJ7.HMKPF.."
00625     "..I.9N...A..P.M.DK...E5.."
00626     "94.N...5..F..E.C182..BG3."
00627     "8D..3HC....6G.....P.F.72I"
00628     "C..I.E.7D....8BG.F...6..."
00629     "......L....N.24..I..1K.DJ"
00630     ".27HG.NF......I..L..E.A.."
00631     "L...N.I8F6.H.9K.3O..B..5P"
00632     ".9...L..25.B14F.N.JE...7K"
00633     ".1...9B....GJ.8.A.5C....."
00634     "....CPK..J....5.M.7.6.H.3"
00635     "..F7..3..O..N..B8....421."
00636     "AM.8....P...71..26N...3G."
00637     "P....D.2.78.O..5CJ.GA.BH."
00638     "6..4.F...3...K9A..1...J.M"
00639     ".I2.E......JM.N...B98..P."
00640     "FC..7..6.EI.D.G...3H5..KN"
00641     "I8NO.4F.9..DB....5......."
00642     "5..1...G3.MIH.A.9..N....."
00643     "KG.62..1.....L3.....IJE.F"
00644     "....D.6.AC4.9.....OL.HP.."
00645     "..EA.5O.L.6.......D...9N."
00646   ,
00647   // 33
00648     ".CH3.L..D4F..I.........1."
00649     "G..K.....7.O.......L.42N."
00650     "A.D...5O8B...39G.4..I...L"
00651     "1E2OB....A8N..6FCD9.H...G"
00652     "IN..4..3.....J..5OM....9."
00653     "...JEMP..9G8..D7......BA."
00654     "B.M9..L....6...2.FI.KJ..."
00655     ".LN.386A..BH....O.J.2..7."
00656     "7A6..2..3N.....4KP..G8HIC"
00657     ".1.....J.CK3....HB..5L4.."
00658     ".H......P.I.57....G..21B4"
00659     "....7.....EP1....3.2..A.."
00660     ".59.1FI.L8.MJG.B..AH....E"
00661     "NI..D....O3K..A.P9..8F..."
00662     ".O....A..E2.8.HN.J7.P...."
00663     ".MC..P....H2...A7..ID...1"
00664     ".6.....M.J.14.BDG.3.O9F2."
00665     ".......CG.........4...M.."
00666     "HDL...8N7.......FK2C.E..B"
00667     "..KP2I.F.3...N7J.E.6..L85"
00668     "D.E...C.4.7B..I....A.1..M"
00669     "J..M..7..D.A..4...ONBG..2"
00670     "9.7.6..K..P..O....D...8.."
00671     ".2IN..GE1.D..8...MK.CPJH."
00672     "FG..8B.2.L..KH.....1.5E.."
00673 };
00674 
00675 const unsigned int n_examples = sizeof(examples)/sizeof(char*);
00676 
00677 int example_size(const char *s) {
00678   int l = std::strlen(s);
00679   int res = static_cast<int>(std::sqrt(std::sqrt(static_cast<float>(l))));
00680   assert(res*res*res*res == l);
00681   return res;
00682 }
00683 
00684 
00685 int value_at(const char *s, int n, int i, int j) {
00686   assert(example_size(s) == n*n);
00687   assert(i >= 0 && i < n);
00688   assert(j >= 0 && j < n);
00689   char c = s[i*n + j];
00690   if (!std::isalnum(c))
00691     return 0;
00692   if (std::isdigit(c))
00693     return c - '0';
00694   if (std::islower(c))
00695     c = static_cast<char>(std::toupper(c));
00696   // std::alpha(c) == true
00697   int res = (c - 'A') + 10;
00698   if (res > n) return 0;
00699   else return res;
00700 }
00702 
00703 // STATISTICS: example-any