<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="wix.bootstrapper" type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.BootstrapperSectionGroup, BootstrapperCore">
<section name="host" type="Microsoft.Tools.WindowsInstallerXml.Bootstrapper.HostSection, BootstrapperCore" />
</sectionGroup>
</configSections>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
</startup>
<wix.bootstrapper>
<host assemblyName="Bootstrapper.UI">
<supportedFramework version="v4\Full" />
<supportedFramework version="v4\Client" />
</host>
</wix.bootstrapper>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle Name="Bootstrapper" Version="!(bind.packageVersion.Msi_Installer)" Manufacturer="Justin" UpgradeCode="1b9106f0-5ba8-4857-ac0a-c1becba1fe51">
<BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">
<Payload SourceFile="$(var.Bootstrapper.UI.TargetPath)" />
<Payload SourceFile="$(var.Bootstrapper.UI.ProjectDir)BootstrapperCore.config"/>
<Payload SourceFile="$(var.Bootstrapper.UI.TargetDir)BootstrapperCore.dll"/>
<Payload SourceFile="$(var.Bootstrapper.UI.TargetDir)Microsoft.Deployment.WindowsInstaller.dll"/>
</BootstrapperApplicationRef>
<Chain>
<PackageGroupRef Id="NetFx462Web"/>
<MsiPackage Id="Msi_Installer" SourceFile="$(var.Installer.TargetPath)" EnableFeatureSelection="yes" Compressed="yes" />
</Chain>
</Bundle>
</Wix>
protected override void Run()
{
WaitForDebugger();
InitializePackages();
_BootstrapDispatcher = Dispatcher.CurrentDispatcher;
// should UI be displayed
if (Command.Display == Display.Full || Command.Display == Display.Unknown)
{
Engine.Log(LogLevel.Verbose, "Launching custom UX");
_InstallerWindowViewModel = new InstallerWindowViewModel(this);
InstallerWindow installerWindow = new InstallerWindow
{
DataContext = _InstallerWindowViewModel
};
installerWindow.Closed += (s, e) => _BootstrapDispatcher.InvokeShutdown();
installerWindow.Show();
Dispatcher.Run();
Engine.Quit(_ErrorCode);
}
else
{
DetectComplete += (sender, args) => Plan(Command.Action);
PlanComplete += (sender, args) => Execute();
ExecuteComplete += (sender, args) =>
{
Engine.Quit(args.Status);
_BootstrapDispatcher.InvokeShutdown();
};
Detect();
Dispatcher.Run();
}
}
private void WaitForDebugger()
{
if (Command.GetCommandLineArgs().Contains("DEBUG"))
{
Engine.Log(LogLevel.Verbose, "Waiting for debugger to be attached...");
while (!Debugger.IsAttached)
{
Thread.Sleep(500);
}
Debugger.Break();
}
}
private readonly XNamespace ManifestName = "http://schemas.microsoft.com/wix/2010/BootstrapperApplicationData";
…
private void InitializePackages()
{
const string DataFilePathName = "BootstrapperApplicationData.xml";
const string ApplicationDataNamespace = "BootstrapperApplicationData";
const string MbaPrereqNamespace = "WixMbaPrereqInformation";
const string PackageNamespace = "WixPackageProperties";
const string FeatureNamespace = "WixPackageFeatureInfo";
var workingDir = Path.GetDirectoryName(GetType().Assembly.Location);
var dataFilePath = Path.Combine(workingDir, DataFilePathName);
XElement applicationData = null;
try
{
using (var reader = new StreamReader(dataFilePath))
{
var xml = reader.ReadToEnd();
var xDoc = XDocument.Parse(xml);
applicationData = xDoc.Element(ManifestName + ApplicationDataNamespace);
}
}
catch (Exception ex)
{
Engine.Log(LogLevel.Error, $"Unable to parse {DataFilePathName}.\nReason: {ex.Message}");
}
var mbaPrereqs = applicationData.Descendants(ManifestName + MbaPrereqNamespace)
.Select(x => new MbaPrereqPackage(x));
// exclude prereq packages
Packages = applicationData.Descendants(ManifestName + PackageNamespace)
.Select(x => new BundlePackage(x))
.Where(pkg => !mbaPrereqs.Any(preReq => preReq.PackageId == pkg.Id))
.ToArray();
// get features and associate with their package
var featureNodes = applicationData.Descendants(ManifestName + FeatureNamespace);
foreach (var featureNode in featureNodes)
{
var feature = new PackageFeature(featureNode);
var parentPkg = Packages.First(pkg => pkg.Id == feature.PackageId);
parentPkg.Features.Add(feature);
feature.Package = parentPkg;
}
}
Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:
1634 = 14 + 64 + 34 + 44
8208 = 84 + 24 + 04 + 84
9474 = 94 + 44 + 74 + 44As 1 = 14 is not a sum it is not included.
The sum of these numbers is 1634 + 8208 + 9474 = 19316.
Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.
using System;
using System.Diagnostics;
namespace Project_Euler_30
{
internal class Program
{
// 5x9^5 has 6 digits, so the upper bound should be 6x9^6
private const int UpperBound = 59049 * 6;
private static readonly int[] powersCache = new int[] { 0, 1, 32, 243, 1024, 3125, 7776, 16807, 32768, 59049 };
private static void Main(string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
int result = 0;
// start the loop at 243 since that is the lower bound (3^5) of a possible sum
for(int i = powersCache[3]; i <= UpperBound; i++)
{
int sum = 0;
int workingNumber = i;
while(workingNumber > 0)
{
int digit = workingNumber % 10;
workingNumber /= 10;
sum += powersCache[digit];
if(sum > i)
{
// passed the number, stop checking
break;
}
}
if(sum == i)
{
result += i;
}
}
sw.Stop();
Console.WriteLine($"Sum of results: {result}");
Console.WriteLine($"Took {sw.ElapsedMilliseconds}ms");
}
}
}
Consider all integer combinations of ab for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5:
22=4, 23=8, 24=16, 25=32
32=9, 33=27, 34=81, 35=243
42=16, 43=64, 44=256, 45=1024
52=25, 53=125, 54=625, 55=3125If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
How many distinct terms are in the sequence generated by ab for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100?
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Project_Euler_29
{
internal class Program
{
private static void Main(string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
HashSet<double> results = new HashSet<double>();
for (int a = 2; a <= 100; a++)
{
for (int b = 2; b <= 100; b++)
{
results.Add(Math.Pow(a, b));
}
}
sw.Stop();
Console.WriteLine($"Number of distinct powers: {results.Count}");
Console.WriteLine($"Took {sw.ElapsedMilliseconds}ms");
}
}
}
Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13It can be verified that the sum of the numbers on the diagonals is 101.
What is the sum of the numbers on the diagonals in a 1001 by 1001 spiral formed in the same way?
using System;
using System.Diagnostics;
using System.Linq;
namespace ProjectEuler_28
{
internal class Program
{
private static void Main(string[] args)
{
const int squareSize = 1001;
Stopwatch sw = Stopwatch.StartNew();
int half = (int)Math.Ceiling(squareSize / 2D) - 1;
int[] topRight = new int[half];
int[] topLeft = new int[half];
int[] bottomLeft = new int[half];
int[] bottomRight = new int[half];
int idx = 0;
for (int i = squareSize; i > 1;)
{
topRight[idx] = i * i;
topLeft[idx] = topRight[idx] - i + 1;
bottomLeft[idx] = topLeft[idx] - i + 1;
bottomRight[idx] = bottomLeft[idx] - i + 1;
i = (int)Math.Floor(Math.Sqrt(bottomRight[idx]));
idx++;
}
sw.Stop();
Console.WriteLine($"Sum of diagonols: {topRight.Sum() + topLeft.Sum() + bottomLeft.Sum() + bottomRight.Sum() + 1} in {sw.ElapsedTicks} ticks");
}
}
}
Euler discovered the remarkable quadratic formula:
n2 + n + 41
It turns out that the formula will produce 40 primes for the consecutive integer values 0 ≤ n ≤ 39. However, when n = 40, 402 + 40 + 41 = 40(40 + 1) + 41 is divisible by 41, and certainly when n = 41, 412 + 41 + 41 is clearly divisible by 41.
The incredible formula n2 - 79n + 1601 was discovered, which produces 80 primes for the consecutive values 0 ≤ n ≤ 79. The product of the coefficients, −79 and 1601, is −126479.
Considering quadratics of the form:
n2 + an + b, where |a| < 1000 and |b| ≤ 1000where |n| is the modulus/absolute value of n
e.g. |11| = 11 and |-4| = 4Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n = 0.
using Common.Math;
using System;
using System.Diagnostics;
using System.Linq;
namespace ProjectEuler_27
{
internal class Program
{
private static int[] primeCache = Eratosthenes.GetPrimes(1000).ToArray();
private static bool IsPrime(int num)
{
if (num > primeCache.Last())
{
primeCache = Eratosthenes.GetPrimes(primeCache.Last() * 2);
}
// array.contains checks every value, these are in order from smallest to largest
// so creating our own contains is more efficient.
int i = 0;
while (i < primeCache.Length && primeCache[i] < num)
{
i++;
}
return primeCache[i] == num;
}
private static void Main(string[] args)
{
Stopwatch sw = Stopwatch.StartNew();
ResultHelper result = new ResultHelper();
// 'b' must be prime because when n=0 we get 0^2 + a(0) + b which is just 'b'
// since 0 is inclusive and all results must be prime, we can narrow down 'b' to just prime numbers
int[] bPossibles = primeCache;
// we can also narrow down 'a' possiblities because all primes except for 2 are odd
// so if n=1 we get 1^2 + a(1) + b = 1 + a + b
// since an odd added to an odd is always even, we know that for all cases except 2 'a' must be odd
// in the case of 2 'a' must be even
for (int a = -999; a < 1000; a += 2)
{
for (int bIdx = 0; bIdx < bPossibles.Length; bIdx++)
{
// handle the case of b=2
int workingA = bPossibles[bIdx] == 2 ? a - 1 : a;
int n = 0;
while (IsPrime(Math.Abs(n * n + workingA * n + bPossibles[bIdx])))
{
n++;
}
if (result.Count < n)
{
result = new ResultHelper
{
A = a,
B = bPossibles[bIdx],
Count = n
};
}
}
}
sw.Stop();
Console.WriteLine($"{result.Count} primes found in {sw.ElapsedMilliseconds}ms when a={result.A} and b={result.B} with a product of {result.A * result.B}.");
}
private struct ResultHelper
{
public int A;
public int B;
public int Count;
}
}
}