White scenery @showyou, hatena

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

GCJJ 予選に参加した

結果としては敗退。A,Cを解いたのだけど、Aは手を抜いて作ったのでlargeがメモリ不足、Cは考え方としては間違ってないが多分longあたりちゃんととってなくて間違ってた。

それはともかく手を抜いたり変数名適当だったりていい加減っすね。

A

# -*- coding:utf-8 -*-
#Read input file
import sys

def p(s):
    #print s
    pass

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


def searchcard(cond, suffle_patterns):
    M, C, W = cond
    # データ作る
    #print M
    data = [i+1 for i in xrange(0,int(M))]

    for sp in suffle_patterns:
        p("状態")
        p(data)
        a = int(sp[0])-1
        b = int(sp[1])
        #p a,b
        data_sub = data[a:a+b]
        #print "sub,",data_sub
        data[a:a+b] = []
        p( "before:")
        p(data)
        data= data_sub + data
        p("after:")
        p(data)
    return data[int(W)-1]


def fileOpen(fileName):
    f = open(fileName)
    i = 0

    c = 0
    t = 0
    setting = {}
    testData = []
    testDataSub = []
    for line in f:
        if i == 0:
            #parse first line
            t = int(line[:-1])
            #p("t",t)
        elif c == 0:
            t -= 1
            #print("t2")
            #print line[:-1]
            if i > 1:
                testData.append(testDataSub)
                testDataSub = []
            if t < 0: break
            M, C, W = line[:-1].split()
            c = int(C)
            #print("M,C,W ", M,C,W)
            testDataSub.append((M,C,W))
        elif t >= 0:
            # A_i, B_i相当
            aibi = line[:-1].split()
            testDataSub.append(aibi)
            #p(aibi)
            c -= 1
        i += 1
    if testDataSub != []:
        testData.append(testDataSub)
        testDataSub = []
    return setting, testData

def parseFirstLine(str):
        """
        """
        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"

B

# -*- coding:utf-8 -*-
#Read input file
import sys

from math import log

def p(s):
    #print s
    pass

def p2(s):
    #print s,
    pass


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

def f(x):
    """
       >>> f(5)
       2
       >>> f(10**18)
       36
    """
    s = format(x,'b')
    r = 0
    for s2 in s:
        if s2=='1': r+=1
    return r


def calc(d):
    # データ作る
    m = int(log(d+1,2))
    p("d,m")
    p(d)
    p(m)
    #max_f = 0
    #for i in xrange(0,m):
    #n = m-i
    p("n"),
    p(m)
    a = 2**m-1
    b = d-a
    p2("a:")
    p2(a)
    p2(" b:")
    p2(b)
    fa = f(a)
    fb = f(b)
    p2("fa:")
    p2(fa)
    p2("fb:")
    p(fb)
    #if max_f < fa+fb:
    max_f = fa+fb
    return max_f


def fileOpen(fileName):
    f = open(fileName)
    i = 0
    c = 0
    t = 0
    setting = {}
    testData = []
    for line in f:
        if i == 0:
            #parse first line
            t = int(line[:-1])
            #p("t",t)
        else :
            testData.append(int(line[:-1]))
        i += 1
    return setting, testData


def parseFirstLine(str):
        """
        """
        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"