写了一个数据生成器(写到一半)
查看原帖
写了一个数据生成器(写到一半)
1402836
d0u28u楼主2024/11/30 22:22

如题,写到一半先发出来,不确定有没有时间写完
希望对大家有帮助

import random

rng = random.Random()

def gen_s(n):
    return "".join(rng.choice("01") for _ in range(n))

def gen_t(n):
    return "".join(rng.choice("01") for _ in range(n))

def gen_t_c(n):
    L = ["1" for _ in range(n)]
    L[rng.randrange(n)] = "0"
    return "".join(L)

# 未写完也未调用,如果要用请自己完善...
def brute_force_solve(s1, s2, t1, t2):
    intervals1, intervals2 = get_operable_intervals(t1), get_operable_intervals(t2)
    # Describe the contents of each interval by 2-tuple (number of 0's, number of 1's)
    q1, q2 = describe(s1, intervals1), describe(s2, intervals2)

    # Permute every interval
    # Time complexity: (number of intervals)(2**(length of this interval)) (?)
    s1 = list(s1)
    s2 = list(s2)

    intervals = intervals1 + intervals2
    for interval in intervals:
        ...

def describe(s, t):
    ...

def get_operable_intervals(t):
    intervals = [] # Each (a, b) represents $[a,b]$ (i.e. include endpoints)
    a = 0
    length = len(t)

    while a < length:
        if t[a] == "0":
            intervals.append((a, a))
            a += 1
            continue

        b = a
        while b + 1 < length and t[b+1] == "1":
            b += 1

        intervals.append((a, b))
        a = b + 1

    return intervals


def loop():
    # 这段代码可用于保存RNG种子,后面可用rng.setstate()复现(?需要吗)
    #with open("randstate.txt", "x") as f:
    with open("randstate.txt", "w") as f:
        print(rng.getstate(), file=f)

    try:
        while True:
            # 每次生成指定n的数据,若末尾加'c'则生成符合特殊条件C的数据
            s = input("> ")
            c = s.endswith("c")
            if c: s = s.rstrip(" c")
            n = int(s)
            print(gen_s(n))
            print(gen_s(n))
            t_func = gen_t_c if c else gen_t
            print(t_func(n))
            print(t_func(n))
    except KeyboardInterrupt:
        pass

if __name__ == "__main__":
    loop()

演示:

  • 每次生成指定n的数据,若末尾加'c'则生成符合特殊条件C的数据
  • 会用randstate.txt存储RNG状态,虽然不知道有没有意义
  • 暴力解代码没写完
> 5
10101
01010
01000
01101
> 10
1011011011
0110110010
0101100011
1100101111
> 10c
1000100001
0100000100
0111111111
1111111110
2024/11/30 22:22
加载中...