White scenery @showyou, hatena

If you have any comments, you may also send twitter @shsub or @showyou.

Google Code Jam-Qualification Round

さりげなく参加してた。この手のイベントは初めて。TopCoderとかも参加したことがない。


Qualification Round,AがLarge含めてOK,Cはshortのみで43点で通過。ただ他の人のコードと比べてもコードが酷い。否応なしにコードの酷さとか理解できるので勉強するにはいい場ですね。一方で問題提出してそれがOKでると自分の努力をちょびっと認められた気分になってうれしいです。

A

与えられた文字列がエイリアンの言語にいくつマッチしてるか数える。(,)を[,]に変えて正規表現で比較するだけ。あまりにあっさり解けすぎてLarge合ってるかどうか心配だった・・問題を理解するのに95%くらい時間がかかった気がする。

B

水の流れる範囲でマップを色分けする。「高いとこから降りてきたときに、既にラベルのついてるセルに来たら"その回の一番上のセルから全て"そのラベルに付け直す」っていう処理が無かったんだと思う。多分。

C

"wweellccoommee to code jam"のような文字列が与えられたとき、"welcome to code jam"と文字列を取り出す方法は何通りあるか数える問題。バカ正直に一個ずつ一致するかどうか見ていったらLargeが時間超えまくりで駄目だった。多分検索とかでよく知られてるやり方があるんだろうなぁ。



あと問題解いてるときにいろいろ覚えたこと。

  • doctestまじ便利。
  • tuple受け取り使えそう。(a,b,c) = str.splitみたいに。
  • 空白区切りはsplit()でok
  • cでいう(char)('c'+ i)ってどうやるんだ?
  • 二重配列でyの高さ求める式は?len(result)でいいの?

ソース

A

q1.py

#Read input file
import sys
from searchword import searchword

def main(fileName):
	setting, known, testData = fileOpen(fileName)
	i = 0
	for t in testData:
		i += 1
		count = searchword(known,t)
		print "Case #%d: %d" % (i,count)

def fileOpen(fileName):
	f = open(fileName)
	i = 0
	setting = {}
	known = []
	testData = []
	for line in f:
		if i == 0:
			#parse first line
			setting = parseFirstLine(line[:-1])
		elif i < int(setting["D"]+1):
			#known alien language
			known.append(line[:-1])
		elif i < int(setting["N"])+int(setting["D"]+1):
			testData.append(line[:-1])
		i += 1
	return setting, known, testData

def parseFirstLine(str):
	"""
		>>> parseFirstLine("3 5 4")
		{'N': 4, 'L': 3, 'D': 5}
	"""
	result={}
	(result["L"],result["D"],result["N"]) = str.split()
	for i in result.keys():
		result[i] = int(result[i])
	return result 

if __name__ == "__main__":
	if len(sys.argv) > 1:
		main(sys.argv[1])
	else:
		import doctest
		doctest.testmod(verbose=True)
		#"usage: exefile inputfile"

searchword.py

"""
	abc-> 1 hit
	>>> searchword(['abc','bca','dac','dbc','cba'],'abc')
	1
	>>> searchword(['abc','bca','dac','dbc','cba'],'(abc)(abc)(abc)')
	3
"""
import re
def searchword(known,testWord):
	count = 0
	testWord = testWord.replace("(","[")
	testWord = testWord.replace(")","]")
	#print testWord
	p = re.compile(testWord)
	for k in known:
		if p.match(k):
			count += 1
	return count

def _test():
	import doctest
	doctest.testmod(verbose=True)

if __name__ == "__main__":
	_test()
C

q3.py

#Read input file
import sys
from searchword import searchword

def main(fileName):
	setting, data = fileOpen(fileName)
	i = 1
	for d in data:
		result = searchword(d)
		print "Case #%d: %04d" % (i ,result)
		i += 1
		if i > setting:
			break

def fileOpen(fileName):
	f = open(fileName)
	i = 0
	data = []
	for line in f:
		if i == 0:
			#parse first line
			setting = int(line[:-1])
		else:
			data.append(line[:-1])
		#print line
		i += 1
	return setting,data

if __name__ == "__main__":
	if len(sys.argv) > 1:
		main(sys.argv[1])
	else:
		#import doctest
		#doctest.testmod(verbose=True)
		print "usage: exefile inputfile"

searchword.py

"""
find "wweellccoommee to .." -> "welcome to .."
"""
def print_d(str):
	#print str
	pass

def searchword(input,checkword="welcome to code jam"):
	
	index = [0 for i in range(len(checkword))]
	pos = 0 # position of checkword
	count = 0 # success count for search word
	while True:
		findFlag = False
		matchFlag = False
		c = checkword[pos]
		for p in range( index[pos], len(input) ):
			print_d("compare " + c + " with " + input[p] + " p:" + str(p))
			if c == input[p]:
				print_d("ok")
				# if success for search, count += 1
				if pos >= len(checkword)-1:
					count = (count + 1) % 10000 
					index[pos] = p+1
					matchFlag = True
					print_d("match")
				else:
					print_d( "pos:" + str(pos))
					index[pos]   = p
					index[pos+1] = p+1
					pos += 1
					findFlag = True
				break

		if findFlag == False and matchFlag == False:
			# if don't find, pos -1 and index[pos] += 1
			print_d("return")
			pos -= 1
			index[pos] += 1
			if pos < 0:
				break
	return count

def _test():
	import doctest
	doctest.testmod(verbose=True)

if __name__ == "__main__":
	#print searchword("abbc","abc")
	print searchword("welcome to code jaam") #1
	print searchword("wweellccoommee to code qps jam") #256
	print searchword("welcome to codejam") #0
	print searchword("ewl") #0
	print searchword("wweellccoommee to code qps jjaamm") #2048?