-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathRemixSeeding.cs
80 lines (76 loc) · 3.09 KB
/
RemixSeeding.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using SeedFinding.Bundles;
namespace SeedFinding
{
public class RemixSeeding
{
// defining the specific bundles needed
public const ulong DesiredBundles = (
// crafts
CompressedFlags.CRAFTS_SPRING_FORAGE_WILD_HORSERADISH
| CompressedFlags.CRAFTS_SPRING_FORAGE_DAFFODIL
| CompressedFlags.CRAFTS_SPRING_FORAGE_LEEK
| CompressedFlags.CRAFTS_SPRING_FORAGE_DANDELION
| CompressedFlags.CRAFTS_WINTER_FORAGE_SNOW_YAM
| CompressedFlags.CRAFTS_WINTER_FORAGE_WINTER_ROOT
| CompressedFlags.CRAFTS_WINTER_FORAGE_CROCUS
| CompressedFlags.CRAFTS_CONSTRUCTION
| CompressedFlags.CRAFTS_EXOTIC
// pantry
| CompressedFlags.PANTRY_RARE
| CompressedFlags.PANTRY_ARTISAN
| CompressedFlags.PANTRY_GARDEN
// fish
| CompressedFlags.FISH_QUALITY
// boiler
| CompressedFlags.BOILER_BLACKSMITH
| CompressedFlags.BOILER_GEOLOGIST
| CompressedFlags.BOILER_ADVENTURER
| CompressedFlags.BOILER_ADVENTURER_SOLAR_ESSENCE
| CompressedFlags.BOILER_ADVENTURER_VOID_ESSENCE
// bulletin
| CompressedFlags.BULLETIN_FODDER
| CompressedFlags.BULLETIN_CHILDREN
| CompressedFlags.BULLETIN_FIELD_RESEARCH
| CompressedFlags.BULLETIN_ENCHANTER
| CompressedFlags.BULLETIN_DYE
| CompressedFlags.BULLETIN_DYE_RED_MUSHROOM
| CompressedFlags.BULLETIN_DYE_AMARANTH
| CompressedFlags.BULLETIN_DYE_SUNFLOWER
| CompressedFlags.BULLETIN_DYE_CACTUS_FRUIT
| CompressedFlags.BULLETIN_DYE_BLUEBERRY
| CompressedFlags.BULLETIN_DYE_IRIDIUM_BAR
);
static bool ValidSeed(uint seed)
{
return RemixedBundles.Generate(seed).Satisfies(DesiredBundles);
}
// parallel search
public static double Search(int numSeeds, int blockSize, out List<uint> validSeeds)
{
Stopwatch stopwatch = Stopwatch.StartNew();
var bag = new ConcurrentBag<uint>();
var partioner = Partitioner.Create(0, numSeeds, blockSize);
Parallel.ForEach(partioner, (range, loopState) =>
{
for (uint seed = (uint)range.Item1; seed < range.Item2; seed++)
{
if (ValidSeed(seed))
{
bag.Add(seed);
}
}
});
double seconds = stopwatch.Elapsed.TotalSeconds;
Console.WriteLine($"Found: {bag.Count} sols in {seconds.ToString("F2")} s");
validSeeds = bag.ToList();
validSeeds.Sort();
return seconds;
}
}
}