<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, "<font color="#ff6060">r</font>")</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 < 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>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("<font color="#ff6060">sample.txt</font>")</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("<font color="#ff6060">sample.txt</font>")</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("<font color="#ff6060">sample.txt</font>")</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>