示例#1
0
def main():
    global ttf_font, font_size, unit
    import argparse
    parser = argparse.ArgumentParser(description='NumberLink check and drawing tool')
    parser.add_argument('-f', '--font', default=ttf_font, help='TrueType font file (default: %(default)s)')
    parser.add_argument('--font-size', metavar='N', type=int, default=font_size, help='font size (default: %(default)s)')
    parser.add_argument('--unit', metavar='N', type=int, default=unit, help='unit square size (default: %(default)s)')
    parser.add_argument('--test', action='store_true', help='test GIF output')
    parser.add_argument('qfile', metavar='Q-FILE', help='input file (Q-file)')
    parser.add_argument('afile', metavar='A-FILE', help='target file (A-file)')
    args = parser.parse_args()
    ttf_font = args.font
    font_size = args.font_size
    unit = args.unit
    setup_font(ttf_font)
    if args.test:
        test()
    qfile = args.qfile
    afile = args.afile
    print(qfile, afile)
    nlc = NLCheck()
    q = nlc.read_input_file(qfile)
    a = nlc.read_target_file(afile)
    #print("q=",q)
    #print("a=",a)
    #a = nlc.clean_a(q, a)
    # 回答をチェックする
    nlc.verbose = True
    judges = nlc.check( q, a )
    print("judges = ", judges)
    # 描画する
    images = draw(q, a, nlc)
    bfile = os.path.basename(qfile)
    bfile = os.path.splitext(bfile)[0] # 拡張子をトル
    for num, img in enumerate(images):
        ifile = "%s.%d.gif" % (bfile, num+1) # 層の番号は1から始まる
        img.save(ifile, 'gif')
        print(ifile)
    if 1 < len(images):
        merge_images(images).save(bfile+'.gif', 'gif')
示例#2
0
文件: nldraw.py 项目: dasadc/conmgr
def main():
    qfile, afile = sys.argv[1:]
    afile = sys.argv[2]
    print qfile, afile
    nlc = NLCheck()
    q = nlc.read_input_file(qfile)
    a = nlc.read_target_file(afile)
    #print "q=",q
    #print "a=",a
    #a = nlc.clean_a(q, a)
    # 回答をチェックする
    nlc.verbose = True
    judges = nlc.check(q, a)
    print "judges = ", judges
    # 描画する
    images = draw(q, a, nlc)
    bfile = basename(qfile)
    bfile = re.sub("\.txt", "", bfile)
    num = 0
    for img in images:
        ifile = "%s.%d.gif" % (bfile, num)
        img.writeGif(ifile)
        print ifile
        num += 1
示例#3
0
文件: nldraw.py 项目: kotarot/conmgr
def main():
    qfile, afile = sys.argv[1:]
    afile = sys.argv[2]
    print qfile,afile
    nlc = NLCheck()
    q = nlc.read_input_file(qfile)
    a = nlc.read_target_file(afile)
    #print "q=",q
    #print "a=",a
    #a = nlc.clean_a(q, a)
    # 回答をチェックする
    nlc.verbose = True
    judges = nlc.check( q, a )
    print "judges = ", judges
    # 描画する
    images = draw(q,a,nlc)
    bfile = basename(qfile)
    bfile = re.sub("\.txt", "", bfile)
    num = 0
    for img in images:
        ifile = "%s.%d.gif" % (bfile, num)
        img.writeGif(ifile)
        print ifile
        num += 1
示例#4
0
def solve(num):
    global project_dir
    o = NLCheck()
    output_info = info['output_info'][num]
    via_to_line = get_via_to_line(info, num)
    adata = 'SIZE %dX%dX%d\r\n' % info['size']
    fail = False
    cwd = os.getcwd()
    #---------------------------------------
    os.chdir(project_dir)
    for layer, info2 in sorted(output_info.items()):
        if layer[0] != 'L' or not layer[1:].isdigit():
            continue
        qfile = info2['ofile']
        afile = exec_solver(qfile)
        #print layer, qfile, afile
        input_data = o.read_input_file(qfile)
        target_data = o.read_target_file(afile)
        target_data2 = o.clean_a(input_data, target_data)
        judges = o.check(input_data, target_data2)
        best = best_target(judges)
        print "judges = ", judges
        print "best = ", best
        #print "best target_data = ", target_data2[best[0]]
        ilayer = int(layer[1:])  # 1,2,…
        via_linenum = get_via_linenum_mat(info, ilayer, via_to_line)
        adata += 'LAYER %d\r\n' % ilayer
        if best[0] is None:
            fail = True
            break
        else:
            bd = target_data2[best[0]]
            adata += generate_A_data(bd, info2['map_line_num'], via_linenum)
            if 0:
                root, ext = os.path.splitext(afile)
                gfile = root + '.gif'
                gif = o.graphic_gif(input_data, [bd], gfile)
                print "gif = ", gif
    os.chdir(cwd)
    #---------------------------------------
    if fail:
        output_info['judges'] = None
        return None
    else:
        # afile: 2016年版ルールの回答ファイルの名前
        root, ext = os.path.splitext(os.path.basename(info['convert_q']))
        afile = root + ('.%d.A.txt' % num)
        afile2 = os.path.join(project_dir, afile)
        with open(afile2, 'w') as fp:
            fp.write(adata)
        # 2016年版ルールで回答チェック
        input_data = o.read_input_file(info['convert_q'])
        target_data = o.read_target_str(adata)
        judges = o.check(input_data, target_data)
        print "afile = ", afile
        print "judges = ", judges
        output_info['afile'] = afile
        output_info['judges'] = judges
        if judges[0][0]:
            # 正解が出た
            gfile = root + ('.%d.A.gif' % num)
            gfile2 = os.path.join(project_dir, gfile)
            gif = o.graphic_gif(input_data, target_data, gfile2)
            print "gif = ", gif

        return afile
