<pre class='wikiSyntax' id='PRE-5b62d490c620c3e8c9aac9da46805036' style='font-family:FixedSys,monospace;color:#c0c0c0;background-color:black'>
<span class="line"></span>
<span class="line"><font color="#8080ff"># -*- coding: UTF-8 -*-</font></span>
<span class="line"><font color="#ff40ff">import</font> unittest</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">readFile</font>(fileName):</span>
<span class="line">        f = file(fileName, &quot;<font color="#ff6060">r</font>&quot;)</span>
<span class="line">        lines = []</span>
<span class="line">        line = f.readline()</span>
<span class="line">        <font color="#ffff00">while</font> line!='' :</span>
<span class="line">                lines.append(line)</span>
<span class="line">                line = f.readline()</span>
<span class="line"></span>
<span class="line">        f.close()</span>
<span class="line">        <font color="#ffff00">return</font> lines</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">extractInfo</font>(lines):</span>
<span class="line">        idx = 0</span>
<span class="line">        sNum = int(lines[idx])</span>
<span class="line">        idx += 1</span>
<span class="line"></span>
<span class="line">        sInfo = lines[idx].split()</span>
<span class="line">        nPaper = int(sInfo[0])</span>
<span class="line">        nPerson = int(sInfo[1])</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">return</font> sNum, nPaper, nPerson</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">stripWhiteSpaces</font>(str):</span>
<span class="line">        <font color="#ffff00">return</font> str.lstrip().rstrip()</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">extractNames</font>(str):</span>
<span class="line">        parts = str.split('<font color="#ff6060">:</font>')</span>
<span class="line">        names = parts[0].split('<font color="#ff6060">.,</font>')</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">for</font> i <font color="#ffff00">in</font> range(0, len(names)):</span>
<span class="line">                dot = ''</span>
<span class="line">                <font color="#ffff00">if</font> i &lt; len(names)-1 :</span>
<span class="line">                        dot = '<font color="#ff6060">.</font>'</span>
<span class="line">                names[i] = stripWhiteSpaces(names[i]+dot)</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">return</font> names</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">erdosNumber</font>(fileName):</span>
<span class="line">        erdosName = '<font color="#ff6060">Erdos, P.</font>'</span>
<span class="line"></span>
<span class="line">        lines = readFile(fileName)</span>
<span class="line">        sNum, nPaper, nPerson = extractInfo(lines)</span>
<span class="line"></span>
<span class="line">        allNames = {}</span>
<span class="line">        allNames[erdosName] = 0</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">for</font> i <font color="#ffff00">in</font> range(2, 2+nPaper):</span>
<span class="line">                names = extractNames(lines[i])</span>
<span class="line"></span>
<span class="line">                erdosFriend = None</span>
<span class="line">                minErdosNum = -1</span>
<span class="line"></span>
<span class="line">                <font color="#ffff00">for</font> name <font color="#ffff00">in</font> names:</span>
<span class="line">                        <font color="#ffff00">if</font> allNames.has_key(name) <font color="#ffff00">and</font> (minErdosNum == -1 <font color="#ffff00">or</font> minErdosNum&gt;allNames[name]) :</span>
<span class="line">                                minErdosNum = allNames[name]</span>
<span class="line">                                erdosFriend = name</span>
<span class="line"></span>
<span class="line">                        <font color="#ffff00">if</font> name == erdosName: <font color="#8080ff"># ê°~Yì~]´ ì~S´ ì~B¬ë~^~Lë~S¤</font></span>
<span class="line">                                erdosFriend = erdosName</span>
<span class="line">                                <font color="#ffff00">break</font></span>
<span class="line"></span>
<span class="line">                <font color="#ffff00">if</font> erdosFriend == erdosName:</span>
<span class="line">                        erdosCoAuthor(allNames, names, erdosName)</span>
<span class="line">                <font color="#ffff00">elif</font> erdosFriend == None:</span>
<span class="line">                        erdosNotRelated(allNames, names)</span>
<span class="line">                <font color="#ffff00">else</font> :</span>
<span class="line">                        erdosCoAuthorCoAuthor(allNames, names, erdosFriend)</span>
<span class="line"></span>
<span class="line">        printResults(lines[2+nPaper:], allNames)</span>
<span class="line">        <font color="#ffff00">return</font> allNames</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">printResults</font>(names, allNames):</span>
<span class="line">        <font color="#ffff00">for</font> name <font color="#ffff00">in</font> names:</span>
<span class="line">                name = stripWhiteSpaces(name)</span>
<span class="line">                <font color="#ffff00">print</font> name,</span>
<span class="line">                <font color="#ffff00">if</font> allNames[name] == -1 :</span>
<span class="line">                        <font color="#ffff00">print</font> '<font color="#ff6060">infinite</font>'</span>
<span class="line">                <font color="#ffff00">else</font>:</span>
<span class="line">                        <font color="#ffff00">print</font> allNames[name]</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">erdosCoAuthor</font>(allNames, names, erdosName):</span>
<span class="line">        <font color="#ffff00">for</font> name <font color="#ffff00">in</font> names :</span>
<span class="line">                <font color="#ffff00">if</font> name != erdosName:</span>
<span class="line">                        allNames[name] = 1</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">erdosNotRelated</font>(allNames, names):</span>
<span class="line">        <font color="#ffff00">for</font> name <font color="#ffff00">in</font> names:</span>
<span class="line">                allNames[name] = -1</span>
<span class="line"></span>
<span class="line"><font color="#ffff00">def</font> <font color="#00ffff">erdosCoAuthorCoAuthor</font>(allNames, names, erdosFriend):</span>
<span class="line">        <font color="#ffff00">for</font> name <font color="#ffff00">in</font> names:</span>
<span class="line">                <font color="#ffff00">if</font> name != erdosFriend :</span>
<span class="line">                        allNames[name] = allNames[erdosFriend] + 1</span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><font color="#ffff00">class</font> <font color="#00ffff">TestErdos</font>(unittest.TestCase):</span>
<span class="line">        <font color="#ffff00">def</font> <font color="#00ffff">setUp</font>(self):</span>
<span class="line">                self.lines = readFile(&quot;<font color="#ff6060">sample.txt</font>&quot;)</span>
<span class="line">        <font color="#ffff00">def</font> <font color="#00ffff">testStripstring</font>(self):</span>
<span class="line">                self.assertEqual('<font color="#ff6060">aaa</font>', stripWhiteSpaces('<font color="#ff6060"> aaa  </font>'))</span>
<span class="line">                self.assertEqual('<font color="#ff6060">bbb</font>', stripWhiteSpaces('<font color="#ff6060">  bbb</font>'))</span>
<span class="line">                self.assertEqual('<font color="#ff6060">ccc</font>', stripWhiteSpaces('<font color="#ff6060">ccc   </font>'))</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">def</font> <font color="#00ffff">testInputInfo</font>(self):</span>
<span class="line">                sNum, nPaper, nPerson = extractInfo(self.lines)</span>
<span class="line">                self.assertEqual(1, sNum)</span>
<span class="line">                self.assertEqual(4, nPaper)</span>
<span class="line">                self.assertEqual(3, nPerson)</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">def</font> <font color="#00ffff">testAllNames</font>(self):</span>
<span class="line">                sNum, nPaper, nPerson = extractInfo(self.lines)</span>
<span class="line"></span>
<span class="line">                allNames = {}</span>
<span class="line"></span>
<span class="line">                <font color="#ffff00">for</font> i <font color="#ffff00">in</font> range(2, 2+nPaper):</span>
<span class="line">                        names = extractNames(self.lines[i])</span>
<span class="line">                        <font color="#ffff00">for</font> name <font color="#ffff00">in</font> names:</span>
<span class="line">                                allNames[name] = 0</span>
<span class="line"></span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Smith, M.N.</font>'))</span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Martin, G.</font>'))</span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Erdos, P.</font>'))</span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Reisig, W.</font>'))</span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Chen, X.</font>'))</span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Jablonski, T.</font>'))</span>
<span class="line">                self.assertEqual(True, allNames.has_key('<font color="#ff6060">Hsueh, Z.</font>'))</span>
<span class="line"></span>
<span class="line">        <font color="#ffff00">def</font> <font color="#00ffff">testErdosNum</font>(self):</span>
<span class="line">                sNum, nPaper, nPerson = extractInfo(self.lines)</span>
<span class="line">                erdosNum = erdosNumber(&quot;<font color="#ff6060">sample.txt</font>&quot;)</span>
<span class="line"></span>
<span class="line">                self.assertEqual(1, erdosNum[stripWhiteSpaces(self.lines[6])])</span>
<span class="line">                self.assertEqual(-1, erdosNum[stripWhiteSpaces(self.lines[7])])</span>
<span class="line">                self.assertEqual(2, erdosNum[stripWhiteSpaces(self.lines[8])])</span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><font color="#ffff00">if</font> __name__=='<font color="#ff6060">__main__</font>':</span>
<span class="line">        <font color="#8080ff">#unittest.main(argv=('','-v'))</font></span>
<span class="line">        erdosNumber(&quot;<font color="#ff6060">sample.txt</font>&quot;)</span>
<span class="line"></span>
<span class="line"></span>
<span class="line">----</span>
<span class="line">ErdosNumbers</span>
<span class="line"></span>
<span class="line"></pre></span>
<span class="line"></body></span>
<span class="line"></html></span>
<span class="line"></span>
</pre>