Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

ErdosNumbers/임인택

From ZeroWiki
# -*- coding: UTF-8 -*-
import unittest

def readFile(fileName):
	f = file(fileName, "r")
	lines = []
	line = f.readline()
	while line!= :
		lines.append(line)
		line = f.readline()

	f.close()
	return lines

def extractInfo(lines):
	idx = 0
	sNum = int(lines[idx])
	idx += 1
	
	sInfo = lines[idx].split()
	nPaper = int(sInfo[0])
	nPerson = int(sInfo[1])

	return sNum, nPaper, nPerson

def stripWhiteSpaces(str):
	return str.lstrip().rstrip()

def extractNames(str):
	parts = str.split(':')
	names = parts[0].split('.,')

	for i in range(0, len(names)):
		dot = 
		if i < len(names)-1 :
			dot = '.'
		names[i] = stripWhiteSpaces(names[i]+dot)

	return names

def erdosNumber(fileName):
	erdosName = 'Erdos, P.'
	
	lines = readFile(fileName)
	sNum, nPaper, nPerson = extractInfo(lines)
	
	allNames = {}
	allNames[erdosName] = 0

	for i in range(2, 2+nPaper):
		names = extractNames(lines[i])
		
		erdosFriend = None
		minErdosNum = -1
		
		for name in names:
			if allNames.has_key(name) and (minErdosNum == -1 or minErdosNum>allNames[name]) :
				minErdosNum = allNames[name]
				erdosFriend = name

			if name == erdosName: # 같이 쓴 사람들
				erdosFriend = erdosName
				break
			
		if erdosFriend == erdosName:
			erdosCoAuthor(allNames, names, erdosName)
		elif erdosFriend == None:
			erdosNotRelated(allNames, names)
		else :
			erdosCoAuthorCoAuthor(allNames, names, erdosFriend)

	printResults(lines[2+nPaper:], allNames)
	return allNames

def printResults(names, allNames):
	for name in names:
		name = stripWhiteSpaces(name)
		print name,
		if allNames[name] == -1 :
			print 'infinite'
		else:
			print allNames[name]

def erdosCoAuthor(allNames, names, erdosName):
	for name in names :
		if name != erdosName:
			allNames[name] = 1

def erdosNotRelated(allNames, names):
	for name in names:
		allNames[name] = -1

def erdosCoAuthorCoAuthor(allNames, names, erdosFriend):
	for name in names:
		if name != erdosFriend :
			allNames[name] = allNames[erdosFriend] + 1


class TestErdos(unittest.TestCase):
	def setUp(self):
		self.lines = readFile("sample.txt")
	def testStripstring(self):
		self.assertEqual('aaa', stripWhiteSpaces(' aaa  '))
		self.assertEqual('bbb', stripWhiteSpaces('  bbb'))
		self.assertEqual('ccc', stripWhiteSpaces('ccc   '))

	def testInputInfo(self):
		sNum, nPaper, nPerson = extractInfo(self.lines)
		self.assertEqual(1, sNum)
		self.assertEqual(4, nPaper)
		self.assertEqual(3, nPerson)

	def testAllNames(self):
		sNum, nPaper, nPerson = extractInfo(self.lines)

		allNames = {}

		for i in range(2, 2+nPaper):
			names = extractNames(self.lines[i])
			for name in names:
				allNames[name] = 0
		
		self.assertEqual(True, allNames.has_key('Smith, M.N.'))
		self.assertEqual(True, allNames.has_key('Martin, G.'))
		self.assertEqual(True, allNames.has_key('Erdos, P.'))
		self.assertEqual(True, allNames.has_key('Reisig, W.'))
		self.assertEqual(True, allNames.has_key('Chen, X.'))
		self.assertEqual(True, allNames.has_key('Jablonski, T.'))
		self.assertEqual(True, allNames.has_key('Hsueh, Z.'))

	def testErdosNum(self):
		sNum, nPaper, nPerson = extractInfo(self.lines)
		erdosNum = erdosNumber("sample.txt")

		self.assertEqual(1, erdosNum[stripWhiteSpaces(self.lines[6])])
		self.assertEqual(-1, erdosNum[stripWhiteSpaces(self.lines[7])])	
		self.assertEqual(2, erdosNum[stripWhiteSpaces(self.lines[8])])	
		
		

if __name__=='__main__':
	#unittest.main(argv=(,'-v'))
	erdosNumber("sample.txt")
	

----
ErdosNumbers