diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty b/Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty new file mode 100644 index 00000000000..faa200f3e44 --- /dev/null +++ b/Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty @@ -0,0 +1,299 @@ +%% +%% This is file `createsudoku.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% sudokubundle.dtx (with options: `create') +%% +%% ----------------------------------------------------------------- +%% Author: Peter Wilson (herries dot press at earthlink dot net) +%% Herries Press +%% Copyright 2006 Peter R. Wilson +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any +%% later version. +%% The latest version of the license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2003/06/01 or later. +%% +%% This work has the LPPL maintenance status "author-maintained". +%% +%% This work consists of the files listed in the README file. +%% ----------------------------------------------------------------- +%% +%%%% solvethem.tex Solve Sudoku files +%%%% Peter Wilson +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{createsudoku}[2006/02/16 v1.0 create sudoku puzzles] +\input{random} +\RequirePackage{solvesudoku} + +\let\oldcommentary\commentary +\let\commentary\@gobble +\newcommand*{\gencommentary}[1]{\typeout{#1}} + +\newcommand*{\genfile}{gensud.sud} +\newcommand*{\prevfile}{genprev.sdx} +\newcommand*{\currfile}{gencurr.sdx} + +\randomi\m@ne +\newcommand*{\setsudrandom}[1]{% + \randomi=#1\relax + \ifnum\randomi<\@ne\else + \nextrandom \nextrandom \nextrandom + \typeout{random initialised to #1}% + \fi} + +\newcommand*{\generategrid}[1][\@empty]{% + \ifx\@empty #1 + \writestartgrid + \getproblem{\prevfile} + \else + \getproblem{#1} + \fi + \swaps + \elimclues + \printsudresults} +\newcommand*{\printsudresults}{% + \sudokusolve{\genfile}% + } + +%% the starting data +\newcommand*{\writestartgrid}{% + \immediate\closeout\s@dwrite + \immediate\openout\s@dwrite=\prevfile + \immediate\write\s@dwrite{123456789} + \immediate\write\s@dwrite{456789123} + \immediate\write\s@dwrite{789123456} + \immediate\write\s@dwrite{234567891} + \immediate\write\s@dwrite{567891234} + \immediate\write\s@dwrite{891234567} + \immediate\write\s@dwrite{345678912} + \immediate\write\s@dwrite{678912345} + \immediate\write\s@dwrite{912345678} + \immediate\closeout\s@dwrite} + +\newcommand*{\swaps}{\bgroup + \setrannum{\maxrangectr}{36}{48}% +\gencommentary{number of swaps (36--48) = maxrangectr = \the\maxrangectr} + \s@dtemploopcnta\@ne + \loop + \ifnum\s@dtemploopcnta<\maxrangectr + \setrannum{\s@dtempcntb}{1}{18}% +%%\typeout{\space\space\space swap no \the\s@dtemploopcnta\space is \the\s@dtempcntb} + \ifcase\s@dtempcntb + \or \swapcolpair{1}{2}% + \or \swapcolpair{1}{3}% + \or \swapcolpair{2}{3}% + \or \swapcolpair{4}{5}% + \or \swapcolpair{4}{6}% + \or \swapcolpair{5}{6}% + \or \swapcolpair{7}{8}% + \or \swapcolpair{7}{9}% + \or \swapcolpair{8}{9}% + \or \swaprowpair{1}{10}% + \or \swaprowpair{1}{19}% + \or \swaprowpair{10}{19}% + \or \swaprowpair{28}{37}% + \or \swaprowpair{28}{46}% + \or \swaprowpair{37}{46}% + \or \swaprowpair{55}{64}% + \or \swaprowpair{55}{73}% + \or \swaprowpair{64}{73}% + \fi + \advance\s@dtemploopcnta\@ne + \repeat +\egroup} + +%% swap the data in rows starting at #1, and #2 +\newcommand*{\swaprowpair}[2]{\bgroup + \s@dncol=#1\relax + \s@dcolpos=#2\relax + \s@dtemploopcnta\@ne + \maxrangectr=10\relax + \loop + \ifnum\s@dtemploopcnta<\maxrangectr + \s@dtempcnta=\useknt{s@lans\the\s@dncol}% + \global\useknt{s@lans\the\s@dncol}=\useknt{s@lans\the\s@dcolpos}% + \global\useknt{s@lans\the\s@dcolpos}=\s@dtempcnta + \advance\s@dncol\@ne + \advance\s@dcolpos\@ne + \advance\s@dtemploopcnta\@ne + \repeat +\egroup} + +%% swap the data in cols starting #1 and #2 +\newcommand*{\swapcolpair}[2]{\bgroup + \s@dnrow=#1\relax + \s@drowpos=#2\relax + \s@dtemploopcnta\@ne + \maxrangectr=10\relax + \loop + \ifnum\s@dtemploopcnta<\maxrangectr + \s@dtempcnta=\useknt{s@lans\the\s@dnrow}% + \global\useknt{s@lans\the\s@dnrow}=\useknt{s@lans\the\s@drowpos}% + \global\useknt{s@lans\the\s@drowpos}=\s@dtempcnta + \advance\s@dnrow 9\relax + \advance\s@drowpos 9\relax + \advance\s@dtemploopcnta\@ne + \repeat +\egroup} + +\newcommand*{\elimclues}{\bgroup + \initialelimination + \writestate{\prevfile}% + \writestate{\currfile}% + \elimcluesonebyone + \getproblem{\prevfile} + \writestate{\genfile} +\egroup} + +\newcommand*{\elimseventeen}{\bgroup + \s@dtemploopcnta\@ne + \maxrangectr 18\relax + \loop + \ifnum\s@dtemploopcnta<\maxrangectr + \setrannum{\s@dtempcnta}{1}{81} + \global\useknt{s@lans\the\s@dtempcnta}=111111111\relax + \advance\s@dtemploopcnta\@ne + \repeat +\egroup} + +%% eliminates all clues in column 5 and row 5 +\newcommand*{\elimcross}{\bgroup + \s@dtemploopcnta 5\relax + \loop + \ifnum\s@dtemploopcnta<78\relax% 78 = 5 + 73 + \global\useknt{s@lans\the\s@dtemploopcnta}=111111111\relax + \advance\s@dtemploopcnta 9\relax + \repeat + \s@dtemploopcnta 37\relax + \loop + \ifnum\s@dtemploopcnta<46\relax% 46 = 37 + 9 + \global\useknt{s@lans\the\s@dtemploopcnta}=111111111\relax + \advance\s@dtemploopcnta \@ne + \repeat +\egroup} + +\newcommand*{\elimnum}[1]{\bgroup + \s@dtemploopcnta\@ne + \loop + \ifnum\s@dtemploopcnta<82\relax + \ifnum\useknt{s@lans\the\s@dtemploopcnta}=-#1\relax + \global\useknt{s@lans\the\s@dtemploopcnta}=111111111\relax + \fi + \advance\s@dtemploopcnta \@ne + \repeat +\egroup} + +\newcommand*{\elimcrossandnines}{\bgroup + \elimcross + \s@dtemploopcnta\@ne + \loop + \ifnum\s@dtemploopcnta<82\relax + \ifnum\useknt{s@lans\the\s@dtemploopcnta}=-9\relax + \global\useknt{s@lans\the\s@dtemploopcnta}=111111111\relax + \fi + \advance\s@dtemploopcnta \@ne + \repeat +\egroup} + +\newcommand*{\elimex}{\bgroup + \s@dtemploopcnta\@ne + \loop + \ifnum\s@dtemploopcnta<82\relax + \global\useknt{s@lans\the\s@dtemploopcnta}=111111111\relax + \advance\s@dtemploopcnta 10\relax + \repeat + \s@dtemploopcnta=9\relax + \loop + \ifnum\s@dtemploopcnta<81\relax + \global\useknt{s@lans\the\s@dtemploopcnta}=111111111\relax + \advance\s@dtemploopcnta 8\relax + \repeat +\egroup} + +\newcommand*{\elimcrossandex}{\bgroup + \elimcross + \elimex +\egroup} + +\newcommand*{\elimcrossandexandnines}{\bgroup + \elimcross + \elimex + \elimnum{9} +\egroup} + +\let\initialelimination\elimseventeen +\let\initialelimination\elimcross +\let\initialelimination\elimcrossandnines +\let\initialelimination\elimcrossandex +\let\initialelimination\elimcrossandexandnines + +\newcount\toomanyloops +\newcommand*{\elimcluesonebyone}{\bgroup +%%%\typeout{***elimcluesonebyone} +\toomanyloops\z@ + \s@dtempcntb=81\relax + \loop + \ifnum\s@dtempcntb>80\relax +\advance\toomanyloops\@ne + \getproblem{\currfile} + \trysolution + \ifnum\solcnt=81\relax % can delete another clue + \getproblem{\currfile} + \writestate{\prevfile} + \deleteaclue + \writestate{\currfile}% + \s@dtempcntb=81\relax + \else % done + \typeout{Solver failed, solcnt = \the\solcnt} + \s@dtempcntb=\@ne + \fi + \ifnum\toomanyloops>80\relax + \typeout{Too much looping} + \s@dtempcntb=\@ne + \fi + \repeat +\egroup} + +\newif\ifacluenotdeleted +\newcommand*{\deleteaclue}{\bgroup + \acluenotdeletedtrue + \loop + \ifacluenotdeleted + \setrannum{\s@dtempcnta}{1}{81}% + \ifnum\useknt{s@lans\the\s@dtempcnta}<\z@% found a clue + \gencommentary{Deleting clue for cell \the\s@dtempcnta}% + \global\useknt{s@lans\the\s@dtempcnta}=111111111\relax + \acluenotdeletedfalse + \fi + \repeat +\egroup} + +\newcommand*{\trysolution}{\bgroup + \reduceallcells + \keepreducing +\egroup} + +%% \writestate{<outputfile>} +\newcommand*{\writestate}[1]{\bgroup + \immediate\closeout\s@dwrite + \immediate\openout\s@dwrite=#1 + \s@dnrow\@ne + \loop + \ifnum\s@dnrow<81\relax + \gatherline{\the\s@dnrow}% + \immediate\write\s@dwrite{\sudaline}% + \advance\s@dnrow 9\relax + \repeat + \immediate\closeout\s@dwrite +\egroup} + +\endinput +%% +%% End of file `createsudoku.sty'. |