#!/usr/bin/perl # use LWP::Simple; $URL = 'http://number-logic.com/archive'; $TPLFILE = 'tpl_sudoku.tex'; # name of the template used to generate tex file $OUTFILE = 'sudoki.tex'; # name of the output tex file my $content = get ($URL); # follow all links and download sudokus while ($content =~ /fill_puzzle\("(.*?)"\).*?25px;">(.*?) at.*?center>(.*?)</gsi){ my @sudoku; my $caption = "$2 ($3)"; my $str = $1; $str =~ s/\./ /g; my @arr = split (//,$str); for ($i=0;$i<81;$i++){ $sudoku[int($i/9)][$i%9] = $arr[$i]; } my $sudo = toLatex(toText(@sudoku),$caption); push @sudokistack, $sudo; } # create the string containing all the sudokus # (why here? 'cause this way, if you want, you can execute # other operations on the stack) for (reverse @sudokistack){ $sudoki .= $_; } # load template file my $TPL = ""; open (IN, "<$TPLFILE") || die "Could not open template file $TPLFILE!\n\n";; while (<IN>){ $TPL .= $_; } close IN; $TPL =~ s/###SUDOKI###/$sudoki/; open (OUT, ">$OUTFILE"); print OUT $TPL; close OUT; exit; # -------------------------------------------------------------------------- # function toText receives an array containing the sudoku and returns a # string representing it # sub toText { # @sudoku is the 9x9 array containing the sudoku my @sudoku = @_; # $sudo is the string which will contain the sudoku once # converted in plain text my $sudo = ""; for ($i=0;$i<9;$i++){ $sudo .= "|"; # line starts here for ($j=0;$j<9;$j++){ $sudo .= $sudoku[$i][$j]."|"; # sudoku cell } $sudo .= ".\n"; # end of line } return $sudo; } # -------------------------------------------------------------------------- # toLatex function receives a sudoky in the string format returned by toText # and a caption to insert below the sudoku. It then returns LaTeX text, # containing the code needed to display the sudoku # sub toLatex { my ($sudo,$caption) = @_; my $tex = ""; $tex .= "\\begin{sudoku}\n$sudo\\end{sudoku}\n"; #sudoku $tex .= "\\begin{center}\n$caption\n\\end{center}\n"; #caption if ($flag){ # insert a pagebreak every 2 sudoku $tex .= "\n\\pagebreak\n\n"; $flag = 0; }else{ $tex .= "\n\\verb||\n\n"; $flag = 1; } return $tex; } # -------------------------------------------------------------------------- # --------------------------------------------------------------------------