<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:_lcr_</id>
  <title>Undesigned unfriendly page</title>
  <subtitle>Lazy Cjow Rhrr</subtitle>
  <author>
    <name>Lazy Cjow Rhrr</name>
  </author>
  <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/"/>
  <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom"/>
  <updated>2007-08-17T13:22:51Z</updated>
  <lj:journal username="_lcr_" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://users.livejournal.com/_lcr_/data/atom" title="Undesigned unfriendly page"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:5439</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/5439.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=5439"/>
    <title>StringTemplate креатифчик</title>
    <published>2007-08-17T13:22:51Z</published>
    <updated>2007-08-17T13:22:51Z</updated>
    <category term="java"/>
    <category term="stringtemplate"/>
    <content type="html">StringTemplate - это шаблонная библиотека для генерации структурированного текста. Имеет функциональные черты, любит чистоту, немножко ленив, но заставляет выносить логику в модель.&lt;br /&gt;&lt;br /&gt;Отчёт тут:&lt;br /&gt;&lt;a href="http://rsdn.ru/Forum/Message.aspx?mid=2625206"&gt;http://rsdn.ru/Forum/Message.aspx?mid=2625206&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:5252</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/5252.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=5252"/>
    <title>Fantasy general</title>
    <published>2007-05-22T09:32:13Z</published>
    <updated>2007-05-22T09:38:31Z</updated>
    <category term="fantasy general"/>
    <content type="html">Эхх ностальгия... Пытался скачать сабж с&lt;br /&gt;&lt;br /&gt;&lt;a href="http://free-game-downloads.mosw.com/"&gt;http://free-game-downloads.mosw.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Чтобы оттуда скачать, нужно прочитать это&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;We're sorry but because of increasing service maintaining costs we can't offer free downloads to everyone without limitations. However if you place a link to our site on your website, blog, or some social media site (Digg, MySpace, Del.icio.us, Reddit, StumbleUpon etc.) thus helping promote our site, we'll grant you free immediate access to download your favorite game or another files. We hope this measure is sufferable for you - it takes you just a moment and it really saves our site. If you really can't afford it, then we are very sorry, but there is no other way if we want to keep our site up. Thank you.&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;&lt;br /&gt;и поступить самым остроумным способом :-))&lt;br /&gt;&lt;br /&gt;UPD: Нет, самым остроумным способом поступают товарищи с fgd. Скачиваем даунлоадер (Касперский молчит), и с помощью него скачиваем игру.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:4913</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/4913.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=4913"/>
    <title>Тухлятина для дуракоф!</title>
    <published>2007-02-01T12:26:05Z</published>
    <updated>2007-02-01T12:26:05Z</updated>
    <category term="тухлятина"/>
    <category term="фп"/>
    <content type="html">LaPerouse&lt;br /&gt;&lt;br /&gt;Ай кросавчег, ай да молодец. Так даже Влад не жог:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;Видите ли, те языки, о которых вы говорите (C++, Pascal) в представлении многих являются классическими процедурными языками, что нет ничего недопустимого в усилении этого термина, которое более предпочтительно по сравнению с введением нового термина – “функциональный язык”. Исходя из того, что сказано мной выше, едва ли справедливо выделять из процедурных группу функциональных языков, тут, скорее, нужно говорить о “функциональном подходе” и о языках, наиболее эффективно поддерживающих этот подход.&lt;br /&gt;&lt;br /&gt;Все-таки основным критерием функционального подхода является то, о чем я говорил выше – отношение к хранению состояния. Вот он, постамент, на котором зиждется вся теория и практика функционального программирования, тот самый “пятый элемент”, придающий особый колорит этому стилю. Стоит только разрешить изменение переменных в любом “функциональном языке” и внешние ссылки на эти переменные (которое не нужно даже специальным образом вводить), и этот язык неуловимо для глаз превратится в стандартный процедурный язык. Все остальное – синтаксические конструкции, помогающие объявлять вложенные конструкции функций, встроенные в сам язык возможности для обработки списков и т п — все это для дураков, чтобы дать им почувствовать всю “революционность” и крутизну “новейшего” подхода. Да! Я утверждаю, что за роскошной вывеской прячется тухлятина, которой уже как минимум 50 лет. И готов это доказать любому, пусть и придется пожертвовать частью личного времени на восполнение пробелов в чужом образовании.&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/forum/Message.aspx?mid=2329984"&gt;http://rsdn.ru/forum/Message.aspx?mid=2329984&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Даже если и так, я согласен чувствовать себя полным дауном читая не то что протухшие, а наверное уже разложившиеся листы рассылки erlang и haskell cafe. ^_^</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:4704</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/4704.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=4704"/>
    <title>О прибыльном говне</title>
    <published>2006-12-16T18:16:40Z</published>
    <updated>2006-12-16T18:16:40Z</updated>
    <category term="ошибки"/>
    <category term="игра"/>
    <category term="говно"/>
    <content type="html">Я комплители дизаппоинтед. Мы тут обсуждаем эрланг с его девятью девятками, ищем методы снижения количества ошибок и как можно более раннего их обнаружения (классическая тема для флейма: static vs dynamic typing), тем самым предполагая неявно, что чем меньше ошибок - тем лучше. Но есть места, где это не нужно...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jimmyvalentine.livejournal.com/1118.html"&gt;Нед слофф&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:4501</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/4501.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=4501"/>
    <title>Много слов про Эрланг</title>
    <published>2006-12-13T15:33:49Z</published>
    <updated>2006-12-13T15:34:48Z</updated>
    <category term="java"/>
    <category term="erlang"/>
    <category term="rsdn"/>
    <content type="html">Сообщение, в котором я пытаюсь обрисовать, то что джавов и дотнетов много, а Эрланг весь такой один. Получилось очень большим. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/Forum/Message.aspx?mid=2261047"&gt;http://rsdn.ru/Forum/Message.aspx?mid=2261047&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В обсуждении уже есть кое-что новенькое:&lt;br /&gt;&lt;table bgcolor="lightgray"&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;К&amp;gt;Т.е. надо в рантайме перехреначить байткод. Мне кажется, что АСТ курочить полегче будет.&lt;br /&gt;К&amp;gt;Т.е. у тебя тут получится, что будет выполняться не байткод, а уже какой-то перетранслированный.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;Не, как раз для этого есть куча средств. Сделать чтобы ВСЕ методы у ВСЕХ библиотек перед началом работы вызывали scheduler это 2-3 строчки кода, плюс добавить библиотеку и изменить startup script. И вообще, байткод гораздо проще чем AST языка. Правда, конечно, stack trace будет весьма странный получатся, что осложнит отладку довольно сильно.&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Я знал, что это возможно, но не знал, что для "всех методов у всех библиотек" достаточно 3-х строчек кода. Разбираюсь, сейчас гляжу в доку по инструментированию JVM. Вижу только горячий апгрейд методов, но магических 3-х строчек не вижу.&lt;br /&gt;&lt;br /&gt;Попутно жду железобетонных доводов "в реальных задачах такие ужимки и прыжки не нужны, и обычные потоки рулят"... ;-)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:4122</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/4122.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=4122"/>
    <title>graphviz</title>
    <published>2006-12-10T05:19:04Z</published>
    <updated>2006-12-10T05:20:42Z</updated>
    <category term="graphviz"/>
    <category term="rsdn"/>
    <content type="html">(Пора возрвратить к жизни эту запылившуюся страничку)&lt;br /&gt;&lt;br /&gt;Есть надежда, что в rsdn скоро можно будет вставлять в сообщения dot-нотацию. То есть то же самое, что и со смайликами, только для включений вроде таких:&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
