summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/maze
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-12-27 21:24:57 +0000
committerKarl Berry <karl@freefriends.org>2022-12-27 21:24:57 +0000
commit2775b86cdc8086d0e204908ff728180cf01345c4 (patch)
tree75746fe9d6ab1d4eb39a936b8bbfb39b7ca8609d /Master/texmf-dist/tex/latex/maze
parent97df36775e9264188811ccd3d523e090e739f022 (diff)
maze (27dec22)
git-svn-id: svn://tug.org/texlive/trunk@65374 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/maze')
-rw-r--r--Master/texmf-dist/tex/latex/maze/maze.sty87
1 files changed, 87 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/maze/maze.sty b/Master/texmf-dist/tex/latex/maze/maze.sty
new file mode 100644
index 00000000000..4401fa60996
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/maze/maze.sty
@@ -0,0 +1,87 @@
+% Copyright (C) 2022 by Sicheng Du <siddsc@foxmail.com>
+% This project is distributed under the LaTeX Project Public License, version 1.3c.
+%-------------------------%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{maze}[1.1]
+\ExplSyntaxOn
+\int_new:N\l_rand
+\int_new:N\l_old \int_new:N\l_new
+\dim_const:Nn\g_size{\linewidth}
+\newcommand{\m@ze}[2]{
+ \sys_gset_rand_seed:n{#2}
+ \let\g_map\undefined
+ \let\g_walls_v\undefined\let\g_walls_h\undefined
+ \intarray_new:Nn\g_map{#1*#1}
+ \intarray_new:Nn\g_walls_v{#1*(#1-1)}
+ \intarray_new:Nn\g_walls_h{#1*(#1-1)}
+ \int_step_inline:nn{#1*#1}{
+ \intarray_gset:Nnn\g_map{##1}{##1}
+ }
+ \int_step_inline:nn{#1*(#1-1)}{
+ \intarray_gset:Nnn\g_walls_v{##1}{1}
+ \intarray_gset:Nnn\g_walls_h{##1}{1}
+ }
+ \bool_do_until:nn{
+ \int_compare_p:nNn{\intarray_item:Nn\g_map{1}}
+ ={\intarray_item:Nn\g_map{#1*#1}}
+ }{
+ \int_set:Nn\l_rand{\int_rand:n{#1*(#1-1)}}
+ \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_v{\l_rand}}{}{
+ \int_compare:nNnTF{
+ \intarray_item:Nn\g_map{\l_rand+\int_div_truncate:nn{\l_rand-1}{#1-1}}
+ }={
+ \intarray_item:Nn\g_map{
+ 1+\l_rand+\int_div_truncate:nn{\l_rand-1}{#1-1}
+ }
+ }{}{
+ \int_set:Nn\l_new{
+ \intarray_item:Nn\g_map{1+\l_rand+\int_div_truncate:nn{\l_rand-1}{#1-1}}
+ }
+ \int_set:Nn\l_old{
+ \intarray_item:Nn\g_map{\l_rand+\int_div_truncate:nn{\l_rand-1}{#1-1}}
+ }
+ \intarray_gset:Nnn\g_walls_v{\l_rand}{0}
+ \int_step_inline:nn{#1*#1}{
+ \int_compare:nNnTF{\l_old}={\intarray_item:Nn\g_map{##1}}
+ {\intarray_gset:Nnn\g_map{##1}{\l_new}}{}
+ }
+ }
+ }
+ \int_set:Nn\l_rand{\int_rand:n{#1*(#1-1)}}
+ \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_h{\l_rand}}{}{
+ \int_compare:nNnTF{\intarray_item:Nn\g_map{\l_rand}}
+ ={\intarray_item:Nn\g_map{#1+\l_rand}}{}{
+ \int_set:Nn\l_new{\intarray_item:Nn\g_map{#1+\l_rand}}
+ \int_set:Nn\l_old{\intarray_item:Nn\g_map{\l_rand}}
+ \intarray_gset:Nnn\g_walls_h{\l_rand}{0}
+ \int_step_inline:nn{#1*#1}{
+ \int_compare:nNnTF{\l_old}={\intarray_item:Nn\g_map{##1}}
+ {\intarray_gset:Nnn\g_map{##1}{\l_new}}{}
+ }
+ }
+ }
+ }
+}
+\NewDocumentCommand\maze{mO{\c_sys_minute_int}}{
+ \m@ze{#1}{#2}
+ \setlength{\unitlength}{\fp_eval:n{.4/#1}\g_size}
+ \begin{picture}(\int_eval:n{#1+2},\int_eval:n{#1+2})(-1,-1)
+ \put(0,0){\line(0,1){#1}}\put(0,0){\line(1,0){#1}}
+ \put(#1,#1){\line(0,-1){#1}}\put(#1,#1){\line(-1,0){#1}}
+ \int_step_inline:nn{#1*(#1-1)}{
+ \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_h{##1}}{}{
+ \put(
+ \int_mod:nn{##1-1}{#1},
+ \int_eval:n{1+\int_div_truncate:nn{##1-1}{#1}}
+ ){\line(1,0){1}}
+ }
+ \int_compare:nNnTF{0}={\intarray_item:Nn\g_walls_v{##1}}{}{
+ \put(
+ \int_mod:nn{##1}{#1-1},
+ \int_div_truncate:nn{##1-1}{#1-1}
+ ){\line(0,1){1}}
+ }
+ }
+ \end{picture}
+}
+\ExplSyntaxOff \ No newline at end of file