summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/lisp-on-tex/examples/nqueen.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/lisp-on-tex/examples/nqueen.tex
Initial commit
Diffstat (limited to 'macros/latex/contrib/lisp-on-tex/examples/nqueen.tex')
-rw-r--r--macros/latex/contrib/lisp-on-tex/examples/nqueen.tex47
1 files changed, 47 insertions, 0 deletions
diff --git a/macros/latex/contrib/lisp-on-tex/examples/nqueen.tex b/macros/latex/contrib/lisp-on-tex/examples/nqueen.tex
new file mode 100644
index 0000000000..9de2d28402
--- /dev/null
+++ b/macros/latex/contrib/lisp-on-tex/examples/nqueen.tex
@@ -0,0 +1,47 @@
+\documentclass{article}
+\usepackage{lisp-on-tex}
+\makeatletter
+\lispinterp{
+ (\define \nqueen (\lambda (\n)
+ (\callOCC (\lambda (\c) (\nqinner \n () \c)))))
+ (\define \nqinner (\lambda (\n \acc \c)
+ (\lispif (\= (\length \acc) \n)
+ (\lispif (\nqcheck \acc) (\c \acc) ())
+ (\nqinnernext \n \acc \c :1))))
+ (\define \nqinnernext (\lambda (\n \acc \c \k)
+ (\lispif (\< \n \k) ()
+ (\begin
+ (\nqinner \n (\cons \k \acc) \c)
+ (\nqinnernext \n \acc \c (\+ \k :1))))))
+ (\define \seq (\lambda (\n)
+ (\lispif (\= \n :1) (\quote (:1)) (\cons \n (\seq (\- \n :1))))))
+ (\define \nqcheck (\lambda (\lst)
+ (\and (\uniqueQ \lst) (\nqcheckdiag \lst))))
+ (\define \nqcheckdiag (\lambda (\lst) (\nqcheckdiaginner \lst :1)))
+ (\define \nqcheckdiaginner (\lambda (\lst \k)
+ (\lispif (\< (\length \lst) \k) /t
+ (\lispif (\nqcheckdiagK \lst \k :1)
+ (\nqcheckdiaginner \lst (\+ \k :1)) /f))))
+ (\define \nqcheckdiagK (\lambda (\lst \k \n)
+ (\lispif (\> \n (\length \lst)) /t
+ (\let ((\t (\nth \lst (\- \k :1)))
+ (\tt (\nth \lst (\- \n :1)))
+ (\d (\- \n \k)))
+ (\lispif (\and
+ (\not (\= \n \k))
+ (\or (\= \t (\+ \tt \d)) (\= \t (\- \tt \d)) ))
+ /f (\nqcheckdiagK \lst \k (\+ \n :1)))))))
+ (\define \uniqueQ (\lambda (\list)
+ (\lispif (\= \list ()) /t
+ (\and (\not (\existQ (\car \list) (\cdr \list))) (\uniqueQ (\cdr \list))))))
+ (\define \existQ (\lambda (\v \list)
+ (\lispif (\= \list ()) /f
+ (\or (\= \v (\car \list)) (\existQ \v (\cdr \list))))))
+ (\define \reverse (\lambda (\l)
+ (\lispif (\= \l ()) () (\append (\reverse (\cdr \l)) (\car \l)))))
+ (\define \append (\lambda (\l \v)
+ (\lispif (\= \l ()) (\cons \v ()) (\cons (\car \l) (\append (\cdr \l) \v)))))
+}
+\begin{document}
+hoge\lispinterp{(\print (\nqueen :5))}fuga
+\end{document} \ No newline at end of file