示例#5
0
def convert(qfile, candidates=None):
    "2016年版ルールの問題ファイルを、変換する"
    o = NLCheck()
    res = o.read_input_file(qfile)
    if debug:
        label = ['size', 'line_num', 'line_mat', 'via_mat', 'via_dic']
        for i in range(0, 5):
            print label[i], '=\n', res[i]

    size, org_line_num, line_mat, via_mat, via_dic = res
    layer_num = size[2]
    qs = []
    found_linevia = {}
    for layer in range(1, layer_num + 1):
        line_num1 = 0
        line_num2 = 0
        lineinfo = []
        linevia = []  # このlayerで、線とviaがつながっている
        for line in line_mat:
            line_num1 += 1
            if line[2] == line[5] and line[2] == layer:
                # 1つのレイヤー内で完結している線
                line_num2 += 1
                lineinfo.append({
                    'LINE#': line_num1,
                    'pos0': (line[0], line[1]),
                    'pos1': (line[3], line[4])
                })
            elif line[2] == layer:
                line_num2 += 1
                lineinfo.append({
                    'LINE#': line_num1,
                    'pos0': (line[0], line[1]),
                    'pos1': None
                })
                linevia.append(line_num1)
                found_linevia[line_num1] = True
            elif line[5] == layer:
                line_num2 += 1
                lineinfo.append({
                    'LINE#': line_num1,
                    'pos0': (line[3], line[4]),
                    'pos1': None
                })
                linevia.append(line_num1)
                found_linevia[line_num1] = True
        qs.append({
            'SIZE': (size[0], size[1]),
            'LINE_NUM': line_num2,
            'LINE': lineinfo,
            'linevia': linevia
        })

    #print qs
    #print "qs[0]['LINE']=\n", qs[0]['LINE']
    #print "qs[1]['LINE']=\n", qs[1]['LINE']
    global_linevia = sorted(found_linevia)
    if debug: print "global_linevia=", global_linevia

    # エラーチェック: すべてのlayerで、lineviaは一致する ★それは2層の場合だけ
    #for layer in range(1, layer_num):
    #    #print "qs[%d]['linevia']=" % (layer-1), qs[layer-1]['linevia']
    #    #print "qs[%d]['linevia']=" % (layer), qs[layer]['linevia']
    #    if qs[layer-1]['linevia'] != qs[layer]['linevia']:
    #        print "Error in via: layer %d and %d" % (layer, layer+1)
    #    if len(via_dic) != len(qs[layer-1]['linevia']):
    #        print "Error in number of via: layer %d" % layer
    # ★3層以上の場合を考慮
    # エラーチェック: 数字マスはviaを経由してつながっている
    # = 対となるlineviaがあるはず
    # = 2回ずつ出現するはず
    count_linevia = {}
    for layer in range(1, layer_num + 1):
        for n in qs[layer - 1]['linevia']:
            if n in count_linevia:
                count_linevia[n] += 1
            else:
                count_linevia[n] = 1
    if debug: print "count_linevia=", count_linevia
    for n in global_linevia:
        if count_linevia[n] != 2:
            print "Error: please check connection between line#%d and via"

    vias = sorted(via_dic.keys())
    if candidates is None:
        candidates = []
        assign_via_line(vias, [], candidates)

    info['size'] = size  # layer_numは、size[2]
    info['org_line_num'] = org_line_num
    info['line_mat'] = line_mat
    info['via_mat'] = via_mat
    info['via_dic'] = via_dic
    info['qs'] = qs
    info['vias'] = vias
    info['global_linevia'] = global_linevia
    info['candidates'] = candidates
    info['output_info'] = [None] * (1 + len(candidates))
    idx = 0
    for c in candidates:
        info['output_info'][idx] = output_q(global_linevia, org_line_num, qs,
                                            c, via_mat, via_dic, qfile, idx)
        idx += 1