<?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%2FHaskell</id>
	<title>LOR-contest/Haskell - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://lorwiki.zhbert.ru/index.php?action=history&amp;feed=atom&amp;title=LOR-contest%2FHaskell"/>
	<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Haskell&amp;action=history"/>
	<updated>2026-10-12T23:41:50Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Haskell&amp;diff=103&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://lorwiki.zhbert.ru/index.php?title=LOR-contest/Haskell&amp;diff=103&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/Haskell&amp;diff=102&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/Haskell&amp;diff=102&amp;oldid=prev"/>
		<updated>2018-05-13T08:32:51Z</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;Вся программа в одном файле.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module Main where&lt;br /&gt;
&lt;br /&gt;
import Data.Map hiding (map, filter, delete, null)&lt;br /&gt;
import Data.List&lt;br /&gt;
import System.IO&lt;br /&gt;
&lt;br /&gt;
data Point = Point {&lt;br /&gt;
                    x:: Int,&lt;br /&gt;
                    y:: Int }&lt;br /&gt;
             deriving (Eq, Ord)&lt;br /&gt;
&lt;br /&gt;
toUp (Point x y) = Point x (y + 1)&lt;br /&gt;
toDown (Point x y) = Point x (y - 1)&lt;br /&gt;
toLeft (Point x y) = Point (x + 1) y&lt;br /&gt;
toRight (Point x y) = Point (x - 1) y&lt;br /&gt;
&lt;br /&gt;
data World = World&lt;br /&gt;
    { sizex:: Int,&lt;br /&gt;
      sizey:: Int,&lt;br /&gt;
      walls:: [Point],&lt;br /&gt;
      items:: [Point],&lt;br /&gt;
      player:: Point,&lt;br /&gt;
      carry:: Bool&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
readWorld y [] = World 0 (y - 1) [] [] (Point 0 0) False&lt;br /&gt;
readWorld y (line:rest) = readLine (readWorld (y + 1) rest) 1 line&lt;br /&gt;
    where&lt;br /&gt;
      readLine world x [] = world { sizex = max x (sizex world) }&lt;br /&gt;
      readLine world x (cell:rest) =&lt;br /&gt;
          readLine readCell (x + 1) rest&lt;br /&gt;
              where&lt;br /&gt;
                readCell =&lt;br /&gt;
                    world {&lt;br /&gt;
                           walls = if cell == '#' then point:worldWalls else worldWalls,&lt;br /&gt;
                           items = if cell == '.' then point:worldItems else worldItems,&lt;br /&gt;
                           player = if cell == '@' then point else (player world) }&lt;br /&gt;
                        where&lt;br /&gt;
                          point = Point x y&lt;br /&gt;
                          worldWalls = walls world&lt;br /&gt;
                          worldItems = items world&lt;br /&gt;
&lt;br /&gt;
getWorld = do&lt;br /&gt;
  worldStream &amp;lt;- readFile &amp;quot;data&amp;quot;&lt;br /&gt;
  return (readWorld 1 $ lines worldStream)&lt;br /&gt;
&lt;br /&gt;
showWorld _ 0 = []&lt;br /&gt;
showWorld world y = (showLine (Point (sizex world) y)) : showWorld world (y - 1)&lt;br /&gt;
    where&lt;br /&gt;
      showLine (Point 0 _) = []&lt;br /&gt;
      showLine point = showCell : showLine (toRight point)&lt;br /&gt;
          where&lt;br /&gt;
            showCell&lt;br /&gt;
                | point `elem` (walls world) = '#'&lt;br /&gt;
                | point == (player world) = '@'&lt;br /&gt;
                | point `elem` (items world) = '.'&lt;br /&gt;
                | otherwise = ' '&lt;br /&gt;
&lt;br /&gt;
isValid world point@(Point x y) =&lt;br /&gt;
    point `notElem` (walls world) &amp;amp;&amp;amp;&lt;br /&gt;
    x&amp;gt;0 &amp;amp;&amp;amp; x&amp;lt;=(sizex world) &amp;amp;&amp;amp;&lt;br /&gt;
    y&amp;gt;0 &amp;amp;&amp;amp; y&amp;lt;=(sizey world)&lt;br /&gt;
&lt;br /&gt;
bringAll world =&lt;br /&gt;
    foldr (++) [] (map bringItem $ items world)&lt;br /&gt;
    where&lt;br /&gt;
      start = player world&lt;br /&gt;
      neighbours point = [dir point |&lt;br /&gt;
                          dir &amp;lt;- [toUp, toDown, toLeft, toRight],&lt;br /&gt;
                          isValid world (dir point) ]&lt;br /&gt;
      waveMap [] wave = wave&lt;br /&gt;
      waveMap front wave =&lt;br /&gt;
          let source = head front&lt;br /&gt;
              nb = filter (`notMember` wave) $ neighbours source&lt;br /&gt;
              g = wave ! source + 1 in&lt;br /&gt;
          waveMap (tail front ++ nb)&lt;br /&gt;
                      (foldr&lt;br /&gt;
                       (\point wm -&amp;gt; insertWith (\_ n -&amp;gt; n) point g wm)&lt;br /&gt;
                       wave nb)&lt;br /&gt;
      waveMap' = waveMap [start] (singleton start 0)&lt;br /&gt;
      bringItem item = &lt;br /&gt;
          (traceProgram $ reverse itemTrace) ++ [&amp;quot;take&amp;quot;] ++ traceProgram itemTrace ++ [&amp;quot;drop&amp;quot;]&lt;br /&gt;
          where&lt;br /&gt;
            itemTrace = trace item&lt;br /&gt;
            trace item &lt;br /&gt;
               | start == item = [item]&lt;br /&gt;
               | otherwise = item : trace nearest&lt;br /&gt;
               where&lt;br /&gt;
                 nearest = minimumBy genOrder $ neighbours item&lt;br /&gt;
                     where&lt;br /&gt;
                       findGen p = findWithDefault (waveMap' ! item) p waveMap'&lt;br /&gt;
                       genOrder p1 p2 = compare (findGen p1) (findGen p2)&lt;br /&gt;
            traceProgram [point] = []&lt;br /&gt;
            traceProgram (point:rest) = (command point (head rest)):(traceProgram rest)&lt;br /&gt;
                where&lt;br /&gt;
                  command (Point x1 y1) (Point x2 y2) =&lt;br /&gt;
                      case Point (x2-x1) (y2-y1) of&lt;br /&gt;
                        Point 0 1 -&amp;gt; &amp;quot;up&amp;quot;&lt;br /&gt;
                        Point 0 (-1) -&amp;gt; &amp;quot;down&amp;quot;&lt;br /&gt;
                        Point 1 0 -&amp;gt; &amp;quot;left&amp;quot;&lt;br /&gt;
                        Point (-1) 0 -&amp;gt; &amp;quot;right&amp;quot;&lt;br /&gt;
&lt;br /&gt;
getProgram = do&lt;br /&gt;
  str &amp;lt;- getLine&lt;br /&gt;
  return (words str)&lt;br /&gt;
&lt;br /&gt;
applyProgram program world initial =&lt;br /&gt;
    foldl applyCommand world program&lt;br /&gt;
    where&lt;br /&gt;
      applyCommand world str =&lt;br /&gt;
          case str of&lt;br /&gt;
            &amp;quot;up&amp;quot; -&amp;gt; step toUp&lt;br /&gt;
            &amp;quot;down&amp;quot; -&amp;gt; step toDown&lt;br /&gt;
            &amp;quot;left&amp;quot; -&amp;gt; step toLeft&lt;br /&gt;
            &amp;quot;right&amp;quot; -&amp;gt; step toRight&lt;br /&gt;
            &amp;quot;take&amp;quot; -&amp;gt; grab True delete&lt;br /&gt;
            &amp;quot;drop&amp;quot; -&amp;gt; grab False (:)&lt;br /&gt;
            &amp;quot;reset&amp;quot; -&amp;gt; initial&lt;br /&gt;
            &amp;quot;collect&amp;quot; -&amp;gt; applyProgram (bringAll world) world initial&lt;br /&gt;
            otherwise -&amp;gt; world&lt;br /&gt;
          where&lt;br /&gt;
            current = player world&lt;br /&gt;
            step dir&lt;br /&gt;
                | isValid world target = world { player = target }&lt;br /&gt;
                | otherwise = world&lt;br /&gt;
                where&lt;br /&gt;
                  target = dir current&lt;br /&gt;
            grab carryFlag action&lt;br /&gt;
                | carry world == carryFlag = world&lt;br /&gt;
                | otherwise = world { carry=carryFlag,&lt;br /&gt;
                                      items=action current (items world) }&lt;br /&gt;
&lt;br /&gt;
doRepl world initial = do&lt;br /&gt;
  putStr (unlines $ showWorld world (sizey world))&lt;br /&gt;
  program &amp;lt;- getProgram&lt;br /&gt;
  if null program&lt;br /&gt;
    then&lt;br /&gt;
      return ()&lt;br /&gt;
    else&lt;br /&gt;
      doRepl (applyProgram program world initial) initial&lt;br /&gt;
&lt;br /&gt;
main = do&lt;br /&gt;
  world &amp;lt;- getWorld&lt;br /&gt;
  doRepl world world&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:LOR-contest]]&lt;/div&gt;</summary>
		<author><name>lor&gt;Cetjs2</name></author>
	</entry>
</feed>