summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/lisp-on-tex/examples/nqueen.tex
blob: 9de2d284025308e1dbecc1460072f36abdad8406 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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}