mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			166 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| # 11dec13abu
 | |
| # (c) Software Lab. Alexander Burger
 | |
| 
 | |
| (de permute (Lst)
 | |
|    (ifn (cdr Lst)
 | |
|       (cons Lst)
 | |
|       (mapcan
 | |
|          '((X)
 | |
|             (mapcar
 | |
|                '((Y) (cons X Y))
 | |
|                (permute (delete X Lst)) ) )
 | |
|          Lst ) ) )
 | |
| 
 | |
| (de subsets (N Lst)
 | |
|    (cond
 | |
|       ((=0 N) '(NIL))
 | |
|       ((not Lst))
 | |
|       (T
 | |
|          (conc
 | |
|             (mapcar
 | |
|                '((X) (cons (car Lst) X))
 | |
|                (subsets (dec N) (cdr Lst)) )
 | |
|             (subsets N (cdr Lst)) ) ) ) )
 | |
| 
 | |
| (de shuffle (Lst)
 | |
|    (by '(NIL (rand)) sort Lst) )
 | |
| 
 | |
| (de samples (Cnt Lst)
 | |
|    (make
 | |
|       (until (=0 Cnt)
 | |
|          (when (>= Cnt (rand 1 (length Lst)))
 | |
|             (link (car Lst))
 | |
|             (dec 'Cnt) )
 | |
|          (pop 'Lst) ) ) )
 | |
| 
 | |
| 
 | |
| # Genetic Algorithm
 | |
| (de gen ("Pop" "Cond" "Re" "Mu" "Se")
 | |
|    (until ("Cond" "Pop")
 | |
|       (for ("P" "Pop" "P" (cdr "P"))
 | |
|          (set "P"
 | |
|             (maxi "Se"  # Selection
 | |
|                (make
 | |
|                   (for ("P" "Pop" "P")
 | |
|                      (rot "P" (rand 1 (length "P")))
 | |
|                      (link  # Recombination + Mutation
 | |
|                         ("Mu" ("Re" (pop '"P") (pop '"P"))) ) ) ) ) ) ) )
 | |
|    (maxi "Se" "Pop") )
 | |
| 
 | |
| 
 | |
| # Alpha-Beta tree search
 | |
| (de game ("Flg" "Cnt" "Moves" "Move" "Cost")
 | |
|    (let ("Alpha" '(1000000)  "Beta" -1000000)
 | |
|       (recur ("Flg" "Cnt" "Alpha" "Beta")
 | |
|          (let? "Lst" ("Moves" "Flg")
 | |
|             (if (=0 (dec '"Cnt"))
 | |
|                (loop
 | |
|                   ("Move" (caar "Lst"))
 | |
|                   (setq "*Val" (list ("Cost" "Flg") (car "Lst")))
 | |
|                   ("Move" (cdar "Lst"))
 | |
|                   (T (>= "Beta" (car "*Val"))
 | |
|                      (cons "Beta" (car "Lst") (cdr "Alpha")) )
 | |
|                   (when (> (car "Alpha") (car "*Val"))
 | |
|                      (setq "Alpha" "*Val") )
 | |
|                   (NIL (setq "Lst" (cdr "Lst")) "Alpha") )
 | |
|                (setq "Lst"
 | |
|                   (sort
 | |
|                      (mapcar
 | |
|                         '(("Mov")
 | |
|                            (prog2
 | |
|                               ("Move" (car "Mov"))
 | |
|                               (cons ("Cost" "Flg") "Mov")
 | |
|                               ("Move" (cdr "Mov")) ) )
 | |
|                         "Lst" ) ) )
 | |
|                (loop
 | |
|                   ("Move" (cadar "Lst"))
 | |
|                   (setq "*Val"
 | |
|                      (if (recurse (not "Flg") "Cnt" (cons (- "Beta")) (- (car "Alpha")))
 | |
|                         (cons (- (car @)) (cdar "Lst") (cdr @))
 | |
|                         (list (caar "Lst") (cdar "Lst")) ) )
 | |
|                   ("Move" (cddar "Lst"))
 | |
|                   (T (>= "Beta" (car "*Val"))
 | |
|                      (cons "Beta" (cdar "Lst") (cdr "Alpha")) )
 | |
|                   (when (> (car "Alpha") (car "*Val"))
 | |
|                      (setq "Alpha" "*Val") )
 | |
|                   (NIL (setq "Lst" (cdr "Lst")) "Alpha") ) ) ) ) ) )
 | |
| 
 | |
| 
 | |
| ### Grids ###
 | |
| (de grid (DX DY FX FY)
 | |
|    (let Grid
 | |
|       (make
 | |
|          (for X DX
 | |
|             (link
 | |
|                (make
 | |
|                   (for Y DY
 | |
|                      (set
 | |
|                         (link
 | |
|                            (if (> DX 26)
 | |
|                               (box)
 | |
|                               (intern (pack (char (+ X 96)) Y)) ) )
 | |
|                         (cons (cons) (cons)) ) ) ) ) ) )
 | |
|       (let West (and FX (last Grid))
 | |
|          (for (Lst Grid  Lst)
 | |
|             (let
 | |
|                (Col (pop 'Lst)
 | |
|                   East (or (car Lst) (and FX (car Grid)))
 | |
|                   South (and FY (last Col)) )
 | |
|                (for (L Col  L)
 | |
|                   (with (pop 'L)
 | |
|                      (set (: 0 1) (pop 'West))  # west
 | |
|                      (con (: 0 1) (pop 'East))  # east
 | |
|                      (set (: 0 -1) South)       # south
 | |
|                      (con (: 0 -1)              # north
 | |
|                         (or (car L) (and FY (car Col))) )
 | |
|                      (setq South This) ) )
 | |
|                (setq West Col) ) ) )
 | |
|       Grid ) )
 | |
| 
 | |
| (de west (This)
 | |
|    (: 0 1 1) )
 | |
| 
 | |
| (de east (This)
 | |
|    (: 0 1 -1) )
 | |
| 
 | |
| (de south (This)
 | |
|    (: 0 -1 1) )
 | |
| 
 | |
| (de north (This)
 | |
|    (: 0 -1 -1) )
 | |
| 
 | |
| (de disp ("Grid" "How" "Fun" "X" "Y" "DX" "DY")
 | |
|    (setq "Grid"
 | |
|       (if "X"
 | |
|          (mapcar
 | |
|             '((L) (flip (head "DY" (nth L "Y"))))
 | |
|             (head "DX" (nth "Grid" "X")) )
 | |
|          (mapcar reverse "Grid") ) )
 | |
|    (let (N (+ (length (cdar "Grid")) (or "Y" 1))  Sp (length N))
 | |
|       ("border" north)
 | |
|       (while (caar "Grid")
 | |
|          (prin " " (align Sp N) " "
 | |
|             (and "How" (if (and (nT "How") (west (caar "Grid"))) " " '|)) )
 | |
|          (for L "Grid"
 | |
|             (prin
 | |
|                ("Fun" (car L))
 | |
|                (and "How" (if (and (nT "How") (east (car L))) " " '|)) ) )
 | |
|          (prinl)
 | |
|          ("border" south)
 | |
|          (map pop "Grid")
 | |
|          (dec 'N) )
 | |
|       (unless (> (default "X" 1) 26)
 | |
|          (space (inc Sp))
 | |
|          (for @ "Grid"
 | |
|             (prin " " (and "How" "  ") (char (+ 96 "X")))
 | |
|             (T (> (inc '"X") 26)) )
 | |
|          (prinl) ) ) )
 | |
| 
 | |
| (de "border" (Dir)
 | |
|    (when "How"
 | |
|       (space Sp)
 | |
|       (prin "  +")
 | |
|       (for L "Grid"
 | |
|          (prin (if (and (nT "How") (Dir (car L))) "   +" "---+")) )
 | |
|       (prinl) ) )
 |