self-evolving seeds. 
This is the first time I'm hearing that term. What does it meanlike a DNA chain or something?
The challenge here is automating the expansion of the prefix. Each time a valid seed is found, i take a portion of its bytes as the new constant prefix. The key steps are:
1. Iteratively build up the constant prefix.
2. For each iteration, search for a seed with the current prefix followed by random bytes that produces a dec starting with the target string.
3. Once found, expand the prefix by taking some bytes from the found seed.
4. Repeat until the target string's required length is matched or no progress is made.
For example
import random, os
puzzle = 65
lower_range_limit = 2 ** (puzzle - 1)
upper_range_limit = (2 ** puzzle) - 1
for x in range(1000000000000):
constant_prefix = b''
prefix_length = len(constant_prefix)
length = 9
ending_length = length - prefix_length
ending_bytes = os.urandom(ending_length)
random_bytes = constant_prefix + ending_bytes
random.seed(random_bytes)
dec = random.randint(lower_range_limit, upper_range_limit)
if str(dec).startswith("3056"):
print(dec, random_bytes)
break
Define the target decimal string as "30568377312064202855".
Start with an empty prefix.
Start with a target prefix length of 4 .
In each iteration:
Generate random seeds with current prefix + random bytes to make up total length (fixed to 9 bytes).
For each seed, set the random state and generate dec.
Check if dec starts with current target prefix.
If found, extract the seed bytes used.
Extend the constant prefix by taking additional bytes from the beginning of the seed.
Increase the target prefix length (e.g., add 2 digits each time if possible).
Repeat until target prefix reaches 10 digits or more, or no solution found.
So the first target is "3056", then "30568", then "305683", etc., up to at least 10 digits.
Then hit the next puzzle. Keep going in a loop till you land on the same seed for three of 'em.
Coming up with a script to automate that is a real pain to brainstorm..
