<?xml version="1.0" encoding="utf-8"?>
<!-- generator="wordpress/2.2.3" -->
<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/"
	>

<channel>
	<title>Програмиране с Python</title>
	<link>http://fmi.py-bg.net</link>
	<description>Новости от малкото ни курсче във ФМИ</description>
	<pubDate>Thu, 08 May 2008 21:12:28 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.3</generator>
	<language>en</language>
			<item>
		<title>Резултати от първи тест</title>
		<link>http://fmi.py-bg.net/results/2008/05/test1/</link>
		<comments>http://fmi.py-bg.net/results/2008/05/test1/#comments</comments>
		<pubDate>Wed, 07 May 2008 20:56:05 +0000</pubDate>
		<dc:creator>николай</dc:creator>
		
		<category><![CDATA[Резултати]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/results/2008/05/test1/</guid>
		<description><![CDATA[(lambda _:_ % _)('(lambda _:_ %% _)(%r)')
Горният код е интересен. Ако го изпълните, той ще върне низ, съдържащ същия. Сигурно сте чували за програма, принтираща себе си. Ето как тя изглежда на Python. Един от вас дори се сети за това. Четирима пък бяха близо.
Иначе:
Сложете мишката върху име на колонка или над клетка от таблицата [...]]]></description>
			<content:encoded><![CDATA[<pre class="prettyprint">(lambda _:_ % _)('(lambda _:_ %% _)(%r)')</pre>
<p>Горният код е интересен. Ако го изпълните, той ще върне низ, съдържащ същия. Сигурно сте чували за <a href="http://en.wikipedia.org/wiki/Quine_%28computing%29">програма, принтираща себе си</a>. Ето как тя изглежда на Python. Един от вас дори се сети за това. Четирима пък бяха близо.</p>
<p>Иначе:</p>
<p>Сложете мишката върху име на колонка или над клетка от таблицата за повече информация.</p>
<ul>
<li><a href="#stat">Малко статистика</a></li>
</ul>
<table>
<tr>
<th>ФН</th>
<th title="Брой правилни отговори">Точки</th>
<th>Вариант</th>
<th title="Процент верни отговори">Процент</th>
</tr>
<tr>
<td>fn80268</td>
<td>24</td>
<td>eggs</td>
<td class="scale" title="96.0%">
<div style="width: 144px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80175</td>
<td>24</td>
<td>spam</td>
<td class="scale" title="96.0%">
<div style="width: 144px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44336</td>
<td>24</td>
<td>larodi</td>
<td class="scale" title="96.0%">
<div style="width: 144px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80168</td>
<td>24</td>
<td>eggs</td>
<td class="scale" title="96.0%">
<div style="width: 144px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80246</td>
<td>24</td>
<td>yield</td>
<td class="scale" title="96.0%">
<div style="width: 144px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43805</td>
<td>23</td>
<td>quinne</td>
<td class="scale" title="92.0%">
<div style="width: 138px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43993</td>
<td>23</td>
<td>larodi</td>
<td class="scale" title="92.0%">
<div style="width: 138px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80169</td>
<td>23</td>
<td>eggs</td>
<td class="scale" title="92.0%">
<div style="width: 138px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71067</td>
<td>23</td>
<td>spam</td>
<td class="scale" title="92.0%">
<div style="width: 138px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fnM22528</td>
<td>22</td>
<td>spam</td>
<td class="scale" title="88.0%">
<div style="width: 132px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43778</td>
<td>22</td>
<td>eggs</td>
<td class="scale" title="88.0%">
<div style="width: 132px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43806</td>
<td>22</td>
<td>yield</td>
<td class="scale" title="88.0%">
<div style="width: 132px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80042</td>
<td>22</td>
<td>yield</td>
<td class="scale" title="88.0%">
<div style="width: 132px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80161</td>
<td>22</td>
<td>eggs</td>
<td class="scale" title="88.0%">
<div style="width: 132px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43830</td>
<td>22</td>
<td>eggs</td>
<td class="scale" title="88.0%">
<div style="width: 132px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61101</td>
<td>21</td>
<td>spam</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn840513</td>
<td>21</td>
<td>spam</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43813</td>
<td>21</td>
<td>yield</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80058</td>
<td>21</td>
<td>spam</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61049</td>
<td>21</td>
<td>spam</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44086</td>
<td>21</td>
<td>quinne</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61093</td>
<td>21</td>
<td>eggs</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80070</td>
<td>21</td>
<td>yield</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80274</td>
<td>21</td>
<td>quinne</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43545</td>
<td>21</td>
<td>larodi</td>
<td class="scale" title="84.0%">
<div style="width: 126px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44030</td>
<td>20</td>
<td>spam</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61079</td>
<td>20</td>
<td>eggs</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80180</td>
<td>20</td>
<td>quinne</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43994</td>
<td>20</td>
<td>yield</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80136</td>
<td>20</td>
<td>spam</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44332</td>
<td>20</td>
<td>larodi</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80093</td>
<td>20</td>
<td>yield</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80102</td>
<td>20</td>
<td>larodi</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44365</td>
<td>20</td>
<td>spam</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44176</td>
<td>20</td>
<td>eggs</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80057</td>
<td>20</td>
<td>yield</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn171717</td>
<td>20</td>
<td>eggs</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn13347</td>
<td>20</td>
<td>spam</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44320</td>
<td>20</td>
<td>spam</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71113</td>
<td>20</td>
<td>yield</td>
<td class="scale" title="80.0%">
<div style="width: 120px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71072</td>
<td>19</td>
<td>yield</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61063</td>
<td>19</td>
<td>yield</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43802</td>
<td>19</td>
<td>larodi</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44183</td>
<td>19</td>
<td>yield</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71081</td>
<td>19</td>
<td>larodi</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80069</td>
<td>19</td>
<td>yield</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44243</td>
<td>19</td>
<td>spam</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71100</td>
<td>19</td>
<td>yield</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80066</td>
<td>19</td>
<td>eggs</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80267</td>
<td>19</td>
<td>spam</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71046</td>
<td>19</td>
<td>larodi</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61133</td>
<td>19</td>
<td>eggs</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43629</td>
<td>19</td>
<td>quinne</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80275</td>
<td>19</td>
<td>larodi</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71102</td>
<td>19</td>
<td>quinne</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43900</td>
<td>19</td>
<td>eggs</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43835</td>
<td>19</td>
<td>yield</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44130</td>
<td>19</td>
<td>larodi</td>
<td class="scale" title="76.0%">
<div style="width: 114px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43888</td>
<td>18</td>
<td>larodi</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61071</td>
<td>18</td>
<td>larodi</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn30987</td>
<td>18</td>
<td>eggs</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71070</td>
<td>18</td>
<td>yield</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43800</td>
<td>18</td>
<td>larodi</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61125</td>
<td>18</td>
<td>spam</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80187</td>
<td>18</td>
<td>eggs</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43857</td>
<td>18</td>
<td>eggs</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71092</td>
<td>18</td>
<td>larodi</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44082</td>
<td>18</td>
<td>eggs</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80107</td>
<td>18</td>
<td>eggs</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80065</td>
<td>18</td>
<td>spam</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80064</td>
<td>18</td>
<td>eggs</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80063</td>
<td>18</td>
<td>larodi</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61096</td>
<td>18</td>
<td>yield</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43733</td>
<td>18</td>
<td>spam</td>
<td class="scale" title="72.0%">
<div style="width: 108px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43763</td>
<td>17</td>
<td>yield</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61067</td>
<td>17</td>
<td>eggs</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71085</td>
<td>17</td>
<td>spam</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43974</td>
<td>17</td>
<td>quinne</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn30899</td>
<td>17</td>
<td>quinne</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80260</td>
<td>17</td>
<td>larodi</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80081</td>
<td>17</td>
<td>spam</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71111</td>
<td>17</td>
<td>yield</td>
<td class="scale" title="68.0%">
<div style="width: 102px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44269</td>
<td>16</td>
<td>spam</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71093</td>
<td>16</td>
<td>yield</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71094</td>
<td>16</td>
<td>larodi</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44103</td>
<td>16</td>
<td>eggs</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80109</td>
<td>16</td>
<td>eggs</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61131</td>
<td>16</td>
<td>eggs</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43938</td>
<td>16</td>
<td>larodi</td>
<td class="scale" title="64.0%">
<div style="width: 96px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44287</td>
<td>15</td>
<td>eggs</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44270</td>
<td>15</td>
<td>quinne</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71099</td>
<td>15</td>
<td>larodi</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80082</td>
<td>15</td>
<td>yield</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71057</td>
<td>15</td>
<td>larodi</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80255</td>
<td>15</td>
<td>larodi</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80256</td>
<td>15</td>
<td>spam</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44140</td>
<td>15</td>
<td>quinne</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71119</td>
<td>15</td>
<td>yield</td>
<td class="scale" title="60.0%">
<div style="width: 90px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80205</td>
<td>14</td>
<td>spam</td>
<td class="scale" title="56.0%">
<div style="width: 84px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44080</td>
<td>14</td>
<td>eggs</td>
<td class="scale" title="56.0%">
<div style="width: 84px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44324</td>
<td>14</td>
<td>spam</td>
<td class="scale" title="56.0%">
<div style="width: 84px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44326</td>
<td>14</td>
<td>larodi</td>
<td class="scale" title="56.0%">
<div style="width: 84px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61069</td>
<td>13</td>
<td>larodi</td>
<td class="scale" title="52.0%">
<div style="width: 78px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71086</td>
<td>13</td>
<td>spam</td>
<td class="scale" title="52.0%">
<div style="width: 78px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80279</td>
<td>13</td>
<td>spam</td>
<td class="scale" title="52.0%">
<div style="width: 78px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43848</td>
<td>13</td>
<td>larodi</td>
<td class="scale" title="52.0%">
<div style="width: 78px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn11076</td>
<td>12</td>
<td>quinne</td>
<td class="scale" title="48.0%">
<div style="width: 72px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn80249</td>
<td>12</td>
<td>quinne</td>
<td class="scale" title="48.0%">
<div style="width: 72px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn43930</td>
<td>12</td>
<td>eggs</td>
<td class="scale" title="48.0%">
<div style="width: 72px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn30852</td>
<td>11</td>
<td>larodi</td>
<td class="scale" title="44.0%">
<div style="width: 66px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn44379</td>
<td>11</td>
<td>larodi</td>
<td class="scale" title="44.0%">
<div style="width: 66px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71075</td>
<td>10</td>
<td>eggs</td>
<td class="scale" title="40.0%">
<div style="width: 60px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn71091</td>
<td>9</td>
<td>quinne</td>
<td class="scale" title="36.0%">
<div style="width: 54px;">&nbsp;</div>
</td>
</tr>
<tr>
<td>fn61081</td>
<td>9</td>
<td>larodi</td>
<td class="scale" title="36.0%">
<div style="width: 54px;">&nbsp;</div>
</td>
</tr>
</table>
<dl id="stat">
<dt>Минимум</dt>
<dd>9 точки (36%)</dd>
<dt>Максимум</dt>
<dd>24 точки (96%)</dd>
<dt>Средно аритметично</dt>
<dd>18.0789 точки (72.3158%)</dd>
<dt>Стандартно отклонение</dt>
<dd>3.33431</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/results/2008/05/test1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Провеждане на първи тест</title>
		<link>http://fmi.py-bg.net/news/2008/05/test1-procedure-2/</link>
		<comments>http://fmi.py-bg.net/news/2008/05/test1-procedure-2/#comments</comments>
		<pubDate>Mon, 05 May 2008 18:00:32 +0000</pubDate>
		<dc:creator>николай</dc:creator>
		
		<category><![CDATA[Новини]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/news/2008/05/test1-procedure-2/</guid>
		<description><![CDATA[Процедурата по провеждането на първия тест ще бъде следната:

В 18:00 часа, на 7-и май 2008г. ще започне тестът за всички студенти, чийто факултетни номера дават остатък от 0, 1, 5 или 7 при деление на 8.
В 19:15 часа ще започне тестът за всички останали.

Времето за работа ще бъде точно 60 минути.
Моля ви, бъдете точни. Ще [...]]]></description>
			<content:encoded><![CDATA[<p>Процедурата по провеждането на първия тест ще бъде следната:</p>
<ul>
<li>В 18:00 часа, на 7-и май 2008г. ще започне тестът за всички студенти, чийто факултетни номера дават остатък от 0, 1, 5 или 7 при деление на 8.</li>
<li>В 19:15 часа ще започне тестът за всички останали.</li>
</ul>
<p>Времето за работа ще бъде точно 60 минути.</p>
<p>Моля ви, бъдете точни. Ще се опитаме да започнем навреме.</p>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/news/2008/05/test1-procedure-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Решения на трета задача</title>
		<link>http://fmi.py-bg.net/code/2008/04/problem-3-solutions/</link>
		<comments>http://fmi.py-bg.net/code/2008/04/problem-3-solutions/#comments</comments>
		<pubDate>Mon, 28 Apr 2008 15:33:15 +0000</pubDate>
		<dc:creator>Стефан</dc:creator>
		
		<category><![CDATA[Код]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/code/2008/04/problem-3-solutions/</guid>
		<description><![CDATA[Признаваме си: трета задача не беше от най-лесните. Въпреки това, беше съвсем близка до реален проблем. И имахте голяма свобода при решаването й. Убедени сме, че за част от вас е била приятно занимане, а друга част са научили много.
Една от кукичките беше елегантните решения. Предложихме ви бонус точки ако се постараете да напишете по-красив [...]]]></description>
			<content:encoded><![CDATA[<p>Признаваме си: <a href="http://fmi.py-bg.net/problems/2008/03/problem-three-wiki/">трета задача</a> не беше от най-лесните. Въпреки това, беше съвсем близка до реален проблем. И имахте голяма свобода при решаването й. Убедени сме, че за част от вас е била приятно занимане, а друга част са научили много.</p>
<p>Една от кукичките беше <em>елегантните</em> решения. Предложихме ви бонус точки ако се постараете да напишете по-красив код и ни уведомите за това. Част от вас го направиха. Тук ви предлагаме няколко от тези решения, заедно с наши коментари към тях.</p>
<h2>Като цяло</h2>
<p>Задачата може да се реши с много простичка схема, ползваща само регулярни изрази. Ето как изглежда:</p>
<ol>
<li>Ограждате текста с <code>&lt;p&gt;...&lt;/p&gt;</code></li>
<li>Прилагате заместване за <strong>получер</strong>, <em>курсив</em> и адреси (именовани, ненаименовани и пощенски).</li>
<li>Замествате всяко заглавие с <code>&lt;/p&gt;&lt;hX&gt;...&lt;/hX&gt;&lt;p&gt;</code></li>
<li>Замествате всяка последователност от повече от два нови реда с <code>&lt;/p&gt;&lt;p&gt;</code></li>
<li>Замествате единичните нови редове с <code>&lt;br /&gt;</code></li>
<li>Чистите празните параграфи и параграфите, които съдържат само нови редове.</li>
<li>Чистите новия ред в края и началото на параграф</li>
</ol>
<p>Това може да стане само с регулярни изрази и е сравнително добро упражнение. Ще ви покажем няколко решения, които ползват вариация на горния алгоритъм.</p>
<h2>Що годе&#8230;</h2>
<pre class="prettyprint">
def wiki(text):
	result = re.sub('\r\n|\r', '\n', text) # Normalizes new lines

	headingMatcher = re.compile('^[ \t]*(?P&lt;level&gt;={1,6})[ \t]*(?P&lt;content&gt;[^\\s].*?)[ \t]*(?P=level)[ \t]*$', re.M)
	newParagraphMatcher = re.compile('\n{2,}')
	lineBreakMatcher = re.compile('\n')
	emphasisMatcher = re.compile(r'_(?P&lt;word&gt;\w+)_', re.U)
	strongEmphasisMatcher = re.compile(r'[*](?P&lt;word&gt;\w+)[*]', re.U) <a class="bookmark" id="codepoint1" href="#bookmark1"><span class="hidden">#</span>1</a>
	namedURLMatcher = re.compile(r'\[(?P&lt;url&gt;http://.*?)[ ]+(?P&lt;name&gt;[^ ].*?)\]') <a class="bookmark" id="codepoint2" href="#bookmark2"><span class="hidden">#</span>2</a>
	urlMatcher = re.compile(r'(?&lt;=[\s&gt;])(?P&lt;url&gt;http://.*?)(?=[\s&lt;])')
	emailMatcher = re.compile(r'(?&lt;=[\s&gt;])(?P&lt;email&gt;[\w_+.]+?@[\w_+.]+[.][\w_+]+?)(?=[^\w_+.])', re.U)

	def createHeading(match):
		return "&lt;/p&gt;&lt;h%d&gt;%s&lt;/h%d&gt;&lt;p&gt;" % (len(match.group("level")), match.group("content"), len(match.group("level"))) <a class="bookmark" id="codepoint3" href="#bookmark3"><span class="hidden">#</span>3</a>

	result = headingMatcher.sub(createHeading, result)
	result = '&lt;p&gt;' + result.strip() + '&lt;/p&gt;'
	result = newParagraphMatcher.sub('&lt;/p&gt;&lt;p&gt;', result)
	result = lineBreakMatcher.sub('&lt;br /&gt;', result)
	result = re.sub(r'&lt;p&gt;(&lt;br /&gt;)*&lt;/p&gt;', '', result) # Removes empty paragraphs
	result = re.sub(r'&lt;p&gt;(&lt;br /&gt;)*(?P&lt;content&gt;[^\s].*?)(&lt;br /&gt;)*&lt;/p&gt;', r'&lt;p&gt;\g&lt;content&gt;&lt;/p&gt;', result) # Removes invalid line breaks
	result = emphasisMatcher.sub(r'&lt;em&gt;\g&lt;word&gt;&lt;/em&gt;', result)
	result = strongEmphasisMatcher.sub(r'&lt;strong&gt;\g&lt;word&gt;&lt;/strong&gt;', result)
	result = namedURLMatcher.sub(r'&lt;a href="\g&lt;url&gt;"&gt;\g&lt;name&gt;&lt;/a&gt;', result)
	result = urlMatcher.sub(r'&lt;a href="\g&lt;url&gt;"&gt;\g&lt;url&gt;&lt;/a&gt;', result)
	result = emailMatcher.sub(r'&lt;a href="mailto:\g&lt;email&gt;"&gt;\g&lt;email&gt;&lt;/a&gt;', result)

	return result
</pre>
<p>Това е един хубав пример, влизащ в първите пет. Регулярните изрази са точни и резултата е сравнително дуракоустойчив. Програмата прави малко различни неща и лесно се разбира.</p>
<p>Но имат един дефект откъм четимост - именованите групи. Според мен те по-скоро усложняват нещата. Допълнително, цялостната структура - регулярните изрази и заместващите шаблони са отделени - за да ги проследя погледът ми трябва да прескача нагоре-надолу из програмата и трябва да помня имена на променливи и на групи.</p>
<p><a id="bookmark1" class="bookmark" href="#codepoint1">1</a> <code>\*(\w+)\*</code>. Поне на мен <code>[*]</code> ми изглежда странно.</p>
<p><a id="bookmark2" class="bookmark" href="#codepoint2">2</a> <code>http://.*?</code> не е съвсем подходящ регулярен израз за url. Минава заради странния клас след него. Всъщност, може би е по-добре да се пренапише като <code>[(http://\S+) (.*?)]</code>. Плюс съответните имена на групи.</p>
<p><a id="bookmark3" class="bookmark" href="#codepoint3">3</a> Според мен това ще изглежда по-добре като ламбда израз. Въвеждането на ново име ми се вижда ненужно.</p>
<h2>&#8230;по-близо&#8230;</h2>
<pre class="prettyprint">
import re, cgi

def header_replace(matchobj):
  match_len = str(len(matchobj.group(1)))
  return '&lt;/p&gt;&lt;h' + match_len + '&gt;' + matchobj.group(2) + '&lt;/h' + match_len + '&gt;&lt;p&gt;'

def wiki(text):
  header_match = r'\s*(=+)\s*([^=\015\012]+?)\s*\1\s*' <a class="bookmark" id="codepoint4" href="#bookmark4"><span class="hidden">#</span>4</a>
  paragraph_match = r'([ \t]*\015?\012[ \t]*){2,}'
  paragraph_replace = r'&lt;/p&gt;&lt;p&gt;'
  newline_match = r'[ \t]*\015?\012[ \t]*'
  newline_replace = r'&lt;br /&gt;'
  empty_paragraph_match = r'&lt;p&gt;\s*&lt;\/p&gt;'
  untitled_url_match = r'((h|H)(t|T)(t|t)(p|P):\/\/[^\s&lt;"]+)' <a class="bookmark" id="codepoint5" href="#bookmark5"><span class="hidden">#</span>5</a>
  untitled_url_replace = r'&lt;a href="\1"&gt;\1&lt;/a&gt;'
  titled_url_match = r'\[&lt;a href="((h|H)(t|T)(t|T)(p|P):\/\/[^"]+)"&gt;\1&lt;\/a&gt;\s+([^\]]+)\]'
  titled_url_replace =  r'&lt;a href="\1"&gt;\6&lt;/a&gt;'
  bold_match = r'([\s&gt;])\*(\S+)\*([\s&lt;])'
  bold_replace = r'\1&lt;strong&gt;\2&lt;/strong&gt;\3'
  italic_match = r'\b_(\S+)_\b'
  italic_replace = r'&lt;em&gt;\1&lt;/em&gt;'
  mail_match = r'([a-zA-Z0-9\._\-]+@([a-zA-Z0-9]([a-zA-Z0-9\-]*[a-zA-Z0-9])?\.)+[a-zA-Z]+)'
  mail_replace = r'&lt;a href="mailto:\1"&gt;\1&lt;/a&gt;'

  cgi.escape(text)
  text = '&lt;p&gt;' + text + '&lt;/p&gt;'
  text = re.sub(header_match, header_replace, text)
  text = re.sub(paragraph_match, paragraph_replace, text)
  text = re.sub(newline_match, newline_replace, text)
  text = re.sub(empty_paragraph_match, '', text)
  text = re.sub(untitled_url_match, untitled_url_replace, text)
  text = re.sub(titled_url_match, titled_url_replace, text)
  text = re.sub(bold_match, bold_replace, text)
  text = re.sub(italic_match, italic_replace, text)
  text = re.sub(mail_match, mail_replace, text)

  return text
</pre>
<p>Тук програмата е една идея по-добре организирана. Двойките регулярен израз/шаблон за заместване са по-близко, макар tuple да изглеждаше по-приятно. Регулярните изрази са една идея по-слаби от предния пример. Все пак, забелязва се едно упорито повторение на <code>text = re.sub</code> (както и по-горе), което може да бъде избегнато.</p>
<p><a id="bookmark4" class="bookmark" href="#codepoint4">4</a> <code>\012</code> и <code>\015</code>? Никой не би запомнил, че това са line feed и carriage return. Особено с тези осмични формати. По-добре ползвайте <code>\n</code> и <code>\r</code>.</p>
<p><a id="bookmark5" class="bookmark" href="#codepoint5">5</a> Вместо да пишете <code>(h|H)(t|T)(t|t)(p|P)</code>, може (1) да добавите <code>re.I</code> за целия регулярен израз или (2) да ползвате <code>((?i)http)</code> за да ползвате флага локално. Впрочем, няма и никаква причина да избягвате наклонената черта <code>http://</code> е достатъчно. <code>http:\/\/</code> не просто наподобява смътно емблемата Volkswagen - приличина на недомислено взет отнякъде Perl. И да, забелязахме, че някой си е спестил един Shift набирайки този код.</p>
<h2>&#8230;и победителят е:</h2>
<pre class="prettyprint">
def wiki(text):

    text = text.strip()

    strong = (re.compile(r"\*([\wа-яА-Я]+?)\*"), r"&lt;strong&gt;\1&lt;/strong&gt;")
    em = (re.compile(r"_([\wа-яА-Я]+?)_"), r"&lt;em&gt;\1&lt;/em&gt;")
    url = (re.compile(r"(?&lt;!\[)(http://[^\s\n]+)"), r'&lt;a href="\1"&gt;\1&lt;/a&gt;')   <a class="bookmark" id="codepoint6" href="#bookmark6"><span class="hidden">#</span>6</a>
    nurl = (re.compile(r"\[(http://[^\s\n]+)\s(.+)\]"), r'&lt;a href="\1"&gt;\2&lt;/a&gt;')
    email = (re.compile(r"(.+@[^\.].*\.[a-z]{2,})"), r'&lt;a href="mailto:\1"&gt;\1&lt;/a&gt;') <a class="bookmark" id="codepoint7" href="#bookmark7"><span class="hidden">#</span>7</a>
    heading = (re.compile(r"\s*(=+)\s*(.+?[^\s])\s*\1\s*\n+"),             <a class="bookmark" id="codepoint8" href="#bookmark8"><span class="hidden">#</span>8</a>
                lambda m: m.expand("".join([r"&lt;/p&gt;&lt;h", str(m.group(1).count("=")), r"&gt;\2", r"&lt;/h",
                                            str(m.group(1).count("=")), r"&gt;&lt;p&gt;"])))
    sline = (re.compile(r"(?&lt;=.)\n(?!\n)"), r"&lt;br/&gt;")   <a class="bookmark" id="codepoint9" href="#bookmark9"><span class="hidden">#</span>9</a>
    paragraph = (re.compile(r"^(.+)$", re.M), r"&lt;p&gt;\1&lt;/p&gt;")
    empty_p = (re.compile(r"&lt;p&gt;&lt;/p&gt;"), r"")

    for regex, repl in [strong, em, url, nurl, email, heading, sline, paragraph, empty_p]:
        text = regex.sub(repl, text)

    return text
</pre>
<p>Кодът тук е почти перфектен. Почти всичко излишно е премахнато - най-вече колонката <code>text = re.sub</code>. За нещастие, регулярните изрази са доста неточни и не отговарят съвсем на условието на задачата.</p>
<p><a id="bookmark6" class="bookmark" href="#codepoint6">6</a> Класът <code>[^\s\n]</code> е съвсем еквивалентен с <code>[^\s]</code>, който пък се записва като <code>\S</code>.</p>
<p><a id="bookmark7" class="bookmark" href="#codepoint7">7</a> Това е ужасно грешно. Взема всичко на същия ред преди @. Много ме е яд, че го срещам в тази програма.</p>
<p><a id="bookmark8" class="bookmark" href="#codepoint8">8</a> Тези четири регулярни израза просто се разминават с условието.</p>
<p><a id="bookmark9" class="bookmark" href="#codepoint9">9</a> Нещо, което малко хора знаят: в SGML (родителя на <acronym title="HyperText Markup Language">HTML</acronym>) синтаксиса <code>&lt;tag/foo/&gt;</code> е съкратен запис за <code>&lt;tag&gt;foo&lt;/tag&gt;</code>. Съответно, <code>&lt;br/&gt;</code> не се чете много добре от някои обратно-съвместими браузъри. Вместо това се препоръчва да се пише <code>&lt;br /&gt;</code>.</p>
<h2>Bottom line</h2>
<p>Ако сте внимавали в картинката, вероятно сте забелязали, че и трите решения са малко или повече неточни. Всъщност, някои дори не получават пълния брой точки. Избрах да ги покажа защото исках да илюстрирам цялостната структура на програмата, не магии с регулярни изрази. Пък и показват, че задачата все пак може да се реши единствено с регулярни изрази.</p>
<p>Все пак забелязвам, че доста от предалите правят грешки с регулярните изрази. Горещо ви препоръчвам да станете майстори в тази сфера. Регулярните изрази са безспорно най-силния инструмент когато става въпрос за обработка на текст. И бързо решават много, много проблеми. Напоследък рядко минава работен ден, в който не ги ползвам. Това умение ще ви много е полезно, независимо на какъв език програмирате.</p>
<h2>Моето решение (с преписване)</h2>
<p>Видях няколко хубави идеи в горните три примера. Ето до какво стигнах като опитах да ги комбинирам в едно:</p>
<pre class="prettyprint">
def wiki(text):
    patterns = [
        ('\r\n', '\n'), <a class="bookmark" id="codepoint10" href="#bookmark10"><span class="hidden">#</span>10</a>
        ('\r', '\n'),
        (r'(?&lt;=\W)\*(\w+)\*(?=\W)', r'&lt;strong&gt;\1&lt;/strong&gt;'),
        (r'\b_(\w+)_\b', r'&lt;em&gt;\1&lt;/em&gt;'),
        (r'\[(http://\S+) (.*?)\]', r'&lt;a href="\1"&gt;\2&lt;/a&gt;'),
        (r'(?&lt;!&lt;a href=")(http://\S+)(?!"&gt;)', r'&lt;a href="\1"&gt;\1&lt;/a&gt;'), <a class="bookmark" id="codepoint11" href="#bookmark11"><span class="hidden">#</span>11</a>
        (r'[\w_+.]+@([\w_+.]+\.)+\w+', r'&lt;a href="mailto:\1"&gt;\1&lt;/a&gt;'), <a class="bookmark" id="codepoint12" href="#bookmark12"><span class="hidden">#</span>12</a>
        (r'^(=+)(.*)\1$', lambda _: "&lt;/p&gt;&lt;h%s&gt;%s&lt;/h%s&gt;&lt;p&gt;" % (len(_.group(1)), _.group(2).strip(), len(_.group(1)))), <a class="bookmark" id="codepoint13" href="#bookmark13"><span class="hidden">#</span>13</a>
        (r'\n{2,}', '&lt;/p&gt;&lt;p&gt;'),
        (r'\n', '&lt;br /&gt;'),
        (r'&lt;p&gt;(\s*&lt;br /&gt;)+\s*', '&lt;p&gt;'),
        (r'(&lt;br /&gt;\s*)+&lt;/p&gt;', '&lt;/p&gt;'),
        (r'&lt;p&gt;\s*&lt;/p&gt;', ''),
    ]   

    return reduce(
        lambda result, repl: re.sub(re.compile(repl[0], re.U | re.M), repl[1], result), <a class="bookmark" id="codepoint14" href="#bookmark14"><span class="hidden">#</span>14</a>
        patterns, "&lt;p&gt;%s&lt;/p&gt;" % text.strip())
</pre>
<p>Силно базирам идеите си на третия пример. Драстичната разлика е че не записвам n-орките в променливи, ами директно конструирам списък от тях. Смятам, че това е предимство. В трети пример се налага да се поддържат два списъка - един от променливи и един, който се итерира във for. Самите имена на променливи също усложняват - биха могли да бъдат използвани навсякъде (например в друг регулярен израз) и трябва добре да прегледам функцията преди да пипам.</p>
<p>Променливите от третия пример имаха едно предимство - казваха за какво служи всеки израз (документация). Въпреки това, смятам, че регулярните изрази са достатъчно очевидни - може само с бърз поглед да прецените, че този служи за заглавия а онзи за електронна поща. Ако все пак държите да ги наименовам, бих го нарпавил в коментар накрая на реда - така кодът остава по-прост.</p>
<p><a id="bookmark10" class="bookmark" href="#codepoint10">10</a> Нормализирам новите редове. След тези два регулярни израза, всичко ще бъде с linux-ски нов ред.</p>
<p><a id="bookmark11" class="bookmark" href="#codepoint11">11</a> Тук играя на по-сигурно. Като страничен ефект, ако някой напише адрес в кавички (&#8220;тя каза &#8222;http://fmi.py-bg.net е адресът, който ти трябва&#8220;") ще проработи правилно.</p>
<p><a id="bookmark12" class="bookmark" href="#codepoint12">12</a> Гледайки решенията, виждам че на много хора им убягва какво прави <code>\w</code>. Еквивалентен е на <code>[a-zA-Z0-9_]</code>. Ако ползвате re.U, ще хваща и кирилица.</p>
<p><a id="bookmark13" class="bookmark" href="#codepoint13">13</a> Няма да се уморя да го повтарям. Според мен <code>_</code> в този пример носи точно толкова информация, колкото и <code>m</code> в третия пример. Но се откроява особено добре.</p>
<p><a id="bookmark14" class="bookmark" href="#codepoint14">14</a> Всъщност, само исках да се изфукам, че умея да ползвам <code>reduce()</code>. И да ви напрегна мозъците. Един <code>for</code> подобно на третото решение щеше да е по-елегантен тук.</p>
<h2>Кой взе точките?</h2>
<p>И накрая идваме до важния въпрос - кой получи бонус точки за елегантни решения. От началото на курса се убедихме в две неща за вас - обичате точките и обичате предизвикателствата. Нека да ги комбинираме в едно.</p>
<pre class="prettyprint">
"010c1000100011001111100c00001c1a1ad3aaa3aae330a13333" +
"aadaaaa3d1b5d39bbb9bbe880b58898bb3bdbd935da34917d81f" +
"9bc21acb9b1d4731384a99013e09bee7f2ad90f3fd9100d0b19"
</pre>
<p>Това е един текстов низ, съдържащ резултатите. Как го произведох?</p>
<ol>
<li>Създадох списък от факултетните ви номера. Всеки номер се съдържа толкова пъти, колкото точки има.</li>
<li>Разбърках списка произволно</li>
<li>Записах всеки факултетен номер в шестнайсетична система, като добавих нули в началото така че да се получи петбуквен текстов низ. Създадох нов списък от тези записи.</li>
<li>Обхождам списъка пет пъти, извеждайки първо първата буква на всеки факултетен номер, после втората, после третата и т.н.</li>
</ol>
<p>Например, ако представете си че резултатите са 699324 - 3, 00274 - 2, 1048575 - 1. Първо си правя списък <code>[699324, 699324, 699324, 4386, 4386, 1048575]</code>. Обръщам го до шестнайсетични числа и получавам <code>['aabbc', 'aabbc', 'aabbc', '01122', '01122', 'fffff']</code>. Правя и едно разбъркване, но да кажем, че то върне същия низ. Тръгвайки по последната стъпка получавам.</p>
<p><code>aaa00faaa11fbbb11fbbb22fccc22f</code></p>
<p>Вярвам знаете достатъчно добре Python за да го използвате за да отговорите на въпроса дали сте получили бонус точки. Моята програма която го прави е точно 103 символа, събрани на един ред (за петцифрен факултетен номер). Ще ви дам две подсказки. Първо, ако сте направили декриптирането успешно, ще забележите че факултетен номер 42 има една точка. Второ, някои думички от моя код за проверка на точките са <code>int</code>, <code>join</code>, <code>zip</code>, <code>re.findall</code>, <code>len</code> и <code>count</code>, изписани в този ред.</p>
<p>Чувствайте се поканени да споделите вашите решения на решението на трета задача :) .</p>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/code/2008/04/problem-3-solutions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Шеста задача</title>
		<link>http://fmi.py-bg.net/problems/2008/04/p6-enumerated-rationals/</link>
		<comments>http://fmi.py-bg.net/problems/2008/04/p6-enumerated-rationals/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 17:57:23 +0000</pubDate>
		<dc:creator>Стефан</dc:creator>
		
		<category><![CDATA[Задачи]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/problems/2008/04/p6-enumerated-rationals/</guid>
		<description><![CDATA[Брой точки, които дава задачата: 5 + 3 (елегантни решения).
Краен срок: 14-и май 2008г., 19:00 часа.
Формуляр за изпращане.
Предистория
Множеството на рационалните числа е изброимо, т.е., може да се създаде биекция между него и естествените числа. За да се докаже това е достатъчно да се създаде биекция между естествените и положителните рационални числа. Това става по следния [...]]]></description>
			<content:encoded><![CDATA[<p>Брой точки, които дава задачата: 5 + 3 (елегантни решения).</p>
<p>Краен срок: 14-и май 2008г., 19:00 часа.</p>
<p><a href="/submit">Формуляр за изпращане</a>.</p>
<h3>Предистория</h3>
<p>Множеството на рационалните числа е изброимо, т.е., може да се създаде биекция между него и естествените числа. За да се докаже това е достатъчно да се създаде биекция между естествените и положителните рационални числа. Това става по следния метод:</p>
<p>Създавате двумерна таблица, като нареждате естествените числа (до безкрайност) веднъж по абцисата и веднъж по ординатата (вж. фигурата). След това заставате в клетка (1, 1) и я номерирате 1. После повтаряте:</p>
<ol>
<li>Стъпка надолу.</li>
<li>Диагонал горе-дясно.</li>
<li>Повтаряте горното, докато не стигнете първия ред.</li>
<li>Стъпка надясно.</li>
<li>Диагонал долу-ляво.</li>
<li>Повтаряте горното, докато не стигнете до първата колонка.</li>
</ol>
<p>При всяко влизане в нова клетка проверявате дали вече сте срещнали рационалното число <em>ред/колона</em>. Ако не &#8212; давате му следващия номер. Ето и как изглежда на картинка:</p>
<p><img src="/files/2008/04/diagonal.png" alt="Enumerated Rationals" /><br />
<small><a href="http://en.wikipedia.org/wiki/Image:Diagonal_argument.svg">Диаграмата е от Wikipedia.</a></small></p>
<h3>Да се напише&#8230;</h3>
<ul>
<li>&#8230;безкраен итератор <code>enumerate_rationals()</code>, който да връща <strong>наредени двойки от цели числа</strong>, представляващи <code>(числител, знаменател)</code> на рационалните числа в описания по-горе ред. Т.е., първите няколко двойки трябва да са <em>(1, 1), (2, 1), (1, 2), (1, 3), (3, 1), (4, 1), (3, 2), (2, 3), (1, 4), (1, 5), (5, 1) и т.н.</em></li>
<li>&#8230;итератор <code>primed(iterator)</code>. Тук <code>iterator</code> (краен или безкраен) връща двойки от цели числа. <code>primed</code> оставя само тези, които се състоят единствено от прости числа и първото е по-малко от второто. Ако изпълните <code>primed(enumerate_rationals())</code>, първите няколко двойки ще бъдат <em>(2, 3), (2, 5), (3, 5) и т.н.</em>.</li>
</ul>
<h3>Подсказки</h3>
<p>Чувствайте се свободни да ползвате решението си на пета задача, ако смятате че ще ви е от полза. Направете го като копирате класа за рационални числа в решението, а не като импортирате модул.</p>
<p>Може да ползвате възможностите на модула <code>itertools</code>.</p>
<h3>Елегантни решения</h3>
<p>Ако смятате, че сте се справили по красив начин, моля заявете го във форума. Ако сме съгласни, дори ще ви дадем бонус точки.</p>
<h3>Примерен тест</h3>
<p>Връзка: <a href="/samples/07-08/p6-sample.py">p6-sample.py</a></p>
<p>Теста може да изпълните като свалите <code>p6-sample.py</code>, заедно с него в една директория запазите своето решение, именувано <code>p6.py</code> и изпълните <code>p6-sample.py</code>. Крайната ви цел е да получите OK някъде из резултата.</p>
<p><strong>Тестът не гарантира, че сте си решили задачата на 100%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/problems/2008/04/p6-enumerated-rationals/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Пета задача</title>
		<link>http://fmi.py-bg.net/problems/2008/04/p5-rational/</link>
		<comments>http://fmi.py-bg.net/problems/2008/04/p5-rational/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 14:12:53 +0000</pubDate>
		<dc:creator>Стефан</dc:creator>
		
		<category><![CDATA[Задачи]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/problems/2008/04/p5-rational/</guid>
		<description><![CDATA[
code {
	background-color: #eeeeee;
	padding: 1px;
}

Брой точки, които дава задачата: 5 + 3 (за елегантно решение).
Краен срок: 14 май 2008г., 19:00 часа.
Формуляр за изпращане.
Накратко
Да се напише клас за рационално число, който да поддържа стандартните операции, плюс няколко допълнителни.
Представяне и конструкция

Класът да се казва rational (малка буква)
Да се конструира с две цели числа &#8212; числител и знаменател, в [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css">
code {
	background-color: #eeeeee;
	padding: 1px;
}
</style>
<p>Брой точки, които дава задачата: 5 + 3 (за елегантно решение).</p>
<p>Краен срок: 14 май 2008г., 19:00 часа.</p>
<p><a href="/submit">Формуляр за изпращане</a>.</p>
<h3>Накратко</h3>
<p>Да се напише клас за рационално число, който да поддържа стандартните операции, плюс няколко допълнителни.</p>
<h3>Представяне и конструкция</h3>
<ul>
<li>Класът да се казва <code>rational</code> (малка буква)</li>
<li>Да се конструира с две цели числа &mdash; числител и знаменател, в този ред: <code>rational(2, 3)</code>.</li>
<li>Да може да се конструира и само с едно цяло число. По стойност да е равно на него.</li>
<li>Да има методи <code>num()</code> и <code>den()</code>, които да връщат съответно числителя и знаменателя.</li>
<li>Числото винаги да се пази съкратено. Ако се конструира като <code>rational(4, 6)</code>, да се свежда до <code>rational(2, 3)</code>. Това важи за <strong>всички операции</strong> &mdash; текстово представяне, <code>num()</code> и <code>den()</code> и прочее.</li>
<li>Ако числото е отрицателно, това значи отрицателен числител и положителен знаменател. <code>rational(2, -3)</code> да се преобразува до <code>rational(-2, 3)</code>. <code>rational(-1, -8)</code> до <code>rational(1, 8)</code>.
<li>Нулата се представя като <code>rational(0, 1)</code>.</li>
<li>Ако като втори аргумент на <code>rational()</code> бъде подадена <code>0</code>, да се вдига <code>ValueError</code>.</li>
<li>Във всички случаи на типово-некоректен вход на <code>rational()</code> и на неговите методи няма значение какво ще правите, тъй като няма да бъдат подавани типово-некоректни данни.</li>
</ul>
<h3>Операции</h3>
<ul>
<li><code>==, !=, <, <=, >, >=</code>. Учили сте математика, досещате се как тези операции трябва да бъдат дефинирани.</li>
<li><code>+, -, /, *</code>. Събиране, изваждане, умножение и деление. Имплементирайте тези операции да работят и с цели числа (int, long), както от лявата, така и от дясната страна.</li>
<li><code>**</code>. Повдигане на <strong>цяла</strong> степен. Недефинирана (без значение) за рационални или реални степени.</li>
<li>Унарен <code>-</code>.</li>
<li><code>~</code>. Реципрочност. Да се имплементира като <code>~rational(1, 6) == rational(6, 1)</code>. <ins><code>~rational(0)</code> да вдига <code>ValueError</code>.</ins></li>
</ul>
<h3>Методи</h3>
<ul>
<li><code>str()</code> и <code>repr()</code> да връщат стрингове, подобни съответно на <code>-1/3</code> и <code>rational(-1, 3)</code> (няма да проверяваме това).</li>
<li><code>lcd(other)</code> намира най-малкия общ знаменател на две рационални числа (връща цяло число)</li>
<li><code>r.partition()</code> връща наредена двойка <code>(x, y)</code>. <em>x</em> е най-голямото цяло число, по-малко <ins>по абсолютна стойност</ins> от <em>r</em>, а <em>y</em> е рационално число <ins>от интервала (-1, 1)</ins>, така че <em>x + y = r</em>. Т.е., <code>rational(42, 9).partition() == (4, rational(2, 3))</code>. При 2/3 резултатът е <code>(0, rational(2, 3))</code>. При 4 е <code>(4, rational(0, 1))</code>, <ins>а при -6/5 ще имаме (-1, rational(1, 5))</ins>.</li>
<li><code>int(), long(), float()</code>. Направете така, че вашите типове да могат да се конвертират до цели или реални числа. При целите закръглявате надолу, <ins>като <code>int(rational(6, 5))</code> е 1, но <code>int(rational(-6, 5))</code> е -1.</ins></li>
</ul>
<h3>Елеганти решения</h3>
<p>Ако смятате, че се сте справили много добре, моля кандидатствайте за елегантно решение. Този път има една уловка - ако искате бонус точки, трябва да имплементирате операциите за сравнение така, че да работят и с цели числа. Т.е. <code>2 == rational(4, 2)</code> да връща истина. <del>За целта трябва да проучите как работи <a href="http://docs.python.org/ref/numeric-types.html#l2h-310">__coerce__</a>.</del></p>
<h3>Примерен тест</h3>
<p>Връзка: <a href="/samples/07-08/p5-sample.py">p5-sample.py</a></p>
<p>Теста може да изпълните като свалите файла, заедно с него в една директория запазите своето решение, именувано <code>p5.py</code> и изпълните <code>p5-sample.py</code>. Крайната ви цел е да получите OK някъде из резултата.</p>
<p><strong>Тестът не гарантира, че сте си решили задачата на 100%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/problems/2008/04/p5-rational/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Четвърта задача</title>
		<link>http://fmi.py-bg.net/problems/2008/04/p4-modules/</link>
		<comments>http://fmi.py-bg.net/problems/2008/04/p4-modules/#comments</comments>
		<pubDate>Thu, 24 Apr 2008 18:05:09 +0000</pubDate>
		<dc:creator>николай</dc:creator>
		
		<category><![CDATA[Задачи]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/problems/2008/04/p4-modules/</guid>
		<description><![CDATA[Брой точки, които дава задачата: 5 + 3 (елегантни решения).
Краен срок: 12-и май 2008г., 19:00 часа.
Формуляр за изпращане
Основната ви цел е да напишете функция със следните име и аргументи: module_game(predicate, *modules).
Входни данни: всички елементи на modules са модули, predicate е функция, приемаща произволен обект, и връщаща булева стойност.
Резултат: n-торка с len(modules) елемента. Всеки елемент съдържа [...]]]></description>
			<content:encoded><![CDATA[<p>Брой точки, които дава задачата: 5 <ins datetime="28.04.2008 12:46:43" title="28.04.2008 12:46:43">+ 3 (елегантни решения)</ins>.</p>
<p>Краен срок: 12-и май 2008г., 19:00 часа.</p>
<p><a href="http://fmi.py-bg.net/submit">Формуляр за изпращане</a></p>
<p>Основната ви цел е да напишете функция със следните име и аргументи: <code>module_game(predicate, *modules)</code>.</p>
<p>Входни данни: всички елементи на <code>modules</code> са модули, <code>predicate</code> е функция, приемаща произволен обект, и връщаща булева стойност.</p>
<p>Резултат: n-торка с <code>len(modules)</code> елемента. Всеки елемент съдържа броя точки, които е събрал съответния модул при играта, описана по-долу.</p>
<p>Предварително известни факти:</p>
<ul>
<li>Всички речници в модулите са или празни или само от цели числа. Ключовете им са винаги низове. Примери: <code>{} {'baba': 5} {'a': 42, 'b': -69, 'x': 4360000634}</code></li>
<li>Всички списъци/n-торки в модулите могат да съдържат само цели числа или други списъци/n-торки, за които важи същото правило. Могат и да бъдат празни, разбира се. Примери: <code>[] [11] ([1, 2, 3, ], 4, [5], [6,(7, 8, 9)]) (5,)</code></li>
<li>Може да разчитате, че тези условия ще бъдат изпълнени и няма нужда да ги проверявате.</li>
</ul>
<p>Правила на играта:</p>
<p><em>За атрибути по-надолу <ins datetime="25.04.2008 11:02:41" title="25.04.2008 11:02:41">(за всички правила)</ins> ще смятаме само тези реални атрибути на модулите, които не започват с <code>_</code> (долна черта, подчертавка)</em></p>
<ol start="0">
<li>Всеки модул получава по една точка за всяко <a href="http://bg.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE_%D1%87%D0%B8%D1%81%D0%BB%D0%BE">просто</a> число в него. Числата в един модул включват както целочислените му атрибути, така и целите числа в речниците, списъците, списъците в списъците, списъците в списъците в списъците и т.н. Ето пример за модул, който получава 3 точки:
<pre class="prettyprint">
s = "baba"
l = [6, (511,), [99, 63, [18, 70], 7907]]
n = (2, (4, (6, (9, (2,)))))
</pre>
</li>
<li>Всеки модул получава по три точки за всеки модул в него, който се казва <a href="http://xkcd.com/353/">antigravity</a> или <a href="http://xkcd.com/413/">soul</a>.</li>
<li>Всеки модул получава по една точка за всеки речник в него, чието име е анаграма на името на функция в модула. Пример, който получава една точка <ins datetime="25.04.2008 10:34:43" title="25.04.2008 10:34:43">по това правило</ins>:
<pre class="prettyprint">
mary = {}
lalala = [9, 11, 2, 3, 4]
army = lambda: "Complain to pop@armenia.com"
def llaalla():
    print "i &gt; u &gt; i"
</pre>
</li>
<li>Всеки модул получава толкова точки, колкото е закръглената надолу разлика между броя атрибути, отговарящи на <code>predicate</code> и <a href="http://bg.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%B0_%28%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0%29">медианата</a> на броя атрибути, отговарящи на <code>predicate</code> във всички модули. Пример:
<p><code>mod0.py:</code></p>
<pre class="prettyprint">
f = lambda: "Apricot"
g = lambda: "Peach"
nofunc = -11
</pre>
<p><code>mod1.py:</code></p>
<pre class="prettyprint">
f = lambda: "Apricot"
</pre>
<p><code>mod2.py:</code></p>
<pre class="prettyprint">
f = lambda: "Apricot"
class G: pass
def h(): pass
l = [1, 2, 3]
i = lambda z: (2*18 != 1*36)+'in terms of'+('man', 'women')[z]
</pre>
<p><code>mod3.py:</code></p>
<pre class="prettyprint">
cool = −273.15
</pre>
<pre class="prettyprint">
module_game(callable, mod0, mod1, mod2, mod3)
</pre>
<p>Четирите модула получават <code>0, -1, 2, -2</code> точки, съответно.</li>
<li>Всеки модул получава <code>-2<sup>А(4,4)</sup></code> точки за всяко число в него, равно на <a href="http://www.xkcd.com/207/">A(g<sub>64</sub>, g<sub>64</sub>)</a>. За търсене на числа важат правилата от нулевото правило.</li>
</ol>
<h3>Полезни функции</h3>
<ul>
<li><code>callable </code>&mdash; за проверка дали атрибут може да се сметне за функция</li>
<li><code>getattr</code>, <code>hasattr</code></li>
<li><code>type</code>, <code>isinstance</code> &mdash; препоръчваме ви <code>isinstance</code>, макар за тази задача и <code>type </code>ще ви свърши работа</li>
<li>черешката на тортата: <code>dir</code></li>
</ul>
<h3>Примерен тест</h3>
<p>Връзка: <a href="/samples/07-08/p4-sample.py">p4-sample.py</a></p>
<p>Тестът може да изпълните като свалите <code>p4-sample.py</code>, заедно с него в една директория запазите своето решение, именувано <code>p4.py</code> и изпълните <code>p4-sample.py</code>. Крайната ви цел е да получите OK някъде из резултата.</p>
<p><strong>Тестът не гарантира, че сте си решили задачата на 100%, но поне ще ви гарантира, че не сте допуснали глупава грешка, която да ви коства всички точки.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/problems/2008/04/p4-modules/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Автоматизирано тестване (презентация #14)</title>
		<link>http://fmi.py-bg.net/materials/2008/04/14-unittest/</link>
		<comments>http://fmi.py-bg.net/materials/2008/04/14-unittest/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 16:53:53 +0000</pubDate>
		<dc:creator>Митьо</dc:creator>
		
		<category><![CDATA[Материали]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/materials/2008/04/14-unittest/</guid>
		<description><![CDATA[Материалите от лекцията за автоматизирано тестване:

Разглеждане на презентацията директно в Интернет
Архиви с презентацията:

14-unittest.zip
14-unittest.tar.gz


Архиви с всички презентации (#0, #1, &#8230; #14) до момента:

в zip формат
в tar.gz формат



]]></description>
			<content:encoded><![CDATA[<p>Материалите от лекцията за автоматизирано тестване:</p>
<ol>
<li><a href="/slides/07-08/14-unittest.html">Разглеждане на презентацията директно в Интернет</a></li>
<li>Архиви с презентацията:
<ul>
<li><a href="/slides/07-08/14-unittest.zip">14-unittest.zip</a></li>
<li><a href="/slides/07-08/14-unittest.tar.gz">14-unittest.tar.gz</a></li>
</ul>
</li>
<li>Архиви с всички презентации (#0, #1, &hellip; #14) до момента:
<ul>
<li><a href="/slides/07-08/python-slides-until-14.zip">в <code>zip</code> формат</a></li>
<li><a href="/slides/07-08/python-slides-until-14.tar.gz">в <code>tar.gz</code> формат</a></li>
</ul>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/materials/2008/04/14-unittest/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Резултати от задача 3</title>
		<link>http://fmi.py-bg.net/results/2008/04/problem-3-2/</link>
		<comments>http://fmi.py-bg.net/results/2008/04/problem-3-2/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 20:23:44 +0000</pubDate>
		<dc:creator>николай</dc:creator>
		
		<category><![CDATA[Резултати]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/results/2008/04/problem-3-2/</guid>
		<description><![CDATA[Тестове


ФН
Точки
ОК
Гръм
Неверен
Изпратено на
Връзка към лога


fn171717
5
5
0
0
2008-04-14 03:51:47
преглед на лога


fn30987
3
3
0
2
2008-04-14 10:35:44
преглед на лога


fn424242
5
5
0
0
2008-04-13 17:07:53
преглед на лога


fn43733
5
5
0
0
2008-04-14 16:12:37
преглед на лога


fn43778
5
5
0
0
2008-04-14 15:54:38
преглед на лога


fn43800
3
3
0
2
2008-04-14 18:55:24
преглед на лога


fn43802
4
4
0
1
2008-04-14 01:18:26
преглед на лога


fn43805
3
3
0
2
2008-04-14 15:01:05
преглед на лога


fn43806
5
5
0
0
2008-04-09 23:55:49
преглед на лога


fn43813
5
5
0
0
2008-04-14 18:02:39
преглед на лога


fn43830
5
5
0
0
2008-04-14 00:11:49
преглед на лога


fn43888
3
3
0
2
2008-04-14 17:59:07
преглед на лога


fn43900
4
4
0
1
2008-04-13 14:55:03
преглед на лога


fn43938
3
3
0
2
2008-04-14 18:53:14
преглед на лога


fn43993
4
4
0
1
2008-04-13 20:18:55
преглед на лога


fn43994
2
2
0
3
2008-04-11 01:32:38
преглед на лога


fn44030
5
5
0
0
2008-04-14 15:37:16
преглед на лога


fn44130
3
3
0
2
2008-04-14 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://fmi.py-bg.net/logs08/p3/tests">Тестове</a></p>
<table>
<tr>
<th>ФН</th>
<th>Точки</th>
<th>ОК</th>
<th>Гръм</th>
<th>Неверен</th>
<th>Изпратено на</th>
<th>Връзка към лога</th>
</tr>
<tr>
<td>fn171717</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 03:51:47</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn171717/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn30987</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 10:35:44</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn30987/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn424242</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-13 17:07:53</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn424242/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43733</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 16:12:37</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43733/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43778</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 15:54:38</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43778/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43800</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 18:55:24</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43800/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43802</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 01:18:26</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43802/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43805</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 15:01:05</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43805/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43806</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-09 23:55:49</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43806/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43813</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 18:02:39</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43813/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43830</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 00:11:49</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43830/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43888</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 17:59:07</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43888/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43900</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-13 14:55:03</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43900/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43938</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 18:53:14</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43938/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43993</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-13 20:18:55</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43993/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn43994</td>
<td>2</td>
<td>2</td>
<td>0</td>
<td>3</td>
<td>2008-04-11 01:32:38</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn43994/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44030</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 15:37:16</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44030/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44130</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 18:55:37</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44130/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44176</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 17:29:01</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44176/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44183</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-13 17:37:41</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44183/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44269</td>
<td><strong>3</strong></td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-14 01:19:04</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44269/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44270</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 01:24:40</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44270/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44287</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>0</td>
<td>2008-04-14 19:08:41</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44287/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44320</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-14 18:53:20</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44320/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44326</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 00:06:29</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44326/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44332</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-12 20:27:25</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44332/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44336</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 15:43:16</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44336/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44365</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-13 13:08:39</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44365/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn44379</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-14 19:02:01</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn44379/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61049</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>4</td>
<td>2008-04-14 18:46:29</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61049/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61067</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 16:19:04</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61067/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61079</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>4</td>
<td>2008-04-14 18:58:25</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61079/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61093</td>
<td><strong>3</strong></td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-13 15:49:14</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61093/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61096</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 01:08:55</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61096/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61101</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-13 12:16:44</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61101/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61131</td>
<td>2</td>
<td>2</td>
<td>3</td>
<td>0</td>
<td>2008-04-14 15:51:35</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61131/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn61133</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 18:26:44</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn61133/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn64069</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 18:44:53</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn64069/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn696969</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-12 09:42:43</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn696969/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71057</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 16:28:04</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71057/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71061</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 18:42:00</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71061/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71067</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-13 16:08:50</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71067/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71081</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 14:03:47</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71081/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71085</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-13 23:07:27</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71085/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71092</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>0</td>
<td>2008-04-14 13:57:43</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71092/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71093</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 18:21:14</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71093/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71100</td>
<td>2</td>
<td>2</td>
<td>0</td>
<td>3</td>
<td>2008-04-14 11:26:11</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71100/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71102</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 13:07:47</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71102/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn71113</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 18:21:45</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn71113/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80042</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 15:53:46</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80042/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80058</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 18:06:10</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80058/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80063</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-13 21:41:07</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80063/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80064</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 13:26:14</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80064/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80066</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-10 12:46:30</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80066/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80069</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-09 23:38:17</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80069/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80070</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 17:27:22</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80070/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80081</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-13 01:12:12</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80081/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80082</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>4</td>
<td>2008-04-14 19:00:41</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80082/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80093</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 00:44:23</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80093/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80102</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-13 23:43:04</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80102/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80107</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-07 19:53:00</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80107/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80109</td>
<td>3</td>
<td>3</td>
<td>0</td>
<td>2</td>
<td>2008-04-14 06:51:27</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80109/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80136</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>2008-04-14 19:14:30</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80136/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80180</td>
<td>1</td>
<td>1</td>
<td>2</td>
<td>2</td>
<td>2008-04-13 17:36:25</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80180/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80187</td>
<td>2</td>
<td>2</td>
<td>0</td>
<td>3</td>
<td>2008-04-14 14:13:55</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80187/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80246</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-10 03:33:23</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80246/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80256</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>4</td>
<td>2008-04-14 15:17:25</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80256/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80267</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-14 12:30:49</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80267/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80274</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 17:20:58</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80274/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn80275</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-14 16:58:46</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn80275/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn840513</td>
<td>4</td>
<td>4</td>
<td>0</td>
<td>1</td>
<td>2008-04-08 09:22:35</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn840513/log">преглед на лога</a></td>
</tr>
<tr>
<td>fn855158</td>
<td>0</td>
<td>0</td>
<td>5</td>
<td>0</td>
<td>2008-04-14 15:24:58</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fn855158/log">преглед на лога</a></td>
</tr>
<tr>
<td>fnM22528</td>
<td>5</td>
<td>5</td>
<td>0</td>
<td>0</td>
<td>2008-04-07 11:59:35</td>
<td><a href="http://fmi.py-bg.net/logs08/p3/fnM22528/log">преглед на лога</a></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/results/2008/04/problem-3-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Итератори и генератори (презентация #13)</title>
		<link>http://fmi.py-bg.net/materials/2008/04/13-iter/</link>
		<comments>http://fmi.py-bg.net/materials/2008/04/13-iter/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 12:39:28 +0000</pubDate>
		<dc:creator>Митьо</dc:creator>
		
		<category><![CDATA[Материали]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/news/2008/04/%d0%b8%d1%82%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d0%b8-%d0%b8-%d0%b3%d0%b5%d0%bd%d0%b5%d1%80%d0%b0%d1%82%d0%be%d1%80%d0%b8-%d0%bf%d1%80%d0%b5%d0%b7%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d1%8f-13/</guid>
		<description><![CDATA[Материалите от лекцията за итератори и генератори:

Разглеждане на презентацията директно в Интернет
Архиви с презентацията:

13-iter.zip
13-iter.tar.gz


Архиви с всички презентации (#0, #1, &#8230; #13) до момента:

в zip формат
в tar.gz формат



]]></description>
			<content:encoded><![CDATA[<p>Материалите от лекцията за итератори и генератори:</p>
<ol>
<li><a href="/slides/07-08/13-iter.html">Разглеждане на презентацията директно в Интернет</a></li>
<li>Архиви с презентацията:
<ul>
<li><a href="/slides/07-08/13-iter.zip">13-iter.zip</a></li>
<li><a href="/slides/07-08/13-iter.tar.gz">13-iter.tar.gz</a></li>
</ul>
</li>
<li>Архиви с всички презентации (#0, #1, &hellip; #13) до момента:
<ul>
<li><a href="/slides/07-08/python-slides-until-13.zip">в <code>zip</code> формат</a></li>
<li><a href="/slides/07-08/python-slides-until-13.tar.gz">в <code>tar.gz</code> формат</a></li>
</ul>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/materials/2008/04/13-iter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Изключения (презентация #12)</title>
		<link>http://fmi.py-bg.net/materials/2008/04/12-exceptions/</link>
		<comments>http://fmi.py-bg.net/materials/2008/04/12-exceptions/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 12:37:42 +0000</pubDate>
		<dc:creator>Митьо</dc:creator>
		
		<category><![CDATA[Материали]]></category>

		<guid isPermaLink="false">http://fmi.py-bg.net/materials/2008/04/%d0%b8%d0%b7%d0%ba%d0%bb%d1%8e%d1%87%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d1%80%d0%b5%d0%b7%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d1%8f-12/</guid>
		<description><![CDATA[Материалите от лекцията за изключения:

Разглеждане на презентацията директно в Интернет
Архиви с презентацията:

12-exceptions.zip
12-exceptions.tar.gz


Архиви с всички презентации (#0, #1, &#8230; #12) до момента:

в zip формат
в tar.gz формат



]]></description>
			<content:encoded><![CDATA[<p>Материалите от лекцията за изключения:</p>
<ol>
<li><a href="/slides/07-08/12-exceptions.html">Разглеждане на презентацията директно в Интернет</a></li>
<li>Архиви с презентацията:
<ul>
<li><a href="/slides/07-08/12-exceptions.zip">12-exceptions.zip</a></li>
<li><a href="/slides/07-08/12-exceptions.tar.gz">12-exceptions.tar.gz</a></li>
</ul>
</li>
<li>Архиви с всички презентации (#0, #1, &hellip; #12) до момента:
<ul>
<li><a href="/slides/07-08/python-slides-until-12.zip">в <code>zip</code> формат</a></li>
<li><a href="/slides/07-08/python-slides-until-12.tar.gz">в <code>tar.gz</code> формат</a></li>
</ul>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://fmi.py-bg.net/materials/2008/04/12-exceptions/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