[gv]
digraph
{
  1-&amp;gt;2-&amp;gt;4-&amp;gt;6
  2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;6 
  1-&amp;gt;3-&amp;gt;5-&amp;gt;6-&amp;gt;1 
}
[/gv]
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;То есть вместо этого текста сгенерируется картинка и вставится в сообщение (по крайней мере предполагается так).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://rsdn.ru/Forum/Message.aspx?mid=2257051&amp;only=1"&gt;http://rsdn.ru/Forum/Message.aspx?mid=2257051&amp;only=1&lt;/a&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:3878</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/3878.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=3878"/>
    <title>Functional Programming For The Rest Of Us</title>
    <published>2006-09-02T13:04:12Z</published>
    <updated>2006-09-04T04:24:48Z</updated>
    <category term="ФП"/>
    <category term="статья"/>
    <content type="html">Мой перевод неплохой на мой взгляд статьи &lt;br /&gt;&lt;a href="http://www.defmacro.org/ramblings/fp.html"&gt;http://www.defmacro.org/ramblings/fp.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Данная статья достаточно кратко и вполне доступно, используя примеры на Java (!), знакомит читателя с базовыми понятиями функционального программирования. &lt;br /&gt;&lt;br /&gt;&lt;hl&gt;&lt;br /&gt;&lt;a name="cutid1"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;UPD:&lt;br /&gt;Трудность номер раз: LJ выдаёт "Post too large". &lt;br /&gt;Трудность номер два: CSS не работает (прощай раскраска синтаксиса во вставках кода и т.п.).&lt;br /&gt;Счастливое решение номер три: Миша (ака kmmbvnr) любезно поделился хостом:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mishaa.alfaspace.net/fp.html"&gt;http://mishaa.alfaspace.net/fp.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;за что ему большое человеческое спасибо!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:3747</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/3747.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=3747"/>
    <title>Рекурсивный перебор k-подмножеств</title>
    <published>2006-05-15T04:58:35Z</published>
    <updated>2006-05-15T04:58:35Z</updated>
    <category term="erlang"/>
    <content type="html">(Уфф, эти срочные проекты вышибли из колеи больше чем на месяц).&lt;br /&gt;&lt;br /&gt;Хочу наконец закончить эстетствовать с перебором k-элементных подмножеств. Задачу сформулирую в наиболее общем виде: дан список (чего угодно), сформировать список всех его k-элементных подсписков.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
start() -&amp;gt;
	comb([], [a,b,c,d,e,f], 3).

% comb([], [a,b,c,d,e,f], 3) -&amp;gt;
%	comb([a], [b,c,d,e,f], 2) ++
%	comb([b], [c,d,e,f], 2) ++
%	comb([c], [d,e,f], 2) ++
%	comb([d], [e,f], 2).	
comb(B, E, 1) -&amp;gt;
	Cons = fun (X) -&amp;gt; B ++ [X] end,
	map(Cons, E);
comb(B, E, K) when K == length(E) -&amp;gt;
	[B ++ E];
comb(B, E, K) -&amp;gt;
	combr(B, E, K-1).

combr(_B, E, K) when K == length(E) -&amp;gt;
	[];
combr(B, [EH|ET], K) -&amp;gt;
	%io:format("~w; ~w; ~w~n", [B ++ [hd(E)], tl(E), K]),
	comb(B ++ [EH], ET, K) ++ combr(B, ET, K).
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Здесь текущее множество формируется из начала B и некоторого куска длины K из списка-конца E. В граничных условиях (когда нужно перебрать все 1-элементные подмножества, или E-элементные подмножества из E) задача решается непосредственным перебором, а в общем случае - рекурсивно. Красивое, компактное, хоть и не самое эффективное решение.&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
2&amp;gt; comb:start().
[[a,b,c],
 [a,b,d],
 [a,b,e],
 [a,b,f],
 [a,c,d],
 [a,c,e],
 [a,c,f],
 [a,d,e],
 [a,d,f],
 [a,e,f],
 [b,c,d],
 [b,c,e],
 [b,c,f],
 [b,d,e],
 [b,d,f],
 [b,e,f],
 [c,d,e],
 [c,d,f],
 [c,e,f],
 [d,e,f]]
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Пока всё на этом.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:3432</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/3432.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=3432"/>
    <title>Перебор k-элементных подмножеств n-элементного множества</title>
    <published>2006-03-31T04:02:20Z</published>
    <updated>2006-03-31T04:03:12Z</updated>
    <category term="программирование"/>
    <category term="erlang"/>
    <category term="алгоритмы"/>
    <content type="html">Да, вот такая простая задача. Везде видел решения рекурсией, но в один прекрасный момент (был он где-то 4 года назад) наткнулся на супербыстрый вариант без рекурсии:&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
