summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty')
-rw-r--r--Master/texmf-dist/tex/latex/sudokubundle/createsudoku.sty299
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'.