<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=LOR-contest%2FLisp</id>
	<title>LOR-contest/Lisp - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=LOR-contest%2FLisp"/>
	<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Lisp&amp;action=history"/>
	<updated>2026-10-12T23:41:56Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Lisp&amp;diff=105&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Lisp&amp;diff=105&amp;oldid=prev"/>
		<updated>2023-02-27T18:39:15Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 21:39, 27 февраля 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Lisp&amp;diff=104&amp;oldid=prev</id>
		<title>lor&gt;Cetjs2: Откат правок 163.172.227.165 (обсуждение) к версии Cetjs2</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Lisp&amp;diff=104&amp;oldid=prev"/>
		<updated>2018-05-13T08:28:35Z</updated>

		<summary type="html">&lt;p&gt;Откат правок &lt;a href=&quot;/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/163.172.227.165&quot; title=&quot;Служебная:Вклад/163.172.227.165&quot;&gt;163.172.227.165&lt;/a&gt; (&lt;a href=&quot;/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:163.172.227.165&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Обсуждение участника:163.172.227.165 (страница не существует)&quot;&gt;обсуждение&lt;/a&gt;) к версии &lt;a href=&quot;/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Cetjs2&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Участник:Cetjs2 (страница не существует)&quot;&gt;Cetjs2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;В отличие от других решений, решение на Lisp удалось сделать в одном файле. После загрузки пакета достаточно вызвать функцию advserver для сервера и hclient для клиента. Программа для робота запускается, как команда клиента collect.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(require 'trivial-sockets)&lt;br /&gt;
&lt;br /&gt;
;; World definition and inspection&lt;br /&gt;
&lt;br /&gt;
(defmacro def-world (&amp;amp;rest attr-names)&lt;br /&gt;
  `(progn&lt;br /&gt;
	  ,@(mapcar #'(lambda (attr-name) `(defparameter ,attr-name nil)) attr-names)&lt;br /&gt;
	  (defun clear-world ()&lt;br /&gt;
		 (setf ,@(mapcan #'(lambda (attr-name) (list attr-name nil)) attr-names)))&lt;br /&gt;
	  (defun pack-world ()&lt;br /&gt;
		 (list 'setf &lt;br /&gt;
				 ,@(mapcan &lt;br /&gt;
					 #'(lambda (attr-name) &lt;br /&gt;
						  (list `(quote ,attr-name) `(list 'quote ,attr-name))) attr-names)))))&lt;br /&gt;
&lt;br /&gt;
(def-world&lt;br /&gt;
  bound-x bound-y wall-points thing-points entry-point hero-point hero-carries-thing-p)&lt;br /&gt;
&lt;br /&gt;
(defparameter world-image-name &amp;quot;1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
(defconstant +directions+&lt;br /&gt;
	'((#c(1 0) . go-east)&lt;br /&gt;
	  (#c(-1 0) . go-west)&lt;br /&gt;
	  (#c(0 -1) . go-north)&lt;br /&gt;
	  (#c(0 1) . go-south)))&lt;br /&gt;
&lt;br /&gt;
(defun show-world ()&lt;br /&gt;
  (loop&lt;br /&gt;
	for y upto bound-y&lt;br /&gt;
	do (loop&lt;br /&gt;
		 for x upto bound-x&lt;br /&gt;
		 for point = (complex x y)&lt;br /&gt;
		 do (princ&lt;br /&gt;
			  (cond&lt;br /&gt;
				 ((member point wall-points) #\#)&lt;br /&gt;
				 ((eql point hero-point) #\@)&lt;br /&gt;
				 ((member point thing-points) #\$)&lt;br /&gt;
				 (t &amp;quot; &amp;quot;)))&lt;br /&gt;
		 finally (terpri)))&lt;br /&gt;
  (format t &amp;quot;~A~%~A~%~D item(s) here~%&amp;quot;&lt;br /&gt;
			 (if (or hero-carries-thing-p&lt;br /&gt;
						(remove entry-point thing-points))&lt;br /&gt;
				  &amp;quot;Game is in progress&amp;quot;&lt;br /&gt;
				  &amp;quot;You won!&amp;quot;)&lt;br /&gt;
			 (if hero-carries-thing-p &lt;br /&gt;
				  &amp;quot;You carry an item&amp;quot;&lt;br /&gt;
				  &amp;quot;Your hands are empty&amp;quot;)&lt;br /&gt;
			 (count hero-point thing-points)))&lt;br /&gt;
&lt;br /&gt;
;; New Path finder&lt;br /&gt;
&lt;br /&gt;
(defun make-program (directions)&lt;br /&gt;
  (mapcar &lt;br /&gt;
	#'(lambda (direction)&lt;br /&gt;
		 `(on-server&lt;br /&gt;
			(quote (,(if (numberp direction) &lt;br /&gt;
							 (cdr (assoc direction +directions+))&lt;br /&gt;
							 direction)))))&lt;br /&gt;
	`(,@(reverse directions)&lt;br /&gt;
	  pickup-thing&lt;br /&gt;
	  ,@(mapcar #'- directions)&lt;br /&gt;
	  drop-thing)))&lt;br /&gt;
&lt;br /&gt;
(defun collect ()&lt;br /&gt;
  (loop&lt;br /&gt;
	with path-table = (make-hash-table)&lt;br /&gt;
	for front = () then (cdr front)&lt;br /&gt;
	and point = hero-point then (car front)&lt;br /&gt;
	while point&lt;br /&gt;
	do (loop&lt;br /&gt;
		 for direction in (mapcar #'car +directions+)&lt;br /&gt;
		 for neighbour = (+ point direction)&lt;br /&gt;
		 unless (or&lt;br /&gt;
					(&amp;lt; (realpart neighbour) 0)&lt;br /&gt;
					(&amp;gt; (realpart neighbour) bound-x)&lt;br /&gt;
					(&amp;lt; (imagpart neighbour) 0)&lt;br /&gt;
					(&amp;gt; (imagpart neighbour) bound-y)&lt;br /&gt;
					(member neighbour wall-points)&lt;br /&gt;
					(gethash neighbour path-table))&lt;br /&gt;
		 do (setf (gethash neighbour path-table) (cons direction (gethash point path-table)))&lt;br /&gt;
		 (push neighbour front))&lt;br /&gt;
	finally&lt;br /&gt;
	(return &lt;br /&gt;
	  `(progn&lt;br /&gt;
		 ,@(mapcan&lt;br /&gt;
			  #'(lambda (point) &lt;br /&gt;
					(make-program (gethash point path-table)))&lt;br /&gt;
			  thing-points)))))&lt;br /&gt;
&lt;br /&gt;
;; Command interpreter&lt;br /&gt;
&lt;br /&gt;
(defun reload-world ()&lt;br /&gt;
  (clear-world)&lt;br /&gt;
  (with-open-file (file world-image-name)&lt;br /&gt;
    (loop &lt;br /&gt;
	  initially (setq bound-x 0)&lt;br /&gt;
	  for line = (read-line file nil nil)&lt;br /&gt;
	  and y upfrom 0&lt;br /&gt;
	  while line&lt;br /&gt;
	  do (loop &lt;br /&gt;
		   for c across line &lt;br /&gt;
			and x upfrom 0&lt;br /&gt;
		   do (case c&lt;br /&gt;
		       (#\# (push (complex x y) wall-points))&lt;br /&gt;
		       (#\$ (push (complex x y) thing-points))&lt;br /&gt;
		       (#\. (setf hero-point (setf entry-point (complex x y)))))&lt;br /&gt;
			finally (setq bound-x (max bound-x x)))&lt;br /&gt;
	  finally (setq bound-y y))))&lt;br /&gt;
&lt;br /&gt;
(defun load-world (file-name)&lt;br /&gt;
  (setf world-image-name file-name)&lt;br /&gt;
  (reload-world))&lt;br /&gt;
&lt;br /&gt;
;; Go commands&lt;br /&gt;
(defmacro def-commands (directions)&lt;br /&gt;
  `(progn&lt;br /&gt;
	 ,@(mapcar #'(lambda (pair)&lt;br /&gt;
						`(defun ,(cdr pair) ()&lt;br /&gt;
						  (let ((new-point (+ hero-point ,(car pair))))&lt;br /&gt;
							 (unless (member new-point wall-points)&lt;br /&gt;
								(setf hero-point new-point)))))&lt;br /&gt;
				  directions)))&lt;br /&gt;
&lt;br /&gt;
(def-commands #.+directions+)&lt;br /&gt;
&lt;br /&gt;
(defun pickup-thing ()&lt;br /&gt;
  (when&lt;br /&gt;
	(and (member hero-point thing-points)&lt;br /&gt;
		  (not hero-carries-thing-p))&lt;br /&gt;
	(setf hero-carries-thing-p t&lt;br /&gt;
			thing-points (remove hero-point thing-points :count 1))))&lt;br /&gt;
&lt;br /&gt;
(defun drop-thing ()&lt;br /&gt;
  (when hero-carries-thing-p&lt;br /&gt;
	 (setf hero-carries-thing-p nil)&lt;br /&gt;
	 (push hero-point thing-points)))&lt;br /&gt;
&lt;br /&gt;
;; Network layer&lt;br /&gt;
&lt;br /&gt;
(defun send (stream command)&lt;br /&gt;
	 (write-line (format nil &amp;quot;~S~%&amp;quot; command) stream)&lt;br /&gt;
	 (force-output stream))&lt;br /&gt;
&lt;br /&gt;
;; Server&lt;br /&gt;
&lt;br /&gt;
(defun advserver (file-name port)&lt;br /&gt;
  (load-world file-name)&lt;br /&gt;
  (trivial-sockets:with-server &lt;br /&gt;
	(server (:port port :reuse-address t))&lt;br /&gt;
	(loop&lt;br /&gt;
	 (with-open-stream &lt;br /&gt;
	  (stream (trivial-sockets:accept-connection server))&lt;br /&gt;
	  (eval (read stream))&lt;br /&gt;
	  (send stream (pack-world))))))&lt;br /&gt;
&lt;br /&gt;
;; Client&lt;br /&gt;
&lt;br /&gt;
(defparameter host &amp;quot;localhost&amp;quot;)&lt;br /&gt;
(defparameter port 7766)&lt;br /&gt;
&lt;br /&gt;
(defun on-server (server-program)&lt;br /&gt;
  (with-open-stream&lt;br /&gt;
	(stream (trivial-sockets:open-stream host port))&lt;br /&gt;
	(send stream server-program)&lt;br /&gt;
	(eval (read stream))&lt;br /&gt;
	(show-world)))&lt;br /&gt;
&lt;br /&gt;
(defun hclient (l-host l-port)&lt;br /&gt;
  (setf host l-host port l-port)&lt;br /&gt;
  (on-server '(reload-world))&lt;br /&gt;
  (loop&lt;br /&gt;
	(princ &amp;quot;&amp;gt; &amp;quot;) (force-output)&lt;br /&gt;
	(eval (eval (read)))))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LOR-contest]]&lt;br /&gt;
[[Category:Lisp]]&lt;/div&gt;</summary>
		<author><name>lor&gt;Cetjs2</name></author>
	</entry>
</feed>