void enumerate(int k, int n)
{
  int i, j;                                           
  int p = k-1; // позиция увеличиваемого элемента                   
                                                               
  for( j=0; j&amp;lt;k; ++j )                                           
    a[j] = j;                                                  
  // к сожалению крайние случаи приходится рассматривать отдельно
  if( k==n || k==0 )                                             
  {                                                              
    return true;                                               
  }                                                              
                                                               
  while( p &amp;gt;= 0 )                                                
  {                                                              
    // используем первые k элементов a (это то самое подмножество) 
    use(a, k);
    // генерируем следующее множество                          
    if( a[k-1] == n-1 )                                        
    {                                                          
        if( --p %gt;= 0 )                                         
            for( i=k; --i&amp;gt;=p ;)                                
                a[i] = a[p]+i-p+1;                             
    }                                                          
    else                                                       
    {                                                          
        p = k-1;                                               
        a[p]++;                                                
    }                                                          
}                                                              &lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Идея очень проста: увеличиваем элемент с индексом p на единичку, пока он не станет больше n. Когда этот последний элемент станет больше p, мы отодвигаем p биже к началу и заполняем элементы с p-го до k-го последовательно.&lt;br /&gt;&lt;br /&gt;Этот алгоритм я и попытался изобразить на Эрланге (единственное отличие, что множество пришлось выписывать наоборот, потому что инкрементировать голову намного легче, чем хвост):&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
enum(N, K) when N &amp;gt;= K -&amp;gt;
	enum(N, K, seq(K, 1, -1), 1).
	
enum(N, K, Ls, P) when hd(Ls) &amp;gt; N -&amp;gt;
	overflow(N, K, Ls, P);
enum(N, K, Ls, P) -&amp;gt;
	do_something(Ls),
	enum(N, K, [hd(Ls)+1 | tl(Ls)], 1).

overflow(N, K, Ls, P, R) -&amp;gt;
	case split(P, Ls) of
		{_, []} -&amp;gt; done;
		{_, [Lsp | Lstt]} -&amp;gt; enum(N, K,
			seq(Lsp + P + 1, Lsp + 1, -1) ++ Lstt, P + 1, R)
	end.

do_something(Ls) -&amp;gt;
	io:format("~w~n", [Ls]).
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Выводит&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
4&amp;gt; test:enum(6,3).
[3,2,1]
[4,2,1]
[5,2,1]
[6,2,1]
[4,3,1]
[5,3,1]
[6,3,1]
[5,4,1]
[6,4,1]
[6,5,1]
[4,3,2]
[5,3,2]
[6,3,2]
[5,4,2]
[6,4,2]
[6,5,2]
[5,4,3]
[6,4,3]
[6,5,3]
[6,5,4]
done
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:3081</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/3081.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=3081"/>
    <title>_lcr_ @ 2006-03-21T14:49:00</title>
    <published>2006-03-21T10:01:00Z</published>
    <updated>2006-03-21T10:01:00Z</updated>
    <category term="программирование"/>
    <category term="эрланг"/>
    <content type="html">Задача: нужно перебрать следующие последовательности, перебор зависит от параметров m и n, где каждый элемент может принимать значения не больше m, всего элементов может быть не больше n, и они невозрастают.&lt;br /&gt;&lt;br /&gt;Первый вариант:&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
test(Ba, Bl, A) when length(A) &amp;lt; Bl -&amp;gt;
	io:fwrite("~p~n", [A]),
	test(Ba, Bl, next(Ba, A));
test(Ba, Bl, A) -&amp;gt;
	done.

next(Ba, A) -&amp;gt;
	{Alow, Ahigh} = lists:splitwith( fun (X) -&amp;gt; X &amp;gt;= Ba end, A),
	next(Ba, Alow, Ahigh).

next(Ba, Alow, []) -&amp;gt;
	lists:duplicate(length(Alow) + 1, 2);
next(Ba, Alow, [Ah | At]) -&amp;gt;
	lists:duplicate(length(Alow) + 1, Ah + 1) ++ At.
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Недостаток в том, что это нифига не эффективно, ибо splitwith проезжает по списку при каждом апдейте списка. Плохо.&lt;br /&gt;&lt;br /&gt;Фторой вариант: фторого варианта пока нет... :-)&lt;br /&gt;&lt;br /&gt;Тем не менее работает:&lt;br /&gt;&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
52&amp;gt; tmp:test(4,4,[]).
[]
[2]
[3]
[4]
[2,2]
[3,2]
[4,2]
[3,3]
[4,3]
[4,4]
[2,2,2]
[3,2,2]
[4,2,2]
[3,3,2]
[4,3,2]
[4,4,2]
[3,3,3]
[4,3,3]
[4,4,3]
[4,4,4]
done
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:3010</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/3010.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=3010"/>
    <title>Ещё табличка для оформления сорцов</title>
    <published>2006-03-13T12:30:02Z</published>
    <updated>2006-03-13T12:30:02Z</updated>
    <content type="html">&lt;table border="1" cellspacing="1" bgcolor="lightgrey"&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre&gt;
package Hello;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface CoolInterface_Home extends EJBHome { 
    public CoolInterface_Remote create() throws RemoteException, CreateException; 
}
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table border=1 cellspacing=1 bgcolor="lightgrey"&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;Здесь идёт супер-пупер код&lt;br /&gt;&amp;lt;/pre&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;Наверное на этом варианте и остановлюсь.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:2729</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/2729.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=2729"/>
    <title>Строка для медитации</title>
    <published>2006-03-13T06:18:15Z</published>
    <updated>2006-03-13T06:18:15Z</updated>
    <content type="html">Я выпал в осадок (довольно давно, надо сказать). Когда растворился обратно и подумал, что ЭТО нужно записать.&lt;br /&gt;&lt;br /&gt;Такая вот маленькая неприментная строчечка из J4C:&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="gray"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;
  y =. 6 6 6 1 0 1
  t - (i.~y) { t =. /: /: y
0 1 2 0 0 1
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Массив-результат обладает следующим свойством: r[i] это количество элементов равных y[i] с индексами меньшими i. То есть y[1] == 6, и r[1]==1 означает, что до этой шестёрки есть ещё только одна.&lt;br /&gt;&lt;br /&gt;Генри Рич, комментируя этот глагол, говорит очевидные вещи, а неочевидные - не говорит :-) Так что пришлось самому. В результате многочасового &lt;s&gt;битья головой об стену&lt;/s&gt; размышления я понял это. Попытаюсь изложить.&lt;br /&gt;&lt;br /&gt;t это порядковый номер соответствующего элемента в y, есть термин такой, "ординал", так вот: t[i] это ординал y[i]-го. Убедиться в этом достаточно просто, скажу только что эта задача в Этюдах не продержалась и одного дня.&lt;br /&gt;&lt;br /&gt;Всё множество элементов в y делятся на классы эквивалентности, а именно y1 и y2 попадают в один класс тогда и только тогда, когда они равны.&lt;br /&gt;&lt;br /&gt;t обладает следующим свойством: для каждого класса эквивалентности соответствующие ординалы &lt;u&gt;начинаются с самого левого элемента&lt;/u&gt; и идут последовательно. Выделенное было ключом для моего понимания. Смотрите сами: если бы было&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="gray"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;
  /:/: 2 2 2
1 2 0
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;то это не противоречило бы определению глагола /:, однако вся конструкция бы рассыпалась.&lt;br /&gt;&lt;br /&gt;(i.~y) это (y i. y). Важно то, что здесь классы эквивалентности помечаются отдельными числами:&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="gray"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;
  ]x =. (i.~y) 6 6 6 1 0 1
0 0 0 3 4 3
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Отмечу свойства x: x[i] &amp;lt;= i (очевидно) и числа-метки есть индекс первого числа соответствующего класса эквивалентности (это следует просто из определения i.).&lt;br /&gt;&lt;br /&gt;Вот теперь ключевой момент: пусть задан какой-нибудь класс эквивалентности I (множество индексов). Утверждения:&lt;br /&gt;&lt;br /&gt;Для любого i1, i2 \in I =&amp;gt; y[i1]==y[i2]. &lt;br /&gt;Есть минимальный индекс im, im \in I.&lt;br /&gt;В t значения на этих индексах идут по порядку, t[im] самый маленький.&lt;br /&gt;В x значения на этих индексах равны im: x[i]==im для всех i \in I.&lt;br /&gt;Следовательно, z =. x { t будет z[i]==t[im] для всех i \in I.&lt;br /&gt;Следовательно, разность r = t - z будет принимать последовательные значения r[i] = 0, 1, .. ,k на индексах i \in I.&lt;br /&gt;&lt;br /&gt;Вот и всё. Спустя некоторое время это станет мегаочевидно, и врядли будет стоить столько слов, сколько я сейчас накатал. Но сейчас оно того стОит!&lt;br /&gt;&lt;br /&gt;Тацитная форма&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="gray"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;
  ([: /: /:) - i.~ { [: /: /:
      +- [:      
  +---+- /:      
  |   +- /:      
  +- -           
--+   +- ~ --- i.
  |   +- {       
  +---+     +- [:
      +-----+- /:
            +- /:
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Quiz: как избавиться от дублирования ([:/:/:)?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:2408</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/2408.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=2408"/>
    <title>Про управление персоналом.</title>
    <published>2006-01-18T09:38:12Z</published>
    <updated>2006-01-18T09:39:29Z</updated>
    <category term="humour"/>
    <category term="management"/>
    <content type="html">Не хотелось сюда постить околопрограммистские ссылки, но эта зацепила&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.hr-journal.ru/contest/exp.shtml?bcg"&gt;К вопросу об эффективном управлении персоналом&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(впервые увидел у kmmbvnr, респект!)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:2192</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/2192.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=2192"/>
    <title>Какая классная фракталина!</title>
    <published>2006-01-16T05:32:44Z</published>
    <updated>2006-01-18T09:43:21Z</updated>
    <category term="programming"/>
    <category term="j"/>
    <content type="html">&lt;a href="http://www.ewartshaw.co.uk/jwhat.html"&gt;http://www.ewartshaw.co.uk/jwhat.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background:lightgray"&gt;
 {&amp;'#.' @ (2:&amp;lt;|) @ ((+*:)^:400 0:)  (18 %~ i:_20) j.~/ 28 %~ _59+i.75
...........................................................................
...........................................................................
...........................................................#...............
...........................................................................
........................................................#..................
.......................................................##..................
.....................................................######................
.....................................................######................
......................................................####.................
............................................#....##############............
............................................##.##################.###......
.............................................#######################.......
.........................................#.#########################.......
..........................................###########################......
........................................###############################....
...............................#........##############################.....
...........................########....################################....
..........................###########..###############################.....
.........................#############.##############################......
......................#..#############.##############################......
...################################################################........
......................#..#############.##############################......
.........................#############.##############################......
..........................###########..###############################.....
...........................########....################################....
...............................#........##############################.....
........................................###############################....
..........................................###########################......
.........................................#.#########################.......
.............................................#######################.......
............................................##.##################.###......
............................................#....##############............
......................................................####.................
.....................................................######................
.....................................................######................
.......................................................##..................
........................................................#..................
...........................................................................
...........................................................#...............
...........................................................................
...........................................................................
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Надо будет как-нить это в пикселях отобразить. Красиво ведь, а!&lt;br /&gt;&lt;br /&gt;UPD: Под линуксами выдаёт непонятно что! :crash: Нужно поковырять, что к чему...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:1933</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/1933.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=1933"/>
    <title>Эксперименты с форматированием</title>
    <published>2006-01-06T04:18:53Z</published>
    <updated>2006-01-06T04:18:53Z</updated>
    <content type="html">Ruby small piece of code&lt;br /&gt;&lt;br /&gt;&lt;pre style="background:lightgray"&gt;
class Person
  attr_accessor :name, :age
  def initialize(name, age)
    @name = name
    @age  = age.to_i
  end
  def inspect
    "#@name (#@age)"
  end
end

p1 = Person.new('elmo', 4)
p2 = Person.new('zoe', 7)

p1               # -&amp;gt; elmo (4)
p2               # -&amp;gt; zoe (7)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;или можно так&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td bgcolor="gray"&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;
class Person
  attr_accessor :name, :age
  def initialize(name, age)
    @name = name
    @age  = age.to_i
  end
  def inspect
    "#@name (#@age)"
  end
end

p1 = Person.new('elmo', 4)
p2 = Person.new('zoe', 7)

p1               # -&amp;gt; elmo (4)
p2               # -&amp;gt; zoe (7)
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;второй кусок наверное симпатичнее, ы?&lt;br /&gt;&lt;pre&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td bgcolor="gray"&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;pre&amp;gt;
тут идёт кусок кода
&amp;lt;/pre&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;
&lt;/pre&gt;&lt;br /&gt;Интересно, какому гению в какое место пришёл этот дурацкий синтаксис html: &amp;amp;lt;?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:1726</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/1726.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=1726"/>
    <title>Вы думаете я буду про Новый Год? Щазззззз</title>
    <published>2006-01-04T10:51:06Z</published>
    <updated>2006-01-04T10:51:24Z</updated>
    <content type="html">&lt;b&gt;А я про J.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Некоторое время я пребывал в состоянии блаженной уверенности, что любой глагол записанный в явной форме можно записать в неявной. Нужно только немножечко хорошенько подумать. Но оказывается, всё чуть-чуть сложнее:&lt;br /&gt;&lt;pre style="background:lightgray"&gt;
   t =. 4 : '0 (x.) } y.'
   2 t i.5
0 1 0 3 4
&lt;/pre&gt;&lt;br /&gt;О сколько нам открытий чудных... (А.С.Пушкин)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:1447</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/1447.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=1447"/>
    <title>Reverse Engeneering just for fun.</title>
    <published>2005-12-28T08:47:39Z</published>
    <updated>2005-12-28T09:00:15Z</updated>
    <category term="программирование"/>
    <category term="erlang"/>
    <content type="html">&lt;p&gt;Эту штуку я запнул на rsdn в "Декларативное программирование", но для полноты картины сюда тоже решил. Взять запостить в список рассылки erlang-questions, что ли. Может быть аффтару, Urban Boquist-у будет приятно...&lt;/p&gt;

&lt;p&gt;Итак, что мы видим сначала? Большую буковку "ё".&lt;/p&gt;
&lt;pre style="background-color:lightgray"&gt;
                             -module(e).
                         -export([main/1]).
                       -import(lists,[all/2]).
                         -define(t(A,B),B
                            andalso A).

f(E,R,L,A,N,G) -&amp;gt;

         if E&amp;gt;G-&amp;gt;{c,N};L&amp;gt;G-&amp;gt;f(E+1,R,R,R,N,G);A&amp;gt;G-&amp;gt;c(
       R,N,G);true-&amp;gt;case g(E,L,N)of g-&amp;gt;f(E,R,L+1,R,N,G
     );_-&amp;gt;b(G,E,A,R,N,L)end end. d(A,B)-&amp;gt;h(3#21,B,A). h(
    A,B,C)-&amp;gt;case f(C,             C,C,C,[{C-1,C-1,a}|B],A
   +2)of{c,D}-&amp;gt;e(A+                 1,TL(lists:sort((D))));
 _-&amp;gt;fail end. main                   (A)-&amp;gt;d(1,A). b(E,R,L,A,
 N,G)when L&amp;gt;E-&amp;gt;f(                     R,A,G,L,N,E);b(L,A,N,G,
 E,R)-&amp;gt;V=round(math:sqrt(L)),C=fun(I)-&amp;gt;(I-1)div V*V end,D=fun
 ({_,_,Q})-&amp;gt;N/=Q end,case?t(all(D,[{I,O,S}||{I,O,S}&amp;lt;-E,A==I]),
 ?t(all(D,[{I,S,O}||{I,S,O}&amp;lt;-E,R==S]),all(D,lists:filter(fun({
 O,S,_})-&amp;gt;?t(C(A)
 &amp;lt;O,?t(O=&amp;lt;C(A)+V,
 ?t(C(R)&amp;lt;S,S=&amp;lt;C(R
 )+V)))end,E))))of                                true
  -&amp;gt;f(A,G,R+1,G,[{A                              ,R,N}|E
   ],L);_-&amp;gt;b(L,A,N+1,                           G,E,R)end.
    a(D,{C,A})-&amp;gt;[[B||                          {_,_,B}&amp;lt;-C]|
      e(D-1,A)]. e(_,[                        ])-&amp;gt;[];e(E,L)
        -&amp;gt;a(E+1,lists:split(E+1,L)). c(_,[{_,_,a}|_],_)-&amp;gt;b
         ;c(B,[{R,K,N}|S],A)-&amp;gt;f(R,B,K,N+1,S,A);c(_,[],_)
           -&amp;gt;b. g(B,A,[{B,A,_}|_])-&amp;gt;g;g(_,_,[])-&amp;gt;h;g(B
                ,A,[_|C])-&amp;gt;g(B,A,C).
&lt;/pre&gt;
Прекрасно. Ломаем её отступами:
&lt;pre style="background-color:lightgray"&gt;
-module(e).
-export([main/1]).
-import(lists, [all/2]).

-define(t(A, B), B andalso A).

f(E, R, L, A, N, G) -&amp;gt;
    if 
        E &amp;gt; G -&amp;gt; {c, N};
        L &amp;gt; G -&amp;gt; f(E+1, R, R, R, N, G);
        A &amp;gt; G -&amp;gt; c(R, N, G);
        true -&amp;gt; case g(E, L, N) of
            g -&amp;gt; f(E, R, L+1, R, N, G);
            _ -&amp;gt; b(G, E, A, R, N, L)
        end
    end.

d(A, B) -&amp;gt; h(3#21, B, A).

h(A, B, C) -&amp;gt;
    case f(C, C, C, C, [{C - 1, C - 1, a} | B], A + 2) of
        {c, D} -&amp;gt; e(A + 1, tl(lists:sort((D))));
        _      -&amp;gt; fail
    end.

% A is list like [{1,3,8},{1,4,4},{1,7,3},{1,8,5},{2,6,1}, ... ].
main(A) -&amp;gt; d(1, A).

b(E, R, L, A, N, G) when L &amp;gt; E-&amp;gt;
    f(R, A, G, L, N, E);
b(L, A, N, G, E, R) -&amp;gt;
    V = round(math:sqrt(L)),
    C = fun(I) -&amp;gt; (I - 1) div V * V end,
    D = fun({_, _, Q}) -&amp;gt; N /= Q end,
    case
        ?t(all(D, [{I, O, S} || {I, O, S} &amp;lt;- E, A == I]),
        ?t(all(D, [{I, S, O} || {I, S, O} &amp;lt;- E, R == S]),
        all(D, lists:filter(
            fun({O, S, _}) -&amp;gt; 
                ?t(C(A) &amp;lt; O, ?t(O =&amp;lt; C(A) + V, ?t(C(R) &amp;lt; S, S =&amp;lt; C(R) + V)))
            end, E))))
    of
        true -&amp;gt; f(A, G, R + 1, G, [{A, R, N} | E], L);
        _    -&amp;gt; b(L, A, N + 1, G, E, R)
    end.

a(D, {C, A}) -&amp;gt; [[B || {_, _, B} &amp;lt;- C] | e(D - 1, A)].

e(_, []) -&amp;gt; [];
e(E, L) -&amp;gt; a(E + 1, lists:split(E + 1, L)).

c(_, [{_, _, a} | _], _) -&amp;gt; b;
c(B, [{R, K, N} | S], A) -&amp;gt; f(R, B, K, N + 1, S, A);
c(_, [], _) -&amp;gt; b.

g(B, A, [{B, A, _} | _]) -&amp;gt; g;
g(_, _, []) -&amp;gt; h;
g(B, A, [_|C]) -&amp;gt; g(B, A, C).
&lt;/pre&gt;
Итак, расставили отступы... Дааа, жуть. Ищем main. Спасительной информацией для понимания является то, что main принимает в качестве параметра список троек {Строка, Столбец, Номер}. Функция main на редкость простая. Смотрим дальше: ага, там функция d просто вызывает h. Двигаемся дальше, к определению функции h. Видим, что к первому параметру A прибавляются 1 и 2, но функция h больше нигде не вызывается. Это даёт нам право немного модифицировать вызов функции h и её саму:
&lt;pre style="background-color:lightgray"&gt;
main(List) -&amp;gt; h(7 + 2, List, 1).

h(Size, List, I) -&amp;gt;
    case f(I, I, I, I, [{I - 1, I - 1, a} | List], Size) of
        {c, D} -&amp;gt; e(Size - 1, tl(lists:sort((D))));
        _      -&amp;gt; fail
    end.
&lt;/pre&gt;
&lt;p&gt;(3#21 это просто число 7, такой вот способ записи, явно для запудривания мозгов).&lt;/p&gt;

&lt;p&gt;Далее рассматриваем мешанину символов... Вдруг - о! - что-то знакомое: функция g - это явно поиск пары в списке. Эта функция вызывается только из f. Первые 2 параметра у g - это номера строки и столбца ячейки. Следовательно, список параметров f уточняется до:&lt;/p&gt;
&lt;pre style="background-color:lightgray"&gt;
f(Rw, R, Cl, A, L, Size) -&amp;gt; ...
&lt;/pre&gt;
Что такое R и A здесь - пока непонятно. Функцию g перепишем в более удобоваримом виде:
&lt;pre style="background-color:lightgray"&gt;
find_cell(Rw, Cl, [{Rw, Cl, _} | _]) -&amp;gt; found;
find_cell(_, _, []) -&amp;gt; not_found;
find_cell(Rw, Cl, [_|L]) -&amp;gt; find_cell(Rw, Cl, L).
&lt;/pre&gt;
&lt;p&gt;Смотрим на параметр R у функции f. Он при первом вызове получает значение 1, затем появляется в функции b под именами A (первое "тело") и G (второе "тело") и в функции с под именем B, но при этом никогда не принимает нового значения! Переименовываем его в I (потому что I похожа на единичку) где только можно. Нужно только позаботиться об отсутствии коллизии имён в функции b.&lt;/p&gt;

&lt;p&gt;Мешает макрос. Макрос в баню, тогда условие в case можно записать так (здесь я уже переименовал A-&amp;gt;Rw и R-&amp;gt;Cl исходя из соответствия функции f):&lt;/p&gt;
&lt;pre style="background-color:lightgray"&gt;
all(D, [{I, O, S} || {I, O, S} &amp;lt;- E, Rw == I] andalso
all(D, [{I, S, O} || {I, S, O} &amp;lt;- E, Cl == S] andalso
all(D, lists:filter(
    fun({O, S, _}) -&amp;gt; 
        C(Rw) &amp;lt; O andalso O =&amp;lt; C(Rw) + V andalso C(Cl) &amp;lt; S andalso S =&amp;lt; C(Cl) + V
    end, L))
&lt;/pre&gt;
(Чтобы не заставлять читателя лезть в доку: выражение [X || X &amp;lt;-List, P(X)] означает "все X из списка List, для которых предикат P(X) выдаёт true").
Возникает интересное подозрение... Посмотрим, что выдаёт C(X):
&lt;pre style="background-color:lightgray"&gt;
1&amp;gt; C=fun(X)-&amp;gt;(X-1) div 3 * 3 end.
#Fun&amp;lt;erl_eval.6.43886099&amp;gt;
2&amp;gt; lists:map(C, lists:seq(1,9)).
[0,0,0,3,3,3,6,6,6]
&lt;/pre&gt;
&lt;p&gt;Ага! А функция D проверяет, не равна ли ячейка числу N. Да, это оно! Это условие выражает основное правило Судоку: число в текущей ячейке не должно совпадать ни с одним из чисел в строке, ни в столбце и ни в соответствующем текущей ячейке квадрате.&lt;/p&gt;

&lt;p&gt;Теперь _очень пристально_ смотрим на параметр A у функции f. Видно, что он используется очень активно и он попадает в функцию b (2 тело) под именем N, на котором и завязано условие. Всё ясно - это номер в текущей ячейке.&lt;/p&gt;

&lt;p&gt;Далее, переименовываем параметры у функций b и c так, чтобы они соответствовали параметрам f. Получим (опуская несущественные пока детали):&lt;/p&gt;
&lt;pre style="background-color:lightgray"&gt;
f(Rw, I, Cl, Nm, L, Size) -&amp;gt; ....
b(Size, Rw, Nm, I, L, Cl) -&amp;gt; ....
...
c(I, [{Rw, Cl, Nm} | L], Size) -&amp;gt; f(Rw, I, Cl, Nm + 1, L, Size);
...
&lt;/pre&gt;
&lt;p&gt;Итак, ещё раз: Rw, Cl - координаты текущей ячейки, Nm - текущий номер, L - список троек, Size - в данном случае всегда 9, I - в данном случае всегда 1.&lt;/p&gt;

&lt;p&gt;Снова пристально смотрим на f, что же она делает:&lt;br /&gt;
1. Если текущая координата строки большая - то выдаёт решение;&lt;br /&gt;
2. Если текущая координата столбца большая - то переходит к следующей строке;&lt;br /&gt;
3. Если текущий номер в ячейке большой - то вызов функции c(...);&lt;br /&gt;
4. Ищет текущую ячейку в списке,&lt;br /&gt;
4.1 если нашлась - то переходит к следующей ячейке в текущей строке;&lt;br /&gt;
4.2 если не нашлась - то вызывает b с текущей ячейкой и номером == 1.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;Пристально смотрим на b, что делает она:&lt;br /&gt;
0. Если текущий номер слишком большой, то вызывает f (это срабатывает тело с гвардом);&lt;br /&gt;
1. Для данного номера проверяет, можно ли вписать его в текущую ячейку,&lt;br /&gt;
1.1. если можно, то добавляет ячейку в список и вызывает f;&lt;br /&gt;
1.2. если нельзя, то вызывает себя со следующим номером.&lt;br /&gt;
&lt;/p&gt;

&lt;p&gt;Теперь по-русски. Функция f двигается по матрице справа налево, сверху вниз. Если в ячейке ещё пусто, то вызывается функция b. Функция b последовательно подбирает номер в текущей ячейке начиная с 1. Подбор заканчивается либо добавлением новой ячейки в список, либо передачей в f параметра Nm == 10. В последнем случае срабатывает условие:&lt;/p&gt;
&lt;pre style="background-color:lightgray"&gt;
    Nm &amp;gt; Size -&amp;gt; c(I, L, Size);
&lt;/pre&gt;
&lt;p&gt;Теперь понятно, что делает функция c. Функция c - это &lt;i&gt;откат&lt;/i&gt;. Если головоломка не совсем банальная, то однажды процесс заткнётся тем, что в текущую ячейку невозможно будет вписать никакой номер от 1 до 9. В этом случае происходит откат: от списка "откусывается" головной элемент, и подбор продолжается со следующего номера.&lt;/p&gt;

&lt;p&gt;Остаются мелочи - функции a и e. e - это просто преобразование списка троек в матрицу. Список троек должен быть полным, иначе функция завалится. Функция a "откусывает" 9 троек и вытягивает их в линейный список. Можно избавиться от E+1, заменив на просто E, но тогда соответственно поменять и вызов в функции h.&lt;/p&gt;

&lt;p&gt;Долго ли, коротко ли, но окончательный вариант этого рефакторинга превратился в:&lt;/p&gt;
&lt;pre style="background-color:lightgray"&gt;
-module(e).
-compile(export_all).
%-export([main/1]).

% (1..10), 1, (1..10), (1..10), List, 9
set_cell(Rw, I, Cl, Nm, L, Size) -&amp;gt;
    if 
        Rw &amp;gt; Size -&amp;gt; {done, L};
        Cl &amp;gt; Size -&amp;gt; set_cell(Rw+1, I, I, I, L, Size);
        Nm &amp;gt; Size -&amp;gt; rollback(I, L, Size);
        true -&amp;gt; case find_cell(Rw, Cl, L) of
            found -&amp;gt; set_cell(Rw,   I, Cl+1, I, L, Size);
            _     -&amp;gt; try_number(Size, Rw, Nm, I, L, Cl)
        end
    end.

% 9, List, 1 
start(Size, List, I) -&amp;gt;
    case set_cell(I, I, I, I, [{I - 1, I - 1, a} | List], Size) of
        {done, L} -&amp;gt;
            io:format("~w~n", [lists:sort(L)]), % отсебятина :-)
            list2matr(Size, tl(lists:sort((L))));
         _        -&amp;gt; fail
    end.

% List is list like [{1,3,8},{1,4,4},{1,7,3},{1,8,5},{2,6,1}, ... ].
main(List) -&amp;gt; start(9, List, 1).

try_number(Size, Rw, Nm, I, L, Cl) when Nm &amp;gt; Size -&amp;gt;
    set_cell(Rw, I, Cl, Nm, L, Size);
try_number(Size, Rw, Nm, I, L, Cl) -&amp;gt;
    V = round(math:sqrt(Size)),
    Cvv = fun(X) -&amp;gt; (X - 1) div V * V end,
    Neq = fun({_, _, X}) -&amp;gt; Nm /= X end,
    case
        lists:all(Neq, [{R, C, N} || {R, C, N} &amp;lt;- L, Rw == R]) andalso 
        lists:all(Neq, [{R, C, N} || {R, C, N} &amp;lt;- L, Cl == C]) andalso
        lists:all(Neq, lists:filter(
            fun({R, C, _}) -&amp;gt; 
                Cvv(Rw) &amp;lt; R andalso R =&amp;lt; Cvv(Rw) + V andalso 
                Cvv(Cl) &amp;lt; C andalso C =&amp;lt; Cvv(Cl) + V
            end, L))
    of
        true -&amp;gt; set_cell(Rw, I, Cl + 1, I, [{Rw, Cl, Nm} | L], Size);
        _    -&amp;gt; try_number(Size, Rw, Nm + 1, I, L, Cl)
    end.

% L1, L2 - lists, E - integer
extr_row(E, {L1, L2}) -&amp;gt; [[N || {_, _, N} &amp;lt;- L1] | list2matr(E, L2)].

% E - integer, L - list
list2matr(_, []) -&amp;gt; [];
list2matr(E, L) -&amp;gt; extr_row(E, lists:split(E, L)).

% 1, List, 9 
rollback(_, [{_, _, a} | _], _) -&amp;gt; fail;
rollback(I, [{Rw, Cl, Nm} | L], Size) -&amp;gt; set_cell(Rw, I, Cl, Nm + 1, L, Size);
rollback(_, [], _) -&amp;gt; fail.

% (1..9), (1..9), List
find_cell(Rw, Cl, [{Rw, Cl, _} | _]) -&amp;gt; found;
find_cell(_, _, []) -&amp;gt; not_found;
find_cell(Rw, Cl, [_|L]) -&amp;gt; find_cell(Rw, Cl, L).
&lt;/pre&gt;

&lt;i&gt;Пара замечаний:&lt;/i&gt;

&lt;p&gt;
1. Поиск здесь в глубину с возвратом, однако возврат выражается только в удалении новых троек из (текущего) списка. Сами вызовы в течение этого поиска "забираются" всё глубже и глубже в рекурсию. Тем не менее с памятью вообще и стеком в частности всё в порядке, потому что железно работает last call optimization. Слегка непривычно, совсем не так как в С??, где для отката нужно было бы выходить из текущего уровня рекурсии. (Но там и таскать с собой текущий список в качестве параметра тоже не нужно было бы). Хотя есть и альтернативные варианты: сделать так, чтобы функции set_cell и try_number возвращали пару {List, result}, или принимали List, а возвращали result. Тогда глубина рекурсии должна существенно уменьшиться.&lt;/p&gt;

&lt;p&gt;2. Даже обфусцированные функциональные программы по-прежнему доступны для понимания, поскольку результат работы функции целиком зависит от параметров и можно на мгновение забыть вообще обо всей программе сконцентрировавшись только на этой функции. Также сильно облегчает анализ неизменность "забинженных" переменных - то бишь прозрачность ссылок (внутри функции куда ни ткни - везде Nm это Nm). Трудности пожалуй могут возникнуть в случаях"большой-пребольшой функции у которой много-премного параметров" и "много-премного переплетённых (взаимно-рекурсивных) функций у которых много-премного параметров".&lt;/p&gt;

&lt;p&gt;Собстно вот, ду хаст!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:1105</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/1105.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=1105"/>
    <title>Маленькое усовершенствование для "домика Пи"</title>
    <published>2005-12-26T06:58:32Z</published>
    <updated>2005-12-26T10:13:03Z</updated>
    <content type="html">Как и раньше&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   pitriang =. ([:#~odd) ,/. pilist
   pitriang 5
3
141
59265
3589793
238462643
   &lt;b&gt;u =. (- @ |."1 @ i.)&lt;/b&gt;
   pitree = u |."0 1 pitriang
   pitree 5
    3
   141
  59265
 3589793
238462643
&lt;/pre&gt;&lt;br /&gt;Такой вот юз глагола "|." и рангов можно сказать ради юза. Напоследок ещё пара замечаний:&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   u 5
_4 _3 _2 _1 0
   -i.- 5
_4 _3 _2 _1 0
&lt;/pre&gt;&lt;br /&gt;Конечно, второй вариант симпатичнее. Собственно, написал я первый вариант только ради того, чтобы поупражняться с рангами и "|.". Упражнение понравилось :-)</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:825</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/825.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=825"/>
    <title>Новые, неизведанные глубины в J</title>
    <published>2005-12-20T03:23:24Z</published>
    <updated>2005-12-22T10:26:14Z</updated>
    <content type="html">Читал вот статью "Functional programming and the J programming language". Какую однака штуку я обнаружил:&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   pprod =: +/ /. @ (*/)
   1 2 pprod 1 3 1
1 5 7 2
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Да. Всего-навсего. Это перемножение полиномов, заданных вектором коэффициентов. И что? Дальше интереснее. fndisplay выдаёт очевидно&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   x (P Q@R) y
+-------------+
|x _P_ Q_ R_ y|
+-------------+
   NB. в данном случае (+/ это P, /. это Q, */ это R
&lt;/pre&gt;&lt;br /&gt;Если мы это дело перепишем в виде (по-честному, со скобочками), получим линейкой по рукам:&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   1 2 +/ (/. (*/) 1 3 1)
|syntax error
|   1 2+/(    /.(*/)1 3 1)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Коробочный вариант однако немного проясняет ситуацию:&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   pprod
+----------+-+-----+
|+-----+--+|@|+-+-+|
||+-+-+|/.|| ||*|/||
|||+|/||  || |+-+-+|
||+-+-+|  || |     |
|+-----+--+| |     |
+----------+-+-----+
&lt;/pre&gt;&lt;br /&gt;Из этой картинки следует, что у нас вилка, согласно определению вилки&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   x (P Q R) y
(x _P_ y) _Q_ (x _R_ y)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;x */ y&lt;/code&gt; даёт табличку, затем применяется &lt;code&gt;(+/ /.)&lt;/code&gt; к &lt;u&gt;этой&lt;/u&gt; табличке, а не к исходным аргументам (почему? возможно из-за @). Ну и полученный вектор выводится на экран.&lt;br /&gt;&lt;br /&gt;Короче, парсинг строк с причастиями - это какой-то магический кристалл. Неужели предсказать поведение луча света в нём могут только маги? Где тот тайный манускрипт, который бы подробно и обстоятельно раскрыл механизм парсинга выражения J?&lt;br /&gt;&lt;br /&gt;fndisplay конечно хорошо, но мало.</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:760</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/760.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=760"/>
    <title>Пи домиком</title>
    <published>2005-12-16T11:31:37Z</published>
    <updated>2005-12-22T10:25:13Z</updated>
    <category term="программирование"/>
    <category term="erlang"/>
    <category term="j"/>
    <content type="html">Какую я красивую штуку нашёл, ну просто...&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color:lightgray"&gt;
   pi=: [: ": [: &amp;lt;.@o. 10x"_^]
   pi_list=: [: pi [: &amp;lt;: [: *: ]
   pi_triangle=: ([: #~ odd) ,/. pi_list
   odd=: 1: + 2: * i.
   pi_tree=: ([: - [: i. -@]) |."0 1 pi_triangle
   pi_tree 16
               3               
              141              
             59265             
            3589793            
           238462643           
          38327950288          
         4197169399375         
        105820974944592        
       30781640628620899       
      8628034825342117067      
     982148086513282306647     
    09384460955058223172535    
   9408128481117450284102701   
  938521105559644622948954930  
 38196442881097566593344612847 
5648233786783165271201909145648
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ещё хорошая новость есть - код выше уже не выглядит простым набором символов, и я не впадаю в жёсткий тупняк, когда вижу такое. А даже наоборот, лишь некоторые места непонятны. :super:&lt;br /&gt;&lt;br /&gt;Последняя хорошая новость. Выложил на RSDN наконец то, что давно хотел выложить, да времени всё не было. Take a &lt;a href="http://www.rsdn.ru/Forum/Message.aspx?mid=1542320&amp;amp;only=1"&gt;look&lt;/a&gt; and enjoy.&lt;br /&gt;&lt;br /&gt;ps: нужно фак читать по форматированию...</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:_lcr_:319</id>
    <link rel="alternate" type="text/html" href="http://users.livejournal.com/_lcr_/319.html"/>
    <link rel="self" type="text/xml" href="http://users.livejournal.com/_lcr_/data/atom/?itemid=319"/>
    <title>_lcr_ @ 2005-12-14T12:03:00</title>
    <published>2005-12-14T06:07:30Z</published>
    <updated>2005-12-14T06:07:30Z</updated>
    <category term="linux"/>
    <content type="html">Разбираюсь в интерфейсе LJ. Смешно, но тыкаюсь как слепой котёнок. И всё вроде бы легко, и многое непонятно. Нужно будет ещё повспоминать интересы (:-!) и настроить стартовую страницу, а то убого софсем...</content>
  </entry>
</feed>
