diff --git a/default_arg.c b/c/default_arg.c similarity index 100% rename from default_arg.c rename to c/default_arg.c diff --git a/machine_learning/mlclass-ex1-008/ex1.pdf b/machine_learning/mlclass-ex1-008/ex1.pdf new file mode 100644 index 0000000..16b8de1 Binary files /dev/null and b/machine_learning/mlclass-ex1-008/ex1.pdf differ diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/computeCost.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/computeCost.m new file mode 100644 index 0000000..8cc8323 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/computeCost.m @@ -0,0 +1,22 @@ +function J = computeCost(X, y, theta) +%COMPUTECOST Compute cost for linear regression +% J = COMPUTECOST(X, y, theta) computes the cost of using theta as the +% parameter for linear regression to fit the data points in X and y + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta +% You should set J to the cost. + +%X = [ones(m,1) X]; +J = sum( (X*theta - y) .^ 2 ) / (2*m); + + +% ========================================================================= + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/computeCostMulti.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/computeCostMulti.m new file mode 100644 index 0000000..9c2c881 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/computeCostMulti.m @@ -0,0 +1,22 @@ +function J = computeCostMulti(X, y, theta) +%COMPUTECOSTMULTI Compute cost for linear regression with multiple variables +% J = COMPUTECOSTMULTI(X, y, theta) computes the cost of using theta as the +% parameter for linear regression to fit the data points in X and y + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta +% You should set J to the cost. + + +J = sum( (X*theta - y) .^ 2 ) / (2*m); + + +% ========================================================================= + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1.m new file mode 100644 index 0000000..33a0a0c --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1.m @@ -0,0 +1,122 @@ +%% Machine Learning Online Class - Exercise 1: Linear Regression + +% Instructions +% ------------ +% +% This file contains code that helps you get started on the +% linear exercise. You will need to complete the following functions +% in this exericse: +% +% warmUpExercise.m +% plotData.m +% gradientDescent.m +% computeCost.m +% gradientDescentMulti.m +% computeCostMulti.m +% featureNormalize.m +% normalEqn.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% +% x refers to the population size in 10,000s +% y refers to the profit in $10,000s +% + +%% Initialization +clear ; close all; clc + +%% ==================== Part 1: Basic Function ==================== +% Complete warmUpExercise.m +fprintf('Running warmUpExercise ... \n'); +fprintf('5x5 Identity Matrix: \n'); +warmUpExercise() + +fprintf('Program paused. Press enter to continue.\n'); +pause; + + +%% ======================= Part 2: Plotting ======================= +fprintf('Plotting Data ...\n') +data = load('ex1data1.txt'); +X = data(:, 1); y = data(:, 2); +m = length(y); % number of training examples + +% Plot Data +% Note: You have to complete the code in plotData.m +plotData(X, y); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +%% =================== Part 3: Gradient descent =================== +fprintf('Running Gradient Descent ...\n') + +X = [ones(m, 1), data(:,1)]; % Add a column of ones to x +theta = zeros(2, 1); % initialize fitting parameters + +% Some gradient descent settings +iterations = 1500; +alpha = 0.01; + +% compute and display initial cost +computeCost(X, y, theta) + +% run gradient descent +theta = gradientDescent(X, y, theta, alpha, iterations); + +% print theta to screen +fprintf('Theta found by gradient descent: '); +fprintf('%f %f \n', theta(1), theta(2)); + +% Plot the linear fit +hold on; % keep previous plot visible +plot(X(:,2), X*theta, '-') +legend('Training data', 'Linear regression') +hold off % don't overlay any more plots on this figure + +% Predict values for population sizes of 35,000 and 70,000 +predict1 = [1, 3.5] *theta; +fprintf('For population = 35,000, we predict a profit of %f\n',... + predict1*10000); +predict2 = [1, 7] * theta; +fprintf('For population = 70,000, we predict a profit of %f\n',... + predict2*10000); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +%% ============= Part 4: Visualizing J(theta_0, theta_1) ============= +fprintf('Visualizing J(theta_0, theta_1) ...\n') + +% Grid over which we will calculate J +theta0_vals = linspace(-10, 10, 100); +theta1_vals = linspace(-1, 4, 100); + +% initialize J_vals to a matrix of 0's +J_vals = zeros(length(theta0_vals), length(theta1_vals)); + +% Fill out J_vals +for i = 1:length(theta0_vals) + for j = 1:length(theta1_vals) + t = [theta0_vals(i); theta1_vals(j)]; + J_vals(i,j) = computeCost(X, y, t); + end +end + + +% Because of the way meshgrids work in the surf command, we need to +% transpose J_vals before calling surf, or else the axes will be flipped +J_vals = J_vals'; +% Surface plot +figure; +surf(theta0_vals, theta1_vals, J_vals) +xlabel('\theta_0'); ylabel('\theta_1'); + +% Contour plot +figure; +% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100 +contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 3, 20)) +xlabel('\theta_0'); ylabel('\theta_1'); +hold on; +plot(theta(1), theta(2), 'rx', 'MarkerSize', 10, 'LineWidth', 2); diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1_multi.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1_multi.m new file mode 100644 index 0000000..f733012 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1_multi.m @@ -0,0 +1,159 @@ +%% Machine Learning Online Class +% Exercise 1: Linear regression with multiple variables +% +% Instructions +% ------------ +% +% This file contains code that helps you get started on the +% linear regression exercise. +% +% You will need to complete the following functions in this +% exericse: +% +% warmUpExercise.m +% plotData.m +% gradientDescent.m +% computeCost.m +% gradientDescentMulti.m +% computeCostMulti.m +% featureNormalize.m +% normalEqn.m +% +% For this part of the exercise, you will need to change some +% parts of the code below for various experiments (e.g., changing +% learning rates). +% + +%% Initialization + +%% ================ Part 1: Feature Normalization ================ + +%% Clear and Close Figures +clear ; close all; clc + +fprintf('Loading data ...\n'); + +%% Load Data +data = load('ex1data2.txt'); +X = data(:, 1:2); +y = data(:, 3); +m = length(y); + +% Print out some data points +fprintf('First 10 examples from the dataset: \n'); +fprintf(' x = [%.0f %.0f], y = %.0f \n', [X(1:10,:) y(1:10,:)]'); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +% Scale features and set them to zero mean +fprintf('Normalizing Features ...\n'); + +[X mu sigma] = featureNormalize(X); + +% Add intercept term to X +X = [ones(m, 1) X]; + + +%% ================ Part 2: Gradient Descent ================ + +% ====================== YOUR CODE HERE ====================== +% Instructions: We have provided you with the following starter +% code that runs gradient descent with a particular +% learning rate (alpha). +% +% Your task is to first make sure that your functions - +% computeCost and gradientDescent already work with +% this starter code and support multiple variables. +% +% After that, try running gradient descent with +% different values of alpha and see which one gives +% you the best result. +% +% Finally, you should complete the code at the end +% to predict the price of a 1650 sq-ft, 3 br house. +% +% Hint: By using the 'hold on' command, you can plot multiple +% graphs on the same figure. +% +% Hint: At prediction, make sure you do the same feature normalization. +% + +fprintf('Running gradient descent ...\n'); + +% Choose some alpha value +alpha = 0.01; +num_iters = 400; + +% Init Theta and Run Gradient Descent +theta = zeros(3, 1); +[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters); + +% Plot the convergence graph +figure; +plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2); +xlabel('Number of iterations'); +ylabel('Cost J'); + +% Display gradient descent's result +fprintf('Theta computed from gradient descent: \n'); +fprintf(' %f \n', theta); +fprintf('\n'); + +% Estimate the price of a 1650 sq-ft, 3 br house +% ====================== YOUR CODE HERE ====================== +% Recall that the first column of X is all-ones. Thus, it does +% not need to be normalized. +price = 0; % You should change this + + +% ============================================================ + +fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ... + '(using gradient descent):\n $%f\n'], price); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +%% ================ Part 3: Normal Equations ================ + +fprintf('Solving with normal equations...\n'); + +% ====================== YOUR CODE HERE ====================== +% Instructions: The following code computes the closed form +% solution for linear regression using the normal +% equations. You should complete the code in +% normalEqn.m +% +% After doing so, you should complete this code +% to predict the price of a 1650 sq-ft, 3 br house. +% + +%% Load Data +data = csvread('ex1data2.txt'); +X = data(:, 1:2); +y = data(:, 3); +m = length(y); + +% Add intercept term to X +X = [ones(m, 1) X]; + +% Calculate the parameters from the normal equation +theta = normalEqn(X, y); + +% Display normal equation's result +fprintf('Theta computed from the normal equations: \n'); +fprintf(' %f \n', theta); +fprintf('\n'); + + +% Estimate the price of a 1650 sq-ft, 3 br house +% ====================== YOUR CODE HERE ====================== +price = 0; % You should change this + + +% ============================================================ + +fprintf(['Predicted price of a 1650 sq-ft, 3 br house ' ... + '(using normal equations):\n $%f\n'], price); + diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data1.txt b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data1.txt new file mode 100644 index 0000000..0f88ccb --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data1.txt @@ -0,0 +1,97 @@ +6.1101,17.592 +5.5277,9.1302 +8.5186,13.662 +7.0032,11.854 +5.8598,6.8233 +8.3829,11.886 +7.4764,4.3483 +8.5781,12 +6.4862,6.5987 +5.0546,3.8166 +5.7107,3.2522 +14.164,15.505 +5.734,3.1551 +8.4084,7.2258 +5.6407,0.71618 +5.3794,3.5129 +6.3654,5.3048 +5.1301,0.56077 +6.4296,3.6518 +7.0708,5.3893 +6.1891,3.1386 +20.27,21.767 +5.4901,4.263 +6.3261,5.1875 +5.5649,3.0825 +18.945,22.638 +12.828,13.501 +10.957,7.0467 +13.176,14.692 +22.203,24.147 +5.2524,-1.22 +6.5894,5.9966 +9.2482,12.134 +5.8918,1.8495 +8.2111,6.5426 +7.9334,4.5623 +8.0959,4.1164 +5.6063,3.3928 +12.836,10.117 +6.3534,5.4974 +5.4069,0.55657 +6.8825,3.9115 +11.708,5.3854 +5.7737,2.4406 +7.8247,6.7318 +7.0931,1.0463 +5.0702,5.1337 +5.8014,1.844 +11.7,8.0043 +5.5416,1.0179 +7.5402,6.7504 +5.3077,1.8396 +7.4239,4.2885 +7.6031,4.9981 +6.3328,1.4233 +6.3589,-1.4211 +6.2742,2.4756 +5.6397,4.6042 +9.3102,3.9624 +9.4536,5.4141 +8.8254,5.1694 +5.1793,-0.74279 +21.279,17.929 +14.908,12.054 +18.959,17.054 +7.2182,4.8852 +8.2951,5.7442 +10.236,7.7754 +5.4994,1.0173 +20.341,20.992 +10.136,6.6799 +7.3345,4.0259 +6.0062,1.2784 +7.2259,3.3411 +5.0269,-2.6807 +6.5479,0.29678 +7.5386,3.8845 +5.0365,5.7014 +10.274,6.7526 +5.1077,2.0576 +5.7292,0.47953 +5.1884,0.20421 +6.3557,0.67861 +9.7687,7.5435 +6.5159,5.3436 +8.5172,4.2415 +9.1802,6.7981 +6.002,0.92695 +5.5204,0.152 +5.0594,2.8214 +5.7077,1.8451 +7.6366,4.2959 +5.8707,7.2029 +5.3054,1.9869 +8.2934,0.14454 +13.394,9.0551 +5.4369,0.61705 diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data2.txt b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data2.txt new file mode 100644 index 0000000..79e9a80 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/ex1data2.txt @@ -0,0 +1,47 @@ +2104,3,399900 +1600,3,329900 +2400,3,369000 +1416,2,232000 +3000,4,539900 +1985,4,299900 +1534,3,314900 +1427,3,198999 +1380,3,212000 +1494,3,242500 +1940,4,239999 +2000,3,347000 +1890,3,329999 +4478,5,699900 +1268,3,259900 +2300,4,449900 +1320,2,299900 +1236,3,199900 +2609,4,499998 +3031,4,599000 +1767,3,252900 +1888,2,255000 +1604,3,242900 +1962,4,259900 +3890,3,573900 +1100,3,249900 +1458,3,464500 +2526,3,469000 +2200,3,475000 +2637,3,299900 +1839,2,349900 +1000,1,169900 +2040,4,314900 +3137,3,579900 +1811,4,285900 +1437,3,249900 +1239,3,229900 +2132,4,345000 +4215,4,549000 +2162,4,287000 +1664,2,368500 +2238,3,329900 +2567,4,314000 +1200,3,299000 +852,2,179900 +1852,4,299900 +1203,3,239500 diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/featureNormalize.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/featureNormalize.m new file mode 100644 index 0000000..771e33d --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/featureNormalize.m @@ -0,0 +1,39 @@ +function [X_norm, mu, sigma] = featureNormalize(X) +%FEATURENORMALIZE Normalizes the features in X +% FEATURENORMALIZE(X) returns a normalized version of X where +% the mean value of each feature is 0 and the standard deviation +% is 1. This is often a good preprocessing step to do when +% working with learning algorithms. + +% You need to set these values correctly +X_norm = X; +mu = zeros(1, size(X, 2)); +sigma = zeros(1, size(X, 2)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: First, for each feature dimension, compute the mean +% of the feature and subtract it from the dataset, +% storing the mean value in mu. Next, compute the +% standard deviation of each feature and divide +% each feature by it's standard deviation, storing +% the standard deviation in sigma. +% +% Note that X is a matrix where each column is a +% feature and each row is an example. You need +% to perform the normalization separately for +% each feature. +% +% Hint: You might find the 'mean' and 'std' functions useful. +% + +mu = mean(X); +sigma = std(X); + +X_norm = (X - repmat( mu, size(X,1), 1 )) ./ repmat( sigma, size(X,1), 1 ); + + + + +% ============================================================ + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/gradientDescent.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/gradientDescent.m new file mode 100644 index 0000000..45f829c --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/gradientDescent.m @@ -0,0 +1,33 @@ +function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) +%GRADIENTDESCENT Performs gradient descent to learn theta +% theta = GRADIENTDESENT(X, y, theta, alpha, num_iters) updates theta by +% taking num_iters gradient steps with learning rate alpha + +% Initialize some useful values +m = length(y); % number of training examples +J_history = zeros(num_iters, 1); + +for iter = 1:num_iters + + % ====================== YOUR CODE HERE ====================== + % Instructions: Perform a single gradient step on the parameter vector + % theta. + % + % Hint: While debugging, it can be useful to print out the values + % of the cost function (computeCost) and gradient here. + % + + + + theta = theta - alpha * (X' * (X*theta-y) / m); + + + + % ============================================================ + + % Save the cost J in every iteration + J_history(iter) = computeCost(X, y, theta); + +end + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/gradientDescentMulti.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/gradientDescentMulti.m new file mode 100644 index 0000000..4429f90 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/gradientDescentMulti.m @@ -0,0 +1,37 @@ +function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters) +%GRADIENTDESCENTMULTI Performs gradient descent to learn theta +% theta = GRADIENTDESCENTMULTI(x, y, theta, alpha, num_iters) updates theta by +% taking num_iters gradient steps with learning rate alpha + +% Initialize some useful values +m = length(y); % number of training examples +J_history = zeros(num_iters, 1); + +for iter = 1:num_iters + + % ====================== YOUR CODE HERE ====================== + % Instructions: Perform a single gradient step on the parameter vector + % theta. + % + % Hint: While debugging, it can be useful to print out the values + % of the cost function (computeCostMulti) and gradient here. + % + + + + theta = theta - alpha * (X' * (X*theta-y) / m); + + + + + + + + % ============================================================ + + % Save the cost J in every iteration + J_history(iter) = computeCostMulti(X, y, theta); + +end + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/normalEqn.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/normalEqn.m new file mode 100644 index 0000000..bcbc135 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/normalEqn.m @@ -0,0 +1,23 @@ +function [theta] = normalEqn(X, y) +%NORMALEQN Computes the closed-form solution to linear regression +% NORMALEQN(X,y) computes the closed-form solution to linear +% regression using the normal equations. + +theta = zeros(size(X, 2), 1); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Complete the code to compute the closed form solution +% to linear regression and put the result in theta. +% + +% ---------------------- Sample Solution ---------------------- + + +theta = pinv(X'*X)*X'*y; + +% ------------------------------------------------------------- + + +% ============================================================ + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/plotData.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/plotData.m new file mode 100644 index 0000000..3a10239 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/plotData.m @@ -0,0 +1,26 @@ +function plotData(x, y) +%PLOTDATA Plots the data points x and y into a new figure +% PLOTDATA(x,y) plots the data points and gives the figure axes labels of +% population and profit. + +% ====================== YOUR CODE HERE ====================== +% Instructions: Plot the training data into a figure using the +% "figure" and "plot" commands. Set the axes labels using +% the "xlabel" and "ylabel" commands. Assume the +% population and revenue data have been passed in +% as the x and y arguments of this function. +% +% Hint: You can use the 'rx' option with plot to have the markers +% appear as red crosses. Furthermore, you can make the +% markers larger by using plot(..., 'rx', 'MarkerSize', 10); + +figure; % open a new figure window + + + + + + +% ============================================================ + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/submit.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/submit.m new file mode 100644 index 0000000..59de10a --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/submit.m @@ -0,0 +1,577 @@ +function submit(partId, webSubmit) +%SUBMIT Submit your code and output to the ml-class servers +% SUBMIT() will connect to the ml-class server and submit your solution + + fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ... + homework_id()); + if ~exist('partId', 'var') || isempty(partId) + partId = promptPart(); + end + + if ~exist('webSubmit', 'var') || isempty(webSubmit) + webSubmit = 0; % submit directly by default + end + + % Check valid partId + partNames = validParts(); + if ~isValidPartId(partId) + fprintf('!! Invalid homework part selected.\n'); + fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1); + fprintf('!! Submission Cancelled\n'); + return + end + + if ~exist('ml_login_data.mat','file') + [login password] = loginPrompt(); + save('ml_login_data.mat','login','password'); + else + load('ml_login_data.mat'); + [login password] = quickLogin(login, password); + save('ml_login_data.mat','login','password'); + end + + if isempty(login) + fprintf('!! Submission Cancelled\n'); + return + end + + fprintf('\n== Connecting to ml-class ... '); + if exist('OCTAVE_VERSION') + fflush(stdout); + end + + % Setup submit list + if partId == numel(partNames) + 1 + submitParts = 1:numel(partNames); + else + submitParts = [partId]; + end + + for s = 1:numel(submitParts) + thisPartId = submitParts(s); + if (~webSubmit) % submit directly to server + [login, ch, signature, auxstring] = getChallenge(login, thisPartId); + if isempty(login) || isempty(ch) || isempty(signature) + % Some error occured, error string in first return element. + fprintf('\n!! Error: %s\n\n', login); + return + end + + % Attempt Submission with Challenge + ch_resp = challengeResponse(login, password, ch); + + [result, str] = submitSolution(login, ch_resp, thisPartId, ... + output(thisPartId, auxstring), source(thisPartId), signature); + + partName = partNames{thisPartId}; + + fprintf('\n== [ml-class] Submitted Assignment %s - Part %d - %s\n', ... + homework_id(), thisPartId, partName); + fprintf('== %s\n', strtrim(str)); + + if exist('OCTAVE_VERSION') + fflush(stdout); + end + else + [result] = submitSolutionWeb(login, thisPartId, output(thisPartId), ... + source(thisPartId)); + result = base64encode(result); + + fprintf('\nSave as submission file [submit_ex%s_part%d.txt (enter to accept default)]:', ... + homework_id(), thisPartId); + saveAsFile = input('', 's'); + if (isempty(saveAsFile)) + saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), thisPartId); + end + + fid = fopen(saveAsFile, 'w'); + if (fid) + fwrite(fid, result); + fclose(fid); + fprintf('\nSaved your solutions to %s.\n\n', saveAsFile); + fprintf(['You can now submit your solutions through the web \n' ... + 'form in the programming exercises. Select the corresponding \n' ... + 'programming exercise to access the form.\n']); + + else + fprintf('Unable to save to %s\n\n', saveAsFile); + fprintf(['You can create a submission file by saving the \n' ... + 'following text in a file: (press enter to continue)\n\n']); + pause; + fprintf(result); + end + end + end +end + +% ================== CONFIGURABLES FOR EACH HOMEWORK ================== + +function id = homework_id() + id = '1'; +end + +function [partNames] = validParts() + partNames = { 'Warm up exercise ', ... + 'Computing Cost (for one variable)', ... + 'Gradient Descent (for one variable)', ... + 'Feature Normalization', ... + 'Computing Cost (for multiple variables)', ... + 'Gradient Descent (for multiple variables)', ... + 'Normal Equations'}; +end + +function srcs = sources() + % Separated by part + srcs = { { 'warmUpExercise.m' }, ... + { 'computeCost.m' }, ... + { 'gradientDescent.m' }, ... + { 'featureNormalize.m' }, ... + { 'computeCostMulti.m' }, ... + { 'gradientDescentMulti.m' }, ... + { 'normalEqn.m' }, ... + }; +end + +function out = output(partId, auxstring) + % Random Test Cases + X1 = [ones(20,1) (exp(1) + exp(2) * (0.1:0.1:2))']; + Y1 = X1(:,2) + sin(X1(:,1)) + cos(X1(:,2)); + X2 = [X1 X1(:,2).^0.5 X1(:,2).^0.25]; + Y2 = Y1.^0.5 + Y1; + if partId == 1 + out = sprintf('%0.5f ', warmUpExercise()); + elseif partId == 2 + out = sprintf('%0.5f ', computeCost(X1, Y1, [0.5 -0.5]')); + elseif partId == 3 + out = sprintf('%0.5f ', gradientDescent(X1, Y1, [0.5 -0.5]', 0.01, 10)); + elseif partId == 4 + out = sprintf('%0.5f ', featureNormalize(X2(:,2:4))); + elseif partId == 5 + out = sprintf('%0.5f ', computeCostMulti(X2, Y2, [0.1 0.2 0.3 0.4]')); + elseif partId == 6 + out = sprintf('%0.5f ', gradientDescentMulti(X2, Y2, [-0.1 -0.2 -0.3 -0.4]', 0.01, 10)); + elseif partId == 7 + out = sprintf('%0.5f ', normalEqn(X2, Y2)); + end +end + +% ====================== SERVER CONFIGURATION =========================== + +% ***************** REMOVE -staging WHEN YOU DEPLOY ********************* +function url = site_url() + url = 'http://class.coursera.org/ml-008'; +end + +function url = challenge_url() + url = [site_url() '/assignment/challenge']; +end + +function url = submit_url() + url = [site_url() '/assignment/submit']; +end + +% ========================= CHALLENGE HELPERS ========================= + +function src = source(partId) + src = ''; + src_files = sources(); + if partId <= numel(src_files) + flist = src_files{partId}; + for i = 1:numel(flist) + fid = fopen(flist{i}); + if (fid == -1) + error('Error opening %s (is it missing?)', flist{i}); + end + line = fgets(fid); + while ischar(line) + src = [src line]; + line = fgets(fid); + end + fclose(fid); + src = [src '||||||||']; + end + end +end + +function ret = isValidPartId(partId) + partNames = validParts(); + ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1); +end + +function partId = promptPart() + fprintf('== Select which part(s) to submit:\n'); + partNames = validParts(); + srcFiles = sources(); + for i = 1:numel(partNames) + fprintf('== %d) %s [', i, partNames{i}); + fprintf(' %s ', srcFiles{i}{:}); + fprintf(']\n'); + end + fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ... + numel(partNames) + 1, numel(partNames) + 1); + selPart = input('', 's'); + partId = str2num(selPart); + if ~isValidPartId(partId) + partId = -1; + end +end + +function [email,ch,signature,auxstring] = getChallenge(email, part) + str = urlread(challenge_url(), 'post', {'email_address', email, 'assignment_part_sid', [homework_id() '-' num2str(part)], 'response_encoding', 'delim'}); + + str = strtrim(str); + r = struct; + while(numel(str) > 0) + [f, str] = strtok (str, '|'); + [v, str] = strtok (str, '|'); + r = setfield(r, f, v); + end + + email = getfield(r, 'email_address'); + ch = getfield(r, 'challenge_key'); + signature = getfield(r, 'state'); + auxstring = getfield(r, 'challenge_aux_data'); +end + +function [result, str] = submitSolutionWeb(email, part, output, source) + + result = ['{"assignment_part_sid":"' base64encode([homework_id() '-' num2str(part)], '') '",' ... + '"email_address":"' base64encode(email, '') '",' ... + '"submission":"' base64encode(output, '') '",' ... + '"submission_aux":"' base64encode(source, '') '"' ... + '}']; + str = 'Web-submission'; +end + +function [result, str] = submitSolution(email, ch_resp, part, output, ... + source, signature) + + params = {'assignment_part_sid', [homework_id() '-' num2str(part)], ... + 'email_address', email, ... + 'submission', base64encode(output, ''), ... + 'submission_aux', base64encode(source, ''), ... + 'challenge_response', ch_resp, ... + 'state', signature}; + + str = urlread(submit_url(), 'post', params); + + % Parse str to read for success / failure + result = 0; + +end + +% =========================== LOGIN HELPERS =========================== + +function [login password] = loginPrompt() + % Prompt for password + [login password] = basicPrompt(); + + if isempty(login) || isempty(password) + login = []; password = []; + end +end + + +function [login password] = basicPrompt() + login = input('Login (Email address): ', 's'); + password = input('Password: ', 's'); +end + +function [login password] = quickLogin(login,password) + disp(['You are currently logged in as ' login '.']); + cont_token = input('Is this you? (y/n - type n to reenter password)','s'); + if(isempty(cont_token) || cont_token(1)=='Y'||cont_token(1)=='y') + return; + else + [login password] = loginPrompt(); + end +end + +function [str] = challengeResponse(email, passwd, challenge) + str = sha1([challenge passwd]); +end + +% =============================== SHA-1 ================================ + +function hash = sha1(str) + + % Initialize variables + h0 = uint32(1732584193); + h1 = uint32(4023233417); + h2 = uint32(2562383102); + h3 = uint32(271733878); + h4 = uint32(3285377520); + + % Convert to word array + strlen = numel(str); + + % Break string into chars and append the bit 1 to the message + mC = [double(str) 128]; + mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')]; + + numB = strlen * 8; + if exist('idivide') + numC = idivide(uint32(numB + 65), 512, 'ceil'); + else + numC = ceil(double(numB + 65)/512); + end + numW = numC * 16; + mW = zeros(numW, 1, 'uint32'); + + idx = 1; + for i = 1:4:strlen + 1 + mW(idx) = bitor(bitor(bitor( ... + bitshift(uint32(mC(i)), 24), ... + bitshift(uint32(mC(i+1)), 16)), ... + bitshift(uint32(mC(i+2)), 8)), ... + uint32(mC(i+3))); + idx = idx + 1; + end + + % Append length of message + mW(numW - 1) = uint32(bitshift(uint64(numB), -32)); + mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32)); + + % Process the message in successive 512-bit chs + for cId = 1 : double(numC) + cSt = (cId - 1) * 16 + 1; + cEnd = cId * 16; + ch = mW(cSt : cEnd); + + % Extend the sixteen 32-bit words into eighty 32-bit words + for j = 17 : 80 + ch(j) = ch(j - 3); + ch(j) = bitxor(ch(j), ch(j - 8)); + ch(j) = bitxor(ch(j), ch(j - 14)); + ch(j) = bitxor(ch(j), ch(j - 16)); + ch(j) = bitrotate(ch(j), 1); + end + + % Initialize hash value for this ch + a = h0; + b = h1; + c = h2; + d = h3; + e = h4; + + % Main loop + for i = 1 : 80 + if(i >= 1 && i <= 20) + f = bitor(bitand(b, c), bitand(bitcmp(b), d)); + k = uint32(1518500249); + elseif(i >= 21 && i <= 40) + f = bitxor(bitxor(b, c), d); + k = uint32(1859775393); + elseif(i >= 41 && i <= 60) + f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d)); + k = uint32(2400959708); + elseif(i >= 61 && i <= 80) + f = bitxor(bitxor(b, c), d); + k = uint32(3395469782); + end + + t = bitrotate(a, 5); + t = bitadd(t, f); + t = bitadd(t, e); + t = bitadd(t, k); + t = bitadd(t, ch(i)); + e = d; + d = c; + c = bitrotate(b, 30); + b = a; + a = t; + + end + h0 = bitadd(h0, a); + h1 = bitadd(h1, b); + h2 = bitadd(h2, c); + h3 = bitadd(h3, d); + h4 = bitadd(h4, e); + + end + + hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]); + + hash = lower(hash); + +end + +function ret = bitadd(iA, iB) + ret = double(iA) + double(iB); + ret = bitset(ret, 33, 0); + ret = uint32(ret); +end + +function ret = bitrotate(iA, places) + t = bitshift(iA, places - 32); + ret = bitshift(iA, places); + ret = bitor(ret, t); +end + +% =========================== Base64 Encoder ============================ +% Thanks to Peter John Acklam +% + +function y = base64encode(x, eol) +%BASE64ENCODE Perform base64 encoding on a string. +% +% BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending +% sequence to use; it is optional and defaults to '\n' (ASCII decimal 10). +% The returned encoded string is broken into lines of no more than 76 +% characters each, and each line will end with EOL unless it is empty. Let +% EOL be empty if you do not want the encoded string broken into lines. +% +% STR and EOL don't have to be strings (i.e., char arrays). The only +% requirement is that they are vectors containing values in the range 0-255. +% +% This function may be used to encode strings into the Base64 encoding +% specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The +% Base64 encoding is designed to represent arbitrary sequences of octets in a +% form that need not be humanly readable. A 65-character subset +% ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per +% printable character. +% +% Examples +% -------- +% +% If you want to encode a large file, you should encode it in chunks that are +% a multiple of 57 bytes. This ensures that the base64 lines line up and +% that you do not end up with padding in the middle. 57 bytes of data fills +% one complete base64 line (76 == 57*4/3): +% +% If ifid and ofid are two file identifiers opened for reading and writing, +% respectively, then you can base64 encode the data with +% +% while ~feof(ifid) +% fwrite(ofid, base64encode(fread(ifid, 60*57))); +% end +% +% or, if you have enough memory, +% +% fwrite(ofid, base64encode(fread(ifid))); +% +% See also BASE64DECODE. + +% Author: Peter John Acklam +% Time-stamp: 2004-02-03 21:36:56 +0100 +% E-mail: pjacklam@online.no +% URL: http://home.online.no/~pjacklam + + if isnumeric(x) + x = num2str(x); + end + + % make sure we have the EOL value + if nargin < 2 + eol = sprintf('\n'); + else + if sum(size(eol) > 1) > 1 + error('EOL must be a vector.'); + end + if any(eol(:) > 255) + error('EOL can not contain values larger than 255.'); + end + end + + if sum(size(x) > 1) > 1 + error('STR must be a vector.'); + end + + x = uint8(x); + eol = uint8(eol); + + ndbytes = length(x); % number of decoded bytes + nchunks = ceil(ndbytes / 3); % number of chunks/groups + nebytes = 4 * nchunks; % number of encoded bytes + + % add padding if necessary, to make the length of x a multiple of 3 + if rem(ndbytes, 3) + x(end+1 : 3*nchunks) = 0; + end + + x = reshape(x, [3, nchunks]); % reshape the data + y = repmat(uint8(0), 4, nchunks); % for the encoded data + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Split up every 3 bytes into 4 pieces + % + % aaaaaabb bbbbcccc ccdddddd + % + % to form + % + % 00aaaaaa 00bbbbbb 00cccccc 00dddddd + % + y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:) + + y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:) + y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:) + + y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:) + y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:) + + y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:) + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Now perform the following mapping + % + % 0 - 25 -> A-Z + % 26 - 51 -> a-z + % 52 - 61 -> 0-9 + % 62 -> + + % 63 -> / + % + % We could use a mapping vector like + % + % ['A':'Z', 'a':'z', '0':'9', '+/'] + % + % but that would require an index vector of class double. + % + z = repmat(uint8(0), size(y)); + i = y <= 25; z(i) = 'A' + double(y(i)); + i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i)); + i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i)); + i = y == 62; z(i) = '+'; + i = y == 63; z(i) = '/'; + y = z; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Add padding if necessary. + % + npbytes = 3 * nchunks - ndbytes; % number of padding bytes + if npbytes + y(end-npbytes+1 : end) = '='; % '=' is used for padding + end + + if isempty(eol) + + % reshape to a row vector + y = reshape(y, [1, nebytes]); + + else + + nlines = ceil(nebytes / 76); % number of lines + neolbytes = length(eol); % number of bytes in eol string + + % pad data so it becomes a multiple of 76 elements + y = [y(:) ; zeros(76 * nlines - numel(y), 1)]; + y(nebytes + 1 : 76 * nlines) = 0; + y = reshape(y, 76, nlines); + + % insert eol strings + eol = eol(:); + y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines)); + + % remove padding, but keep the last eol string + m = nebytes + neolbytes * (nlines - 1); + n = (76+neolbytes)*nlines - neolbytes; + y(m+1 : n) = ''; + + % extract and reshape to row vector + y = reshape(y, 1, m+neolbytes); + + end + + % output is a character array + y = char(y); + +end diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/submitWeb.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/submitWeb.m new file mode 100644 index 0000000..8611707 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/submitWeb.m @@ -0,0 +1,20 @@ +% submitWeb Creates files from your code and output for web submission. +% +% If the submit function does not work for you, use the web-submission mechanism. +% Call this function to produce a file for the part you wish to submit. Then, +% submit the file to the class servers using the "Web Submission" button on the +% Programming Exercises page on the course website. +% +% You should call this function without arguments (submitWeb), to receive +% an interactive prompt for submission; optionally you can call it with the partID +% if you so wish. Make sure your working directory is set to the directory +% containing the submitWeb.m file and your assignment files. + +function submitWeb(partId) + if ~exist('partId', 'var') || isempty(partId) + partId = []; + end + + submit(partId, 1); +end + diff --git a/machine_learning/mlclass-ex1-008/mlclass-ex1/warmUpExercise.m b/machine_learning/mlclass-ex1-008/mlclass-ex1/warmUpExercise.m new file mode 100644 index 0000000..367c9f5 --- /dev/null +++ b/machine_learning/mlclass-ex1-008/mlclass-ex1/warmUpExercise.m @@ -0,0 +1,21 @@ +function A = warmUpExercise() +%WARMUPEXERCISE Example function in octave +% A = WARMUPEXERCISE() is an example function that returns the 5x5 identity matrix + +A = []; +% ============= YOUR CODE HERE ============== +% Instructions: Return the 5x5 identity matrix +% In octave, we return values by defining which variables +% represent the return values (at the top of the file) +% and then set them accordingly. + + +A = eye(5); + + + + +% =========================================== + + +end diff --git a/machine_learning/mlclass-ex2-008/ex2.pdf b/machine_learning/mlclass-ex2-008/ex2.pdf new file mode 100644 index 0000000..29231cc Binary files /dev/null and b/machine_learning/mlclass-ex2-008/ex2.pdf differ diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/costFunction.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/costFunction.m new file mode 100644 index 0000000..f9b971b --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/costFunction.m @@ -0,0 +1,30 @@ +function [J, grad] = costFunction(theta, X, y) +%COSTFUNCTION Compute cost and gradient for logistic regression +% J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the +% parameter for logistic regression and the gradient of the cost +% w.r.t. to the parameters. + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; +grad = zeros(size(theta)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta. +% You should set J to the cost. +% Compute the partial derivatives and set grad to the partial +% derivatives of the cost w.r.t. each parameter in theta +% +% Note: grad should have the same dimensions as theta +% + +h = sigmoid( X*theta ); +o = ones(size(y)); +J = sum( y .* log(h) + (o-y) .* log(o-h) ) / (-m); +grad = (X'*(h - y)) / m; + +% ============================================================= + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/costFunctionReg.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/costFunctionReg.m new file mode 100644 index 0000000..c82f431 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/costFunctionReg.m @@ -0,0 +1,30 @@ +function [J, grad] = costFunctionReg(theta, X, y, lambda) +%COSTFUNCTIONREG Compute cost and gradient for logistic regression with regularization +% J = COSTFUNCTIONREG(theta, X, y, lambda) computes the cost of using +% theta as the parameter for regularized logistic regression and the +% gradient of the cost w.r.t. to the parameters. + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; +grad = zeros(size(theta)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta. +% You should set J to the cost. +% Compute the partial derivatives and set grad to the partial +% derivatives of the cost w.r.t. each parameter in theta + + +h = sigmoid( X*theta ); +o = ones(size(y)); +reg = theta; +reg(1) = 0; +J = sum( y .* log(h) + (o-y) .* log(o-h) ) / (-m) + (lambda/(2*m))*sum(reg.^2); +grad = (X'*(h - y)) / m + (lambda/m) * reg; + +% ============================================================= + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2.m new file mode 100644 index 0000000..359e01e --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2.m @@ -0,0 +1,135 @@ +%% Machine Learning Online Class - Exercise 2: Logistic Regression +% +% Instructions +% ------------ +% +% This file contains code that helps you get started on the logistic +% regression exercise. You will need to complete the following functions +% in this exericse: +% +% sigmoid.m +% costFunction.m +% predict.m +% costFunctionReg.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% + +%% Initialization +clear ; close all; clc + +%% Load Data +% The first two columns contains the exam scores and the third column +% contains the label. + +data = load('ex2data1.txt'); +X = data(:, [1, 2]); y = data(:, 3); + +%% ==================== Part 1: Plotting ==================== +% We start the exercise by first plotting the data to understand the +% the problem we are working with. + +fprintf(['Plotting data with + indicating (y = 1) examples and o ' ... + 'indicating (y = 0) examples.\n']); + +%%plotData(X, y); + +% Put some labels +%%hold on; +% Labels and Legend +%%xlabel('Exam 1 score') +%%ylabel('Exam 2 score') + +% Specified in plot order +%%legend('Admitted', 'Not admitted') +%%hold off; + +fprintf('\nProgram paused. Press enter to continue.\n'); +%%pause; + + +%% ============ Part 2: Compute Cost and Gradient ============ +% In this part of the exercise, you will implement the cost and gradient +% for logistic regression. You neeed to complete the code in +% costFunction.m + +% Setup the data matrix appropriately, and add ones for the intercept term +[m, n] = size(X); + +% Add intercept term to x and X_test +X = [ones(m, 1) X]; + +% Initialize fitting parameters +initial_theta = zeros(n + 1, 1); + +% Compute and display initial cost and gradient +[cost, grad] = costFunction(initial_theta, X, y); + +fprintf('Cost at initial theta (zeros): %f\n', cost); +fprintf('Gradient at initial theta (zeros): \n'); +fprintf(' %f \n', grad); + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + + +%% ============= Part 3: Optimizing using fminunc ============= +% In this exercise, you will use a built-in function (fminunc) to find the +% optimal parameters theta. + +% Set options for fminunc +options = optimset('GradObj', 'on', 'MaxIter', 400); + +% Run fminunc to obtain the optimal theta +% This function will return theta and the cost +[theta, cost] = ... + fminunc(@(t)(costFunction(t, X, y)), initial_theta, options); + +% Print theta to screen +fprintf('Cost at theta found by fminunc: %f\n', cost); +fprintf('theta: \n'); +fprintf(' %f \n', theta); + +% Plot Boundary +plotDecisionBoundary(theta, X, y); + +% Put some labels +hold on; +% Labels and Legend +xlabel('Exam 1 score') +ylabel('Exam 2 score') + +% Specified in plot order +legend('Admitted', 'Not admitted') +hold off; + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + +%% ============== Part 4: Predict and Accuracies ============== +% After learning the parameters, you'll like to use it to predict the outcomes +% on unseen data. In this part, you will use the logistic regression model +% to predict the probability that a student with score 45 on exam 1 and +% score 85 on exam 2 will be admitted. +% +% Furthermore, you will compute the training and test set accuracies of +% our model. +% +% Your task is to complete the code in predict.m + +% Predict probability for a student with score 45 on exam 1 +% and score 85 on exam 2 + +prob = sigmoid([1 45 85] * theta); +fprintf(['For a student with scores 45 and 85, we predict an admission ' ... + 'probability of %f\n\n'], prob); + +% Compute accuracy on our training set +p = predict(theta, X); + +fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100); + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2_reg.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2_reg.m new file mode 100644 index 0000000..d83dffe --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2_reg.m @@ -0,0 +1,116 @@ +%% Machine Learning Online Class - Exercise 2: Logistic Regression +% +% Instructions +% ------------ +% +% This file contains code that helps you get started on the second part +% of the exercise which covers regularization with logistic regression. +% +% You will need to complete the following functions in this exericse: +% +% sigmoid.m +% costFunction.m +% predict.m +% costFunctionReg.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% + +%% Initialization +clear ; close all; clc + +%% Load Data +% The first two columns contains the X values and the third column +% contains the label (y). + +data = load('ex2data2.txt'); +X = data(:, [1, 2]); y = data(:, 3); + +plotData(X, y); + +% Put some labels +hold on; + +% Labels and Legend +xlabel('Microchip Test 1') +ylabel('Microchip Test 2') + +% Specified in plot order +legend('y = 1', 'y = 0') +hold off; + + +%% =========== Part 1: Regularized Logistic Regression ============ +% In this part, you are given a dataset with data points that are not +% linearly separable. However, you would still like to use logistic +% regression to classify the data points. +% +% To do so, you introduce more features to use -- in particular, you add +% polynomial features to our data matrix (similar to polynomial +% regression). +% + +% Add Polynomial Features + +% Note that mapFeature also adds a column of ones for us, so the intercept +% term is handled +X = mapFeature(X(:,1), X(:,2)); + +% Initialize fitting parameters +initial_theta = zeros(size(X, 2), 1); + +% Set regularization parameter lambda to 1 +lambda = 1; + +% Compute and display initial cost and gradient for regularized logistic +% regression +[cost, grad] = costFunctionReg(initial_theta, X, y, lambda); + +fprintf('Cost at initial theta (zeros): %f\n', cost); + +fprintf('\nProgram paused. Press enter to continue.\n'); +pause; + +%% ============= Part 2: Regularization and Accuracies ============= +% Optional Exercise: +% In this part, you will get to try different values of lambda and +% see how regularization affects the decision coundart +% +% Try the following values of lambda (0, 1, 10, 100). +% +% How does the decision boundary change when you vary lambda? How does +% the training set accuracy vary? +% + +% Initialize fitting parameters +initial_theta = zeros(size(X, 2), 1); + +% Set regularization parameter lambda to 1 (you should vary this) +lambda = 1; + +% Set Options +options = optimset('GradObj', 'on', 'MaxIter', 400); + +% Optimize +[theta, J, exit_flag] = ... + fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options); + +% Plot Boundary +plotDecisionBoundary(theta, X, y); +hold on; +title(sprintf('lambda = %g', lambda)) + +% Labels and Legend +xlabel('Microchip Test 1') +ylabel('Microchip Test 2') + +legend('y = 1', 'y = 0', 'Decision boundary') +hold off; + +% Compute accuracy on our training set +p = predict(theta, X); + +fprintf('Train Accuracy: %f\n', mean(double(p == y)) * 100); + + diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data1.txt b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data1.txt new file mode 100644 index 0000000..3a5f952 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data1.txt @@ -0,0 +1,100 @@ +34.62365962451697,78.0246928153624,0 +30.28671076822607,43.89499752400101,0 +35.84740876993872,72.90219802708364,0 +60.18259938620976,86.30855209546826,1 +79.0327360507101,75.3443764369103,1 +45.08327747668339,56.3163717815305,0 +61.10666453684766,96.51142588489624,1 +75.02474556738889,46.55401354116538,1 +76.09878670226257,87.42056971926803,1 +84.43281996120035,43.53339331072109,1 +95.86155507093572,38.22527805795094,0 +75.01365838958247,30.60326323428011,0 +82.30705337399482,76.48196330235604,1 +69.36458875970939,97.71869196188608,1 +39.53833914367223,76.03681085115882,0 +53.9710521485623,89.20735013750205,1 +69.07014406283025,52.74046973016765,1 +67.94685547711617,46.67857410673128,0 +70.66150955499435,92.92713789364831,1 +76.97878372747498,47.57596364975532,1 +67.37202754570876,42.83843832029179,0 +89.67677575072079,65.79936592745237,1 +50.534788289883,48.85581152764205,0 +34.21206097786789,44.20952859866288,0 +77.9240914545704,68.9723599933059,1 +62.27101367004632,69.95445795447587,1 +80.1901807509566,44.82162893218353,1 +93.114388797442,38.80067033713209,0 +61.83020602312595,50.25610789244621,0 +38.78580379679423,64.99568095539578,0 +61.379289447425,72.80788731317097,1 +85.40451939411645,57.05198397627122,1 +52.10797973193984,63.12762376881715,0 +52.04540476831827,69.43286012045222,1 +40.23689373545111,71.16774802184875,0 +54.63510555424817,52.21388588061123,0 +33.91550010906887,98.86943574220611,0 +64.17698887494485,80.90806058670817,1 +74.78925295941542,41.57341522824434,0 +34.1836400264419,75.2377203360134,0 +83.90239366249155,56.30804621605327,1 +51.54772026906181,46.85629026349976,0 +94.44336776917852,65.56892160559052,1 +82.36875375713919,40.61825515970618,0 +51.04775177128865,45.82270145776001,0 +62.22267576120188,52.06099194836679,0 +77.19303492601364,70.45820000180959,1 +97.77159928000232,86.7278223300282,1 +62.07306379667647,96.76882412413983,1 +91.56497449807442,88.69629254546599,1 +79.94481794066932,74.16311935043758,1 +99.2725269292572,60.99903099844988,1 +90.54671411399852,43.39060180650027,1 +34.52451385320009,60.39634245837173,0 +50.2864961189907,49.80453881323059,0 +49.58667721632031,59.80895099453265,0 +97.64563396007767,68.86157272420604,1 +32.57720016809309,95.59854761387875,0 +74.24869136721598,69.82457122657193,1 +71.79646205863379,78.45356224515052,1 +75.3956114656803,85.75993667331619,1 +35.28611281526193,47.02051394723416,0 +56.25381749711624,39.26147251058019,0 +30.05882244669796,49.59297386723685,0 +44.66826172480893,66.45008614558913,0 +66.56089447242954,41.09209807936973,0 +40.45755098375164,97.53518548909936,1 +49.07256321908844,51.88321182073966,0 +80.27957401466998,92.11606081344084,1 +66.74671856944039,60.99139402740988,1 +32.72283304060323,43.30717306430063,0 +64.0393204150601,78.03168802018232,1 +72.34649422579923,96.22759296761404,1 +60.45788573918959,73.09499809758037,1 +58.84095621726802,75.85844831279042,1 +99.82785779692128,72.36925193383885,1 +47.26426910848174,88.47586499559782,1 +50.45815980285988,75.80985952982456,1 +60.45555629271532,42.50840943572217,0 +82.22666157785568,42.71987853716458,0 +88.9138964166533,69.80378889835472,1 +94.83450672430196,45.69430680250754,1 +67.31925746917527,66.58935317747915,1 +57.23870631569862,59.51428198012956,1 +80.36675600171273,90.96014789746954,1 +68.46852178591112,85.59430710452014,1 +42.0754545384731,78.84478600148043,0 +75.47770200533905,90.42453899753964,1 +78.63542434898018,96.64742716885644,1 +52.34800398794107,60.76950525602592,0 +94.09433112516793,77.15910509073893,1 +90.44855097096364,87.50879176484702,1 +55.48216114069585,35.57070347228866,0 +74.49269241843041,84.84513684930135,1 +89.84580670720979,45.35828361091658,1 +83.48916274498238,48.38028579728175,1 +42.2617008099817,87.10385094025457,1 +99.31500880510394,68.77540947206617,1 +55.34001756003703,64.9319380069486,1 +74.77589300092767,89.52981289513276,1 diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data2.txt b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data2.txt new file mode 100644 index 0000000..a888992 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/ex2data2.txt @@ -0,0 +1,118 @@ +0.051267,0.69956,1 +-0.092742,0.68494,1 +-0.21371,0.69225,1 +-0.375,0.50219,1 +-0.51325,0.46564,1 +-0.52477,0.2098,1 +-0.39804,0.034357,1 +-0.30588,-0.19225,1 +0.016705,-0.40424,1 +0.13191,-0.51389,1 +0.38537,-0.56506,1 +0.52938,-0.5212,1 +0.63882,-0.24342,1 +0.73675,-0.18494,1 +0.54666,0.48757,1 +0.322,0.5826,1 +0.16647,0.53874,1 +-0.046659,0.81652,1 +-0.17339,0.69956,1 +-0.47869,0.63377,1 +-0.60541,0.59722,1 +-0.62846,0.33406,1 +-0.59389,0.005117,1 +-0.42108,-0.27266,1 +-0.11578,-0.39693,1 +0.20104,-0.60161,1 +0.46601,-0.53582,1 +0.67339,-0.53582,1 +-0.13882,0.54605,1 +-0.29435,0.77997,1 +-0.26555,0.96272,1 +-0.16187,0.8019,1 +-0.17339,0.64839,1 +-0.28283,0.47295,1 +-0.36348,0.31213,1 +-0.30012,0.027047,1 +-0.23675,-0.21418,1 +-0.06394,-0.18494,1 +0.062788,-0.16301,1 +0.22984,-0.41155,1 +0.2932,-0.2288,1 +0.48329,-0.18494,1 +0.64459,-0.14108,1 +0.46025,0.012427,1 +0.6273,0.15863,1 +0.57546,0.26827,1 +0.72523,0.44371,1 +0.22408,0.52412,1 +0.44297,0.67032,1 +0.322,0.69225,1 +0.13767,0.57529,1 +-0.0063364,0.39985,1 +-0.092742,0.55336,1 +-0.20795,0.35599,1 +-0.20795,0.17325,1 +-0.43836,0.21711,1 +-0.21947,-0.016813,1 +-0.13882,-0.27266,1 +0.18376,0.93348,0 +0.22408,0.77997,0 +0.29896,0.61915,0 +0.50634,0.75804,0 +0.61578,0.7288,0 +0.60426,0.59722,0 +0.76555,0.50219,0 +0.92684,0.3633,0 +0.82316,0.27558,0 +0.96141,0.085526,0 +0.93836,0.012427,0 +0.86348,-0.082602,0 +0.89804,-0.20687,0 +0.85196,-0.36769,0 +0.82892,-0.5212,0 +0.79435,-0.55775,0 +0.59274,-0.7405,0 +0.51786,-0.5943,0 +0.46601,-0.41886,0 +0.35081,-0.57968,0 +0.28744,-0.76974,0 +0.085829,-0.75512,0 +0.14919,-0.57968,0 +-0.13306,-0.4481,0 +-0.40956,-0.41155,0 +-0.39228,-0.25804,0 +-0.74366,-0.25804,0 +-0.69758,0.041667,0 +-0.75518,0.2902,0 +-0.69758,0.68494,0 +-0.4038,0.70687,0 +-0.38076,0.91886,0 +-0.50749,0.90424,0 +-0.54781,0.70687,0 +0.10311,0.77997,0 +0.057028,0.91886,0 +-0.10426,0.99196,0 +-0.081221,1.1089,0 +0.28744,1.087,0 +0.39689,0.82383,0 +0.63882,0.88962,0 +0.82316,0.66301,0 +0.67339,0.64108,0 +1.0709,0.10015,0 +-0.046659,-0.57968,0 +-0.23675,-0.63816,0 +-0.15035,-0.36769,0 +-0.49021,-0.3019,0 +-0.46717,-0.13377,0 +-0.28859,-0.060673,0 +-0.61118,-0.067982,0 +-0.66302,-0.21418,0 +-0.59965,-0.41886,0 +-0.72638,-0.082602,0 +-0.83007,0.31213,0 +-0.72062,0.53874,0 +-0.59389,0.49488,0 +-0.48445,0.99927,0 +-0.0063364,0.99927,0 +0.63265,-0.030612,0 diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/findmin.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/findmin.m new file mode 100644 index 0000000..33c34f9 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/findmin.m @@ -0,0 +1,28 @@ +function [theta,hist] = findmin(CF, X, y, theta, alpha, num_iters) +%GRADIENTDESCENTMULTI Performs gradient descent to learn theta +% theta = GRADIENTDESCENTMULTI(x, y, theta, alpha, num_iters) updates theta by +% taking num_iters gradient steps with learning rate alpha + +hist = zeros(num_iters+1, length(theta)); +hist(1,:) = theta'; + +for iter = 1:num_iters + + % ====================== YOUR CODE HERE ====================== + % Instructions: Perform a single gradient step on the parameter vector + % theta. + % + % Hint: While debugging, it can be useful to print out the values + % of the cost function (computeCostMulti) and gradient here. + % + + + [J,g] = CF( theta, X, y ); + + theta = theta - alpha * g; + + hist(iter+1,:) = theta'; + +end + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/mapFeature.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/mapFeature.m new file mode 100644 index 0000000..d02a72a --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/mapFeature.m @@ -0,0 +1,21 @@ +function out = mapFeature(X1, X2) +% MAPFEATURE Feature mapping function to polynomial features +% +% MAPFEATURE(X1, X2) maps the two input features +% to quadratic features used in the regularization exercise. +% +% Returns a new feature array with more features, comprising of +% X1, X2, X1.^2, X2.^2, X1*X2, X1*X2.^2, etc.. +% +% Inputs X1, X2 must be the same size +% + +degree = 6; +out = ones(size(X1(:,1))); +for i = 1:degree + for j = 0:i + out(:, end+1) = (X1.^(i-j)).*(X2.^j); + end +end + +end \ No newline at end of file diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/plotData.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/plotData.m new file mode 100644 index 0000000..5df9d3f --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/plotData.m @@ -0,0 +1,29 @@ +function plotData(X, y) +%PLOTDATA Plots the data points X and y into a new figure +% PLOTDATA(x,y) plots the data points with + for the positive examples +% and o for the negative examples. X is assumed to be a Mx2 matrix. + +% Create New Figure +figure; hold on; + +% ====================== YOUR CODE HERE ====================== +% Instructions: Plot the positive and negative examples on a +% 2D plot, using the option 'k+' for the positive +% examples and 'ko' for the negative examples. +% + + + + + + + + + +% ========================================================================= + + + +hold off; + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/plotDecisionBoundary.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/plotDecisionBoundary.m new file mode 100644 index 0000000..cd36314 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/plotDecisionBoundary.m @@ -0,0 +1,48 @@ +function plotDecisionBoundary(theta, X, y) +%PLOTDECISIONBOUNDARY Plots the data points X and y into a new figure with +%the decision boundary defined by theta +% PLOTDECISIONBOUNDARY(theta, X,y) plots the data points with + for the +% positive examples and o for the negative examples. X is assumed to be +% a either +% 1) Mx3 matrix, where the first column is an all-ones column for the +% intercept. +% 2) MxN, N>3 matrix, where the first column is all-ones + +% Plot Data +plotData(X(:,2:3), y); +hold on + +if size(X, 2) <= 3 + % Only need 2 points to define a line, so choose two endpoints + plot_x = [min(X(:,2))-2, max(X(:,2))+2]; + + % Calculate the decision boundary line + plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1)); + + % Plot, and adjust axes for better viewing + plot(plot_x, plot_y) + + % Legend, specific for the exercise + legend('Admitted', 'Not admitted', 'Decision Boundary') + axis([30, 100, 30, 100]) +else + % Here is the grid range + u = linspace(-1, 1.5, 50); + v = linspace(-1, 1.5, 50); + + z = zeros(length(u), length(v)); + % Evaluate z = theta*x over the grid + for i = 1:length(u) + for j = 1:length(v) + z(i,j) = mapFeature(u(i), v(j))*theta; + end + end + z = z'; % important to transpose z before calling contour + + % Plot z = 0 + % Notice you need to specify the range [0, 0] + contour(u, v, z, [0, 0], 'LineWidth', 2) +end +hold off + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/predict.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/predict.m new file mode 100644 index 0000000..d52b360 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/predict.m @@ -0,0 +1,27 @@ +function p = predict(theta, X) +%PREDICT Predict whether the label is 0 or 1 using learned logistic +%regression parameters theta +% p = PREDICT(theta, X) computes the predictions for X using a +% threshold at 0.5 (i.e., if sigmoid(theta'*x) >= 0.5, predict 1) + +m = size(X, 1); % Number of training examples + +% You need to return the following variables correctly +p = zeros(m, 1); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Complete the following code to make predictions using +% your learned logistic regression parameters. +% You should set p to a vector of 0's and 1's +% + +h = sigmoid( X*theta ); +p = round(h); + + + + +% ========================================================================= + + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/sigmoid.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/sigmoid.m new file mode 100644 index 0000000..f131b71 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/sigmoid.m @@ -0,0 +1,19 @@ +function g = sigmoid(z) +%SIGMOID Compute sigmoid functoon +% J = SIGMOID(z) computes the sigmoid of z. + +% You need to return the following variables correctly +g = zeros(size(z)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the sigmoid of each value of z (z can be a matrix, +% vector or scalar). + + +g = ones(size(z)) ./ (ones(size(z)) + exp(-1*z)); + + + +% ============================================================= + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/submit.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/submit.m new file mode 100644 index 0000000..2e76e6e --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/submit.m @@ -0,0 +1,574 @@ +function submit(partId, webSubmit) +%SUBMIT Submit your code and output to the ml-class servers +% SUBMIT() will connect to the ml-class server and submit your solution + + fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ... + homework_id()); + if ~exist('partId', 'var') || isempty(partId) + partId = promptPart(); + end + + if ~exist('webSubmit', 'var') || isempty(webSubmit) + webSubmit = 0; % submit directly by default + end + + % Check valid partId + partNames = validParts(); + if ~isValidPartId(partId) + fprintf('!! Invalid homework part selected.\n'); + fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1); + fprintf('!! Submission Cancelled\n'); + return + end + + if ~exist('ml_login_data.mat','file') + [login password] = loginPrompt(); + save('ml_login_data.mat','login','password'); + else + load('ml_login_data.mat'); + [login password] = quickLogin(login, password); + save('ml_login_data.mat','login','password'); + end + + if isempty(login) + fprintf('!! Submission Cancelled\n'); + return + end + + fprintf('\n== Connecting to ml-class ... '); + if exist('OCTAVE_VERSION') + fflush(stdout); + end + + % Setup submit list + if partId == numel(partNames) + 1 + submitParts = 1:numel(partNames); + else + submitParts = [partId]; + end + + for s = 1:numel(submitParts) + thisPartId = submitParts(s); + if (~webSubmit) % submit directly to server + [login, ch, signature, auxstring] = getChallenge(login, thisPartId); + if isempty(login) || isempty(ch) || isempty(signature) + % Some error occured, error string in first return element. + fprintf('\n!! Error: %s\n\n', login); + return + end + + % Attempt Submission with Challenge + ch_resp = challengeResponse(login, password, ch); + + [result, str] = submitSolution(login, ch_resp, thisPartId, ... + output(thisPartId, auxstring), source(thisPartId), signature); + + partName = partNames{thisPartId}; + + fprintf('\n== [ml-class] Submitted Assignment %s - Part %d - %s\n', ... + homework_id(), thisPartId, partName); + fprintf('== %s\n', strtrim(str)); + + if exist('OCTAVE_VERSION') + fflush(stdout); + end + else + [result] = submitSolutionWeb(login, thisPartId, output(thisPartId), ... + source(thisPartId)); + result = base64encode(result); + + fprintf('\nSave as submission file [submit_ex%s_part%d.txt (enter to accept default)]:', ... + homework_id(), thisPartId); + saveAsFile = input('', 's'); + if (isempty(saveAsFile)) + saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), thisPartId); + end + + fid = fopen(saveAsFile, 'w'); + if (fid) + fwrite(fid, result); + fclose(fid); + fprintf('\nSaved your solutions to %s.\n\n', saveAsFile); + fprintf(['You can now submit your solutions through the web \n' ... + 'form in the programming exercises. Select the corresponding \n' ... + 'programming exercise to access the form.\n']); + + else + fprintf('Unable to save to %s\n\n', saveAsFile); + fprintf(['You can create a submission file by saving the \n' ... + 'following text in a file: (press enter to continue)\n\n']); + pause; + fprintf(result); + end + end + end +end + +% ================== CONFIGURABLES FOR EACH HOMEWORK ================== + +function id = homework_id() + id = '2'; +end + +function [partNames] = validParts() + partNames = { 'Sigmoid Function ', ... + 'Logistic Regression Cost', ... + 'Logistic Regression Gradient', ... + 'Predict', ... + 'Regularized Logistic Regression Cost' ... + 'Regularized Logistic Regression Gradient' ... + }; +end + +function srcs = sources() + % Separated by part + srcs = { { 'sigmoid.m' }, ... + { 'costFunction.m' }, ... + { 'costFunction.m' }, ... + { 'predict.m' }, ... + { 'costFunctionReg.m' }, ... + { 'costFunctionReg.m' } }; +end + +function out = output(partId, auxstring) + % Random Test Cases + X = [ones(20,1) (exp(1) * sin(1:1:20))' (exp(0.5) * cos(1:1:20))']; + y = sin(X(:,1) + X(:,2)) > 0; + if partId == 1 + out = sprintf('%0.5f ', sigmoid(X)); + elseif partId == 2 + out = sprintf('%0.5f ', costFunction([0.25 0.5 -0.5]', X, y)); + elseif partId == 3 + [cost, grad] = costFunction([0.25 0.5 -0.5]', X, y); + out = sprintf('%0.5f ', grad); + elseif partId == 4 + out = sprintf('%0.5f ', predict([0.25 0.5 -0.5]', X)); + elseif partId == 5 + out = sprintf('%0.5f ', costFunctionReg([0.25 0.5 -0.5]', X, y, 0.1)); + elseif partId == 6 + [cost, grad] = costFunctionReg([0.25 0.5 -0.5]', X, y, 0.1); + out = sprintf('%0.5f ', grad); + end +end + + +% ====================== SERVER CONFIGURATION =========================== + +% ***************** REMOVE -staging WHEN YOU DEPLOY ********************* +function url = site_url() + url = 'http://class.coursera.org/ml-008'; +end + +function url = challenge_url() + url = [site_url() '/assignment/challenge']; +end + +function url = submit_url() + url = [site_url() '/assignment/submit']; +end + +% ========================= CHALLENGE HELPERS ========================= + +function src = source(partId) + src = ''; + src_files = sources(); + if partId <= numel(src_files) + flist = src_files{partId}; + for i = 1:numel(flist) + fid = fopen(flist{i}); + if (fid == -1) + error('Error opening %s (is it missing?)', flist{i}); + end + line = fgets(fid); + while ischar(line) + src = [src line]; + line = fgets(fid); + end + fclose(fid); + src = [src '||||||||']; + end + end +end + +function ret = isValidPartId(partId) + partNames = validParts(); + ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1); +end + +function partId = promptPart() + fprintf('== Select which part(s) to submit:\n'); + partNames = validParts(); + srcFiles = sources(); + for i = 1:numel(partNames) + fprintf('== %d) %s [', i, partNames{i}); + fprintf(' %s ', srcFiles{i}{:}); + fprintf(']\n'); + end + fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ... + numel(partNames) + 1, numel(partNames) + 1); + selPart = input('', 's'); + partId = str2num(selPart); + if ~isValidPartId(partId) + partId = -1; + end +end + +function [email,ch,signature,auxstring] = getChallenge(email, part) + str = urlread(challenge_url(), 'post', {'email_address', email, 'assignment_part_sid', [homework_id() '-' num2str(part)], 'response_encoding', 'delim'}); + + str = strtrim(str); + r = struct; + while(numel(str) > 0) + [f, str] = strtok (str, '|'); + [v, str] = strtok (str, '|'); + r = setfield(r, f, v); + end + + email = getfield(r, 'email_address'); + ch = getfield(r, 'challenge_key'); + signature = getfield(r, 'state'); + auxstring = getfield(r, 'challenge_aux_data'); +end + +function [result, str] = submitSolutionWeb(email, part, output, source) + + result = ['{"assignment_part_sid":"' base64encode([homework_id() '-' num2str(part)], '') '",' ... + '"email_address":"' base64encode(email, '') '",' ... + '"submission":"' base64encode(output, '') '",' ... + '"submission_aux":"' base64encode(source, '') '"' ... + '}']; + str = 'Web-submission'; +end + +function [result, str] = submitSolution(email, ch_resp, part, output, ... + source, signature) + + params = {'assignment_part_sid', [homework_id() '-' num2str(part)], ... + 'email_address', email, ... + 'submission', base64encode(output, ''), ... + 'submission_aux', base64encode(source, ''), ... + 'challenge_response', ch_resp, ... + 'state', signature}; + + str = urlread(submit_url(), 'post', params); + + % Parse str to read for success / failure + result = 0; + +end + +% =========================== LOGIN HELPERS =========================== + +function [login password] = loginPrompt() + % Prompt for password + [login password] = basicPrompt(); + + if isempty(login) || isempty(password) + login = []; password = []; + end +end + + +function [login password] = basicPrompt() + login = input('Login (Email address): ', 's'); + password = input('Password: ', 's'); +end + +function [login password] = quickLogin(login,password) + disp(['You are currently logged in as ' login '.']); + cont_token = input('Is this you? (y/n - type n to reenter password)','s'); + if(isempty(cont_token) || cont_token(1)=='Y'||cont_token(1)=='y') + return; + else + [login password] = loginPrompt(); + end +end + +function [str] = challengeResponse(email, passwd, challenge) + str = sha1([challenge passwd]); +end + +% =============================== SHA-1 ================================ + +function hash = sha1(str) + + % Initialize variables + h0 = uint32(1732584193); + h1 = uint32(4023233417); + h2 = uint32(2562383102); + h3 = uint32(271733878); + h4 = uint32(3285377520); + + % Convert to word array + strlen = numel(str); + + % Break string into chars and append the bit 1 to the message + mC = [double(str) 128]; + mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')]; + + numB = strlen * 8; + if exist('idivide') + numC = idivide(uint32(numB + 65), 512, 'ceil'); + else + numC = ceil(double(numB + 65)/512); + end + numW = numC * 16; + mW = zeros(numW, 1, 'uint32'); + + idx = 1; + for i = 1:4:strlen + 1 + mW(idx) = bitor(bitor(bitor( ... + bitshift(uint32(mC(i)), 24), ... + bitshift(uint32(mC(i+1)), 16)), ... + bitshift(uint32(mC(i+2)), 8)), ... + uint32(mC(i+3))); + idx = idx + 1; + end + + % Append length of message + mW(numW - 1) = uint32(bitshift(uint64(numB), -32)); + mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32)); + + % Process the message in successive 512-bit chs + for cId = 1 : double(numC) + cSt = (cId - 1) * 16 + 1; + cEnd = cId * 16; + ch = mW(cSt : cEnd); + + % Extend the sixteen 32-bit words into eighty 32-bit words + for j = 17 : 80 + ch(j) = ch(j - 3); + ch(j) = bitxor(ch(j), ch(j - 8)); + ch(j) = bitxor(ch(j), ch(j - 14)); + ch(j) = bitxor(ch(j), ch(j - 16)); + ch(j) = bitrotate(ch(j), 1); + end + + % Initialize hash value for this ch + a = h0; + b = h1; + c = h2; + d = h3; + e = h4; + + % Main loop + for i = 1 : 80 + if(i >= 1 && i <= 20) + f = bitor(bitand(b, c), bitand(bitcmp(b), d)); + k = uint32(1518500249); + elseif(i >= 21 && i <= 40) + f = bitxor(bitxor(b, c), d); + k = uint32(1859775393); + elseif(i >= 41 && i <= 60) + f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d)); + k = uint32(2400959708); + elseif(i >= 61 && i <= 80) + f = bitxor(bitxor(b, c), d); + k = uint32(3395469782); + end + + t = bitrotate(a, 5); + t = bitadd(t, f); + t = bitadd(t, e); + t = bitadd(t, k); + t = bitadd(t, ch(i)); + e = d; + d = c; + c = bitrotate(b, 30); + b = a; + a = t; + + end + h0 = bitadd(h0, a); + h1 = bitadd(h1, b); + h2 = bitadd(h2, c); + h3 = bitadd(h3, d); + h4 = bitadd(h4, e); + + end + + hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]); + + hash = lower(hash); + +end + +function ret = bitadd(iA, iB) + ret = double(iA) + double(iB); + ret = bitset(ret, 33, 0); + ret = uint32(ret); +end + +function ret = bitrotate(iA, places) + t = bitshift(iA, places - 32); + ret = bitshift(iA, places); + ret = bitor(ret, t); +end + +% =========================== Base64 Encoder ============================ +% Thanks to Peter John Acklam +% + +function y = base64encode(x, eol) +%BASE64ENCODE Perform base64 encoding on a string. +% +% BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending +% sequence to use; it is optional and defaults to '\n' (ASCII decimal 10). +% The returned encoded string is broken into lines of no more than 76 +% characters each, and each line will end with EOL unless it is empty. Let +% EOL be empty if you do not want the encoded string broken into lines. +% +% STR and EOL don't have to be strings (i.e., char arrays). The only +% requirement is that they are vectors containing values in the range 0-255. +% +% This function may be used to encode strings into the Base64 encoding +% specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The +% Base64 encoding is designed to represent arbitrary sequences of octets in a +% form that need not be humanly readable. A 65-character subset +% ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per +% printable character. +% +% Examples +% -------- +% +% If you want to encode a large file, you should encode it in chunks that are +% a multiple of 57 bytes. This ensures that the base64 lines line up and +% that you do not end up with padding in the middle. 57 bytes of data fills +% one complete base64 line (76 == 57*4/3): +% +% If ifid and ofid are two file identifiers opened for reading and writing, +% respectively, then you can base64 encode the data with +% +% while ~feof(ifid) +% fwrite(ofid, base64encode(fread(ifid, 60*57))); +% end +% +% or, if you have enough memory, +% +% fwrite(ofid, base64encode(fread(ifid))); +% +% See also BASE64DECODE. + +% Author: Peter John Acklam +% Time-stamp: 2004-02-03 21:36:56 +0100 +% E-mail: pjacklam@online.no +% URL: http://home.online.no/~pjacklam + + if isnumeric(x) + x = num2str(x); + end + + % make sure we have the EOL value + if nargin < 2 + eol = sprintf('\n'); + else + if sum(size(eol) > 1) > 1 + error('EOL must be a vector.'); + end + if any(eol(:) > 255) + error('EOL can not contain values larger than 255.'); + end + end + + if sum(size(x) > 1) > 1 + error('STR must be a vector.'); + end + + x = uint8(x); + eol = uint8(eol); + + ndbytes = length(x); % number of decoded bytes + nchunks = ceil(ndbytes / 3); % number of chunks/groups + nebytes = 4 * nchunks; % number of encoded bytes + + % add padding if necessary, to make the length of x a multiple of 3 + if rem(ndbytes, 3) + x(end+1 : 3*nchunks) = 0; + end + + x = reshape(x, [3, nchunks]); % reshape the data + y = repmat(uint8(0), 4, nchunks); % for the encoded data + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Split up every 3 bytes into 4 pieces + % + % aaaaaabb bbbbcccc ccdddddd + % + % to form + % + % 00aaaaaa 00bbbbbb 00cccccc 00dddddd + % + y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:) + + y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:) + y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:) + + y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:) + y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:) + + y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:) + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Now perform the following mapping + % + % 0 - 25 -> A-Z + % 26 - 51 -> a-z + % 52 - 61 -> 0-9 + % 62 -> + + % 63 -> / + % + % We could use a mapping vector like + % + % ['A':'Z', 'a':'z', '0':'9', '+/'] + % + % but that would require an index vector of class double. + % + z = repmat(uint8(0), size(y)); + i = y <= 25; z(i) = 'A' + double(y(i)); + i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i)); + i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i)); + i = y == 62; z(i) = '+'; + i = y == 63; z(i) = '/'; + y = z; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Add padding if necessary. + % + npbytes = 3 * nchunks - ndbytes; % number of padding bytes + if npbytes + y(end-npbytes+1 : end) = '='; % '=' is used for padding + end + + if isempty(eol) + + % reshape to a row vector + y = reshape(y, [1, nebytes]); + + else + + nlines = ceil(nebytes / 76); % number of lines + neolbytes = length(eol); % number of bytes in eol string + + % pad data so it becomes a multiple of 76 elements + y = [y(:) ; zeros(76 * nlines - numel(y), 1)]; + y(nebytes + 1 : 76 * nlines) = 0; + y = reshape(y, 76, nlines); + + % insert eol strings + eol = eol(:); + y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines)); + + % remove padding, but keep the last eol string + m = nebytes + neolbytes * (nlines - 1); + n = (76+neolbytes)*nlines - neolbytes; + y(m+1 : n) = ''; + + % extract and reshape to row vector + y = reshape(y, 1, m+neolbytes); + + end + + % output is a character array + y = char(y); + +end diff --git a/machine_learning/mlclass-ex2-008/mlclass-ex2/submitWeb.m b/machine_learning/mlclass-ex2-008/mlclass-ex2/submitWeb.m new file mode 100644 index 0000000..8611707 --- /dev/null +++ b/machine_learning/mlclass-ex2-008/mlclass-ex2/submitWeb.m @@ -0,0 +1,20 @@ +% submitWeb Creates files from your code and output for web submission. +% +% If the submit function does not work for you, use the web-submission mechanism. +% Call this function to produce a file for the part you wish to submit. Then, +% submit the file to the class servers using the "Web Submission" button on the +% Programming Exercises page on the course website. +% +% You should call this function without arguments (submitWeb), to receive +% an interactive prompt for submission; optionally you can call it with the partID +% if you so wish. Make sure your working directory is set to the directory +% containing the submitWeb.m file and your assignment files. + +function submitWeb(partId) + if ~exist('partId', 'var') || isempty(partId) + partId = []; + end + + submit(partId, 1); +end + diff --git a/machine_learning/mlclass-ex3-008/ex3.pdf b/machine_learning/mlclass-ex3-008/ex3.pdf new file mode 100644 index 0000000..bac0f5f Binary files /dev/null and b/machine_learning/mlclass-ex3-008/ex3.pdf differ diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/displayData.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/displayData.m new file mode 100644 index 0000000..160697e --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/displayData.m @@ -0,0 +1,59 @@ +function [h, display_array] = displayData(X, example_width) +%DISPLAYDATA Display 2D data in a nice grid +% [h, display_array] = DISPLAYDATA(X, example_width) displays 2D data +% stored in X in a nice grid. It returns the figure handle h and the +% displayed array if requested. + +% Set example_width automatically if not passed in +if ~exist('example_width', 'var') || isempty(example_width) + example_width = round(sqrt(size(X, 2))); +end + +% Gray Image +colormap(gray); + +% Compute rows, cols +[m n] = size(X); +example_height = (n / example_width); + +% Compute number of items to display +display_rows = floor(sqrt(m)); +display_cols = ceil(m / display_rows); + +% Between images padding +pad = 1; + +% Setup blank display +display_array = - ones(pad + display_rows * (example_height + pad), ... + pad + display_cols * (example_width + pad)); + +% Copy each example into a patch on the display array +curr_ex = 1; +for j = 1:display_rows + for i = 1:display_cols + if curr_ex > m, + break; + end + % Copy the patch + + % Get the max value of the patch + max_val = max(abs(X(curr_ex, :))); + display_array(pad + (j - 1) * (example_height + pad) + (1:example_height), ... + pad + (i - 1) * (example_width + pad) + (1:example_width)) = ... + reshape(X(curr_ex, :), example_height, example_width) / max_val; + curr_ex = curr_ex + 1; + end + if curr_ex > m, + break; + end +end + +% Display Image +h = imagesc(display_array, [-1 1]); + +% Do not show axis +axis image off + +drawnow; + +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3.m new file mode 100644 index 0000000..5ea40bd --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3.m @@ -0,0 +1,69 @@ +%% Machine Learning Online Class - Exercise 3 | Part 1: One-vs-all + +% Instructions +% ------------ +% +% This file contains code that helps you get started on the +% linear exercise. You will need to complete the following functions +% in this exericse: +% +% lrCostFunction.m (logistic regression cost function) +% oneVsAll.m +% predictOneVsAll.m +% predict.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% + +%% Initialization +clear ; close all; clc + +%% Setup the parameters you will use for this part of the exercise +input_layer_size = 400; % 20x20 Input Images of Digits +num_labels = 10; % 10 labels, from 1 to 10 + % (note that we have mapped "0" to label 10) + +%% =========== Part 1: Loading and Visualizing Data ============= +% We start the exercise by first loading and visualizing the dataset. +% You will be working with a dataset that contains handwritten digits. +% + +% Load Training Data +fprintf('Loading and Visualizing Data ...\n') + +load('ex3data1.mat'); % training data stored in arrays X, y +m = size(X, 1); + +% Randomly select 100 data points to display +rand_indices = randperm(m); +sel = X(rand_indices(1:100), :); + +%displayData(sel); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +%% ============ Part 2: Vectorize Logistic Regression ============ +% In this part of the exercise, you will reuse your logistic regression +% code from the last exercise. You task here is to make sure that your +% regularized logistic regression implementation is vectorized. After +% that, you will implement one-vs-all classification for the handwritten +% digit dataset. +% + +fprintf('\nTraining One-vs-All Logistic Regression...\n') + +lambda = 0.1; +[all_theta] = oneVsAll(X, y, num_labels, lambda); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + + +%% ================ Part 3: Predict for One-Vs-All ================ +% After ... +pred = predictOneVsAll(all_theta, X); + +fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100); + diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3_nn.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3_nn.m new file mode 100644 index 0000000..073bc4d --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3_nn.m @@ -0,0 +1,88 @@ +%% Machine Learning Online Class - Exercise 3 | Part 2: Neural Networks + +% Instructions +% ------------ +% +% This file contains code that helps you get started on the +% linear exercise. You will need to complete the following functions +% in this exericse: +% +% lrCostFunction.m (logistic regression cost function) +% oneVsAll.m +% predictOneVsAll.m +% predict.m +% +% For this exercise, you will not need to change any code in this file, +% or any other files other than those mentioned above. +% + +%% Initialization +clear ; close all; clc + +%% Setup the parameters you will use for this exercise +input_layer_size = 400; % 20x20 Input Images of Digits +hidden_layer_size = 25; % 25 hidden units +num_labels = 10; % 10 labels, from 1 to 10 + % (note that we have mapped "0" to label 10) + +%% =========== Part 1: Loading and Visualizing Data ============= +% We start the exercise by first loading and visualizing the dataset. +% You will be working with a dataset that contains handwritten digits. +% + +% Load Training Data +fprintf('Loading and Visualizing Data ...\n') + +load('ex3data1.mat'); +m = size(X, 1); + +% Randomly select 100 data points to display +sel = randperm(size(X, 1)); +sel = sel(1:100); + +displayData(X(sel, :)); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +%% ================ Part 2: Loading Pameters ================ +% In this part of the exercise, we load some pre-initialized +% neural network parameters. + +fprintf('\nLoading Saved Neural Network Parameters ...\n') + +% Load the weights into variables Theta1 and Theta2 +load('ex3weights.mat'); + +%% ================= Part 3: Implement Predict ================= +% After training the neural network, we would like to use it to predict +% the labels. You will now implement the "predict" function to use the +% neural network to predict the labels of the training set. This lets +% you compute the training set accuracy. + +pred = predict(Theta1, Theta2, X); + +fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100); + +fprintf('Program paused. Press enter to continue.\n'); +pause; + +% To give you an idea of the network's output, you can also run +% through the examples one at the a time to see what it is predicting. + +% Randomly permute examples +rp = randperm(m); + +for i = 1:m + % Display + fprintf('\nDisplaying Example Image\n'); + displayData(X(rp(i), :)); + + pred = predict(Theta1, Theta2, X(rp(i),:)); + fprintf('\nNeural Network Prediction: %d (digit %d)\n', pred, mod(pred, 10)); + + % Pause + fprintf('Program paused. Press enter to continue.\n'); + pause; +end + diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3data1.mat b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3data1.mat new file mode 100644 index 0000000..371bd0c Binary files /dev/null and b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3data1.mat differ diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3weights.mat b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3weights.mat new file mode 100644 index 0000000..ace2a09 Binary files /dev/null and b/machine_learning/mlclass-ex3-008/mlclass-ex3/ex3weights.mat differ diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/fmincg.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/fmincg.m new file mode 100644 index 0000000..34bf539 --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/fmincg.m @@ -0,0 +1,175 @@ +function [X, fX, i] = fmincg(f, X, options, P1, P2, P3, P4, P5) +% Minimize a continuous differentialble multivariate function. Starting point +% is given by "X" (D by 1), and the function named in the string "f", must +% return a function value and a vector of partial derivatives. The Polack- +% Ribiere flavour of conjugate gradients is used to compute search directions, +% and a line search using quadratic and cubic polynomial approximations and the +% Wolfe-Powell stopping criteria is used together with the slope ratio method +% for guessing initial step sizes. Additionally a bunch of checks are made to +% make sure that exploration is taking place and that extrapolation will not +% be unboundedly large. The "length" gives the length of the run: if it is +% positive, it gives the maximum number of line searches, if negative its +% absolute gives the maximum allowed number of function evaluations. You can +% (optionally) give "length" a second component, which will indicate the +% reduction in function value to be expected in the first line-search (defaults +% to 1.0). The function returns when either its length is up, or if no further +% progress can be made (ie, we are at a minimum, or so close that due to +% numerical problems, we cannot get any closer). If the function terminates +% within a few iterations, it could be an indication that the function value +% and derivatives are not consistent (ie, there may be a bug in the +% implementation of your "f" function). The function returns the found +% solution "X", a vector of function values "fX" indicating the progress made +% and "i" the number of iterations (line searches or function evaluations, +% depending on the sign of "length") used. +% +% Usage: [X, fX, i] = fmincg(f, X, options, P1, P2, P3, P4, P5) +% +% See also: checkgrad +% +% Copyright (C) 2001 and 2002 by Carl Edward Rasmussen. Date 2002-02-13 +% +% +% (C) Copyright 1999, 2000 & 2001, Carl Edward Rasmussen +% +% Permission is granted for anyone to copy, use, or modify these +% programs and accompanying documents for purposes of research or +% education, provided this copyright notice is retained, and note is +% made of any changes that have been made. +% +% These programs and documents are distributed without any warranty, +% express or implied. As the programs were written for research +% purposes only, they have not been tested to the degree that would be +% advisable in any important application. All use of these programs is +% entirely at the user's own risk. +% +% [ml-class] Changes Made: +% 1) Function name and argument specifications +% 2) Output display +% + +% Read options +if exist('options', 'var') && ~isempty(options) && isfield(options, 'MaxIter') + length = options.MaxIter; +else + length = 100; +end + + +RHO = 0.01; % a bunch of constants for line searches +SIG = 0.5; % RHO and SIG are the constants in the Wolfe-Powell conditions +INT = 0.1; % don't reevaluate within 0.1 of the limit of the current bracket +EXT = 3.0; % extrapolate maximum 3 times the current bracket +MAX = 20; % max 20 function evaluations per line search +RATIO = 100; % maximum allowed slope ratio + +argstr = ['feval(f, X']; % compose string used to call function +for i = 1:(nargin - 3) + argstr = [argstr, ',P', int2str(i)]; +end +argstr = [argstr, ')']; + +if max(size(length)) == 2, red=length(2); length=length(1); else red=1; end +S=['Iteration ']; + +i = 0; % zero the run length counter +ls_failed = 0; % no previous line search has failed +fX = []; +[f1 df1] = eval(argstr); % get function value and gradient +i = i + (length<0); % count epochs?! +s = -df1; % search direction is steepest +d1 = -s'*s; % this is the slope +z1 = red/(1-d1); % initial step is red/(|s|+1) + +while i < abs(length) % while not finished + i = i + (length>0); % count iterations?! + + X0 = X; f0 = f1; df0 = df1; % make a copy of current values + X = X + z1*s; % begin line search + [f2 df2] = eval(argstr); + i = i + (length<0); % count epochs?! + d2 = df2'*s; + f3 = f1; d3 = d1; z3 = -z1; % initialize point 3 equal to point 1 + if length>0, M = MAX; else M = min(MAX, -length-i); end + success = 0; limit = -1; % initialize quanteties + while 1 + while ((f2 > f1+z1*RHO*d1) | (d2 > -SIG*d1)) & (M > 0) + limit = z1; % tighten the bracket + if f2 > f1 + z2 = z3 - (0.5*d3*z3*z3)/(d3*z3+f2-f3); % quadratic fit + else + A = 6*(f2-f3)/z3+3*(d2+d3); % cubic fit + B = 3*(f3-f2)-z3*(d3+2*d2); + z2 = (sqrt(B*B-A*d2*z3*z3)-B)/A; % numerical error possible - ok! + end + if isnan(z2) | isinf(z2) + z2 = z3/2; % if we had a numerical problem then bisect + end + z2 = max(min(z2, INT*z3),(1-INT)*z3); % don't accept too close to limits + z1 = z1 + z2; % update the step + X = X + z2*s; + [f2 df2] = eval(argstr); + M = M - 1; i = i + (length<0); % count epochs?! + d2 = df2'*s; + z3 = z3-z2; % z3 is now relative to the location of z2 + end + if f2 > f1+z1*RHO*d1 | d2 > -SIG*d1 + break; % this is a failure + elseif d2 > SIG*d1 + success = 1; break; % success + elseif M == 0 + break; % failure + end + A = 6*(f2-f3)/z3+3*(d2+d3); % make cubic extrapolation + B = 3*(f3-f2)-z3*(d3+2*d2); + z2 = -d2*z3*z3/(B+sqrt(B*B-A*d2*z3*z3)); % num. error possible - ok! + if ~isreal(z2) | isnan(z2) | isinf(z2) | z2 < 0 % num prob or wrong sign? + if limit < -0.5 % if we have no upper limit + z2 = z1 * (EXT-1); % the extrapolate the maximum amount + else + z2 = (limit-z1)/2; % otherwise bisect + end + elseif (limit > -0.5) & (z2+z1 > limit) % extraplation beyond max? + z2 = (limit-z1)/2; % bisect + elseif (limit < -0.5) & (z2+z1 > z1*EXT) % extrapolation beyond limit + z2 = z1*(EXT-1.0); % set to extrapolation limit + elseif z2 < -z3*INT + z2 = -z3*INT; + elseif (limit > -0.5) & (z2 < (limit-z1)*(1.0-INT)) % too close to limit? + z2 = (limit-z1)*(1.0-INT); + end + f3 = f2; d3 = d2; z3 = -z2; % set point 3 equal to point 2 + z1 = z1 + z2; X = X + z2*s; % update current estimates + [f2 df2] = eval(argstr); + M = M - 1; i = i + (length<0); % count epochs?! + d2 = df2'*s; + end % end of line search + + if success % if line search succeeded + f1 = f2; fX = [fX' f1]'; + fprintf('%s %4i | Cost: %4.6e\r', S, i, f1); + s = (df2'*df2-df1'*df2)/(df1'*df1)*s - df2; % Polack-Ribiere direction + tmp = df1; df1 = df2; df2 = tmp; % swap derivatives + d2 = df1'*s; + if d2 > 0 % new slope must be negative + s = -df1; % otherwise use steepest direction + d2 = -s'*s; + end + z1 = z1 * min(RATIO, d1/(d2-realmin)); % slope ratio but max RATIO + d1 = d2; + ls_failed = 0; % this line search did not fail + else + X = X0; f1 = f0; df1 = df0; % restore point from before failed line search + if ls_failed | i > abs(length) % line search failed twice in a row + break; % or we ran out of time, so we give up + end + tmp = df1; df1 = df2; df2 = tmp; % swap derivatives + s = -df1; % try steepest + d1 = -s'*s; + z1 = 1/(1-d1); + ls_failed = 1; % this line search failed + end + if exist('OCTAVE_VERSION') + fflush(stdout); + end +end +fprintf('\n'); diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/lrCostFunction.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/lrCostFunction.m new file mode 100644 index 0000000..7fd3f7f --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/lrCostFunction.m @@ -0,0 +1,58 @@ +function [J, grad] = lrCostFunction(theta, X, y, lambda) +%LRCOSTFUNCTION Compute cost and gradient for logistic regression with +%regularization +% J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using +% theta as the parameter for regularized logistic regression and the +% gradient of the cost w.r.t. to the parameters. + +% Initialize some useful values +m = length(y); % number of training examples + +% You need to return the following variables correctly +J = 0; +grad = zeros(size(theta)); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Compute the cost of a particular choice of theta. +% You should set J to the cost. +% Compute the partial derivatives and set grad to the partial +% derivatives of the cost w.r.t. each parameter in theta +% +% Hint: The computation of the cost function and gradients can be +% efficiently vectorized. For example, consider the computation +% +% sigmoid(X * theta) +% +% Each row of the resulting matrix will contain the value of the +% prediction for that example. You can make use of this to vectorize +% the cost function and gradient computations. +% +% Hint: When computing the gradient of the regularized cost function, +% there're many possible vectorized solutions, but one solution +% looks like: +% grad = (unregularized gradient for logistic regression) +% temp = theta; +% temp(1) = 0; % because we don't add anything for j = 0 +% grad = grad + YOUR_CODE_HERE (using the temp variable) +% + + +h = sigmoid( X*theta ); +o = ones(size(y)); +reg = theta; +reg(1) = 0; +J = sum( y .* log(h) + (o-y) .* log(o-h) ) / (-m) + (lambda/(2*m))*sum(reg.^2); +grad = (X'*(h - y)) / m + (lambda/m) * reg; + + + + + + + + +% ============================================================= + +grad = grad(:); + +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/oneVsAll.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/oneVsAll.m new file mode 100644 index 0000000..96d10aa --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/oneVsAll.m @@ -0,0 +1,70 @@ +function [all_theta] = oneVsAll(X, y, num_labels, lambda) +%ONEVSALL trains multiple logistic regression classifiers and returns all +%the classifiers in a matrix all_theta, where the i-th row of all_theta +%corresponds to the classifier for label i +% [all_theta] = ONEVSALL(X, y, num_labels, lambda) trains num_labels +% logisitc regression classifiers and returns each of these classifiers +% in a matrix all_theta, where the i-th row of all_theta corresponds +% to the classifier for label i + +% Some useful variables +m = size(X, 1); +n = size(X, 2); + +% You need to return the following variables correctly +all_theta = zeros(num_labels, n + 1); + +% Add ones to the X data matrix +X = [ones(m, 1) X]; + +% ====================== YOUR CODE HERE ====================== +% Instructions: You should complete the following code to train num_labels +% logistic regression classifiers with regularization +% parameter lambda. +% +% Hint: theta(:) will return a column vector. +% +% Hint: You can use y == c to obtain a vector of 1's and 0's that tell use +% whether the ground truth is true/false for this class. +% +% Note: For this assignment, we recommend using fmincg to optimize the cost +% function. It is okay to use a for-loop (for c = 1:num_labels) to +% loop over the different classes. +% +% fmincg works similarly to fminunc, but is more efficient when we +% are dealing with large number of parameters. +% +% Example Code for fmincg: +% +% % Set Initial theta +% initial_theta = zeros(n + 1, 1); +% +% % Set options for fminunc +% options = optimset('GradObj', 'on', 'MaxIter', 50); +% +% % Run fmincg to obtain the optimal theta +% % This function will return theta and the cost +% [theta] = ... +% fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ... +% initial_theta, options); +% + +options = optimset('GradObj', 'on', 'MaxIter', 50); +initial_theta = zeros(n + 1, 1); + +for c = 1:num_labels, + + +theta = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options); +all_theta(c,:) = theta; + +end; + + + + + +% ========================================================================= + + +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/predict.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/predict.m new file mode 100644 index 0000000..c326fa3 --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/predict.m @@ -0,0 +1,33 @@ +function p = predict(Theta1, Theta2, X) +%PREDICT Predict the label of an input given a trained neural network +% p = PREDICT(Theta1, Theta2, X) outputs the predicted label of X given the +% trained weights of a neural network (Theta1, Theta2) + +% Useful values +m = size(X, 1); +num_labels = size(Theta2, 1); + +% You need to return the following variables correctly +p = zeros(size(X, 1), 1); + +% ====================== YOUR CODE HERE ====================== +% Instructions: Complete the following code to make predictions using +% your learned neural network. You should set p to a +% vector containing labels between 1 to num_labels. +% +% Hint: The max function might come in useful. In particular, the max +% function can also return the index of the max element, for more +% information see 'help max'. If your examples are in rows, then, you +% can use max(A, [], 2) to obtain the max for each row. +% + +X = [ones(m, 1) X]; +a2 = [ones(m,1) sigmoid(X*Theta1')]; +a3 = sigmoid(a2*Theta2'); + +[m, p] = max( a3, [], 2 ); + +% ========================================================================= + + +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/predictOneVsAll.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/predictOneVsAll.m new file mode 100644 index 0000000..ad553da --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/predictOneVsAll.m @@ -0,0 +1,39 @@ +function p = predictOneVsAll(all_theta, X) +%PREDICT Predict the label for a trained one-vs-all classifier. The labels +%are in the range 1..K, where K = size(all_theta, 1). +% p = PREDICTONEVSALL(all_theta, X) will return a vector of predictions +% for each example in the matrix X. Note that X contains the examples in +% rows. all_theta is a matrix where the i-th row is a trained logistic +% regression theta vector for the i-th class. You should set p to a vector +% of values from 1..K (e.g., p = [1; 3; 1; 2] predicts classes 1, 3, 1, 2 +% for 4 examples) + +m = size(X, 1); +num_labels = size(all_theta, 1); + +% You need to return the following variables correctly +p = zeros(size(X, 1), 1); + +% Add ones to the X data matrix +X = [ones(m, 1) X]; + +% ====================== YOUR CODE HERE ====================== +% Instructions: Complete the following code to make predictions using +% your learned logistic regression parameters (one-vs-all). +% You should set p to a vector of predictions (from 1 to +% num_labels). +% +% Hint: This code can be done all vectorized using the max function. +% In particular, the max function can also return the index of the +% max element, for more information see 'help max'. If your examples +% are in rows, then, you can use max(A, [], 2) to obtain the max +% for each row. +% + +[m, p] = max( sigmoid( all_theta * X' ) ); +p = p'; + +% ========================================================================= + + +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/sigmoid.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/sigmoid.m new file mode 100644 index 0000000..6deca13 --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/sigmoid.m @@ -0,0 +1,6 @@ +function g = sigmoid(z) +%SIGMOID Compute sigmoid functoon +% J = SIGMOID(z) computes the sigmoid of z. + +g = 1.0 ./ (1.0 + exp(-z)); +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/submit.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/submit.m new file mode 100644 index 0000000..e336a9f --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/submit.m @@ -0,0 +1,574 @@ +function submit(partId, webSubmit) +%SUBMIT Submit your code and output to the ml-class servers +% SUBMIT() will connect to the ml-class server and submit your solution + + fprintf('==\n== [ml-class] Submitting Solutions | Programming Exercise %s\n==\n', ... + homework_id()); + if ~exist('partId', 'var') || isempty(partId) + partId = promptPart(); + end + + if ~exist('webSubmit', 'var') || isempty(webSubmit) + webSubmit = 0; % submit directly by default + end + + % Check valid partId + partNames = validParts(); + if ~isValidPartId(partId) + fprintf('!! Invalid homework part selected.\n'); + fprintf('!! Expected an integer from 1 to %d.\n', numel(partNames) + 1); + fprintf('!! Submission Cancelled\n'); + return + end + + if ~exist('ml_login_data.mat','file') + [login password] = loginPrompt(); + save('ml_login_data.mat','login','password'); + else + load('ml_login_data.mat'); + [login password] = quickLogin(login, password); + save('ml_login_data.mat','login','password'); + end + + if isempty(login) + fprintf('!! Submission Cancelled\n'); + return + end + + fprintf('\n== Connecting to ml-class ... '); + if exist('OCTAVE_VERSION') + fflush(stdout); + end + + % Setup submit list + if partId == numel(partNames) + 1 + submitParts = 1:numel(partNames); + else + submitParts = [partId]; + end + + for s = 1:numel(submitParts) + thisPartId = submitParts(s); + if (~webSubmit) % submit directly to server + [login, ch, signature, auxstring] = getChallenge(login, thisPartId); + if isempty(login) || isempty(ch) || isempty(signature) + % Some error occured, error string in first return element. + fprintf('\n!! Error: %s\n\n', login); + return + end + + % Attempt Submission with Challenge + ch_resp = challengeResponse(login, password, ch); + + [result, str] = submitSolution(login, ch_resp, thisPartId, ... + output(thisPartId, auxstring), source(thisPartId), signature); + + partName = partNames{thisPartId}; + + fprintf('\n== [ml-class] Submitted Assignment %s - Part %d - %s\n', ... + homework_id(), thisPartId, partName); + fprintf('== %s\n', strtrim(str)); + + if exist('OCTAVE_VERSION') + fflush(stdout); + end + else + [result] = submitSolutionWeb(login, thisPartId, output(thisPartId), ... + source(thisPartId)); + result = base64encode(result); + + fprintf('\nSave as submission file [submit_ex%s_part%d.txt (enter to accept default)]:', ... + homework_id(), thisPartId); + saveAsFile = input('', 's'); + if (isempty(saveAsFile)) + saveAsFile = sprintf('submit_ex%s_part%d.txt', homework_id(), thisPartId); + end + + fid = fopen(saveAsFile, 'w'); + if (fid) + fwrite(fid, result); + fclose(fid); + fprintf('\nSaved your solutions to %s.\n\n', saveAsFile); + fprintf(['You can now submit your solutions through the web \n' ... + 'form in the programming exercises. Select the corresponding \n' ... + 'programming exercise to access the form.\n']); + + else + fprintf('Unable to save to %s\n\n', saveAsFile); + fprintf(['You can create a submission file by saving the \n' ... + 'following text in a file: (press enter to continue)\n\n']); + pause; + fprintf(result); + end + end + end +end + +% ================== CONFIGURABLES FOR EACH HOMEWORK ================== + +function id = homework_id() + id = '3'; +end + +function [partNames] = validParts() + partNames = { 'Vectorized Logistic Regression ', ... + 'One-vs-all classifier training', ... + 'One-vs-all classifier prediction', ... + 'Neural network prediction function' ... + }; +end + +function srcs = sources() + % Separated by part + srcs = { { 'lrCostFunction.m' }, ... + { 'oneVsAll.m' }, ... + { 'predictOneVsAll.m' }, ... + { 'predict.m' } }; +end + +function out = output(partId, auxdata) + % Random Test Cases + X = [ones(20,1) (exp(1) * sin(1:1:20))' (exp(0.5) * cos(1:1:20))']; + y = sin(X(:,1) + X(:,2)) > 0; + Xm = [ -1 -1 ; -1 -2 ; -2 -1 ; -2 -2 ; ... + 1 1 ; 1 2 ; 2 1 ; 2 2 ; ... + -1 1 ; -1 2 ; -2 1 ; -2 2 ; ... + 1 -1 ; 1 -2 ; -2 -1 ; -2 -2 ]; + ym = [ 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 ]'; + t1 = sin(reshape(1:2:24, 4, 3)); + t2 = cos(reshape(1:2:40, 4, 5)); + + if partId == 1 + [J, grad] = lrCostFunction([0.25 0.5 -0.5]', X, y, 0.1); + out = sprintf('%0.5f ', J); + out = [out sprintf('%0.5f ', grad)]; + elseif partId == 2 + out = sprintf('%0.5f ', oneVsAll(Xm, ym, 4, 0.1)); + elseif partId == 3 + out = sprintf('%0.5f ', predictOneVsAll(t1, Xm)); + elseif partId == 4 + out = sprintf('%0.5f ', predict(t1, t2, Xm)); + end +end + + +% ====================== SERVER CONFIGURATION =========================== + +% ***************** REMOVE -staging WHEN YOU DEPLOY ********************* +function url = site_url() + url = 'http://class.coursera.org/ml-008'; +end + +function url = challenge_url() + url = [site_url() '/assignment/challenge']; +end + +function url = submit_url() + url = [site_url() '/assignment/submit']; +end + +% ========================= CHALLENGE HELPERS ========================= + +function src = source(partId) + src = ''; + src_files = sources(); + if partId <= numel(src_files) + flist = src_files{partId}; + for i = 1:numel(flist) + fid = fopen(flist{i}); + if (fid == -1) + error('Error opening %s (is it missing?)', flist{i}); + end + line = fgets(fid); + while ischar(line) + src = [src line]; + line = fgets(fid); + end + fclose(fid); + src = [src '||||||||']; + end + end +end + +function ret = isValidPartId(partId) + partNames = validParts(); + ret = (~isempty(partId)) && (partId >= 1) && (partId <= numel(partNames) + 1); +end + +function partId = promptPart() + fprintf('== Select which part(s) to submit:\n'); + partNames = validParts(); + srcFiles = sources(); + for i = 1:numel(partNames) + fprintf('== %d) %s [', i, partNames{i}); + fprintf(' %s ', srcFiles{i}{:}); + fprintf(']\n'); + end + fprintf('== %d) All of the above \n==\nEnter your choice [1-%d]: ', ... + numel(partNames) + 1, numel(partNames) + 1); + selPart = input('', 's'); + partId = str2num(selPart); + if ~isValidPartId(partId) + partId = -1; + end +end + +function [email,ch,signature,auxstring] = getChallenge(email, part) + str = urlread(challenge_url(), 'post', {'email_address', email, 'assignment_part_sid', [homework_id() '-' num2str(part)], 'response_encoding', 'delim'}); + + str = strtrim(str); + r = struct; + while(numel(str) > 0) + [f, str] = strtok (str, '|'); + [v, str] = strtok (str, '|'); + r = setfield(r, f, v); + end + + email = getfield(r, 'email_address'); + ch = getfield(r, 'challenge_key'); + signature = getfield(r, 'state'); + auxstring = getfield(r, 'challenge_aux_data'); +end + +function [result, str] = submitSolutionWeb(email, part, output, source) + + result = ['{"assignment_part_sid":"' base64encode([homework_id() '-' num2str(part)], '') '",' ... + '"email_address":"' base64encode(email, '') '",' ... + '"submission":"' base64encode(output, '') '",' ... + '"submission_aux":"' base64encode(source, '') '"' ... + '}']; + str = 'Web-submission'; +end + +function [result, str] = submitSolution(email, ch_resp, part, output, ... + source, signature) + + params = {'assignment_part_sid', [homework_id() '-' num2str(part)], ... + 'email_address', email, ... + 'submission', base64encode(output, ''), ... + 'submission_aux', base64encode(source, ''), ... + 'challenge_response', ch_resp, ... + 'state', signature}; + + str = urlread(submit_url(), 'post', params); + + % Parse str to read for success / failure + result = 0; + +end + +% =========================== LOGIN HELPERS =========================== + +function [login password] = loginPrompt() + % Prompt for password + [login password] = basicPrompt(); + + if isempty(login) || isempty(password) + login = []; password = []; + end +end + + +function [login password] = basicPrompt() + login = input('Login (Email address): ', 's'); + password = input('Password: ', 's'); +end + +function [login password] = quickLogin(login,password) + disp(['You are currently logged in as ' login '.']); + cont_token = input('Is this you? (y/n - type n to reenter password)','s'); + if(isempty(cont_token) || cont_token(1)=='Y'||cont_token(1)=='y') + return; + else + [login password] = loginPrompt(); + end +end + +function [str] = challengeResponse(email, passwd, challenge) + str = sha1([challenge passwd]); +end + +% =============================== SHA-1 ================================ + +function hash = sha1(str) + + % Initialize variables + h0 = uint32(1732584193); + h1 = uint32(4023233417); + h2 = uint32(2562383102); + h3 = uint32(271733878); + h4 = uint32(3285377520); + + % Convert to word array + strlen = numel(str); + + % Break string into chars and append the bit 1 to the message + mC = [double(str) 128]; + mC = [mC zeros(1, 4-mod(numel(mC), 4), 'uint8')]; + + numB = strlen * 8; + if exist('idivide') + numC = idivide(uint32(numB + 65), 512, 'ceil'); + else + numC = ceil(double(numB + 65)/512); + end + numW = numC * 16; + mW = zeros(numW, 1, 'uint32'); + + idx = 1; + for i = 1:4:strlen + 1 + mW(idx) = bitor(bitor(bitor( ... + bitshift(uint32(mC(i)), 24), ... + bitshift(uint32(mC(i+1)), 16)), ... + bitshift(uint32(mC(i+2)), 8)), ... + uint32(mC(i+3))); + idx = idx + 1; + end + + % Append length of message + mW(numW - 1) = uint32(bitshift(uint64(numB), -32)); + mW(numW) = uint32(bitshift(bitshift(uint64(numB), 32), -32)); + + % Process the message in successive 512-bit chs + for cId = 1 : double(numC) + cSt = (cId - 1) * 16 + 1; + cEnd = cId * 16; + ch = mW(cSt : cEnd); + + % Extend the sixteen 32-bit words into eighty 32-bit words + for j = 17 : 80 + ch(j) = ch(j - 3); + ch(j) = bitxor(ch(j), ch(j - 8)); + ch(j) = bitxor(ch(j), ch(j - 14)); + ch(j) = bitxor(ch(j), ch(j - 16)); + ch(j) = bitrotate(ch(j), 1); + end + + % Initialize hash value for this ch + a = h0; + b = h1; + c = h2; + d = h3; + e = h4; + + % Main loop + for i = 1 : 80 + if(i >= 1 && i <= 20) + f = bitor(bitand(b, c), bitand(bitcmp(b), d)); + k = uint32(1518500249); + elseif(i >= 21 && i <= 40) + f = bitxor(bitxor(b, c), d); + k = uint32(1859775393); + elseif(i >= 41 && i <= 60) + f = bitor(bitor(bitand(b, c), bitand(b, d)), bitand(c, d)); + k = uint32(2400959708); + elseif(i >= 61 && i <= 80) + f = bitxor(bitxor(b, c), d); + k = uint32(3395469782); + end + + t = bitrotate(a, 5); + t = bitadd(t, f); + t = bitadd(t, e); + t = bitadd(t, k); + t = bitadd(t, ch(i)); + e = d; + d = c; + c = bitrotate(b, 30); + b = a; + a = t; + + end + h0 = bitadd(h0, a); + h1 = bitadd(h1, b); + h2 = bitadd(h2, c); + h3 = bitadd(h3, d); + h4 = bitadd(h4, e); + + end + + hash = reshape(dec2hex(double([h0 h1 h2 h3 h4]), 8)', [1 40]); + + hash = lower(hash); + +end + +function ret = bitadd(iA, iB) + ret = double(iA) + double(iB); + ret = bitset(ret, 33, 0); + ret = uint32(ret); +end + +function ret = bitrotate(iA, places) + t = bitshift(iA, places - 32); + ret = bitshift(iA, places); + ret = bitor(ret, t); +end + +% =========================== Base64 Encoder ============================ +% Thanks to Peter John Acklam +% + +function y = base64encode(x, eol) +%BASE64ENCODE Perform base64 encoding on a string. +% +% BASE64ENCODE(STR, EOL) encode the given string STR. EOL is the line ending +% sequence to use; it is optional and defaults to '\n' (ASCII decimal 10). +% The returned encoded string is broken into lines of no more than 76 +% characters each, and each line will end with EOL unless it is empty. Let +% EOL be empty if you do not want the encoded string broken into lines. +% +% STR and EOL don't have to be strings (i.e., char arrays). The only +% requirement is that they are vectors containing values in the range 0-255. +% +% This function may be used to encode strings into the Base64 encoding +% specified in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The +% Base64 encoding is designed to represent arbitrary sequences of octets in a +% form that need not be humanly readable. A 65-character subset +% ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be represented per +% printable character. +% +% Examples +% -------- +% +% If you want to encode a large file, you should encode it in chunks that are +% a multiple of 57 bytes. This ensures that the base64 lines line up and +% that you do not end up with padding in the middle. 57 bytes of data fills +% one complete base64 line (76 == 57*4/3): +% +% If ifid and ofid are two file identifiers opened for reading and writing, +% respectively, then you can base64 encode the data with +% +% while ~feof(ifid) +% fwrite(ofid, base64encode(fread(ifid, 60*57))); +% end +% +% or, if you have enough memory, +% +% fwrite(ofid, base64encode(fread(ifid))); +% +% See also BASE64DECODE. + +% Author: Peter John Acklam +% Time-stamp: 2004-02-03 21:36:56 +0100 +% E-mail: pjacklam@online.no +% URL: http://home.online.no/~pjacklam + + if isnumeric(x) + x = num2str(x); + end + + % make sure we have the EOL value + if nargin < 2 + eol = sprintf('\n'); + else + if sum(size(eol) > 1) > 1 + error('EOL must be a vector.'); + end + if any(eol(:) > 255) + error('EOL can not contain values larger than 255.'); + end + end + + if sum(size(x) > 1) > 1 + error('STR must be a vector.'); + end + + x = uint8(x); + eol = uint8(eol); + + ndbytes = length(x); % number of decoded bytes + nchunks = ceil(ndbytes / 3); % number of chunks/groups + nebytes = 4 * nchunks; % number of encoded bytes + + % add padding if necessary, to make the length of x a multiple of 3 + if rem(ndbytes, 3) + x(end+1 : 3*nchunks) = 0; + end + + x = reshape(x, [3, nchunks]); % reshape the data + y = repmat(uint8(0), 4, nchunks); % for the encoded data + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Split up every 3 bytes into 4 pieces + % + % aaaaaabb bbbbcccc ccdddddd + % + % to form + % + % 00aaaaaa 00bbbbbb 00cccccc 00dddddd + % + y(1,:) = bitshift(x(1,:), -2); % 6 highest bits of x(1,:) + + y(2,:) = bitshift(bitand(x(1,:), 3), 4); % 2 lowest bits of x(1,:) + y(2,:) = bitor(y(2,:), bitshift(x(2,:), -4)); % 4 highest bits of x(2,:) + + y(3,:) = bitshift(bitand(x(2,:), 15), 2); % 4 lowest bits of x(2,:) + y(3,:) = bitor(y(3,:), bitshift(x(3,:), -6)); % 2 highest bits of x(3,:) + + y(4,:) = bitand(x(3,:), 63); % 6 lowest bits of x(3,:) + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Now perform the following mapping + % + % 0 - 25 -> A-Z + % 26 - 51 -> a-z + % 52 - 61 -> 0-9 + % 62 -> + + % 63 -> / + % + % We could use a mapping vector like + % + % ['A':'Z', 'a':'z', '0':'9', '+/'] + % + % but that would require an index vector of class double. + % + z = repmat(uint8(0), size(y)); + i = y <= 25; z(i) = 'A' + double(y(i)); + i = 26 <= y & y <= 51; z(i) = 'a' - 26 + double(y(i)); + i = 52 <= y & y <= 61; z(i) = '0' - 52 + double(y(i)); + i = y == 62; z(i) = '+'; + i = y == 63; z(i) = '/'; + y = z; + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % Add padding if necessary. + % + npbytes = 3 * nchunks - ndbytes; % number of padding bytes + if npbytes + y(end-npbytes+1 : end) = '='; % '=' is used for padding + end + + if isempty(eol) + + % reshape to a row vector + y = reshape(y, [1, nebytes]); + + else + + nlines = ceil(nebytes / 76); % number of lines + neolbytes = length(eol); % number of bytes in eol string + + % pad data so it becomes a multiple of 76 elements + y = [y(:) ; zeros(76 * nlines - numel(y), 1)]; + y(nebytes + 1 : 76 * nlines) = 0; + y = reshape(y, 76, nlines); + + % insert eol strings + eol = eol(:); + y(end + 1 : end + neolbytes, :) = eol(:, ones(1, nlines)); + + % remove padding, but keep the last eol string + m = nebytes + neolbytes * (nlines - 1); + n = (76+neolbytes)*nlines - neolbytes; + y(m+1 : n) = ''; + + % extract and reshape to row vector + y = reshape(y, 1, m+neolbytes); + + end + + % output is a character array + y = char(y); + +end diff --git a/machine_learning/mlclass-ex3-008/mlclass-ex3/submitWeb.m b/machine_learning/mlclass-ex3-008/mlclass-ex3/submitWeb.m new file mode 100644 index 0000000..8611707 --- /dev/null +++ b/machine_learning/mlclass-ex3-008/mlclass-ex3/submitWeb.m @@ -0,0 +1,20 @@ +% submitWeb Creates files from your code and output for web submission. +% +% If the submit function does not work for you, use the web-submission mechanism. +% Call this function to produce a file for the part you wish to submit. Then, +% submit the file to the class servers using the "Web Submission" button on the +% Programming Exercises page on the course website. +% +% You should call this function without arguments (submitWeb), to receive +% an interactive prompt for submission; optionally you can call it with the partID +% if you so wish. Make sure your working directory is set to the directory +% containing the submitWeb.m file and your assignment files. + +function submitWeb(partId) + if ~exist('partId', 'var') || isempty(partId) + partId = []; + end + + submit(partId, 1); +end + diff --git a/machine_learning/test.m b/machine_learning/test.m new file mode 100644 index 0000000..51be435 --- /dev/null +++ b/machine_learning/test.m @@ -0,0 +1,164 @@ +%VIM: let g:flags="" +% +a = 3 +b = 'hi' +b +a = pi +c = (3 >= 1 ) +disp(sprintf('2 decimals: %0.2f', a )) +format long +a +format short +a + +A = [1 2; 3 4; 5 6] % define matrix +v = [1 2 3] % row vector +v = [1; 2; 3] % column vector +v = 1:0.2:2 % vector from 1 to 2 with 0.2 increments +v = 1:6 % vector 1 to 6 + +ones(2,3) % matrix of ones +2*ones(2,3) +zeros(3,1) % matrix of zeros +eye(4) % identity matrix +rand(2,3) % matrix of random numbers +randn(2,3) % matrix of normal distribution random numbers + +w = -6 + sqrt(10)*randn(1,10000) + +hist(w,50) % histogram + +size(A) % sizes of matrix as a row vector +size(A,1) % number of rows +size(A,2) % number of columns +length(v) % length of a matrix + +%load( 'file name' ) % load data from a file + +who % what variables do I have. +whos % detailed who + +%v = priceY(1:10) +%save savedfile.mat v +%save savedfile.mat v -ascii + +clear % remove variables + +A = [1 2; 3 4; 5 6 ] +A(3,2) % element on third row and second column +A(3,:) % third row +A(:,2) % second column + +A([1 3], :) % matrix from 1 and 3 rows +A(:,2) = [10; 11; 12] % assign to second column +A = [A, [100; 101; 102]] % append to matrix + +B = [ 3 3; 5 6; 6 7] + +C = [ A B ] % append to the right +D = [ A; B ] % append at bottom + +A' % transpos +A * B' % matrix mul +A .* B % element vice mult +A .^2 % element vice square + +v = [ 1; 2; 3 ] + +1 ./ v % reciprocal of v +1 ./ A + +log(v) % element vice log +exp(v) +abs(v) +-v +v + ones(lenght(v), 1) +v + 1 % same as of above + +a = [2 3 4 5] +max(a) % max element in a +[val, ind] = max(a) % val = max elem, ind = the index of elem + + +a < 3 % elem vice compare +find(a < 3) + +A = magic(3) + +[r,c] = find(A>=7) + +sum(a) +prod(a) +floor(a) +ceil(a) + +max( rand(3), rand(3) ) % elem vice max of two 3x3 matrices + +max ( A, [], 1 ) % row vice max +max(A) % column vice max + +A = magic(9) + +sum(A,1) + +A .* eye(9) + +sum( sum( A.*eye(9))) % sum of diagonal elements + +flipud( eye(9)) %flip up down + +pinv(A) %pseudo inverse of A + + +%============================ +t=[0:0.01:0.98]; +y1 = sin(2*pi*4*t) +plot(t,y1); +y2 = cos(2*pi*4*t) +plot(t,y1); +hold on; +plot(t,y1,r); +xlabel('time') +ylabel('value') +legend('sin','cos') +title('my plot') +print -dpng 'myPlot.png' +close + + +figure(1); plot(t,y1); +figure(2); plot(t,y2); +subplot(1,2,1); +axis + +A= magic(5); +imagesc(A); +imagesc(A),colorbar,colormap gray; + +%============================ +v = zero(10,1) +for i=1:10, + v(i) = 2^i; +end; +while i <= 5, + v(i) = 100; + i = i+1; + if i == 4, %elseif else + break; + end; +end; + +%put into a separate file with the same name +function y = functionName( x ) + y = x^2; + +function [y1,y2] = functionName( x ) + y1 = x^2; + y2 = x^3; + + + + + +%help eye + diff --git a/mergeTwoFiles/mergeTwoFiles.sln b/mergeTwoFiles/mergeTwoFiles.sln deleted file mode 100644 index 976dd42..0000000 --- a/mergeTwoFiles/mergeTwoFiles.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mergeTwoFiles", "mergeTwoFiles.vcproj", "{F07269AD-FE36-43E5-A832-92D5FC475DE2}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F07269AD-FE36-43E5-A832-92D5FC475DE2}.Debug|Win32.ActiveCfg = Debug|Win32 - {F07269AD-FE36-43E5-A832-92D5FC475DE2}.Debug|Win32.Build.0 = Debug|Win32 - {F07269AD-FE36-43E5-A832-92D5FC475DE2}.Release|Win32.ActiveCfg = Release|Win32 - {F07269AD-FE36-43E5-A832-92D5FC475DE2}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/mergeTwoFiles/mergeTwoFiles.vcproj b/mergeTwoFiles/mergeTwoFiles.vcproj deleted file mode 100644 index 102ebcd..0000000 --- a/mergeTwoFiles/mergeTwoFiles.vcproj +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mergeTwoFiles/stdafx.cpp b/mergeTwoFiles/stdafx.cpp deleted file mode 100644 index 96d643d..0000000 --- a/mergeTwoFiles/stdafx.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// mergeTwoFiles.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/mergeTwoFiles/stdafx.h b/mergeTwoFiles/stdafx.h deleted file mode 100644 index 0be0e6f..0000000 --- a/mergeTwoFiles/stdafx.h +++ /dev/null @@ -1,17 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. -#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. -#endif - -#include -#include - - - -// TODO: reference additional headers your program requires here diff --git a/SSE2_transform.cpp b/misc/SSE2_transform.cpp similarity index 100% rename from SSE2_transform.cpp rename to misc/SSE2_transform.cpp diff --git a/SSE2_transform.h b/misc/SSE2_transform.h similarity index 100% rename from SSE2_transform.h rename to misc/SSE2_transform.h diff --git a/SSE_cmplr_abstraction.h b/misc/SSE_cmplr_abstraction.h similarity index 100% rename from SSE_cmplr_abstraction.h rename to misc/SSE_cmplr_abstraction.h diff --git a/SSE_cmplr_abstraction_GCC.h b/misc/SSE_cmplr_abstraction_GCC.h similarity index 100% rename from SSE_cmplr_abstraction_GCC.h rename to misc/SSE_cmplr_abstraction_GCC.h diff --git a/SSE_cmplr_abstraction_MSC.h b/misc/SSE_cmplr_abstraction_MSC.h similarity index 100% rename from SSE_cmplr_abstraction_MSC.h rename to misc/SSE_cmplr_abstraction_MSC.h diff --git a/SSE_cmplr_abstraction_MSC_backup.h b/misc/SSE_cmplr_abstraction_MSC_backup.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_backup.h rename to misc/SSE_cmplr_abstraction_MSC_backup.h diff --git a/SSE_cmplr_abstraction_MSC_pckdbl.h b/misc/SSE_cmplr_abstraction_MSC_pckdbl.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_pckdbl.h rename to misc/SSE_cmplr_abstraction_MSC_pckdbl.h diff --git a/SSE_cmplr_abstraction_MSC_pckfloat.h b/misc/SSE_cmplr_abstraction_MSC_pckfloat.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_pckfloat.h rename to misc/SSE_cmplr_abstraction_MSC_pckfloat.h diff --git a/SSE_cmplr_abstraction_MSC_pckint16.h b/misc/SSE_cmplr_abstraction_MSC_pckint16.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_pckint16.h rename to misc/SSE_cmplr_abstraction_MSC_pckint16.h diff --git a/SSE_cmplr_abstraction_MSC_pckint32.h b/misc/SSE_cmplr_abstraction_MSC_pckint32.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_pckint32.h rename to misc/SSE_cmplr_abstraction_MSC_pckint32.h diff --git a/SSE_cmplr_abstraction_MSC_pckint64.h b/misc/SSE_cmplr_abstraction_MSC_pckint64.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_pckint64.h rename to misc/SSE_cmplr_abstraction_MSC_pckint64.h diff --git a/SSE_cmplr_abstraction_MSC_pckint8.h b/misc/SSE_cmplr_abstraction_MSC_pckint8.h similarity index 100% rename from SSE_cmplr_abstraction_MSC_pckint8.h rename to misc/SSE_cmplr_abstraction_MSC_pckint8.h diff --git a/SSE_cmplr_abstraction_other.h b/misc/SSE_cmplr_abstraction_other.h similarity index 100% rename from SSE_cmplr_abstraction_other.h rename to misc/SSE_cmplr_abstraction_other.h diff --git a/SSE_transform.cpp b/misc/SSE_transform.cpp similarity index 100% rename from SSE_transform.cpp rename to misc/SSE_transform.cpp diff --git a/getcurrenttime.h b/misc/getcurrenttime.h similarity index 100% rename from getcurrenttime.h rename to misc/getcurrenttime.h diff --git a/getcurrenttime2.h b/misc/getcurrenttime2.h similarity index 100% rename from getcurrenttime2.h rename to misc/getcurrenttime2.h diff --git a/puzzles/bluefruit/roman_numerals.cpp b/puzzles/bluefruit/roman_numerals.cpp new file mode 100644 index 0000000..a85fcac --- /dev/null +++ b/puzzles/bluefruit/roman_numerals.cpp @@ -0,0 +1,271 @@ +/* +VIM: let g:lcppflags="-std=c++11 -O2 -pthread" +VIM: let g:wcppflags="/O2 /EHsc /DWIN32" +VIM: let g:argv="" + +ID 971852 +*/ +#include +#include + +/* +Given a Roman number as a string (eg "XX") determine +its integer value (eg 20). + +You cannot write numerals like IM for 999. +Wikipedia states "Modern Roman numerals are written by +expressing each digit separately starting with the +leftmost digit and skipping any digit with a value of zero." + +Examples: + + "I" -> 1 | "X" -> 10 | "C" -> 100 | "M" -> 1000 + "II" -> 2 | "XX" -> 20 | "CC" -> 200 | "MM" -> 2000 + "III" -> 3 | "XXX" -> 30 | "CCC" -> 300 | "MMM" -> 3000 + "IV" -> 4 | "XL" -> 40 | "CD" -> 400 | "MMMM" -> 4000 + "V" -> 5 | "L" -> 50 | "D" -> 500 | + "VI" -> 6 | "LX" -> 60 | "DC" -> 600 | + "VII" -> 7 | "LXX" -> 70 | "DCC" -> 700 | +"VIII" -> 8 | "LXXX" -> 80 | "DCCC" -> 800 | + "IX" -> 9 | "XC" -> 90 | "CM" -> 900 | + + "MCMXC" -> 1990 ("M" -> 1000 + "CM" -> 900 + "XC" -> 90) +"MMVIII" -> 2008 ("MM" -> 2000 + "VIII" -> 8) + "XCIX" -> 99 ("XC" -> 90 + "IX" -> 9) + "XLVII" -> 47 ("XL" -> 40 + "VII" -> 7) +*/ +int roman2num( const char * roman_num ) { + // + // Possible digits. + // + enum digits { D_I = 0, D_V, D_X, D_L, D_C, D_D, D_M, D_ERR }; + // + // The states of parser. The names of states are quite intuitive. The + // vI, lX, dC are the states corresponding to patterns VI+, LX+, DC+ + // when the first I,X,C letters are seen. + // + enum states { + S = 0, /* START state. */ + I, vI, II, III, IV, V, IX, + X, lX, XX, XXX, XL, L, XC, + C, dC, CC, CCC, CD, D, CM, + M, MM, MMM, MMMM, + E /* ERROR state */ + }; + // + // This table defines state transition for each character seen. + // + static const char state_table[][8] = { + /* I, V, X, L, C, D, M, D_ERR */ + { I, V, X, L, C, D, M, E}, //S + + { II, IV, IX, E, E, E, E, E}, //I + { II, E, E, E, E, E, E, E}, //vI + {III, E, E, E, E, E, E, E}, //II + { E, E, E, E, E, E, E, E}, //III + { E, E, E, E, E, E, E, E}, //IV + { vI, E, E, E, E, E, E, E}, //V + { E, E, E, E, E, E, E, E}, //IX + + { I, V, XX, XL, XC, E, E, E}, //X + { I, V, XX, E, E, E, E, E}, //lX + { I, V,XXX, E, E, E, E, E}, //XX + { I, V, E, E, E, E, E, E}, //XXX + { I, V, E, E, E, E, E, E}, //XL + { I, V, lX, E, E, E, E, E}, //L + { I, V, E, E, E, E, E, E}, //XC + + { I, V, X, L, CC, CD, CM, E}, //C + { I, V, X, L, CC, E, E, E}, //dC + { I, V, X, L,CCC, E, E, E}, //CC + { I, V, X, L, E, E, E, E}, //CCC + { I, V, X, L, E, E, E, E}, //CD + { I, V, X, L, dC, E, E, E}, //D + { I, V, X, L, E, E, E, E}, //CM + + { I, V, X, L, C, D, MM, E}, //M + { I, V, X, L, C, D, MMM, E}, //MM + { I, V, X, L, C, D, MMMM, E}, //MMM + { I, V, X, L, C, D, E, E}, //MMMM + + { E, E, E, E, E, E, E, E} //E + }; + // + // Each state transition causes an increment of the number with + // certain value defined in this table. + // A state transition happens for each character we read, hence when + // defining the increment value of complex states such as II,III,IV,... + // please take into consideration what amount increment we already have. + // For example the state XL is defined as 30 since we already added 10 when + // we see X. + // + static const short increment[] = { + //S This is here to preserve alignment only. + 0, + // I, vI, II, III, IV, V, IX + 1, 1, 1, 1, 3, 5, 8, + // X, lX, XX, XXX, XL, L, XC + 10, 10, 10, 10, 30, 50, 80, + // C, dC, CC, CCC, CD, D, CM, + 100, 100, 100, 100, 300, 500, 800, + // M, MM, MMM, MMMM */ + 1000, 1000, 1000, 1000, + //E This is the error condition. The value doesn't really matter. + 0 + }; + // + // Ideally this had to be a table based lookup. + // + auto chr2digit = []( char ch ) { + switch (ch) { + case 'I' : return D_I; + case 'V' : return D_V; + case 'X' : return D_X; + case 'L' : return D_L; + case 'C' : return D_C; + case 'D' : return D_D; + case 'M' : return D_M; + default : return D_ERR; + } + }; + // + // Here the algorithm begins. + // + if ( !roman_num ) + return -1; + + int num = 0; + int state = S; + for ( const char * e = roman_num; *e && state < E; ++e ) { + state = state_table[state][chr2digit(*e)]; + num += increment[state]; + } + if ( state >= E ) + return -1; + return num; +} + +void ASSERT_EQ( int golden, int ret ) { + if ( ret != golden ) + std::cout << "FAIL: Expected " << golden << " got " << ret << std::endl; +} + +int main ( void ) +{try{ + ASSERT_EQ(0, roman2num("")); + ASSERT_EQ(1, roman2num("I")); + ASSERT_EQ(2, roman2num("II")); + ASSERT_EQ(3, roman2num("III")); + ASSERT_EQ(4, roman2num("IV")); + ASSERT_EQ(5, roman2num("V")); + ASSERT_EQ(6, roman2num("VI")); + ASSERT_EQ(7, roman2num("VII")); + ASSERT_EQ(8, roman2num("VIII")); + ASSERT_EQ(9, roman2num("IX")); + + ASSERT_EQ(10, roman2num("X")); + ASSERT_EQ(20, roman2num("XX")); + ASSERT_EQ(30, roman2num("XXX")); + ASSERT_EQ(40, roman2num("XL")); + ASSERT_EQ(50, roman2num("L")); + ASSERT_EQ(60, roman2num("LX")); + ASSERT_EQ(70, roman2num("LXX")); + ASSERT_EQ(80, roman2num("LXXX")); + ASSERT_EQ(90, roman2num("XC")); + + ASSERT_EQ(100, roman2num("C")); + ASSERT_EQ(200, roman2num("CC")); + ASSERT_EQ(300, roman2num("CCC")); + ASSERT_EQ(400, roman2num("CD")); + ASSERT_EQ(500, roman2num("D")); + ASSERT_EQ(600, roman2num("DC")); + ASSERT_EQ(700, roman2num("DCC")); + ASSERT_EQ(800, roman2num("DCCC")); + ASSERT_EQ(900, roman2num("CM")); + + ASSERT_EQ(1000, roman2num("M")); + ASSERT_EQ(2000, roman2num("MM")); + ASSERT_EQ(3000, roman2num("MMM")); + ASSERT_EQ(4000, roman2num("MMMM")); + + ASSERT_EQ(1990, roman2num("MCMXC")); + ASSERT_EQ(2008, roman2num("MMVIII")); + ASSERT_EQ(91, roman2num("XCI")); + ASSERT_EQ(99, roman2num("XCIX")); + ASSERT_EQ(47, roman2num("XLVII")); + ASSERT_EQ(3888, roman2num("MMMDCCCLXXXVIII")); + ASSERT_EQ(4888, roman2num("MMMMDCCCLXXXVIII")); + ASSERT_EQ(4999, roman2num("MMMMCMXCIX")); + + static const char * num [] = { + "","I","II","III","IV","V","VI","VII","VIII","IX", + "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC", + "","C","CC","CCC","CD","D","DC","DCC","DCCC","CM", + "","M","MM","MMM","MMMM" + }; + for ( int i = 0; i < 5000; ++i ) { + int d4 = i/1000; + int d3 = i%1000/100; + int d2 = i%100/10; + int d1 = i%10; + + std::string test = num[30+d4]; + test +=num[20+d3]; + test +=num[10+d2]; + test +=num[d1]; + + ASSERT_EQ(i, roman2num(test.c_str())); + } + + // + // Negative cases. + // + ASSERT_EQ(-1, roman2num(0)); + ASSERT_EQ(-1, roman2num("IXLVII")); + ASSERT_EQ(-1, roman2num("IIII")); + ASSERT_EQ(-1, roman2num("VV")); + ASSERT_EQ(-1, roman2num("XXXX")); + ASSERT_EQ(-1, roman2num("LL")); + ASSERT_EQ(-1, roman2num("CCCC")); + ASSERT_EQ(-1, roman2num("DD")); + ASSERT_EQ(-1, roman2num("MMMMM")); + ASSERT_EQ(-1, roman2num("IIV")); + ASSERT_EQ(-1, roman2num("IVI")); + ASSERT_EQ(-1, roman2num("IIX")); + ASSERT_EQ(-1, roman2num("IXI")); + ASSERT_EQ(-1, roman2num("XXC")); + ASSERT_EQ(-1, roman2num("XCX")); + ASSERT_EQ(-1, roman2num("XXL")); + ASSERT_EQ(-1, roman2num("XLX")); + ASSERT_EQ(-1, roman2num("CCM")); + ASSERT_EQ(-1, roman2num("CMC")); + ASSERT_EQ(-1, roman2num("CCD")); + ASSERT_EQ(-1, roman2num("CDC")); + + ASSERT_EQ(-1, roman2num("c")); + ASSERT_EQ(-1, roman2num("l")); + ASSERT_EQ(-1, roman2num("x")); + ASSERT_EQ(-1, roman2num("v")); + ASSERT_EQ(-1, roman2num("v")); + ASSERT_EQ(-1, roman2num("v")); + ASSERT_EQ(-1, roman2num("v")); + ASSERT_EQ(-1, roman2num("1")); + ASSERT_EQ(-1, roman2num("2")); + ASSERT_EQ(-1, roman2num("a")); + ASSERT_EQ(-1, roman2num(".")); + + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} + diff --git a/google_code_jam/.vimrc.local b/puzzles/google_code_jam/.vimrc.local similarity index 100% rename from google_code_jam/.vimrc.local rename to puzzles/google_code_jam/.vimrc.local diff --git a/google_code_jam/2013/1A-A-bullseye-sample.in b/puzzles/google_code_jam/2013/1A-A-bullseye-sample.in similarity index 100% rename from google_code_jam/2013/1A-A-bullseye-sample.in rename to puzzles/google_code_jam/2013/1A-A-bullseye-sample.in diff --git a/google_code_jam/2013/1A-A-bullseye.cpp b/puzzles/google_code_jam/2013/1A-A-bullseye.cpp similarity index 100% rename from google_code_jam/2013/1A-A-bullseye.cpp rename to puzzles/google_code_jam/2013/1A-A-bullseye.cpp diff --git a/google_code_jam/2013/1A-A-large-practice.in b/puzzles/google_code_jam/2013/1A-A-large-practice.in similarity index 100% rename from google_code_jam/2013/1A-A-large-practice.in rename to puzzles/google_code_jam/2013/1A-A-large-practice.in diff --git a/google_code_jam/2013/1A-A-small-practice.in b/puzzles/google_code_jam/2013/1A-A-small-practice.in similarity index 100% rename from google_code_jam/2013/1A-A-small-practice.in rename to puzzles/google_code_jam/2013/1A-A-small-practice.in diff --git a/google_code_jam/2013/1A-B-energy.cpp b/puzzles/google_code_jam/2013/1A-B-energy.cpp similarity index 100% rename from google_code_jam/2013/1A-B-energy.cpp rename to puzzles/google_code_jam/2013/1A-B-energy.cpp diff --git a/google_code_jam/2013/1A-B-large-practice.in b/puzzles/google_code_jam/2013/1A-B-large-practice.in similarity index 100% rename from google_code_jam/2013/1A-B-large-practice.in rename to puzzles/google_code_jam/2013/1A-B-large-practice.in diff --git a/google_code_jam/2013/1A-B-sample.in b/puzzles/google_code_jam/2013/1A-B-sample.in similarity index 100% rename from google_code_jam/2013/1A-B-sample.in rename to puzzles/google_code_jam/2013/1A-B-sample.in diff --git a/google_code_jam/2013/1A-B-small-practice.in b/puzzles/google_code_jam/2013/1A-B-small-practice.in similarity index 100% rename from google_code_jam/2013/1A-B-small-practice.in rename to puzzles/google_code_jam/2013/1A-B-small-practice.in diff --git a/google_code_jam/2013/1B-A-Osmos.cpp b/puzzles/google_code_jam/2013/1B-A-Osmos.cpp similarity index 100% rename from google_code_jam/2013/1B-A-Osmos.cpp rename to puzzles/google_code_jam/2013/1B-A-Osmos.cpp diff --git a/google_code_jam/2013/1B-A-large-practice.in b/puzzles/google_code_jam/2013/1B-A-large-practice.in similarity index 100% rename from google_code_jam/2013/1B-A-large-practice.in rename to puzzles/google_code_jam/2013/1B-A-large-practice.in diff --git a/google_code_jam/2013/1B-A-sample.in b/puzzles/google_code_jam/2013/1B-A-sample.in similarity index 100% rename from google_code_jam/2013/1B-A-sample.in rename to puzzles/google_code_jam/2013/1B-A-sample.in diff --git a/google_code_jam/2013/1B-A-small-practice.in b/puzzles/google_code_jam/2013/1B-A-small-practice.in similarity index 100% rename from google_code_jam/2013/1B-A-small-practice.in rename to puzzles/google_code_jam/2013/1B-A-small-practice.in diff --git a/google_code_jam/2013/1B-B-diamonds.cpp b/puzzles/google_code_jam/2013/1B-B-diamonds.cpp similarity index 100% rename from google_code_jam/2013/1B-B-diamonds.cpp rename to puzzles/google_code_jam/2013/1B-B-diamonds.cpp diff --git a/google_code_jam/2013/1B-B-large-practice.in b/puzzles/google_code_jam/2013/1B-B-large-practice.in similarity index 100% rename from google_code_jam/2013/1B-B-large-practice.in rename to puzzles/google_code_jam/2013/1B-B-large-practice.in diff --git a/google_code_jam/2013/1B-B-sample.in b/puzzles/google_code_jam/2013/1B-B-sample.in similarity index 100% rename from google_code_jam/2013/1B-B-sample.in rename to puzzles/google_code_jam/2013/1B-B-sample.in diff --git a/google_code_jam/2013/1B-B-small-practice.in b/puzzles/google_code_jam/2013/1B-B-small-practice.in similarity index 100% rename from google_code_jam/2013/1B-B-small-practice.in rename to puzzles/google_code_jam/2013/1B-B-small-practice.in diff --git a/google_code_jam/2013/tic_tac_A-large-practice.in b/puzzles/google_code_jam/2013/tic_tac_A-large-practice.in similarity index 100% rename from google_code_jam/2013/tic_tac_A-large-practice.in rename to puzzles/google_code_jam/2013/tic_tac_A-large-practice.in diff --git a/google_code_jam/2013/tic_tac_A-small-practice.in b/puzzles/google_code_jam/2013/tic_tac_A-small-practice.in similarity index 100% rename from google_code_jam/2013/tic_tac_A-small-practice.in rename to puzzles/google_code_jam/2013/tic_tac_A-small-practice.in diff --git a/google_code_jam/2013/tic_tac_toy_tomek.cpp b/puzzles/google_code_jam/2013/tic_tac_toy_tomek.cpp similarity index 100% rename from google_code_jam/2013/tic_tac_toy_tomek.cpp rename to puzzles/google_code_jam/2013/tic_tac_toy_tomek.cpp diff --git a/google_code_jam/2013/tic_tac_toy_tomek.sample_input b/puzzles/google_code_jam/2013/tic_tac_toy_tomek.sample_input similarity index 100% rename from google_code_jam/2013/tic_tac_toy_tomek.sample_input rename to puzzles/google_code_jam/2013/tic_tac_toy_tomek.sample_input diff --git a/google_code_jam/2014/0-A-magic_trick-sample.in b/puzzles/google_code_jam/2014/0-A-magic_trick-sample.in similarity index 100% rename from google_code_jam/2014/0-A-magic_trick-sample.in rename to puzzles/google_code_jam/2014/0-A-magic_trick-sample.in diff --git a/google_code_jam/2014/0-A-magic_trick-small-attempt0.in b/puzzles/google_code_jam/2014/0-A-magic_trick-small-attempt0.in similarity index 100% rename from google_code_jam/2014/0-A-magic_trick-small-attempt0.in rename to puzzles/google_code_jam/2014/0-A-magic_trick-small-attempt0.in diff --git a/google_code_jam/2014/0-A-magic_trick.cpp b/puzzles/google_code_jam/2014/0-A-magic_trick.cpp similarity index 100% rename from google_code_jam/2014/0-A-magic_trick.cpp rename to puzzles/google_code_jam/2014/0-A-magic_trick.cpp diff --git a/google_code_jam/2014/0-B-cookie-sample.in b/puzzles/google_code_jam/2014/0-B-cookie-sample.in similarity index 100% rename from google_code_jam/2014/0-B-cookie-sample.in rename to puzzles/google_code_jam/2014/0-B-cookie-sample.in diff --git a/google_code_jam/2014/0-B-cookie.cpp b/puzzles/google_code_jam/2014/0-B-cookie.cpp similarity index 100% rename from google_code_jam/2014/0-B-cookie.cpp rename to puzzles/google_code_jam/2014/0-B-cookie.cpp diff --git a/google_code_jam/2014/0-B-large.in b/puzzles/google_code_jam/2014/0-B-large.in similarity index 100% rename from google_code_jam/2014/0-B-large.in rename to puzzles/google_code_jam/2014/0-B-large.in diff --git a/google_code_jam/2014/0-B-small-attempt0.in b/puzzles/google_code_jam/2014/0-B-small-attempt0.in similarity index 100% rename from google_code_jam/2014/0-B-small-attempt0.in rename to puzzles/google_code_jam/2014/0-B-small-attempt0.in diff --git a/google_code_jam/2014/0-C-large.in b/puzzles/google_code_jam/2014/0-C-large.in similarity index 100% rename from google_code_jam/2014/0-C-large.in rename to puzzles/google_code_jam/2014/0-C-large.in diff --git a/google_code_jam/2014/0-C-mine-sample.in b/puzzles/google_code_jam/2014/0-C-mine-sample.in similarity index 100% rename from google_code_jam/2014/0-C-mine-sample.in rename to puzzles/google_code_jam/2014/0-C-mine-sample.in diff --git a/google_code_jam/2014/0-C-mine.cpp b/puzzles/google_code_jam/2014/0-C-mine.cpp similarity index 100% rename from google_code_jam/2014/0-C-mine.cpp rename to puzzles/google_code_jam/2014/0-C-mine.cpp diff --git a/google_code_jam/2014/0-C-small-attempt0.in b/puzzles/google_code_jam/2014/0-C-small-attempt0.in similarity index 100% rename from google_code_jam/2014/0-C-small-attempt0.in rename to puzzles/google_code_jam/2014/0-C-small-attempt0.in diff --git a/google_code_jam/2014/0-D-deceitful-sample.in b/puzzles/google_code_jam/2014/0-D-deceitful-sample.in similarity index 100% rename from google_code_jam/2014/0-D-deceitful-sample.in rename to puzzles/google_code_jam/2014/0-D-deceitful-sample.in diff --git a/google_code_jam/2014/0-D-deceitful.cpp b/puzzles/google_code_jam/2014/0-D-deceitful.cpp similarity index 100% rename from google_code_jam/2014/0-D-deceitful.cpp rename to puzzles/google_code_jam/2014/0-D-deceitful.cpp diff --git a/google_code_jam/2014/0-D-large.in b/puzzles/google_code_jam/2014/0-D-large.in similarity index 100% rename from google_code_jam/2014/0-D-large.in rename to puzzles/google_code_jam/2014/0-D-large.in diff --git a/google_code_jam/2014/0-D-small-attempt0.in b/puzzles/google_code_jam/2014/0-D-small-attempt0.in similarity index 100% rename from google_code_jam/2014/0-D-small-attempt0.in rename to puzzles/google_code_jam/2014/0-D-small-attempt0.in diff --git a/google_code_jam/2014/1A-A-code_jam.cpp b/puzzles/google_code_jam/2014/1A-A-code_jam.cpp similarity index 100% rename from google_code_jam/2014/1A-A-code_jam.cpp rename to puzzles/google_code_jam/2014/1A-A-code_jam.cpp diff --git a/google_code_jam/2014/1A-A-large-practice.in b/puzzles/google_code_jam/2014/1A-A-large-practice.in similarity index 100% rename from google_code_jam/2014/1A-A-large-practice.in rename to puzzles/google_code_jam/2014/1A-A-large-practice.in diff --git a/google_code_jam/2014/1A-A-sample.in b/puzzles/google_code_jam/2014/1A-A-sample.in similarity index 100% rename from google_code_jam/2014/1A-A-sample.in rename to puzzles/google_code_jam/2014/1A-A-sample.in diff --git a/google_code_jam/2014/1A-A-small-practice.in b/puzzles/google_code_jam/2014/1A-A-small-practice.in similarity index 100% rename from google_code_jam/2014/1A-A-small-practice.in rename to puzzles/google_code_jam/2014/1A-A-small-practice.in diff --git a/google_code_jam/2014/1A-B-code_jam.cpp b/puzzles/google_code_jam/2014/1A-B-code_jam.cpp similarity index 100% rename from google_code_jam/2014/1A-B-code_jam.cpp rename to puzzles/google_code_jam/2014/1A-B-code_jam.cpp diff --git a/google_code_jam/2014/1A-B-large-practice.in b/puzzles/google_code_jam/2014/1A-B-large-practice.in similarity index 100% rename from google_code_jam/2014/1A-B-large-practice.in rename to puzzles/google_code_jam/2014/1A-B-large-practice.in diff --git a/google_code_jam/2014/1A-B-sample.in b/puzzles/google_code_jam/2014/1A-B-sample.in similarity index 100% rename from google_code_jam/2014/1A-B-sample.in rename to puzzles/google_code_jam/2014/1A-B-sample.in diff --git a/google_code_jam/2014/1A-B-small-attempt0.in b/puzzles/google_code_jam/2014/1A-B-small-attempt0.in similarity index 100% rename from google_code_jam/2014/1A-B-small-attempt0.in rename to puzzles/google_code_jam/2014/1A-B-small-attempt0.in diff --git a/google_code_jam/2014/1A-B-small-attempt1.in b/puzzles/google_code_jam/2014/1A-B-small-attempt1.in similarity index 100% rename from google_code_jam/2014/1A-B-small-attempt1.in rename to puzzles/google_code_jam/2014/1A-B-small-attempt1.in diff --git a/google_code_jam/2014/1A-B-small-practice.in b/puzzles/google_code_jam/2014/1A-B-small-practice.in similarity index 100% rename from google_code_jam/2014/1A-B-small-practice.in rename to puzzles/google_code_jam/2014/1A-B-small-practice.in diff --git a/google_code_jam/2014/1A-C-small-practice.in b/puzzles/google_code_jam/2014/1A-C-small-practice.in similarity index 100% rename from google_code_jam/2014/1A-C-small-practice.in rename to puzzles/google_code_jam/2014/1A-C-small-practice.in diff --git a/google_code_jam/2014/1B-A-large.in b/puzzles/google_code_jam/2014/1B-A-large.in similarity index 100% rename from google_code_jam/2014/1B-A-large.in rename to puzzles/google_code_jam/2014/1B-A-large.in diff --git a/google_code_jam/2014/1B-A-repeater.cpp b/puzzles/google_code_jam/2014/1B-A-repeater.cpp similarity index 100% rename from google_code_jam/2014/1B-A-repeater.cpp rename to puzzles/google_code_jam/2014/1B-A-repeater.cpp diff --git a/google_code_jam/2014/1B-A-small-attempt0.in b/puzzles/google_code_jam/2014/1B-A-small-attempt0.in similarity index 100% rename from google_code_jam/2014/1B-A-small-attempt0.in rename to puzzles/google_code_jam/2014/1B-A-small-attempt0.in diff --git a/google_code_jam/2014/1B-A-small-attempt1.in b/puzzles/google_code_jam/2014/1B-A-small-attempt1.in similarity index 100% rename from google_code_jam/2014/1B-A-small-attempt1.in rename to puzzles/google_code_jam/2014/1B-A-small-attempt1.in diff --git a/google_code_jam/2014/1B-B-lottery.cpp b/puzzles/google_code_jam/2014/1B-B-lottery.cpp similarity index 100% rename from google_code_jam/2014/1B-B-lottery.cpp rename to puzzles/google_code_jam/2014/1B-B-lottery.cpp diff --git a/google_code_jam/2014/1B-B-small-attempt0.in b/puzzles/google_code_jam/2014/1B-B-small-attempt0.in similarity index 100% rename from google_code_jam/2014/1B-B-small-attempt0.in rename to puzzles/google_code_jam/2014/1B-B-small-attempt0.in diff --git a/google_code_jam/2014/1C-A-large.in b/puzzles/google_code_jam/2014/1C-A-large.in similarity index 100% rename from google_code_jam/2014/1C-A-large.in rename to puzzles/google_code_jam/2014/1C-A-large.in diff --git a/google_code_jam/2014/1C-A-small-attempt0.in b/puzzles/google_code_jam/2014/1C-A-small-attempt0.in similarity index 100% rename from google_code_jam/2014/1C-A-small-attempt0.in rename to puzzles/google_code_jam/2014/1C-A-small-attempt0.in diff --git a/google_code_jam/2014/1C-A.cpp b/puzzles/google_code_jam/2014/1C-A.cpp similarity index 100% rename from google_code_jam/2014/1C-A.cpp rename to puzzles/google_code_jam/2014/1C-A.cpp diff --git a/google_code_jam/2014/1C-B-small-attempt0.in b/puzzles/google_code_jam/2014/1C-B-small-attempt0.in similarity index 100% rename from google_code_jam/2014/1C-B-small-attempt0.in rename to puzzles/google_code_jam/2014/1C-B-small-attempt0.in diff --git a/google_code_jam/2014/1C-B-small-attempt1.in b/puzzles/google_code_jam/2014/1C-B-small-attempt1.in similarity index 100% rename from google_code_jam/2014/1C-B-small-attempt1.in rename to puzzles/google_code_jam/2014/1C-B-small-attempt1.in diff --git a/google_code_jam/2014/1C-B.cpp b/puzzles/google_code_jam/2014/1C-B.cpp similarity index 100% rename from google_code_jam/2014/1C-B.cpp rename to puzzles/google_code_jam/2014/1C-B.cpp diff --git a/google_code_jam/2014/2-A-large-practice.in b/puzzles/google_code_jam/2014/2-A-large-practice.in similarity index 100% rename from google_code_jam/2014/2-A-large-practice.in rename to puzzles/google_code_jam/2014/2-A-large-practice.in diff --git a/google_code_jam/2014/2-A-sample.in b/puzzles/google_code_jam/2014/2-A-sample.in similarity index 100% rename from google_code_jam/2014/2-A-sample.in rename to puzzles/google_code_jam/2014/2-A-sample.in diff --git a/google_code_jam/2014/2-A-small-practice.in b/puzzles/google_code_jam/2014/2-A-small-practice.in similarity index 100% rename from google_code_jam/2014/2-A-small-practice.in rename to puzzles/google_code_jam/2014/2-A-small-practice.in diff --git a/google_code_jam/2014/2-A.cpp b/puzzles/google_code_jam/2014/2-A.cpp similarity index 100% rename from google_code_jam/2014/2-A.cpp rename to puzzles/google_code_jam/2014/2-A.cpp diff --git a/google_code_jam/library.h b/puzzles/google_code_jam/library.h similarity index 100% rename from google_code_jam/library.h rename to puzzles/google_code_jam/library.h diff --git a/interviews/FacebookInterviewTest.cpp b/puzzles/interviews/FacebookInterviewTest.cpp similarity index 100% rename from interviews/FacebookInterviewTest.cpp rename to puzzles/interviews/FacebookInterviewTest.cpp diff --git a/interviews/FacebookInterviewTest1.cpp b/puzzles/interviews/FacebookInterviewTest1.cpp similarity index 100% rename from interviews/FacebookInterviewTest1.cpp rename to puzzles/interviews/FacebookInterviewTest1.cpp diff --git a/interviews/NokiaInterviewTest.cpp b/puzzles/interviews/NokiaInterviewTest.cpp similarity index 100% rename from interviews/NokiaInterviewTest.cpp rename to puzzles/interviews/NokiaInterviewTest.cpp diff --git a/puzzles/interviews/radley_james/online_test.cpp b/puzzles/interviews/radley_james/online_test.cpp new file mode 100644 index 0000000..cba4882 --- /dev/null +++ b/puzzles/interviews/radley_james/online_test.cpp @@ -0,0 +1,140 @@ +/* +VIM: let g:lcppflags="-std=c++11 -O2 -pthread" +VIM: let g:wcppflags="/O2 /EHsc /DWIN32" +VIM: let g:argv="" +*/ +#include +#include +#include +#include +#include +#include + +/* +#1 print numbers from 1 to N and if i is 3 mutltiple print "Fizz", if 5 multiple "Buzz". + If both then "FizzBuzz". Otherwise print number. + + int N; + std::cin >> N; + + for (int i = 1; i <= N; i++) + { + if (!(i % 3)) + std::cout << "Fizz"; + if (!(i % 5)) + std::cout << "Buzz"; + if ((i % 3) && (i % 5)) + std::cout << i; + std::cout << std::endl; + } +*/ + +/* +#2 print complement of N. + + unsigned int c = 1; + unsigned int b = N; + while (b) + { + b >>= 1; + c <<= 1; + } + return c-1-N; + +alternative: + if ( !N ) + return 0; + + unsigned int b = N; + while ((b&(b-1))) + auto n = b&(b-1); + return (b<<1)-1-N; +*/ + +/* + #3 + char a[] = ""; + sizeof(a)? +*/ + +/* +#4 +struct A { + int x; + A(int a) : x(a) {} + A( const A& a ) { x=a.x; x++; } + opertaor = ... { x=a.x; x--; } +}; + +A a(4); +A b = a; +std::cout << b.x; + +3? +4? +5? +*/ + +/* +#5 +struct A { + int u; + int l; + + A(int i) : l(i), u(l + 1) {} +}; + +A a(5); +print a.l a.u + +5 6 +compilation fail +5 garbage ? + +*/ + +//#6 +/* +struct A { + int d; + virtual ~A(){} +}; +sizeof(A)? 8 || 16 +*/ + +//#7 +/* + +conceptual support for function call + +system stack +data segment +processor's register +text segment +heap +*/ + +int main ( void ) +{try{ + + + A a(5); + std::cout << a.l << ' ' << a.u ; + + char c; + std::cin >> c; + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} + diff --git a/interviews/think-cell/IntervalMap.cpp b/puzzles/interviews/think-cell/IntervalMap.cpp similarity index 100% rename from interviews/think-cell/IntervalMap.cpp rename to puzzles/interviews/think-cell/IntervalMap.cpp diff --git a/puzzles/interviews/think-cell/interview.cpp b/puzzles/interviews/think-cell/interview.cpp new file mode 100644 index 0000000..6f32611 --- /dev/null +++ b/puzzles/interviews/think-cell/interview.cpp @@ -0,0 +1,47 @@ + +//aschoedl@think-cell.com + +#include +#include + +template +int binary_search( IT ib, IT ie, const T& e ) +{ + if ( ib == ie || e < *ib || *(ie-1) < e ) + return -1; + + auto base = ib; + auto im = (ib+(ie-ib)/2); + while ( ib != im ) + { + if ( e < *im ) + ie = im; + else + ib = im; + im = (ib+(ie-ib)/2); + } + + return !(*ib < e) ? (ib - base) : -1; +} + +void main ( void ) +{ + std::vector v = { 0,1,2,3,4,4,4,4,5,6,7,8,9,11}; + + for ( int i = 0; i < v.size(); i++ ) { + int j = binary_search( v.begin(), v.end(), v[i] ); + std::cout << v[i] << "->" << j << std::endl; + } + std::cout << binary_search( v.begin(), v.end(), 10 ) << std::endl; + std::cout << binary_search( v.begin(), v.end(), 12 ) << std::endl; + std::cout << binary_search( v.begin(), v.end(), -4 ) << std::endl; + + std::vector v0; + std::cout << binary_search( v0.begin(), v0.end(), 10 ) << std::endl; + + std::vector v1 = { 1 }; + std::cout << binary_search( v1.begin(), v1.end(), -10 ) << std::endl; + std::cout << binary_search( v1.begin(), v1.end(), 10 ) << std::endl; + std::cout << binary_search( v1.begin(), v1.end(), 1 ) << std::endl; +} + diff --git a/puzzles/interviews/tomtom/tomtom_demo.cpp b/puzzles/interviews/tomtom/tomtom_demo.cpp new file mode 100644 index 0000000..9cef397 --- /dev/null +++ b/puzzles/interviews/tomtom/tomtom_demo.cpp @@ -0,0 +1,52 @@ +/* +VIM: let g:lcppflags="-std=c++11 -O2 -pthread" +VIM: let g:wcppflags="/O2 /EHsc /DWIN32" +VIM: let g:argv="" +*/ +#include +#include +#include +#include +#include + +int solution( std::vector & a ) +{ + long long s = 0; + for ( auto it = a.begin(), ie=a.end(); it != ie; ++it ) { + s += *it; + } + + long long t = 0; + for ( auto it = a.begin(), ie=a.end(); it != ie; ++it ) { + if ( (s-*it)%2 == 0 && t == (s-*it)/2 ) + return it - a.begin(); + t += *it; + } + return -1; +} + +int main ( void ) +{try{ +#if 1 + std::vector a = { + -1,3,-4,5,1,-6,2,1 + }; + + std::cout << solution( a ) << std::endl; + +#endif + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} + diff --git a/puzzles/interviews/tomtom/tomtom_test1.cpp b/puzzles/interviews/tomtom/tomtom_test1.cpp new file mode 100644 index 0000000..3b14b48 --- /dev/null +++ b/puzzles/interviews/tomtom/tomtom_test1.cpp @@ -0,0 +1,51 @@ +/* +VIM: let g:lcppflags="-std=c++11 -O2 -pthread" +VIM: let g:wcppflags="/O2 /EHsc /DWIN32" +VIM: let g:argv="" +*/ +#include +#include +#include +#include +#include + +int solution( std::vector & a ) +{ + auto n = a.size(); + + int i = 0; + for (int c = 0; c < n; ++c ) { + auto new_i = i + a[i]; + if (new_i < 0 || n <= new_i) + return i; + i = new_i; + } + + return -1; +} + +int main ( void ) +{try{ +#if 1 + std::vector a = { + 2,3,-1,1,-1 + }; + + std::cout << solution( a ) << std::endl; + +#endif + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} + diff --git a/puzzles/interviews/tomtom/tomtom_test2.cpp b/puzzles/interviews/tomtom/tomtom_test2.cpp new file mode 100644 index 0000000..597a460 --- /dev/null +++ b/puzzles/interviews/tomtom/tomtom_test2.cpp @@ -0,0 +1,57 @@ +/* +VIM: let g:lcppflags="-std=c++11 -O2 -pthread" +VIM: let g:wcppflags="/O2 /EHsc /DWIN32" +VIM: let g:argv="" +*/ +#include +#include +#include +#include +#include + +int solution( std::vector & a ) +{ + int max_e = 10001; // + std::vector c(max_e, 0); + + for ( auto e : a ) { + ++c[e]; + } + + int m = 0; + int mi = 0; + for ( auto it = c.begin(); it != c.end(); ++it ) { + if (*it > m) + { + m = *it; + mi = it - c.begin(); + } + } + return mi; +} + +int main ( void ) +{try{ +#if 1 + std::vector a = { + 0, 0, 1, 2, 0, 10000, 10000, 10000 + }; + + std::cout << solution( a ) << std::endl; + +#endif + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} + diff --git a/puzzles/interviews/tomtom/tomtom_test3.cpp b/puzzles/interviews/tomtom/tomtom_test3.cpp new file mode 100644 index 0000000..60df41f --- /dev/null +++ b/puzzles/interviews/tomtom/tomtom_test3.cpp @@ -0,0 +1,88 @@ +/* +VIM: let g:lcppflags="-std=c++11 -O2 -pthread" +VIM: let g:wcppflags="/O2 /EHsc /DWIN32" +VIM: let g:argv="" +*/ +#include +#include +#include +#include +#include + +/* +int solution(vector& A) { + int n = A.size(); + int i = n - 1; + int result = -1; + int k = 0; + int maximal = 0; + while (i > 0) { + if (A[i] == 1) { + k = k + 1; + if (k >= maximal) { + maximal = k; + result = i; + } + } + else { + k = 0; + } + i = i - 1; + } + if (A[i] == 1 && k + 1 > maximal) + result = 0; + return result; +} +*/ + +using namespace std; + +int solution(vector& A) { + int n = A.size(); + int i = n - 1; + int result = -1; + int k = 0; + int maximal = 0; + while (i > 0) { + if (A[i] == 1) { + k = k + 1; + if (k >= maximal) { + maximal = k; + result = i; + } + } + else { + k = 0; + } + i = i - 1; + } + if (A[i] == 1 && k + 1 >= maximal) + result = 0; + return result; +} + +int main ( void ) +{try{ +#if 1 + std::vector a = { + 1,1,1,0,1,1,1,0,1 + }; + + std::cout << solution( a ) << std::endl; + +#endif + return 0; +} +catch ( const std::exception& e ) +{ + std::cerr << std::endl + << "std::exception(\"" << e.what() << "\")." << std::endl; + return 2; +} +catch ( ... ) +{ + std::cerr << std::endl + << "unknown exception." << std::endl; + return 1; +}} + diff --git a/project_euler/p001_MultipleOf3and5.cpp b/puzzles/project_euler/p001_MultipleOf3and5.cpp similarity index 100% rename from project_euler/p001_MultipleOf3and5.cpp rename to puzzles/project_euler/p001_MultipleOf3and5.cpp diff --git a/project_euler/p002_EvenFibNum.cpp b/puzzles/project_euler/p002_EvenFibNum.cpp similarity index 100% rename from project_euler/p002_EvenFibNum.cpp rename to puzzles/project_euler/p002_EvenFibNum.cpp diff --git a/project_euler/p003_LargestPrimeFactor.cpp b/puzzles/project_euler/p003_LargestPrimeFactor.cpp similarity index 100% rename from project_euler/p003_LargestPrimeFactor.cpp rename to puzzles/project_euler/p003_LargestPrimeFactor.cpp diff --git a/project_euler/p004_LargestPalindromeProduct.py b/puzzles/project_euler/p004_LargestPalindromeProduct.py similarity index 100% rename from project_euler/p004_LargestPalindromeProduct.py rename to puzzles/project_euler/p004_LargestPalindromeProduct.py diff --git a/project_euler/p005_SmallestMultiple.cpp b/puzzles/project_euler/p005_SmallestMultiple.cpp similarity index 100% rename from project_euler/p005_SmallestMultiple.cpp rename to puzzles/project_euler/p005_SmallestMultiple.cpp diff --git a/project_euler/p006_SumSquareDiff.cpp b/puzzles/project_euler/p006_SumSquareDiff.cpp similarity index 100% rename from project_euler/p006_SumSquareDiff.cpp rename to puzzles/project_euler/p006_SumSquareDiff.cpp diff --git a/project_euler/p007_10001st_prime.cpp b/puzzles/project_euler/p007_10001st_prime.cpp similarity index 100% rename from project_euler/p007_10001st_prime.cpp rename to puzzles/project_euler/p007_10001st_prime.cpp diff --git a/project_euler/p008_LargestProductInASeries.cpp b/puzzles/project_euler/p008_LargestProductInASeries.cpp similarity index 100% rename from project_euler/p008_LargestProductInASeries.cpp rename to puzzles/project_euler/p008_LargestProductInASeries.cpp diff --git a/project_euler/p009_SpecialPythagoreanTriplet.py b/puzzles/project_euler/p009_SpecialPythagoreanTriplet.py similarity index 100% rename from project_euler/p009_SpecialPythagoreanTriplet.py rename to puzzles/project_euler/p009_SpecialPythagoreanTriplet.py diff --git a/project_euler/p010_SummationOfPrimes.cpp b/puzzles/project_euler/p010_SummationOfPrimes.cpp similarity index 100% rename from project_euler/p010_SummationOfPrimes.cpp rename to puzzles/project_euler/p010_SummationOfPrimes.cpp diff --git a/project_euler/p011_LargestProductInAGrid.py b/puzzles/project_euler/p011_LargestProductInAGrid.py similarity index 100% rename from project_euler/p011_LargestProductInAGrid.py rename to puzzles/project_euler/p011_LargestProductInAGrid.py diff --git a/project_euler/p012_HighlyDivisibleTriangularNumber.py b/puzzles/project_euler/p012_HighlyDivisibleTriangularNumber.py similarity index 100% rename from project_euler/p012_HighlyDivisibleTriangularNumber.py rename to puzzles/project_euler/p012_HighlyDivisibleTriangularNumber.py diff --git a/project_euler/p013_LargeSum.py b/puzzles/project_euler/p013_LargeSum.py similarity index 100% rename from project_euler/p013_LargeSum.py rename to puzzles/project_euler/p013_LargeSum.py diff --git a/project_euler/p014_LongestCollatzSequence.py b/puzzles/project_euler/p014_LongestCollatzSequence.py similarity index 100% rename from project_euler/p014_LongestCollatzSequence.py rename to puzzles/project_euler/p014_LongestCollatzSequence.py diff --git a/project_euler/p015_LatticePath.py b/puzzles/project_euler/p015_LatticePath.py similarity index 100% rename from project_euler/p015_LatticePath.py rename to puzzles/project_euler/p015_LatticePath.py diff --git a/project_euler/p016_PowerDigitSum.py b/puzzles/project_euler/p016_PowerDigitSum.py similarity index 100% rename from project_euler/p016_PowerDigitSum.py rename to puzzles/project_euler/p016_PowerDigitSum.py diff --git a/project_euler/p017_NumberLetterCounts.py b/puzzles/project_euler/p017_NumberLetterCounts.py similarity index 100% rename from project_euler/p017_NumberLetterCounts.py rename to puzzles/project_euler/p017_NumberLetterCounts.py diff --git a/project_euler/p018_MaximumPathSumI.py b/puzzles/project_euler/p018_MaximumPathSumI.py similarity index 100% rename from project_euler/p018_MaximumPathSumI.py rename to puzzles/project_euler/p018_MaximumPathSumI.py diff --git a/project_euler/p019_CountingSundays.py b/puzzles/project_euler/p019_CountingSundays.py similarity index 100% rename from project_euler/p019_CountingSundays.py rename to puzzles/project_euler/p019_CountingSundays.py diff --git a/project_euler/p020_FactorialDigitSum.py b/puzzles/project_euler/p020_FactorialDigitSum.py similarity index 100% rename from project_euler/p020_FactorialDigitSum.py rename to puzzles/project_euler/p020_FactorialDigitSum.py diff --git a/project_euler/p021_AmicableNumbers.py b/puzzles/project_euler/p021_AmicableNumbers.py similarity index 100% rename from project_euler/p021_AmicableNumbers.py rename to puzzles/project_euler/p021_AmicableNumbers.py diff --git a/project_euler/p022_NamesScores.py b/puzzles/project_euler/p022_NamesScores.py similarity index 100% rename from project_euler/p022_NamesScores.py rename to puzzles/project_euler/p022_NamesScores.py diff --git a/project_euler/p023_NonAbundantSums.py b/puzzles/project_euler/p023_NonAbundantSums.py similarity index 100% rename from project_euler/p023_NonAbundantSums.py rename to puzzles/project_euler/p023_NonAbundantSums.py diff --git a/project_euler/p024_LexicographicPermutations.py b/puzzles/project_euler/p024_LexicographicPermutations.py similarity index 100% rename from project_euler/p024_LexicographicPermutations.py rename to puzzles/project_euler/p024_LexicographicPermutations.py diff --git a/project_euler/p025_1000DigitFibonacciNumber.py b/puzzles/project_euler/p025_1000DigitFibonacciNumber.py similarity index 100% rename from project_euler/p025_1000DigitFibonacciNumber.py rename to puzzles/project_euler/p025_1000DigitFibonacciNumber.py diff --git a/project_euler/p026_ReciprocalCycles.py b/puzzles/project_euler/p026_ReciprocalCycles.py similarity index 100% rename from project_euler/p026_ReciprocalCycles.py rename to puzzles/project_euler/p026_ReciprocalCycles.py diff --git a/project_euler/p027_QuadraticPrimes.py b/puzzles/project_euler/p027_QuadraticPrimes.py similarity index 100% rename from project_euler/p027_QuadraticPrimes.py rename to puzzles/project_euler/p027_QuadraticPrimes.py diff --git a/project_euler/p028_NumberSpiralDiagonals.py b/puzzles/project_euler/p028_NumberSpiralDiagonals.py similarity index 100% rename from project_euler/p028_NumberSpiralDiagonals.py rename to puzzles/project_euler/p028_NumberSpiralDiagonals.py diff --git a/project_euler/p029_DistinctPowers.py b/puzzles/project_euler/p029_DistinctPowers.py similarity index 100% rename from project_euler/p029_DistinctPowers.py rename to puzzles/project_euler/p029_DistinctPowers.py diff --git a/project_euler/p030_DigitFifthPowers.py b/puzzles/project_euler/p030_DigitFifthPowers.py similarity index 100% rename from project_euler/p030_DigitFifthPowers.py rename to puzzles/project_euler/p030_DigitFifthPowers.py diff --git a/project_euler/p031_CoinSums.py b/puzzles/project_euler/p031_CoinSums.py similarity index 100% rename from project_euler/p031_CoinSums.py rename to puzzles/project_euler/p031_CoinSums.py diff --git a/project_euler/p032_PandigitalProducts.py b/puzzles/project_euler/p032_PandigitalProducts.py similarity index 100% rename from project_euler/p032_PandigitalProducts.py rename to puzzles/project_euler/p032_PandigitalProducts.py diff --git a/project_euler/p033_DigitCancelingFractions.py b/puzzles/project_euler/p033_DigitCancelingFractions.py similarity index 100% rename from project_euler/p033_DigitCancelingFractions.py rename to puzzles/project_euler/p033_DigitCancelingFractions.py diff --git a/project_euler/p034_DigitFactorials.py b/puzzles/project_euler/p034_DigitFactorials.py similarity index 100% rename from project_euler/p034_DigitFactorials.py rename to puzzles/project_euler/p034_DigitFactorials.py diff --git a/project_euler/p035_CircularPrimes.py b/puzzles/project_euler/p035_CircularPrimes.py similarity index 100% rename from project_euler/p035_CircularPrimes.py rename to puzzles/project_euler/p035_CircularPrimes.py diff --git a/project_euler/p036_DoubleBasePalindromes.py b/puzzles/project_euler/p036_DoubleBasePalindromes.py similarity index 100% rename from project_euler/p036_DoubleBasePalindromes.py rename to puzzles/project_euler/p036_DoubleBasePalindromes.py diff --git a/project_euler/p037_TruncatablePrimes.py b/puzzles/project_euler/p037_TruncatablePrimes.py similarity index 100% rename from project_euler/p037_TruncatablePrimes.py rename to puzzles/project_euler/p037_TruncatablePrimes.py diff --git a/project_euler/p038_PandigitalMultiples.py b/puzzles/project_euler/p038_PandigitalMultiples.py similarity index 100% rename from project_euler/p038_PandigitalMultiples.py rename to puzzles/project_euler/p038_PandigitalMultiples.py diff --git a/project_euler/p039_IntegerRightTriangles.py b/puzzles/project_euler/p039_IntegerRightTriangles.py similarity index 100% rename from project_euler/p039_IntegerRightTriangles.py rename to puzzles/project_euler/p039_IntegerRightTriangles.py diff --git a/project_euler/p040_ChampernowneConstant.py b/puzzles/project_euler/p040_ChampernowneConstant.py similarity index 100% rename from project_euler/p040_ChampernowneConstant.py rename to puzzles/project_euler/p040_ChampernowneConstant.py diff --git a/project_euler/p041_PandigitalPrime.py b/puzzles/project_euler/p041_PandigitalPrime.py similarity index 100% rename from project_euler/p041_PandigitalPrime.py rename to puzzles/project_euler/p041_PandigitalPrime.py diff --git a/project_euler/p042_CodedTriangleNumbers.py b/puzzles/project_euler/p042_CodedTriangleNumbers.py similarity index 100% rename from project_euler/p042_CodedTriangleNumbers.py rename to puzzles/project_euler/p042_CodedTriangleNumbers.py diff --git a/project_euler/p043_SubStringDivisibility.py b/puzzles/project_euler/p043_SubStringDivisibility.py similarity index 100% rename from project_euler/p043_SubStringDivisibility.py rename to puzzles/project_euler/p043_SubStringDivisibility.py diff --git a/project_euler/p044_PentagonNumbers.py b/puzzles/project_euler/p044_PentagonNumbers.py similarity index 100% rename from project_euler/p044_PentagonNumbers.py rename to puzzles/project_euler/p044_PentagonNumbers.py diff --git a/project_euler/p045_TriangularPentagonalAndHexagonal.py b/puzzles/project_euler/p045_TriangularPentagonalAndHexagonal.py similarity index 100% rename from project_euler/p045_TriangularPentagonalAndHexagonal.py rename to puzzles/project_euler/p045_TriangularPentagonalAndHexagonal.py diff --git a/project_euler/p046_GoldbachOtherConjecture.py b/puzzles/project_euler/p046_GoldbachOtherConjecture.py similarity index 100% rename from project_euler/p046_GoldbachOtherConjecture.py rename to puzzles/project_euler/p046_GoldbachOtherConjecture.py diff --git a/project_euler/p047_DistinctPrimesFactors.py b/puzzles/project_euler/p047_DistinctPrimesFactors.py similarity index 100% rename from project_euler/p047_DistinctPrimesFactors.py rename to puzzles/project_euler/p047_DistinctPrimesFactors.py diff --git a/project_euler/p048_SelfPowers.py b/puzzles/project_euler/p048_SelfPowers.py similarity index 100% rename from project_euler/p048_SelfPowers.py rename to puzzles/project_euler/p048_SelfPowers.py diff --git a/project_euler/p049_PrimePermutations.py b/puzzles/project_euler/p049_PrimePermutations.py similarity index 100% rename from project_euler/p049_PrimePermutations.py rename to puzzles/project_euler/p049_PrimePermutations.py diff --git a/project_euler/p050_ConsecutivePrimeSum.py b/puzzles/project_euler/p050_ConsecutivePrimeSum.py similarity index 100% rename from project_euler/p050_ConsecutivePrimeSum.py rename to puzzles/project_euler/p050_ConsecutivePrimeSum.py diff --git a/project_euler/p051_PrimeDigitReplacements.py b/puzzles/project_euler/p051_PrimeDigitReplacements.py similarity index 100% rename from project_euler/p051_PrimeDigitReplacements.py rename to puzzles/project_euler/p051_PrimeDigitReplacements.py diff --git a/project_euler/p052_PermutedMultiples.py b/puzzles/project_euler/p052_PermutedMultiples.py similarity index 100% rename from project_euler/p052_PermutedMultiples.py rename to puzzles/project_euler/p052_PermutedMultiples.py diff --git a/project_euler/p053_CombinatoricSelections.py b/puzzles/project_euler/p053_CombinatoricSelections.py similarity index 100% rename from project_euler/p053_CombinatoricSelections.py rename to puzzles/project_euler/p053_CombinatoricSelections.py diff --git a/project_euler/p054_PokerHands.py b/puzzles/project_euler/p054_PokerHands.py similarity index 100% rename from project_euler/p054_PokerHands.py rename to puzzles/project_euler/p054_PokerHands.py diff --git a/project_euler/p055_LychrelNumbers.py b/puzzles/project_euler/p055_LychrelNumbers.py similarity index 100% rename from project_euler/p055_LychrelNumbers.py rename to puzzles/project_euler/p055_LychrelNumbers.py diff --git a/project_euler/p056_PowerfulDigitSum.py b/puzzles/project_euler/p056_PowerfulDigitSum.py similarity index 100% rename from project_euler/p056_PowerfulDigitSum.py rename to puzzles/project_euler/p056_PowerfulDigitSum.py diff --git a/project_euler/p057_SquareRootConvergents.py b/puzzles/project_euler/p057_SquareRootConvergents.py similarity index 100% rename from project_euler/p057_SquareRootConvergents.py rename to puzzles/project_euler/p057_SquareRootConvergents.py diff --git a/project_euler/p058_SpiralPrimes.py b/puzzles/project_euler/p058_SpiralPrimes.py similarity index 100% rename from project_euler/p058_SpiralPrimes.py rename to puzzles/project_euler/p058_SpiralPrimes.py diff --git a/project_euler/p059_XORDecryption.py b/puzzles/project_euler/p059_XORDecryption.py similarity index 100% rename from project_euler/p059_XORDecryption.py rename to puzzles/project_euler/p059_XORDecryption.py diff --git a/project_euler/p060_PrimePairSets.py b/puzzles/project_euler/p060_PrimePairSets.py similarity index 100% rename from project_euler/p060_PrimePairSets.py rename to puzzles/project_euler/p060_PrimePairSets.py diff --git a/project_euler/p061_CyclicalFigurateNumbers.py b/puzzles/project_euler/p061_CyclicalFigurateNumbers.py similarity index 100% rename from project_euler/p061_CyclicalFigurateNumbers.py rename to puzzles/project_euler/p061_CyclicalFigurateNumbers.py diff --git a/project_euler/p062_CubicPermutations.py b/puzzles/project_euler/p062_CubicPermutations.py similarity index 100% rename from project_euler/p062_CubicPermutations.py rename to puzzles/project_euler/p062_CubicPermutations.py diff --git a/project_euler/p063_PowerfulDigitCounts.py b/puzzles/project_euler/p063_PowerfulDigitCounts.py similarity index 100% rename from project_euler/p063_PowerfulDigitCounts.py rename to puzzles/project_euler/p063_PowerfulDigitCounts.py diff --git a/project_euler/p064_OddPeriodSquareRoots.py b/puzzles/project_euler/p064_OddPeriodSquareRoots.py similarity index 100% rename from project_euler/p064_OddPeriodSquareRoots.py rename to puzzles/project_euler/p064_OddPeriodSquareRoots.py diff --git a/project_euler/p065_ConvergentsOfE.py b/puzzles/project_euler/p065_ConvergentsOfE.py similarity index 100% rename from project_euler/p065_ConvergentsOfE.py rename to puzzles/project_euler/p065_ConvergentsOfE.py diff --git a/project_euler/p066_DiophantineEquation.py b/puzzles/project_euler/p066_DiophantineEquation.py similarity index 100% rename from project_euler/p066_DiophantineEquation.py rename to puzzles/project_euler/p066_DiophantineEquation.py diff --git a/project_euler/p067_MaximumPathSumII.py b/puzzles/project_euler/p067_MaximumPathSumII.py similarity index 100% rename from project_euler/p067_MaximumPathSumII.py rename to puzzles/project_euler/p067_MaximumPathSumII.py diff --git a/project_euler/p067_triangle.txt b/puzzles/project_euler/p067_triangle.txt similarity index 100% rename from project_euler/p067_triangle.txt rename to puzzles/project_euler/p067_triangle.txt diff --git a/project_euler/p068_Magic5GonRing.py b/puzzles/project_euler/p068_Magic5GonRing.py similarity index 100% rename from project_euler/p068_Magic5GonRing.py rename to puzzles/project_euler/p068_Magic5GonRing.py diff --git a/project_euler/p069_TotientMaximum.py b/puzzles/project_euler/p069_TotientMaximum.py similarity index 100% rename from project_euler/p069_TotientMaximum.py rename to puzzles/project_euler/p069_TotientMaximum.py diff --git a/project_euler/p070_TotientPermutation.py b/puzzles/project_euler/p070_TotientPermutation.py similarity index 100% rename from project_euler/p070_TotientPermutation.py rename to puzzles/project_euler/p070_TotientPermutation.py diff --git a/project_euler/p071_OrderedFractions.py b/puzzles/project_euler/p071_OrderedFractions.py similarity index 100% rename from project_euler/p071_OrderedFractions.py rename to puzzles/project_euler/p071_OrderedFractions.py diff --git a/project_euler/p072_CountingFractions.py b/puzzles/project_euler/p072_CountingFractions.py similarity index 100% rename from project_euler/p072_CountingFractions.py rename to puzzles/project_euler/p072_CountingFractions.py diff --git a/project_euler/p073_CountingFractionsInARange.py b/puzzles/project_euler/p073_CountingFractionsInARange.py similarity index 100% rename from project_euler/p073_CountingFractionsInARange.py rename to puzzles/project_euler/p073_CountingFractionsInARange.py diff --git a/project_euler/p074_DigitFactorialChains.py b/puzzles/project_euler/p074_DigitFactorialChains.py similarity index 100% rename from project_euler/p074_DigitFactorialChains.py rename to puzzles/project_euler/p074_DigitFactorialChains.py diff --git a/project_euler/p075_SingularIntegerRightTriangles.py b/puzzles/project_euler/p075_SingularIntegerRightTriangles.py similarity index 100% rename from project_euler/p075_SingularIntegerRightTriangles.py rename to puzzles/project_euler/p075_SingularIntegerRightTriangles.py diff --git a/project_euler/p076_CountingSummations.py b/puzzles/project_euler/p076_CountingSummations.py similarity index 100% rename from project_euler/p076_CountingSummations.py rename to puzzles/project_euler/p076_CountingSummations.py diff --git a/project_euler/p077_PrimeSummations.py b/puzzles/project_euler/p077_PrimeSummations.py similarity index 100% rename from project_euler/p077_PrimeSummations.py rename to puzzles/project_euler/p077_PrimeSummations.py diff --git a/project_euler/p078_CoinPartitions.py b/puzzles/project_euler/p078_CoinPartitions.py similarity index 100% rename from project_euler/p078_CoinPartitions.py rename to puzzles/project_euler/p078_CoinPartitions.py diff --git a/project_euler/p079_PasscodeDerivation.py b/puzzles/project_euler/p079_PasscodeDerivation.py similarity index 100% rename from project_euler/p079_PasscodeDerivation.py rename to puzzles/project_euler/p079_PasscodeDerivation.py diff --git a/project_euler/p080_SquareRootDigitalExpansion.py b/puzzles/project_euler/p080_SquareRootDigitalExpansion.py similarity index 100% rename from project_euler/p080_SquareRootDigitalExpansion.py rename to puzzles/project_euler/p080_SquareRootDigitalExpansion.py diff --git a/project_euler/p081_PathSum_2ways.py b/puzzles/project_euler/p081_PathSum_2ways.py similarity index 100% rename from project_euler/p081_PathSum_2ways.py rename to puzzles/project_euler/p081_PathSum_2ways.py diff --git a/project_euler/p082_PathSum_3ways.py b/puzzles/project_euler/p082_PathSum_3ways.py similarity index 100% rename from project_euler/p082_PathSum_3ways.py rename to puzzles/project_euler/p082_PathSum_3ways.py diff --git a/project_euler/p083_PathSum_4ways.py b/puzzles/project_euler/p083_PathSum_4ways.py similarity index 100% rename from project_euler/p083_PathSum_4ways.py rename to puzzles/project_euler/p083_PathSum_4ways.py diff --git a/project_euler/p084_MonopolyOdds.py b/puzzles/project_euler/p084_MonopolyOdds.py similarity index 100% rename from project_euler/p084_MonopolyOdds.py rename to puzzles/project_euler/p084_MonopolyOdds.py diff --git a/project_euler/p085_CountingRectangles.py b/puzzles/project_euler/p085_CountingRectangles.py similarity index 100% rename from project_euler/p085_CountingRectangles.py rename to puzzles/project_euler/p085_CountingRectangles.py diff --git a/project_euler/p086_CuboidRoute.py b/puzzles/project_euler/p086_CuboidRoute.py similarity index 100% rename from project_euler/p086_CuboidRoute.py rename to puzzles/project_euler/p086_CuboidRoute.py diff --git a/project_euler/p087_PrimePowerTriples.py b/puzzles/project_euler/p087_PrimePowerTriples.py similarity index 100% rename from project_euler/p087_PrimePowerTriples.py rename to puzzles/project_euler/p087_PrimePowerTriples.py diff --git a/project_euler/p088_ProductSumNumbers.py b/puzzles/project_euler/p088_ProductSumNumbers.py similarity index 100% rename from project_euler/p088_ProductSumNumbers.py rename to puzzles/project_euler/p088_ProductSumNumbers.py diff --git a/project_euler/p089_RomanNumerals.py b/puzzles/project_euler/p089_RomanNumerals.py similarity index 100% rename from project_euler/p089_RomanNumerals.py rename to puzzles/project_euler/p089_RomanNumerals.py diff --git a/project_euler/p090_CubeDigitPairs.py b/puzzles/project_euler/p090_CubeDigitPairs.py similarity index 100% rename from project_euler/p090_CubeDigitPairs.py rename to puzzles/project_euler/p090_CubeDigitPairs.py diff --git a/project_euler/p091_RightTrianglesWithIntegerCoordinates.py b/puzzles/project_euler/p091_RightTrianglesWithIntegerCoordinates.py similarity index 100% rename from project_euler/p091_RightTrianglesWithIntegerCoordinates.py rename to puzzles/project_euler/p091_RightTrianglesWithIntegerCoordinates.py diff --git a/project_euler/p092_SquareDigitChains.py b/puzzles/project_euler/p092_SquareDigitChains.py similarity index 100% rename from project_euler/p092_SquareDigitChains.py rename to puzzles/project_euler/p092_SquareDigitChains.py diff --git a/project_euler/p093_ArithmeticExpressions.py b/puzzles/project_euler/p093_ArithmeticExpressions.py similarity index 100% rename from project_euler/p093_ArithmeticExpressions.py rename to puzzles/project_euler/p093_ArithmeticExpressions.py diff --git a/project_euler/p094_AlmostEquilateralTriangles.py b/puzzles/project_euler/p094_AlmostEquilateralTriangles.py similarity index 100% rename from project_euler/p094_AlmostEquilateralTriangles.py rename to puzzles/project_euler/p094_AlmostEquilateralTriangles.py diff --git a/project_euler/p095_AmicableChains.py b/puzzles/project_euler/p095_AmicableChains.py similarity index 100% rename from project_euler/p095_AmicableChains.py rename to puzzles/project_euler/p095_AmicableChains.py diff --git a/project_euler/p096_SuDoku.py b/puzzles/project_euler/p096_SuDoku.py similarity index 100% rename from project_euler/p096_SuDoku.py rename to puzzles/project_euler/p096_SuDoku.py diff --git a/project_euler/p097_LargeNonMersennePrime.py b/puzzles/project_euler/p097_LargeNonMersennePrime.py similarity index 100% rename from project_euler/p097_LargeNonMersennePrime.py rename to puzzles/project_euler/p097_LargeNonMersennePrime.py diff --git a/project_euler/p098_AnagramicSquares.py b/puzzles/project_euler/p098_AnagramicSquares.py similarity index 100% rename from project_euler/p098_AnagramicSquares.py rename to puzzles/project_euler/p098_AnagramicSquares.py diff --git a/project_euler/p099_LargestExponential.py b/puzzles/project_euler/p099_LargestExponential.py similarity index 100% rename from project_euler/p099_LargestExponential.py rename to puzzles/project_euler/p099_LargestExponential.py diff --git a/project_euler/p100_ArrangedProbability.py b/puzzles/project_euler/p100_ArrangedProbability.py similarity index 100% rename from project_euler/p100_ArrangedProbability.py rename to puzzles/project_euler/p100_ArrangedProbability.py diff --git a/project_euler/p101_OptimumPolynomial.py b/puzzles/project_euler/p101_OptimumPolynomial.py similarity index 100% rename from project_euler/p101_OptimumPolynomial.py rename to puzzles/project_euler/p101_OptimumPolynomial.py diff --git a/project_euler/p102_TriangleContainment.py b/puzzles/project_euler/p102_TriangleContainment.py similarity index 100% rename from project_euler/p102_TriangleContainment.py rename to puzzles/project_euler/p102_TriangleContainment.py diff --git a/project_euler/p103_SpecialSubsetSums_optimum.py b/puzzles/project_euler/p103_SpecialSubsetSums_optimum.py similarity index 100% rename from project_euler/p103_SpecialSubsetSums_optimum.py rename to puzzles/project_euler/p103_SpecialSubsetSums_optimum.py diff --git a/project_euler/p104_PandigitalFibonacciEnds.py b/puzzles/project_euler/p104_PandigitalFibonacciEnds.py similarity index 100% rename from project_euler/p104_PandigitalFibonacciEnds.py rename to puzzles/project_euler/p104_PandigitalFibonacciEnds.py diff --git a/project_euler/p105_SpecialSubsetSums_testing.py b/puzzles/project_euler/p105_SpecialSubsetSums_testing.py similarity index 100% rename from project_euler/p105_SpecialSubsetSums_testing.py rename to puzzles/project_euler/p105_SpecialSubsetSums_testing.py diff --git a/project_euler/p106_SpecialSubsetSums_metatesting.py b/puzzles/project_euler/p106_SpecialSubsetSums_metatesting.py similarity index 100% rename from project_euler/p106_SpecialSubsetSums_metatesting.py rename to puzzles/project_euler/p106_SpecialSubsetSums_metatesting.py diff --git a/project_euler/p107_MinimalNetwork.py b/puzzles/project_euler/p107_MinimalNetwork.py similarity index 100% rename from project_euler/p107_MinimalNetwork.py rename to puzzles/project_euler/p107_MinimalNetwork.py diff --git a/project_euler/p108_DiophantineReciprocalsI.py b/puzzles/project_euler/p108_DiophantineReciprocalsI.py similarity index 100% rename from project_euler/p108_DiophantineReciprocalsI.py rename to puzzles/project_euler/p108_DiophantineReciprocalsI.py diff --git a/project_euler/p109_Darts.py b/puzzles/project_euler/p109_Darts.py similarity index 100% rename from project_euler/p109_Darts.py rename to puzzles/project_euler/p109_Darts.py diff --git a/project_euler/p110_DiophantineReciprocalsII.py b/puzzles/project_euler/p110_DiophantineReciprocalsII.py similarity index 100% rename from project_euler/p110_DiophantineReciprocalsII.py rename to puzzles/project_euler/p110_DiophantineReciprocalsII.py diff --git a/project_euler/p111_PrimesWithRuns.py b/puzzles/project_euler/p111_PrimesWithRuns.py similarity index 100% rename from project_euler/p111_PrimesWithRuns.py rename to puzzles/project_euler/p111_PrimesWithRuns.py diff --git a/project_euler/p112_BouncyNumbers.py b/puzzles/project_euler/p112_BouncyNumbers.py similarity index 100% rename from project_euler/p112_BouncyNumbers.py rename to puzzles/project_euler/p112_BouncyNumbers.py diff --git a/project_euler/p113_NonBouncyNumbers.py b/puzzles/project_euler/p113_NonBouncyNumbers.py similarity index 100% rename from project_euler/p113_NonBouncyNumbers.py rename to puzzles/project_euler/p113_NonBouncyNumbers.py diff --git a/project_euler/p114_CountingBlockCombinationsI.py b/puzzles/project_euler/p114_CountingBlockCombinationsI.py similarity index 100% rename from project_euler/p114_CountingBlockCombinationsI.py rename to puzzles/project_euler/p114_CountingBlockCombinationsI.py diff --git a/project_euler/p115_CountingBlockCombinationsII.py b/puzzles/project_euler/p115_CountingBlockCombinationsII.py similarity index 100% rename from project_euler/p115_CountingBlockCombinationsII.py rename to puzzles/project_euler/p115_CountingBlockCombinationsII.py diff --git a/project_euler/p116_Red,GreenOrBlueTiles.py b/puzzles/project_euler/p116_Red,GreenOrBlueTiles.py similarity index 100% rename from project_euler/p116_Red,GreenOrBlueTiles.py rename to puzzles/project_euler/p116_Red,GreenOrBlueTiles.py diff --git a/project_euler/p117_Red,Green,AndBlueTiles.py b/puzzles/project_euler/p117_Red,Green,AndBlueTiles.py similarity index 100% rename from project_euler/p117_Red,Green,AndBlueTiles.py rename to puzzles/project_euler/p117_Red,Green,AndBlueTiles.py diff --git a/project_euler/p118_PandigitalPrimeSets.py b/puzzles/project_euler/p118_PandigitalPrimeSets.py similarity index 100% rename from project_euler/p118_PandigitalPrimeSets.py rename to puzzles/project_euler/p118_PandigitalPrimeSets.py diff --git a/project_euler/p119_DigitPowerSum.py b/puzzles/project_euler/p119_DigitPowerSum.py similarity index 100% rename from project_euler/p119_DigitPowerSum.py rename to puzzles/project_euler/p119_DigitPowerSum.py diff --git a/project_euler/p120_SquareRemainders.py b/puzzles/project_euler/p120_SquareRemainders.py similarity index 100% rename from project_euler/p120_SquareRemainders.py rename to puzzles/project_euler/p120_SquareRemainders.py diff --git a/project_euler/p121_DiscGamePrizeFund.py b/puzzles/project_euler/p121_DiscGamePrizeFund.py similarity index 100% rename from project_euler/p121_DiscGamePrizeFund.py rename to puzzles/project_euler/p121_DiscGamePrizeFund.py diff --git a/project_euler/p122_EfficientExponentiation.py b/puzzles/project_euler/p122_EfficientExponentiation.py similarity index 100% rename from project_euler/p122_EfficientExponentiation.py rename to puzzles/project_euler/p122_EfficientExponentiation.py diff --git a/project_euler/p123_PrimeSquareRemainders.py b/puzzles/project_euler/p123_PrimeSquareRemainders.py similarity index 100% rename from project_euler/p123_PrimeSquareRemainders.py rename to puzzles/project_euler/p123_PrimeSquareRemainders.py diff --git a/project_euler/p124_OrderedRadicals.py b/puzzles/project_euler/p124_OrderedRadicals.py similarity index 100% rename from project_euler/p124_OrderedRadicals.py rename to puzzles/project_euler/p124_OrderedRadicals.py diff --git a/project_euler/p125_PalindromicSums.py b/puzzles/project_euler/p125_PalindromicSums.py similarity index 100% rename from project_euler/p125_PalindromicSums.py rename to puzzles/project_euler/p125_PalindromicSums.py diff --git a/project_euler/p126_CuboidLayers.py b/puzzles/project_euler/p126_CuboidLayers.py similarity index 100% rename from project_euler/p126_CuboidLayers.py rename to puzzles/project_euler/p126_CuboidLayers.py diff --git a/project_euler/p127_abcHits.py b/puzzles/project_euler/p127_abcHits.py similarity index 100% rename from project_euler/p127_abcHits.py rename to puzzles/project_euler/p127_abcHits.py diff --git a/project_euler/p128_HexagonalTileDifferences.py b/puzzles/project_euler/p128_HexagonalTileDifferences.py similarity index 100% rename from project_euler/p128_HexagonalTileDifferences.py rename to puzzles/project_euler/p128_HexagonalTileDifferences.py diff --git a/project_euler/p129_RepunitDivisibility.py b/puzzles/project_euler/p129_RepunitDivisibility.py similarity index 100% rename from project_euler/p129_RepunitDivisibility.py rename to puzzles/project_euler/p129_RepunitDivisibility.py diff --git a/project_euler/p130_CompositesWithPrimeRepunitProperty.py b/puzzles/project_euler/p130_CompositesWithPrimeRepunitProperty.py similarity index 100% rename from project_euler/p130_CompositesWithPrimeRepunitProperty.py rename to puzzles/project_euler/p130_CompositesWithPrimeRepunitProperty.py diff --git a/project_euler/p131_PrimeCubePartnership.py b/puzzles/project_euler/p131_PrimeCubePartnership.py similarity index 100% rename from project_euler/p131_PrimeCubePartnership.py rename to puzzles/project_euler/p131_PrimeCubePartnership.py diff --git a/project_euler/p132_LargeRepunitFactors.py b/puzzles/project_euler/p132_LargeRepunitFactors.py similarity index 100% rename from project_euler/p132_LargeRepunitFactors.py rename to puzzles/project_euler/p132_LargeRepunitFactors.py diff --git a/project_euler/p133_RepunitNonfactors.py b/puzzles/project_euler/p133_RepunitNonfactors.py similarity index 100% rename from project_euler/p133_RepunitNonfactors.py rename to puzzles/project_euler/p133_RepunitNonfactors.py diff --git a/project_euler/p134_PrimePairConnection.py b/puzzles/project_euler/p134_PrimePairConnection.py similarity index 100% rename from project_euler/p134_PrimePairConnection.py rename to puzzles/project_euler/p134_PrimePairConnection.py diff --git a/project_euler/p135_SameDifferences.py b/puzzles/project_euler/p135_SameDifferences.py similarity index 100% rename from project_euler/p135_SameDifferences.py rename to puzzles/project_euler/p135_SameDifferences.py diff --git a/project_euler/p136_SingletonDifference.py b/puzzles/project_euler/p136_SingletonDifference.py similarity index 100% rename from project_euler/p136_SingletonDifference.py rename to puzzles/project_euler/p136_SingletonDifference.py diff --git a/project_euler/p137_FibonacciGoldenNuggets.py b/puzzles/project_euler/p137_FibonacciGoldenNuggets.py similarity index 100% rename from project_euler/p137_FibonacciGoldenNuggets.py rename to puzzles/project_euler/p137_FibonacciGoldenNuggets.py diff --git a/project_euler/p138_SpecialIsoscelesTriangles.py b/puzzles/project_euler/p138_SpecialIsoscelesTriangles.py similarity index 100% rename from project_euler/p138_SpecialIsoscelesTriangles.py rename to puzzles/project_euler/p138_SpecialIsoscelesTriangles.py diff --git a/project_euler/p139_PythagoreanTiles.py b/puzzles/project_euler/p139_PythagoreanTiles.py similarity index 100% rename from project_euler/p139_PythagoreanTiles.py rename to puzzles/project_euler/p139_PythagoreanTiles.py diff --git a/project_euler/p140_ModifiedFibonacciGoldenNuggets.py b/puzzles/project_euler/p140_ModifiedFibonacciGoldenNuggets.py similarity index 100% rename from project_euler/p140_ModifiedFibonacciGoldenNuggets.py rename to puzzles/project_euler/p140_ModifiedFibonacciGoldenNuggets.py diff --git a/project_euler/p141_InvestigatingProgressiveNumbers,N,WhichAreAlsoSquare..py b/puzzles/project_euler/p141_InvestigatingProgressiveNumbers,N,WhichAreAlsoSquare..py similarity index 100% rename from project_euler/p141_InvestigatingProgressiveNumbers,N,WhichAreAlsoSquare..py rename to puzzles/project_euler/p141_InvestigatingProgressiveNumbers,N,WhichAreAlsoSquare..py diff --git a/project_euler/p142_PerfectSquareCollection.py b/puzzles/project_euler/p142_PerfectSquareCollection.py similarity index 100% rename from project_euler/p142_PerfectSquareCollection.py rename to puzzles/project_euler/p142_PerfectSquareCollection.py diff --git a/project_euler/p143_InvestigatingTheTorricelliPointOfATriangle.py b/puzzles/project_euler/p143_InvestigatingTheTorricelliPointOfATriangle.py similarity index 100% rename from project_euler/p143_InvestigatingTheTorricelliPointOfATriangle.py rename to puzzles/project_euler/p143_InvestigatingTheTorricelliPointOfATriangle.py diff --git a/project_euler/p144_InvestigatingMultipleReflectionsOfALaserBeam..py b/puzzles/project_euler/p144_InvestigatingMultipleReflectionsOfALaserBeam..py similarity index 100% rename from project_euler/p144_InvestigatingMultipleReflectionsOfALaserBeam..py rename to puzzles/project_euler/p144_InvestigatingMultipleReflectionsOfALaserBeam..py diff --git a/project_euler/p145_HowManyReversibleNumbersAreThereBelowOneBillion.py b/puzzles/project_euler/p145_HowManyReversibleNumbersAreThereBelowOneBillion.py similarity index 100% rename from project_euler/p145_HowManyReversibleNumbersAreThereBelowOneBillion.py rename to puzzles/project_euler/p145_HowManyReversibleNumbersAreThereBelowOneBillion.py diff --git a/project_euler/p146_InvestigatingAPrimePattern.py b/puzzles/project_euler/p146_InvestigatingAPrimePattern.py similarity index 100% rename from project_euler/p146_InvestigatingAPrimePattern.py rename to puzzles/project_euler/p146_InvestigatingAPrimePattern.py diff --git a/project_euler/p147_RectanglesInCrossHatchedGrids.py b/puzzles/project_euler/p147_RectanglesInCrossHatchedGrids.py similarity index 100% rename from project_euler/p147_RectanglesInCrossHatchedGrids.py rename to puzzles/project_euler/p147_RectanglesInCrossHatchedGrids.py diff --git a/project_euler/p148_ExploringPascalTriangle..py b/puzzles/project_euler/p148_ExploringPascalTriangle..py similarity index 100% rename from project_euler/p148_ExploringPascalTriangle..py rename to puzzles/project_euler/p148_ExploringPascalTriangle..py diff --git a/project_euler/p149_SearchingForAMaximumSumSubsequence..py b/puzzles/project_euler/p149_SearchingForAMaximumSumSubsequence..py similarity index 100% rename from project_euler/p149_SearchingForAMaximumSumSubsequence..py rename to puzzles/project_euler/p149_SearchingForAMaximumSumSubsequence..py diff --git a/project_euler/p150_SearchingATriangularArrayForASubTriangleHavingMinimumSum..py b/puzzles/project_euler/p150_SearchingATriangularArrayForASubTriangleHavingMinimumSum..py similarity index 100% rename from project_euler/p150_SearchingATriangularArrayForASubTriangleHavingMinimumSum..py rename to puzzles/project_euler/p150_SearchingATriangularArrayForASubTriangleHavingMinimumSum..py diff --git a/project_euler/p151_PaperSheetsOfStandardSizes.py b/puzzles/project_euler/p151_PaperSheetsOfStandardSizes.py similarity index 100% rename from project_euler/p151_PaperSheetsOfStandardSizes.py rename to puzzles/project_euler/p151_PaperSheetsOfStandardSizes.py diff --git a/project_euler/p152_Writing12AsAumAfAnverseSquares.py b/puzzles/project_euler/p152_Writing12AsAumAfAnverseSquares.py similarity index 100% rename from project_euler/p152_Writing12AsAumAfAnverseSquares.py rename to puzzles/project_euler/p152_Writing12AsAumAfAnverseSquares.py diff --git a/project_euler/p153_InvestigatingGaussianIntegers.py b/puzzles/project_euler/p153_InvestigatingGaussianIntegers.py similarity index 100% rename from project_euler/p153_InvestigatingGaussianIntegers.py rename to puzzles/project_euler/p153_InvestigatingGaussianIntegers.py diff --git a/project_euler/p154_ExploringPascalPyramid..py b/puzzles/project_euler/p154_ExploringPascalPyramid..py similarity index 100% rename from project_euler/p154_ExploringPascalPyramid..py rename to puzzles/project_euler/p154_ExploringPascalPyramid..py diff --git a/project_euler/p155_CountingCapacitorCircuits..py b/puzzles/project_euler/p155_CountingCapacitorCircuits..py similarity index 100% rename from project_euler/p155_CountingCapacitorCircuits..py rename to puzzles/project_euler/p155_CountingCapacitorCircuits..py diff --git a/project_euler/p156_CountingDigits.py b/puzzles/project_euler/p156_CountingDigits.py similarity index 100% rename from project_euler/p156_CountingDigits.py rename to puzzles/project_euler/p156_CountingDigits.py diff --git a/project_euler/p157_SolvingTheDiophantineEquation.py b/puzzles/project_euler/p157_SolvingTheDiophantineEquation.py similarity index 100% rename from project_euler/p157_SolvingTheDiophantineEquation.py rename to puzzles/project_euler/p157_SolvingTheDiophantineEquation.py diff --git a/project_euler/p158_ExploringStringsForWhichOnlyOneCharacterComesLexicographicallyAfterItsNeighbourToTheLeft..py b/puzzles/project_euler/p158_ExploringStringsForWhichOnlyOneCharacterComesLexicographicallyAfterItsNeighbourToTheLeft..py similarity index 100% rename from project_euler/p158_ExploringStringsForWhichOnlyOneCharacterComesLexicographicallyAfterItsNeighbourToTheLeft..py rename to puzzles/project_euler/p158_ExploringStringsForWhichOnlyOneCharacterComesLexicographicallyAfterItsNeighbourToTheLeft..py diff --git a/project_euler/p159_DigitalRootSumsOfFactorisations..py b/puzzles/project_euler/p159_DigitalRootSumsOfFactorisations..py similarity index 100% rename from project_euler/p159_DigitalRootSumsOfFactorisations..py rename to puzzles/project_euler/p159_DigitalRootSumsOfFactorisations..py diff --git a/project_euler/p160_FactorialTrailingDigits.py b/puzzles/project_euler/p160_FactorialTrailingDigits.py similarity index 100% rename from project_euler/p160_FactorialTrailingDigits.py rename to puzzles/project_euler/p160_FactorialTrailingDigits.py diff --git a/project_euler/p161_Triominoes.py b/puzzles/project_euler/p161_Triominoes.py similarity index 100% rename from project_euler/p161_Triominoes.py rename to puzzles/project_euler/p161_Triominoes.py diff --git a/project_euler/p162_HexadecimalNumbers.py b/puzzles/project_euler/p162_HexadecimalNumbers.py similarity index 100% rename from project_euler/p162_HexadecimalNumbers.py rename to puzzles/project_euler/p162_HexadecimalNumbers.py diff --git a/project_euler/p163_CrossHatchedTriangles.py b/puzzles/project_euler/p163_CrossHatchedTriangles.py similarity index 100% rename from project_euler/p163_CrossHatchedTriangles.py rename to puzzles/project_euler/p163_CrossHatchedTriangles.py diff --git a/project_euler/p164_NumbersForWhichNoThreeConsecutiveDigitsHaveASumGreaterThanAGivenValue..py b/puzzles/project_euler/p164_NumbersForWhichNoThreeConsecutiveDigitsHaveASumGreaterThanAGivenValue..py similarity index 100% rename from project_euler/p164_NumbersForWhichNoThreeConsecutiveDigitsHaveASumGreaterThanAGivenValue..py rename to puzzles/project_euler/p164_NumbersForWhichNoThreeConsecutiveDigitsHaveASumGreaterThanAGivenValue..py diff --git a/project_euler/p165_Intersections.py b/puzzles/project_euler/p165_Intersections.py similarity index 100% rename from project_euler/p165_Intersections.py rename to puzzles/project_euler/p165_Intersections.py diff --git a/project_euler/p166_CrissCross.py b/puzzles/project_euler/p166_CrissCross.py similarity index 100% rename from project_euler/p166_CrissCross.py rename to puzzles/project_euler/p166_CrissCross.py diff --git a/project_euler/p167_InvestigatingUlamSequences.py b/puzzles/project_euler/p167_InvestigatingUlamSequences.py similarity index 100% rename from project_euler/p167_InvestigatingUlamSequences.py rename to puzzles/project_euler/p167_InvestigatingUlamSequences.py diff --git a/project_euler/p168_NumberRotations.py b/puzzles/project_euler/p168_NumberRotations.py similarity index 100% rename from project_euler/p168_NumberRotations.py rename to puzzles/project_euler/p168_NumberRotations.py diff --git a/project_euler/p169_ExploringTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py b/puzzles/project_euler/p169_ExploringTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py similarity index 100% rename from project_euler/p169_ExploringTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py rename to puzzles/project_euler/p169_ExploringTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py diff --git a/project_euler/p170_FindTheLargest0To9PandigitalThatCanBeFormedByConcatenatingProducts..py b/puzzles/project_euler/p170_FindTheLargest0To9PandigitalThatCanBeFormedByConcatenatingProducts..py similarity index 100% rename from project_euler/p170_FindTheLargest0To9PandigitalThatCanBeFormedByConcatenatingProducts..py rename to puzzles/project_euler/p170_FindTheLargest0To9PandigitalThatCanBeFormedByConcatenatingProducts..py diff --git a/project_euler/p171_FindingNumbersForWhichTheSumOfTheSquaresOfTheDigitsIsASquare..py b/puzzles/project_euler/p171_FindingNumbersForWhichTheSumOfTheSquaresOfTheDigitsIsASquare..py similarity index 100% rename from project_euler/p171_FindingNumbersForWhichTheSumOfTheSquaresOfTheDigitsIsASquare..py rename to puzzles/project_euler/p171_FindingNumbersForWhichTheSumOfTheSquaresOfTheDigitsIsASquare..py diff --git a/project_euler/p172_InvestigatingNumbersWithFewRepeatedDigits..py b/puzzles/project_euler/p172_InvestigatingNumbersWithFewRepeatedDigits..py similarity index 100% rename from project_euler/p172_InvestigatingNumbersWithFewRepeatedDigits..py rename to puzzles/project_euler/p172_InvestigatingNumbersWithFewRepeatedDigits..py diff --git a/project_euler/p173_UsingUpToOneMillionTilesHowManyDifferent_Hollow_SquareLaminaeCanBeFormed.py b/puzzles/project_euler/p173_UsingUpToOneMillionTilesHowManyDifferent_Hollow_SquareLaminaeCanBeFormed.py similarity index 100% rename from project_euler/p173_UsingUpToOneMillionTilesHowManyDifferent_Hollow_SquareLaminaeCanBeFormed.py rename to puzzles/project_euler/p173_UsingUpToOneMillionTilesHowManyDifferent_Hollow_SquareLaminaeCanBeFormed.py diff --git a/project_euler/p174_CountingTheNumberOf_Hollow_SquareLaminaeThatCanFormOne,Two,Three,...DistinctArrangements..py b/puzzles/project_euler/p174_CountingTheNumberOf_Hollow_SquareLaminaeThatCanFormOne,Two,Three,...DistinctArrangements..py similarity index 100% rename from project_euler/p174_CountingTheNumberOf_Hollow_SquareLaminaeThatCanFormOne,Two,Three,...DistinctArrangements..py rename to puzzles/project_euler/p174_CountingTheNumberOf_Hollow_SquareLaminaeThatCanFormOne,Two,Three,...DistinctArrangements..py diff --git a/project_euler/p175_FractionsInvolvingTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py b/puzzles/project_euler/p175_FractionsInvolvingTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py similarity index 100% rename from project_euler/p175_FractionsInvolvingTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py rename to puzzles/project_euler/p175_FractionsInvolvingTheNumberOfDifferentWaysANumberCanBeExpressedAsASumOfPowersOf2..py diff --git a/project_euler/p176_RightAngledTrianglesThatShareACathetus..py b/puzzles/project_euler/p176_RightAngledTrianglesThatShareACathetus..py similarity index 100% rename from project_euler/p176_RightAngledTrianglesThatShareACathetus..py rename to puzzles/project_euler/p176_RightAngledTrianglesThatShareACathetus..py diff --git a/project_euler/p177_IntegerAngledQuadrilaterals..py b/puzzles/project_euler/p177_IntegerAngledQuadrilaterals..py similarity index 100% rename from project_euler/p177_IntegerAngledQuadrilaterals..py rename to puzzles/project_euler/p177_IntegerAngledQuadrilaterals..py diff --git a/project_euler/p178_StepNumbers.py b/puzzles/project_euler/p178_StepNumbers.py similarity index 100% rename from project_euler/p178_StepNumbers.py rename to puzzles/project_euler/p178_StepNumbers.py diff --git a/project_euler/p179_ConsecutivePositiveDivisors.py b/puzzles/project_euler/p179_ConsecutivePositiveDivisors.py similarity index 100% rename from project_euler/p179_ConsecutivePositiveDivisors.py rename to puzzles/project_euler/p179_ConsecutivePositiveDivisors.py diff --git a/project_euler/p180_RationalZerosOfAFunctionOfThreeVariables..py b/puzzles/project_euler/p180_RationalZerosOfAFunctionOfThreeVariables..py similarity index 100% rename from project_euler/p180_RationalZerosOfAFunctionOfThreeVariables..py rename to puzzles/project_euler/p180_RationalZerosOfAFunctionOfThreeVariables..py diff --git a/project_euler/p181_InvestigatingInHowManyWaysObjectsOfTwoDifferentColoursCanBeGrouped..py b/puzzles/project_euler/p181_InvestigatingInHowManyWaysObjectsOfTwoDifferentColoursCanBeGrouped..py similarity index 100% rename from project_euler/p181_InvestigatingInHowManyWaysObjectsOfTwoDifferentColoursCanBeGrouped..py rename to puzzles/project_euler/p181_InvestigatingInHowManyWaysObjectsOfTwoDifferentColoursCanBeGrouped..py diff --git a/project_euler/p182_RSAEncryption.py b/puzzles/project_euler/p182_RSAEncryption.py similarity index 100% rename from project_euler/p182_RSAEncryption.py rename to puzzles/project_euler/p182_RSAEncryption.py diff --git a/project_euler/p183_MaximumProductOfParts.py b/puzzles/project_euler/p183_MaximumProductOfParts.py similarity index 100% rename from project_euler/p183_MaximumProductOfParts.py rename to puzzles/project_euler/p183_MaximumProductOfParts.py diff --git a/project_euler/p184_TrianglesContainingTheOrigin..py b/puzzles/project_euler/p184_TrianglesContainingTheOrigin..py similarity index 100% rename from project_euler/p184_TrianglesContainingTheOrigin..py rename to puzzles/project_euler/p184_TrianglesContainingTheOrigin..py diff --git a/project_euler/p185_NumberMind.py b/puzzles/project_euler/p185_NumberMind.py similarity index 100% rename from project_euler/p185_NumberMind.py rename to puzzles/project_euler/p185_NumberMind.py diff --git a/project_euler/p186_ConnectednessOfANetwork..py b/puzzles/project_euler/p186_ConnectednessOfANetwork..py similarity index 100% rename from project_euler/p186_ConnectednessOfANetwork..py rename to puzzles/project_euler/p186_ConnectednessOfANetwork..py diff --git a/project_euler/p187_Semiprimes.py b/puzzles/project_euler/p187_Semiprimes.py similarity index 100% rename from project_euler/p187_Semiprimes.py rename to puzzles/project_euler/p187_Semiprimes.py diff --git a/project_euler/p188_TheHyperexponentiationOfANumber.py b/puzzles/project_euler/p188_TheHyperexponentiationOfANumber.py similarity index 100% rename from project_euler/p188_TheHyperexponentiationOfANumber.py rename to puzzles/project_euler/p188_TheHyperexponentiationOfANumber.py diff --git a/project_euler/p189_TriColouringATriangularGrid.py b/puzzles/project_euler/p189_TriColouringATriangularGrid.py similarity index 100% rename from project_euler/p189_TriColouringATriangularGrid.py rename to puzzles/project_euler/p189_TriColouringATriangularGrid.py diff --git a/project_euler/p190_MaximisingAWeightedProduct.py b/puzzles/project_euler/p190_MaximisingAWeightedProduct.py similarity index 100% rename from project_euler/p190_MaximisingAWeightedProduct.py rename to puzzles/project_euler/p190_MaximisingAWeightedProduct.py diff --git a/project_euler/p191_PrizeStrings.py b/puzzles/project_euler/p191_PrizeStrings.py similarity index 100% rename from project_euler/p191_PrizeStrings.py rename to puzzles/project_euler/p191_PrizeStrings.py diff --git a/project_euler/p192_BestApproximations.py b/puzzles/project_euler/p192_BestApproximations.py similarity index 100% rename from project_euler/p192_BestApproximations.py rename to puzzles/project_euler/p192_BestApproximations.py diff --git a/project_euler/p193_SquarefreeNumbers.py b/puzzles/project_euler/p193_SquarefreeNumbers.py similarity index 100% rename from project_euler/p193_SquarefreeNumbers.py rename to puzzles/project_euler/p193_SquarefreeNumbers.py diff --git a/project_euler/p194_ColouredConfigurations.py b/puzzles/project_euler/p194_ColouredConfigurations.py similarity index 100% rename from project_euler/p194_ColouredConfigurations.py rename to puzzles/project_euler/p194_ColouredConfigurations.py diff --git a/project_euler/p195_InscribedCirclesOfTrianglesWithOneAngleOf60Degrees.py b/puzzles/project_euler/p195_InscribedCirclesOfTrianglesWithOneAngleOf60Degrees.py similarity index 100% rename from project_euler/p195_InscribedCirclesOfTrianglesWithOneAngleOf60Degrees.py rename to puzzles/project_euler/p195_InscribedCirclesOfTrianglesWithOneAngleOf60Degrees.py diff --git a/project_euler/p196_PrimeTriplets.py b/puzzles/project_euler/p196_PrimeTriplets.py similarity index 100% rename from project_euler/p196_PrimeTriplets.py rename to puzzles/project_euler/p196_PrimeTriplets.py diff --git a/project_euler/p197_InvestigatingTheBehaviourOfARecursivelyDefinedSequence.py b/puzzles/project_euler/p197_InvestigatingTheBehaviourOfARecursivelyDefinedSequence.py similarity index 100% rename from project_euler/p197_InvestigatingTheBehaviourOfARecursivelyDefinedSequence.py rename to puzzles/project_euler/p197_InvestigatingTheBehaviourOfARecursivelyDefinedSequence.py diff --git a/project_euler/p198_AmbiguousNumbers.py b/puzzles/project_euler/p198_AmbiguousNumbers.py similarity index 100% rename from project_euler/p198_AmbiguousNumbers.py rename to puzzles/project_euler/p198_AmbiguousNumbers.py diff --git a/project_euler/p199_IterativeCirclePacking.py b/puzzles/project_euler/p199_IterativeCirclePacking.py similarity index 100% rename from project_euler/p199_IterativeCirclePacking.py rename to puzzles/project_euler/p199_IterativeCirclePacking.py diff --git a/project_euler/p200_FindThe200thPrimeProofSqubeContainingTheContiguousSubString_200_.py b/puzzles/project_euler/p200_FindThe200thPrimeProofSqubeContainingTheContiguousSubString_200_.py similarity index 100% rename from project_euler/p200_FindThe200thPrimeProofSqubeContainingTheContiguousSubString_200_.py rename to puzzles/project_euler/p200_FindThe200thPrimeProofSqubeContainingTheContiguousSubString_200_.py diff --git a/project_euler/p201_SubsetsWithAUniqueSum.py b/puzzles/project_euler/p201_SubsetsWithAUniqueSum.py similarity index 100% rename from project_euler/p201_SubsetsWithAUniqueSum.py rename to puzzles/project_euler/p201_SubsetsWithAUniqueSum.py diff --git a/project_euler/p202_Laserbeam.py b/puzzles/project_euler/p202_Laserbeam.py similarity index 100% rename from project_euler/p202_Laserbeam.py rename to puzzles/project_euler/p202_Laserbeam.py diff --git a/project_euler/p203_SquarefreeBinomialCoefficients.py b/puzzles/project_euler/p203_SquarefreeBinomialCoefficients.py similarity index 100% rename from project_euler/p203_SquarefreeBinomialCoefficients.py rename to puzzles/project_euler/p203_SquarefreeBinomialCoefficients.py diff --git a/project_euler/p204_GeneralisedHammingNumbers.py b/puzzles/project_euler/p204_GeneralisedHammingNumbers.py similarity index 100% rename from project_euler/p204_GeneralisedHammingNumbers.py rename to puzzles/project_euler/p204_GeneralisedHammingNumbers.py diff --git a/project_euler/p205_DiceGame.py b/puzzles/project_euler/p205_DiceGame.py similarity index 100% rename from project_euler/p205_DiceGame.py rename to puzzles/project_euler/p205_DiceGame.py diff --git a/project_euler/p206_ConcealedSquare.py b/puzzles/project_euler/p206_ConcealedSquare.py similarity index 100% rename from project_euler/p206_ConcealedSquare.py rename to puzzles/project_euler/p206_ConcealedSquare.py diff --git a/project_euler/p207_IntegerPartitionEquations.py b/puzzles/project_euler/p207_IntegerPartitionEquations.py similarity index 100% rename from project_euler/p207_IntegerPartitionEquations.py rename to puzzles/project_euler/p207_IntegerPartitionEquations.py diff --git a/project_euler/p208_RobotWalks.py b/puzzles/project_euler/p208_RobotWalks.py similarity index 100% rename from project_euler/p208_RobotWalks.py rename to puzzles/project_euler/p208_RobotWalks.py diff --git a/project_euler/p209_CircularLogic.py b/puzzles/project_euler/p209_CircularLogic.py similarity index 100% rename from project_euler/p209_CircularLogic.py rename to puzzles/project_euler/p209_CircularLogic.py diff --git a/project_euler/p210_ObtuseAngledTriangles.py b/puzzles/project_euler/p210_ObtuseAngledTriangles.py similarity index 100% rename from project_euler/p210_ObtuseAngledTriangles.py rename to puzzles/project_euler/p210_ObtuseAngledTriangles.py diff --git a/project_euler/p211_DivisorSquareSum.py b/puzzles/project_euler/p211_DivisorSquareSum.py similarity index 100% rename from project_euler/p211_DivisorSquareSum.py rename to puzzles/project_euler/p211_DivisorSquareSum.py diff --git a/project_euler/p212_CombinedVolumeOfCuboids.py b/puzzles/project_euler/p212_CombinedVolumeOfCuboids.py similarity index 100% rename from project_euler/p212_CombinedVolumeOfCuboids.py rename to puzzles/project_euler/p212_CombinedVolumeOfCuboids.py diff --git a/project_euler/p213_FleaCircus.py b/puzzles/project_euler/p213_FleaCircus.py similarity index 100% rename from project_euler/p213_FleaCircus.py rename to puzzles/project_euler/p213_FleaCircus.py diff --git a/project_euler/p214_TotientChains.py b/puzzles/project_euler/p214_TotientChains.py similarity index 100% rename from project_euler/p214_TotientChains.py rename to puzzles/project_euler/p214_TotientChains.py diff --git a/project_euler/p215_CrackFreeWalls.py b/puzzles/project_euler/p215_CrackFreeWalls.py similarity index 100% rename from project_euler/p215_CrackFreeWalls.py rename to puzzles/project_euler/p215_CrackFreeWalls.py diff --git a/project_euler/p216_InvestigatingThePrimalityOfNumbersOfTheForm2n21.py b/puzzles/project_euler/p216_InvestigatingThePrimalityOfNumbersOfTheForm2n21.py similarity index 100% rename from project_euler/p216_InvestigatingThePrimalityOfNumbersOfTheForm2n21.py rename to puzzles/project_euler/p216_InvestigatingThePrimalityOfNumbersOfTheForm2n21.py diff --git a/project_euler/p217_BalancedNumbers.py b/puzzles/project_euler/p217_BalancedNumbers.py similarity index 100% rename from project_euler/p217_BalancedNumbers.py rename to puzzles/project_euler/p217_BalancedNumbers.py diff --git a/project_euler/p218_PerfectRightAngledTriangles.py b/puzzles/project_euler/p218_PerfectRightAngledTriangles.py similarity index 100% rename from project_euler/p218_PerfectRightAngledTriangles.py rename to puzzles/project_euler/p218_PerfectRightAngledTriangles.py diff --git a/project_euler/p219_SkewCostCoding.py b/puzzles/project_euler/p219_SkewCostCoding.py similarity index 100% rename from project_euler/p219_SkewCostCoding.py rename to puzzles/project_euler/p219_SkewCostCoding.py diff --git a/project_euler/p220_HeighwayDragon.py b/puzzles/project_euler/p220_HeighwayDragon.py similarity index 100% rename from project_euler/p220_HeighwayDragon.py rename to puzzles/project_euler/p220_HeighwayDragon.py diff --git a/project_euler/p221_AlexandrianIntegers.py b/puzzles/project_euler/p221_AlexandrianIntegers.py similarity index 100% rename from project_euler/p221_AlexandrianIntegers.py rename to puzzles/project_euler/p221_AlexandrianIntegers.py diff --git a/project_euler/p222_SpherePacking.py b/puzzles/project_euler/p222_SpherePacking.py similarity index 100% rename from project_euler/p222_SpherePacking.py rename to puzzles/project_euler/p222_SpherePacking.py diff --git a/project_euler/p223_AlmostRightAngledTrianglesI.py b/puzzles/project_euler/p223_AlmostRightAngledTrianglesI.py similarity index 100% rename from project_euler/p223_AlmostRightAngledTrianglesI.py rename to puzzles/project_euler/p223_AlmostRightAngledTrianglesI.py diff --git a/project_euler/p224_AlmostRightAngledTrianglesII.py b/puzzles/project_euler/p224_AlmostRightAngledTrianglesII.py similarity index 100% rename from project_euler/p224_AlmostRightAngledTrianglesII.py rename to puzzles/project_euler/p224_AlmostRightAngledTrianglesII.py diff --git a/project_euler/p225_TribonacciNonDivisors.py b/puzzles/project_euler/p225_TribonacciNonDivisors.py similarity index 100% rename from project_euler/p225_TribonacciNonDivisors.py rename to puzzles/project_euler/p225_TribonacciNonDivisors.py diff --git a/project_euler/p226_AScoopOfBlancmange.py b/puzzles/project_euler/p226_AScoopOfBlancmange.py similarity index 100% rename from project_euler/p226_AScoopOfBlancmange.py rename to puzzles/project_euler/p226_AScoopOfBlancmange.py diff --git a/project_euler/p227_TheChase.py b/puzzles/project_euler/p227_TheChase.py similarity index 100% rename from project_euler/p227_TheChase.py rename to puzzles/project_euler/p227_TheChase.py diff --git a/project_euler/p228_MinkowskiSums.py b/puzzles/project_euler/p228_MinkowskiSums.py similarity index 100% rename from project_euler/p228_MinkowskiSums.py rename to puzzles/project_euler/p228_MinkowskiSums.py diff --git a/project_euler/p229_FourRepresentationsUsingSquares.py b/puzzles/project_euler/p229_FourRepresentationsUsingSquares.py similarity index 100% rename from project_euler/p229_FourRepresentationsUsingSquares.py rename to puzzles/project_euler/p229_FourRepresentationsUsingSquares.py diff --git a/project_euler/p230_FibonacciWords.py b/puzzles/project_euler/p230_FibonacciWords.py similarity index 100% rename from project_euler/p230_FibonacciWords.py rename to puzzles/project_euler/p230_FibonacciWords.py diff --git a/project_euler/p231_ThePrimeFactorisationOfBinomialCoefficients.py b/puzzles/project_euler/p231_ThePrimeFactorisationOfBinomialCoefficients.py similarity index 100% rename from project_euler/p231_ThePrimeFactorisationOfBinomialCoefficients.py rename to puzzles/project_euler/p231_ThePrimeFactorisationOfBinomialCoefficients.py diff --git a/project_euler/p232_TheRace.py b/puzzles/project_euler/p232_TheRace.py similarity index 100% rename from project_euler/p232_TheRace.py rename to puzzles/project_euler/p232_TheRace.py diff --git a/project_euler/p233_LatticePointsOnACircle.py b/puzzles/project_euler/p233_LatticePointsOnACircle.py similarity index 100% rename from project_euler/p233_LatticePointsOnACircle.py rename to puzzles/project_euler/p233_LatticePointsOnACircle.py diff --git a/project_euler/p234_SemidivisibleNumbers.py b/puzzles/project_euler/p234_SemidivisibleNumbers.py similarity index 100% rename from project_euler/p234_SemidivisibleNumbers.py rename to puzzles/project_euler/p234_SemidivisibleNumbers.py diff --git a/project_euler/p235_AnArithmeticGeometricSequence.py b/puzzles/project_euler/p235_AnArithmeticGeometricSequence.py similarity index 100% rename from project_euler/p235_AnArithmeticGeometricSequence.py rename to puzzles/project_euler/p235_AnArithmeticGeometricSequence.py diff --git a/project_euler/p236_LuxuryHampers.py b/puzzles/project_euler/p236_LuxuryHampers.py similarity index 100% rename from project_euler/p236_LuxuryHampers.py rename to puzzles/project_euler/p236_LuxuryHampers.py diff --git a/project_euler/p237_ToursOnA4XNPlayingBoard.py b/puzzles/project_euler/p237_ToursOnA4XNPlayingBoard.py similarity index 100% rename from project_euler/p237_ToursOnA4XNPlayingBoard.py rename to puzzles/project_euler/p237_ToursOnA4XNPlayingBoard.py diff --git a/project_euler/p238_InfiniteStringTour.py b/puzzles/project_euler/p238_InfiniteStringTour.py similarity index 100% rename from project_euler/p238_InfiniteStringTour.py rename to puzzles/project_euler/p238_InfiniteStringTour.py diff --git a/project_euler/p239_TwentyTwoFoolishPrimes.py b/puzzles/project_euler/p239_TwentyTwoFoolishPrimes.py similarity index 100% rename from project_euler/p239_TwentyTwoFoolishPrimes.py rename to puzzles/project_euler/p239_TwentyTwoFoolishPrimes.py diff --git a/project_euler/p240_TopDice.py b/puzzles/project_euler/p240_TopDice.py similarity index 100% rename from project_euler/p240_TopDice.py rename to puzzles/project_euler/p240_TopDice.py diff --git a/project_euler/p241_PerfectionQuotients.py b/puzzles/project_euler/p241_PerfectionQuotients.py similarity index 100% rename from project_euler/p241_PerfectionQuotients.py rename to puzzles/project_euler/p241_PerfectionQuotients.py diff --git a/project_euler/p242_OddTriplets.py b/puzzles/project_euler/p242_OddTriplets.py similarity index 100% rename from project_euler/p242_OddTriplets.py rename to puzzles/project_euler/p242_OddTriplets.py diff --git a/project_euler/p243_Resilience.py b/puzzles/project_euler/p243_Resilience.py similarity index 100% rename from project_euler/p243_Resilience.py rename to puzzles/project_euler/p243_Resilience.py diff --git a/project_euler/p244_Sliders.py b/puzzles/project_euler/p244_Sliders.py similarity index 100% rename from project_euler/p244_Sliders.py rename to puzzles/project_euler/p244_Sliders.py diff --git a/project_euler/p245_Coresilience.py b/puzzles/project_euler/p245_Coresilience.py similarity index 100% rename from project_euler/p245_Coresilience.py rename to puzzles/project_euler/p245_Coresilience.py diff --git a/project_euler/p246_TangentsToAnEllipse.py b/puzzles/project_euler/p246_TangentsToAnEllipse.py similarity index 100% rename from project_euler/p246_TangentsToAnEllipse.py rename to puzzles/project_euler/p246_TangentsToAnEllipse.py diff --git a/project_euler/p247_SquaresUnderAHyperbola.py b/puzzles/project_euler/p247_SquaresUnderAHyperbola.py similarity index 100% rename from project_euler/p247_SquaresUnderAHyperbola.py rename to puzzles/project_euler/p247_SquaresUnderAHyperbola.py diff --git a/project_euler/p248_NumbersForWhichEulerTotientFunctionEqualsFac13.py b/puzzles/project_euler/p248_NumbersForWhichEulerTotientFunctionEqualsFac13.py similarity index 100% rename from project_euler/p248_NumbersForWhichEulerTotientFunctionEqualsFac13.py rename to puzzles/project_euler/p248_NumbersForWhichEulerTotientFunctionEqualsFac13.py diff --git a/project_euler/p249_PrimeSubsetSums.py b/puzzles/project_euler/p249_PrimeSubsetSums.py similarity index 100% rename from project_euler/p249_PrimeSubsetSums.py rename to puzzles/project_euler/p249_PrimeSubsetSums.py diff --git a/project_euler/p250_250250.py b/puzzles/project_euler/p250_250250.py similarity index 100% rename from project_euler/p250_250250.py rename to puzzles/project_euler/p250_250250.py diff --git a/project_euler/p251_CardanoTriplets.py b/puzzles/project_euler/p251_CardanoTriplets.py similarity index 100% rename from project_euler/p251_CardanoTriplets.py rename to puzzles/project_euler/p251_CardanoTriplets.py diff --git a/project_euler/p252_ConvexHoles.py b/puzzles/project_euler/p252_ConvexHoles.py similarity index 100% rename from project_euler/p252_ConvexHoles.py rename to puzzles/project_euler/p252_ConvexHoles.py diff --git a/project_euler/p253_TidyingUp.py b/puzzles/project_euler/p253_TidyingUp.py similarity index 100% rename from project_euler/p253_TidyingUp.py rename to puzzles/project_euler/p253_TidyingUp.py diff --git a/project_euler/p254_SumsOfDigitFactorials.py b/puzzles/project_euler/p254_SumsOfDigitFactorials.py similarity index 100% rename from project_euler/p254_SumsOfDigitFactorials.py rename to puzzles/project_euler/p254_SumsOfDigitFactorials.py diff --git a/project_euler/p255_RoundedSquareRoots.py b/puzzles/project_euler/p255_RoundedSquareRoots.py similarity index 100% rename from project_euler/p255_RoundedSquareRoots.py rename to puzzles/project_euler/p255_RoundedSquareRoots.py diff --git a/project_euler/p256_TatamiFreeRooms.py b/puzzles/project_euler/p256_TatamiFreeRooms.py similarity index 100% rename from project_euler/p256_TatamiFreeRooms.py rename to puzzles/project_euler/p256_TatamiFreeRooms.py diff --git a/project_euler/p257_AngularBisectors.py b/puzzles/project_euler/p257_AngularBisectors.py similarity index 100% rename from project_euler/p257_AngularBisectors.py rename to puzzles/project_euler/p257_AngularBisectors.py diff --git a/project_euler/p258_ALaggedFibonacciSequence.py b/puzzles/project_euler/p258_ALaggedFibonacciSequence.py similarity index 100% rename from project_euler/p258_ALaggedFibonacciSequence.py rename to puzzles/project_euler/p258_ALaggedFibonacciSequence.py diff --git a/project_euler/p259_ReachableNumbers.py b/puzzles/project_euler/p259_ReachableNumbers.py similarity index 100% rename from project_euler/p259_ReachableNumbers.py rename to puzzles/project_euler/p259_ReachableNumbers.py diff --git a/project_euler/p260_StoneGame.py b/puzzles/project_euler/p260_StoneGame.py similarity index 100% rename from project_euler/p260_StoneGame.py rename to puzzles/project_euler/p260_StoneGame.py diff --git a/project_euler/p261_PivotalSquareSums.py b/puzzles/project_euler/p261_PivotalSquareSums.py similarity index 100% rename from project_euler/p261_PivotalSquareSums.py rename to puzzles/project_euler/p261_PivotalSquareSums.py diff --git a/project_euler/p262_MountainRange..py b/puzzles/project_euler/p262_MountainRange..py similarity index 100% rename from project_euler/p262_MountainRange..py rename to puzzles/project_euler/p262_MountainRange..py diff --git a/project_euler/p263_AnEngineers'DreamComeTrue.py b/puzzles/project_euler/p263_AnEngineers'DreamComeTrue.py similarity index 100% rename from project_euler/p263_AnEngineers'DreamComeTrue.py rename to puzzles/project_euler/p263_AnEngineers'DreamComeTrue.py diff --git a/project_euler/p264_TriangleCentres.py b/puzzles/project_euler/p264_TriangleCentres.py similarity index 100% rename from project_euler/p264_TriangleCentres.py rename to puzzles/project_euler/p264_TriangleCentres.py diff --git a/project_euler/p265_BinaryCircles.py b/puzzles/project_euler/p265_BinaryCircles.py similarity index 100% rename from project_euler/p265_BinaryCircles.py rename to puzzles/project_euler/p265_BinaryCircles.py diff --git a/project_euler/p266_PseudoSquareRoot.py b/puzzles/project_euler/p266_PseudoSquareRoot.py similarity index 100% rename from project_euler/p266_PseudoSquareRoot.py rename to puzzles/project_euler/p266_PseudoSquareRoot.py diff --git a/project_euler/p267_Billionaire.py b/puzzles/project_euler/p267_Billionaire.py similarity index 100% rename from project_euler/p267_Billionaire.py rename to puzzles/project_euler/p267_Billionaire.py diff --git a/project_euler/p268_CountingNumbersWithAtLeastFourDistinctPrimeFactorsLessThan100.py b/puzzles/project_euler/p268_CountingNumbersWithAtLeastFourDistinctPrimeFactorsLessThan100.py similarity index 100% rename from project_euler/p268_CountingNumbersWithAtLeastFourDistinctPrimeFactorsLessThan100.py rename to puzzles/project_euler/p268_CountingNumbersWithAtLeastFourDistinctPrimeFactorsLessThan100.py diff --git a/project_euler/p269_PolynomialsWithAtLeastOneIntegerRoot.py b/puzzles/project_euler/p269_PolynomialsWithAtLeastOneIntegerRoot.py similarity index 100% rename from project_euler/p269_PolynomialsWithAtLeastOneIntegerRoot.py rename to puzzles/project_euler/p269_PolynomialsWithAtLeastOneIntegerRoot.py diff --git a/project_euler/p270_CuttingSquares.py b/puzzles/project_euler/p270_CuttingSquares.py similarity index 100% rename from project_euler/p270_CuttingSquares.py rename to puzzles/project_euler/p270_CuttingSquares.py diff --git a/project_euler/p271_ModularCubes,Part1.py b/puzzles/project_euler/p271_ModularCubes,Part1.py similarity index 100% rename from project_euler/p271_ModularCubes,Part1.py rename to puzzles/project_euler/p271_ModularCubes,Part1.py diff --git a/project_euler/p272_ModularCubes,Part2.py b/puzzles/project_euler/p272_ModularCubes,Part2.py similarity index 100% rename from project_euler/p272_ModularCubes,Part2.py rename to puzzles/project_euler/p272_ModularCubes,Part2.py diff --git a/project_euler/p273_SumOfSquares.py b/puzzles/project_euler/p273_SumOfSquares.py similarity index 100% rename from project_euler/p273_SumOfSquares.py rename to puzzles/project_euler/p273_SumOfSquares.py diff --git a/project_euler/p274_DivisibilityMultipliers.py b/puzzles/project_euler/p274_DivisibilityMultipliers.py similarity index 100% rename from project_euler/p274_DivisibilityMultipliers.py rename to puzzles/project_euler/p274_DivisibilityMultipliers.py diff --git a/project_euler/p275_BalancedSculptures.py b/puzzles/project_euler/p275_BalancedSculptures.py similarity index 100% rename from project_euler/p275_BalancedSculptures.py rename to puzzles/project_euler/p275_BalancedSculptures.py diff --git a/project_euler/p276_PrimitiveTriangles.py b/puzzles/project_euler/p276_PrimitiveTriangles.py similarity index 100% rename from project_euler/p276_PrimitiveTriangles.py rename to puzzles/project_euler/p276_PrimitiveTriangles.py diff --git a/project_euler/p277_AModifiedCollatzSequence.py b/puzzles/project_euler/p277_AModifiedCollatzSequence.py similarity index 100% rename from project_euler/p277_AModifiedCollatzSequence.py rename to puzzles/project_euler/p277_AModifiedCollatzSequence.py diff --git a/project_euler/p278_LinearCombinationsOfSemiprimes.py b/puzzles/project_euler/p278_LinearCombinationsOfSemiprimes.py similarity index 100% rename from project_euler/p278_LinearCombinationsOfSemiprimes.py rename to puzzles/project_euler/p278_LinearCombinationsOfSemiprimes.py diff --git a/project_euler/p279_TrianglesWithIntegralSidesAndAnIntegralAngle.py b/puzzles/project_euler/p279_TrianglesWithIntegralSidesAndAnIntegralAngle.py similarity index 100% rename from project_euler/p279_TrianglesWithIntegralSidesAndAnIntegralAngle.py rename to puzzles/project_euler/p279_TrianglesWithIntegralSidesAndAnIntegralAngle.py diff --git a/project_euler/p280_AntAndSeeds.py b/puzzles/project_euler/p280_AntAndSeeds.py similarity index 100% rename from project_euler/p280_AntAndSeeds.py rename to puzzles/project_euler/p280_AntAndSeeds.py diff --git a/project_euler/p281_PizzaToppings.py b/puzzles/project_euler/p281_PizzaToppings.py similarity index 100% rename from project_euler/p281_PizzaToppings.py rename to puzzles/project_euler/p281_PizzaToppings.py diff --git a/project_euler/p282_TheAckermannFunction.py b/puzzles/project_euler/p282_TheAckermannFunction.py similarity index 100% rename from project_euler/p282_TheAckermannFunction.py rename to puzzles/project_euler/p282_TheAckermannFunction.py diff --git a/project_euler/p283_IntegerSidedTrianglesForWhichTheAreaperimeterRatioIsIntegral.py b/puzzles/project_euler/p283_IntegerSidedTrianglesForWhichTheAreaperimeterRatioIsIntegral.py similarity index 100% rename from project_euler/p283_IntegerSidedTrianglesForWhichTheAreaperimeterRatioIsIntegral.py rename to puzzles/project_euler/p283_IntegerSidedTrianglesForWhichTheAreaperimeterRatioIsIntegral.py diff --git a/project_euler/p284_SteadySquares.py b/puzzles/project_euler/p284_SteadySquares.py similarity index 100% rename from project_euler/p284_SteadySquares.py rename to puzzles/project_euler/p284_SteadySquares.py diff --git a/project_euler/p285_PythagoreanOdds.py b/puzzles/project_euler/p285_PythagoreanOdds.py similarity index 100% rename from project_euler/p285_PythagoreanOdds.py rename to puzzles/project_euler/p285_PythagoreanOdds.py diff --git a/project_euler/p286_ScoringProbabilities.py b/puzzles/project_euler/p286_ScoringProbabilities.py similarity index 100% rename from project_euler/p286_ScoringProbabilities.py rename to puzzles/project_euler/p286_ScoringProbabilities.py diff --git a/project_euler/p287_QuadtreeEncoding(ASimpleCompressionAlgorithm).py b/puzzles/project_euler/p287_QuadtreeEncoding(ASimpleCompressionAlgorithm).py similarity index 100% rename from project_euler/p287_QuadtreeEncoding(ASimpleCompressionAlgorithm).py rename to puzzles/project_euler/p287_QuadtreeEncoding(ASimpleCompressionAlgorithm).py diff --git a/project_euler/p288_AnEnormousFactorial.py b/puzzles/project_euler/p288_AnEnormousFactorial.py similarity index 100% rename from project_euler/p288_AnEnormousFactorial.py rename to puzzles/project_euler/p288_AnEnormousFactorial.py diff --git a/project_euler/p289_EulerianCycles.py b/puzzles/project_euler/p289_EulerianCycles.py similarity index 100% rename from project_euler/p289_EulerianCycles.py rename to puzzles/project_euler/p289_EulerianCycles.py diff --git a/project_euler/p290_DigitalSignature.py b/puzzles/project_euler/p290_DigitalSignature.py similarity index 100% rename from project_euler/p290_DigitalSignature.py rename to puzzles/project_euler/p290_DigitalSignature.py diff --git a/project_euler/p291_PanaitopolPrimes.py b/puzzles/project_euler/p291_PanaitopolPrimes.py similarity index 100% rename from project_euler/p291_PanaitopolPrimes.py rename to puzzles/project_euler/p291_PanaitopolPrimes.py diff --git a/project_euler/p292_PythagoreanPolygons.py b/puzzles/project_euler/p292_PythagoreanPolygons.py similarity index 100% rename from project_euler/p292_PythagoreanPolygons.py rename to puzzles/project_euler/p292_PythagoreanPolygons.py diff --git a/project_euler/p293_PseudoFortunateNumbers.py b/puzzles/project_euler/p293_PseudoFortunateNumbers.py similarity index 100% rename from project_euler/p293_PseudoFortunateNumbers.py rename to puzzles/project_euler/p293_PseudoFortunateNumbers.py diff --git a/project_euler/p294_SumOfDigitsExperience#23.py b/puzzles/project_euler/p294_SumOfDigitsExperience#23.py similarity index 100% rename from project_euler/p294_SumOfDigitsExperience#23.py rename to puzzles/project_euler/p294_SumOfDigitsExperience#23.py diff --git a/project_euler/p295_LenticularHoles.py b/puzzles/project_euler/p295_LenticularHoles.py similarity index 100% rename from project_euler/p295_LenticularHoles.py rename to puzzles/project_euler/p295_LenticularHoles.py diff --git a/project_euler/p296_AngularBisectorAndTangent.py b/puzzles/project_euler/p296_AngularBisectorAndTangent.py similarity index 100% rename from project_euler/p296_AngularBisectorAndTangent.py rename to puzzles/project_euler/p296_AngularBisectorAndTangent.py diff --git a/project_euler/p297_ZeckendorfRepresentation.py b/puzzles/project_euler/p297_ZeckendorfRepresentation.py similarity index 100% rename from project_euler/p297_ZeckendorfRepresentation.py rename to puzzles/project_euler/p297_ZeckendorfRepresentation.py diff --git a/project_euler/p298_SelectiveAmnesia.py b/puzzles/project_euler/p298_SelectiveAmnesia.py similarity index 100% rename from project_euler/p298_SelectiveAmnesia.py rename to puzzles/project_euler/p298_SelectiveAmnesia.py diff --git a/project_euler/p299_ThreeSimilarTriangles.py b/puzzles/project_euler/p299_ThreeSimilarTriangles.py similarity index 100% rename from project_euler/p299_ThreeSimilarTriangles.py rename to puzzles/project_euler/p299_ThreeSimilarTriangles.py diff --git a/project_euler/p300_ProteinFolding.py b/puzzles/project_euler/p300_ProteinFolding.py similarity index 100% rename from project_euler/p300_ProteinFolding.py rename to puzzles/project_euler/p300_ProteinFolding.py diff --git a/project_euler/p301_Nim.py b/puzzles/project_euler/p301_Nim.py similarity index 100% rename from project_euler/p301_Nim.py rename to puzzles/project_euler/p301_Nim.py diff --git a/project_euler/p302_StrongAchillesNumbers.py b/puzzles/project_euler/p302_StrongAchillesNumbers.py similarity index 100% rename from project_euler/p302_StrongAchillesNumbers.py rename to puzzles/project_euler/p302_StrongAchillesNumbers.py diff --git a/project_euler/p303_MultiplesWithSmallDigits.py b/puzzles/project_euler/p303_MultiplesWithSmallDigits.py similarity index 100% rename from project_euler/p303_MultiplesWithSmallDigits.py rename to puzzles/project_euler/p303_MultiplesWithSmallDigits.py diff --git a/project_euler/p304_Primonacci.py b/puzzles/project_euler/p304_Primonacci.py similarity index 100% rename from project_euler/p304_Primonacci.py rename to puzzles/project_euler/p304_Primonacci.py diff --git a/project_euler/p305_ReflexivePosition.py b/puzzles/project_euler/p305_ReflexivePosition.py similarity index 100% rename from project_euler/p305_ReflexivePosition.py rename to puzzles/project_euler/p305_ReflexivePosition.py diff --git a/project_euler/p306_PaperStripGame.py b/puzzles/project_euler/p306_PaperStripGame.py similarity index 100% rename from project_euler/p306_PaperStripGame.py rename to puzzles/project_euler/p306_PaperStripGame.py diff --git a/project_euler/p307_ChipDefects.py b/puzzles/project_euler/p307_ChipDefects.py similarity index 100% rename from project_euler/p307_ChipDefects.py rename to puzzles/project_euler/p307_ChipDefects.py diff --git a/project_euler/p308_AnAmazingPrimeGeneratingAutomaton.py b/puzzles/project_euler/p308_AnAmazingPrimeGeneratingAutomaton.py similarity index 100% rename from project_euler/p308_AnAmazingPrimeGeneratingAutomaton.py rename to puzzles/project_euler/p308_AnAmazingPrimeGeneratingAutomaton.py diff --git a/project_euler/p309_IntegerLadders.py b/puzzles/project_euler/p309_IntegerLadders.py similarity index 100% rename from project_euler/p309_IntegerLadders.py rename to puzzles/project_euler/p309_IntegerLadders.py diff --git a/project_euler/p310_NimSquare.py b/puzzles/project_euler/p310_NimSquare.py similarity index 100% rename from project_euler/p310_NimSquare.py rename to puzzles/project_euler/p310_NimSquare.py diff --git a/project_euler/p311_BiclinicIntegralQuadrilaterals.py b/puzzles/project_euler/p311_BiclinicIntegralQuadrilaterals.py similarity index 100% rename from project_euler/p311_BiclinicIntegralQuadrilaterals.py rename to puzzles/project_euler/p311_BiclinicIntegralQuadrilaterals.py diff --git a/project_euler/p312_CyclicPathsOnSierpinskiGraphs.py b/puzzles/project_euler/p312_CyclicPathsOnSierpinskiGraphs.py similarity index 100% rename from project_euler/p312_CyclicPathsOnSierpinskiGraphs.py rename to puzzles/project_euler/p312_CyclicPathsOnSierpinskiGraphs.py diff --git a/project_euler/p313_SlidingGame.py b/puzzles/project_euler/p313_SlidingGame.py similarity index 100% rename from project_euler/p313_SlidingGame.py rename to puzzles/project_euler/p313_SlidingGame.py diff --git a/project_euler/p314_TheMouseOnTheMoon.py b/puzzles/project_euler/p314_TheMouseOnTheMoon.py similarity index 100% rename from project_euler/p314_TheMouseOnTheMoon.py rename to puzzles/project_euler/p314_TheMouseOnTheMoon.py diff --git a/project_euler/p315_DigitalRootClocks.py b/puzzles/project_euler/p315_DigitalRootClocks.py similarity index 100% rename from project_euler/p315_DigitalRootClocks.py rename to puzzles/project_euler/p315_DigitalRootClocks.py diff --git a/project_euler/p316_NumbersInDecimalExpansions.py b/puzzles/project_euler/p316_NumbersInDecimalExpansions.py similarity index 100% rename from project_euler/p316_NumbersInDecimalExpansions.py rename to puzzles/project_euler/p316_NumbersInDecimalExpansions.py diff --git a/project_euler/p317_Firecracker.py b/puzzles/project_euler/p317_Firecracker.py similarity index 100% rename from project_euler/p317_Firecracker.py rename to puzzles/project_euler/p317_Firecracker.py diff --git a/project_euler/p318_2011Nines.py b/puzzles/project_euler/p318_2011Nines.py similarity index 100% rename from project_euler/p318_2011Nines.py rename to puzzles/project_euler/p318_2011Nines.py diff --git a/project_euler/p319_BoundedSequences.py b/puzzles/project_euler/p319_BoundedSequences.py similarity index 100% rename from project_euler/p319_BoundedSequences.py rename to puzzles/project_euler/p319_BoundedSequences.py diff --git a/project_euler/p320_FactorialsDivisibleByAHugeInteger.py b/puzzles/project_euler/p320_FactorialsDivisibleByAHugeInteger.py similarity index 100% rename from project_euler/p320_FactorialsDivisibleByAHugeInteger.py rename to puzzles/project_euler/p320_FactorialsDivisibleByAHugeInteger.py diff --git a/project_euler/p321_SwappingCounters.py b/puzzles/project_euler/p321_SwappingCounters.py similarity index 100% rename from project_euler/p321_SwappingCounters.py rename to puzzles/project_euler/p321_SwappingCounters.py diff --git a/project_euler/p322_BinomialCoefficientsDivisibleBy10.py b/puzzles/project_euler/p322_BinomialCoefficientsDivisibleBy10.py similarity index 100% rename from project_euler/p322_BinomialCoefficientsDivisibleBy10.py rename to puzzles/project_euler/p322_BinomialCoefficientsDivisibleBy10.py diff --git a/project_euler/p323_BitwiseOROperationsOnRandomIntegers.py b/puzzles/project_euler/p323_BitwiseOROperationsOnRandomIntegers.py similarity index 100% rename from project_euler/p323_BitwiseOROperationsOnRandomIntegers.py rename to puzzles/project_euler/p323_BitwiseOROperationsOnRandomIntegers.py diff --git a/project_euler/p324_BuildingATower.py b/puzzles/project_euler/p324_BuildingATower.py similarity index 100% rename from project_euler/p324_BuildingATower.py rename to puzzles/project_euler/p324_BuildingATower.py diff --git a/project_euler/p325_StoneGameII.py b/puzzles/project_euler/p325_StoneGameII.py similarity index 100% rename from project_euler/p325_StoneGameII.py rename to puzzles/project_euler/p325_StoneGameII.py diff --git a/project_euler/p326_ModuloSummations.py b/puzzles/project_euler/p326_ModuloSummations.py similarity index 100% rename from project_euler/p326_ModuloSummations.py rename to puzzles/project_euler/p326_ModuloSummations.py diff --git a/project_euler/p327_RoomsOfDoom.py b/puzzles/project_euler/p327_RoomsOfDoom.py similarity index 100% rename from project_euler/p327_RoomsOfDoom.py rename to puzzles/project_euler/p327_RoomsOfDoom.py diff --git a/project_euler/p328_LowestCostSearch.py b/puzzles/project_euler/p328_LowestCostSearch.py similarity index 100% rename from project_euler/p328_LowestCostSearch.py rename to puzzles/project_euler/p328_LowestCostSearch.py diff --git a/project_euler/p329_PrimeFrog.py b/puzzles/project_euler/p329_PrimeFrog.py similarity index 100% rename from project_euler/p329_PrimeFrog.py rename to puzzles/project_euler/p329_PrimeFrog.py diff --git a/project_euler/p330_EulerNumber.py b/puzzles/project_euler/p330_EulerNumber.py similarity index 100% rename from project_euler/p330_EulerNumber.py rename to puzzles/project_euler/p330_EulerNumber.py diff --git a/project_euler/p331_CrossFlips.py b/puzzles/project_euler/p331_CrossFlips.py similarity index 100% rename from project_euler/p331_CrossFlips.py rename to puzzles/project_euler/p331_CrossFlips.py diff --git a/project_euler/p332_SphericalTriangles.py b/puzzles/project_euler/p332_SphericalTriangles.py similarity index 100% rename from project_euler/p332_SphericalTriangles.py rename to puzzles/project_euler/p332_SphericalTriangles.py diff --git a/project_euler/p333_SpecialPartitions.py b/puzzles/project_euler/p333_SpecialPartitions.py similarity index 100% rename from project_euler/p333_SpecialPartitions.py rename to puzzles/project_euler/p333_SpecialPartitions.py diff --git a/project_euler/p334_SpillingTheBeans.py b/puzzles/project_euler/p334_SpillingTheBeans.py similarity index 100% rename from project_euler/p334_SpillingTheBeans.py rename to puzzles/project_euler/p334_SpillingTheBeans.py diff --git a/project_euler/p335_GatheringTheBeans.py b/puzzles/project_euler/p335_GatheringTheBeans.py similarity index 100% rename from project_euler/p335_GatheringTheBeans.py rename to puzzles/project_euler/p335_GatheringTheBeans.py diff --git a/project_euler/p336_MaximixArrangements.py b/puzzles/project_euler/p336_MaximixArrangements.py similarity index 100% rename from project_euler/p336_MaximixArrangements.py rename to puzzles/project_euler/p336_MaximixArrangements.py diff --git a/project_euler/p337_TotientStairstepSequences.py b/puzzles/project_euler/p337_TotientStairstepSequences.py similarity index 100% rename from project_euler/p337_TotientStairstepSequences.py rename to puzzles/project_euler/p337_TotientStairstepSequences.py diff --git a/project_euler/p338_CuttingRectangularGridPaper.py b/puzzles/project_euler/p338_CuttingRectangularGridPaper.py similarity index 100% rename from project_euler/p338_CuttingRectangularGridPaper.py rename to puzzles/project_euler/p338_CuttingRectangularGridPaper.py diff --git a/project_euler/p339_PeredurFabEfrawg.py b/puzzles/project_euler/p339_PeredurFabEfrawg.py similarity index 100% rename from project_euler/p339_PeredurFabEfrawg.py rename to puzzles/project_euler/p339_PeredurFabEfrawg.py diff --git a/project_euler/p340_CrazyFunction.py b/puzzles/project_euler/p340_CrazyFunction.py similarity index 100% rename from project_euler/p340_CrazyFunction.py rename to puzzles/project_euler/p340_CrazyFunction.py diff --git a/project_euler/p341_GolombSelfDescribingSequence.py b/puzzles/project_euler/p341_GolombSelfDescribingSequence.py similarity index 100% rename from project_euler/p341_GolombSelfDescribingSequence.py rename to puzzles/project_euler/p341_GolombSelfDescribingSequence.py diff --git a/project_euler/p342_TheTotientOfASquareIsACube.py b/puzzles/project_euler/p342_TheTotientOfASquareIsACube.py similarity index 100% rename from project_euler/p342_TheTotientOfASquareIsACube.py rename to puzzles/project_euler/p342_TheTotientOfASquareIsACube.py diff --git a/project_euler/p343_FractionalSequences.py b/puzzles/project_euler/p343_FractionalSequences.py similarity index 100% rename from project_euler/p343_FractionalSequences.py rename to puzzles/project_euler/p343_FractionalSequences.py diff --git a/project_euler/p344_SilverDollarGame.py b/puzzles/project_euler/p344_SilverDollarGame.py similarity index 100% rename from project_euler/p344_SilverDollarGame.py rename to puzzles/project_euler/p344_SilverDollarGame.py diff --git a/project_euler/p345_MatrixSum.py b/puzzles/project_euler/p345_MatrixSum.py similarity index 100% rename from project_euler/p345_MatrixSum.py rename to puzzles/project_euler/p345_MatrixSum.py diff --git a/project_euler/p346_StrongRepunits.py b/puzzles/project_euler/p346_StrongRepunits.py similarity index 100% rename from project_euler/p346_StrongRepunits.py rename to puzzles/project_euler/p346_StrongRepunits.py diff --git a/project_euler/p347_LargestIntegerDivisibleByTwoPrimes.py b/puzzles/project_euler/p347_LargestIntegerDivisibleByTwoPrimes.py similarity index 100% rename from project_euler/p347_LargestIntegerDivisibleByTwoPrimes.py rename to puzzles/project_euler/p347_LargestIntegerDivisibleByTwoPrimes.py diff --git a/project_euler/p348_SumOfASquareAndACube.py b/puzzles/project_euler/p348_SumOfASquareAndACube.py similarity index 100% rename from project_euler/p348_SumOfASquareAndACube.py rename to puzzles/project_euler/p348_SumOfASquareAndACube.py diff --git a/project_euler/p349_LangtonAnt.py b/puzzles/project_euler/p349_LangtonAnt.py similarity index 100% rename from project_euler/p349_LangtonAnt.py rename to puzzles/project_euler/p349_LangtonAnt.py diff --git a/project_euler/p350_ConstrainingTheLeastGreatestAndTheGreatestLeast.py b/puzzles/project_euler/p350_ConstrainingTheLeastGreatestAndTheGreatestLeast.py similarity index 100% rename from project_euler/p350_ConstrainingTheLeastGreatestAndTheGreatestLeast.py rename to puzzles/project_euler/p350_ConstrainingTheLeastGreatestAndTheGreatestLeast.py diff --git a/project_euler/p351_HexagonalOrchards.py b/puzzles/project_euler/p351_HexagonalOrchards.py similarity index 100% rename from project_euler/p351_HexagonalOrchards.py rename to puzzles/project_euler/p351_HexagonalOrchards.py diff --git a/project_euler/p352_BloodTests.py b/puzzles/project_euler/p352_BloodTests.py similarity index 100% rename from project_euler/p352_BloodTests.py rename to puzzles/project_euler/p352_BloodTests.py diff --git a/project_euler/p353_RiskyMoon.py b/puzzles/project_euler/p353_RiskyMoon.py similarity index 100% rename from project_euler/p353_RiskyMoon.py rename to puzzles/project_euler/p353_RiskyMoon.py diff --git a/project_euler/p354_DistancesInABeeHoneycomb.py b/puzzles/project_euler/p354_DistancesInABeeHoneycomb.py similarity index 100% rename from project_euler/p354_DistancesInABeeHoneycomb.py rename to puzzles/project_euler/p354_DistancesInABeeHoneycomb.py diff --git a/project_euler/p355_MaximalCoprimeSubset.py b/puzzles/project_euler/p355_MaximalCoprimeSubset.py similarity index 100% rename from project_euler/p355_MaximalCoprimeSubset.py rename to puzzles/project_euler/p355_MaximalCoprimeSubset.py diff --git a/project_euler/p356_LargestRootsOfCubicPolynomials.py b/puzzles/project_euler/p356_LargestRootsOfCubicPolynomials.py similarity index 100% rename from project_euler/p356_LargestRootsOfCubicPolynomials.py rename to puzzles/project_euler/p356_LargestRootsOfCubicPolynomials.py diff --git a/project_euler/p357_PrimeGeneratingIntegers.py b/puzzles/project_euler/p357_PrimeGeneratingIntegers.py similarity index 100% rename from project_euler/p357_PrimeGeneratingIntegers.py rename to puzzles/project_euler/p357_PrimeGeneratingIntegers.py diff --git a/project_euler/p358_CyclicNumbers.py b/puzzles/project_euler/p358_CyclicNumbers.py similarity index 100% rename from project_euler/p358_CyclicNumbers.py rename to puzzles/project_euler/p358_CyclicNumbers.py diff --git a/project_euler/p359_HilbertNewHotel.py b/puzzles/project_euler/p359_HilbertNewHotel.py similarity index 100% rename from project_euler/p359_HilbertNewHotel.py rename to puzzles/project_euler/p359_HilbertNewHotel.py diff --git a/project_euler/p360_ScarySphere.py b/puzzles/project_euler/p360_ScarySphere.py similarity index 100% rename from project_euler/p360_ScarySphere.py rename to puzzles/project_euler/p360_ScarySphere.py diff --git a/project_euler/p361_SubsequenceOfThueMorseSequence.py b/puzzles/project_euler/p361_SubsequenceOfThueMorseSequence.py similarity index 100% rename from project_euler/p361_SubsequenceOfThueMorseSequence.py rename to puzzles/project_euler/p361_SubsequenceOfThueMorseSequence.py diff --git a/project_euler/p362_SquarefreeFactors.py b/puzzles/project_euler/p362_SquarefreeFactors.py similarity index 100% rename from project_euler/p362_SquarefreeFactors.py rename to puzzles/project_euler/p362_SquarefreeFactors.py diff --git a/project_euler/p363_BezierCurves.py b/puzzles/project_euler/p363_BezierCurves.py similarity index 100% rename from project_euler/p363_BezierCurves.py rename to puzzles/project_euler/p363_BezierCurves.py diff --git a/project_euler/p364_ComfortableDistance.py b/puzzles/project_euler/p364_ComfortableDistance.py similarity index 100% rename from project_euler/p364_ComfortableDistance.py rename to puzzles/project_euler/p364_ComfortableDistance.py diff --git a/project_euler/p365_AHugeBinomialCoefficient.py b/puzzles/project_euler/p365_AHugeBinomialCoefficient.py similarity index 100% rename from project_euler/p365_AHugeBinomialCoefficient.py rename to puzzles/project_euler/p365_AHugeBinomialCoefficient.py diff --git a/project_euler/p366_StoneGameIII.py b/puzzles/project_euler/p366_StoneGameIII.py similarity index 100% rename from project_euler/p366_StoneGameIII.py rename to puzzles/project_euler/p366_StoneGameIII.py diff --git a/project_euler/p367_bozoSort.py b/puzzles/project_euler/p367_bozoSort.py similarity index 100% rename from project_euler/p367_bozoSort.py rename to puzzles/project_euler/p367_bozoSort.py diff --git a/project_euler/p368_AKempnerLikeSeries.py b/puzzles/project_euler/p368_AKempnerLikeSeries.py similarity index 100% rename from project_euler/p368_AKempnerLikeSeries.py rename to puzzles/project_euler/p368_AKempnerLikeSeries.py diff --git a/project_euler/p369_Badugi.py b/puzzles/project_euler/p369_Badugi.py similarity index 100% rename from project_euler/p369_Badugi.py rename to puzzles/project_euler/p369_Badugi.py diff --git a/project_euler/p370_GeometricTriangles.py b/puzzles/project_euler/p370_GeometricTriangles.py similarity index 100% rename from project_euler/p370_GeometricTriangles.py rename to puzzles/project_euler/p370_GeometricTriangles.py diff --git a/project_euler/p371_LicencePlates.py b/puzzles/project_euler/p371_LicencePlates.py similarity index 100% rename from project_euler/p371_LicencePlates.py rename to puzzles/project_euler/p371_LicencePlates.py diff --git a/project_euler/p372_PencilsOfRays.py b/puzzles/project_euler/p372_PencilsOfRays.py similarity index 100% rename from project_euler/p372_PencilsOfRays.py rename to puzzles/project_euler/p372_PencilsOfRays.py diff --git a/project_euler/p373_CircumscribedCircles.py b/puzzles/project_euler/p373_CircumscribedCircles.py similarity index 100% rename from project_euler/p373_CircumscribedCircles.py rename to puzzles/project_euler/p373_CircumscribedCircles.py diff --git a/project_euler/p374_MaximumIntegerPartitionProduct.py b/puzzles/project_euler/p374_MaximumIntegerPartitionProduct.py similarity index 100% rename from project_euler/p374_MaximumIntegerPartitionProduct.py rename to puzzles/project_euler/p374_MaximumIntegerPartitionProduct.py diff --git a/project_euler/p375_MinimumOfSubsequences.py b/puzzles/project_euler/p375_MinimumOfSubsequences.py similarity index 100% rename from project_euler/p375_MinimumOfSubsequences.py rename to puzzles/project_euler/p375_MinimumOfSubsequences.py diff --git a/project_euler/p376_NontransitiveSetsOfDice.py b/puzzles/project_euler/p376_NontransitiveSetsOfDice.py similarity index 100% rename from project_euler/p376_NontransitiveSetsOfDice.py rename to puzzles/project_euler/p376_NontransitiveSetsOfDice.py diff --git a/project_euler/p377_SumOfDigits,Experience13.py b/puzzles/project_euler/p377_SumOfDigits,Experience13.py similarity index 100% rename from project_euler/p377_SumOfDigits,Experience13.py rename to puzzles/project_euler/p377_SumOfDigits,Experience13.py diff --git a/project_euler/p378_TriangleTriples.py b/puzzles/project_euler/p378_TriangleTriples.py similarity index 100% rename from project_euler/p378_TriangleTriples.py rename to puzzles/project_euler/p378_TriangleTriples.py diff --git a/project_euler/p379_LeastCommonMultipleCount.py b/puzzles/project_euler/p379_LeastCommonMultipleCount.py similarity index 100% rename from project_euler/p379_LeastCommonMultipleCount.py rename to puzzles/project_euler/p379_LeastCommonMultipleCount.py diff --git a/project_euler/p380_AmazingMazes!.py b/puzzles/project_euler/p380_AmazingMazes!.py similarity index 100% rename from project_euler/p380_AmazingMazes!.py rename to puzzles/project_euler/p380_AmazingMazes!.py diff --git a/project_euler/p381_(PrimeK)Factorial.py b/puzzles/project_euler/p381_(PrimeK)Factorial.py similarity index 100% rename from project_euler/p381_(PrimeK)Factorial.py rename to puzzles/project_euler/p381_(PrimeK)Factorial.py diff --git a/project_euler/p382_GeneratingPolygons.py b/puzzles/project_euler/p382_GeneratingPolygons.py similarity index 100% rename from project_euler/p382_GeneratingPolygons.py rename to puzzles/project_euler/p382_GeneratingPolygons.py diff --git a/project_euler/p383_DivisibilityComparisonBetweenFactorials.py b/puzzles/project_euler/p383_DivisibilityComparisonBetweenFactorials.py similarity index 100% rename from project_euler/p383_DivisibilityComparisonBetweenFactorials.py rename to puzzles/project_euler/p383_DivisibilityComparisonBetweenFactorials.py diff --git a/project_euler/p384_RudinShapiroSequence.py b/puzzles/project_euler/p384_RudinShapiroSequence.py similarity index 100% rename from project_euler/p384_RudinShapiroSequence.py rename to puzzles/project_euler/p384_RudinShapiroSequence.py diff --git a/project_euler/p385_EllipsesInsideTriangles.py b/puzzles/project_euler/p385_EllipsesInsideTriangles.py similarity index 100% rename from project_euler/p385_EllipsesInsideTriangles.py rename to puzzles/project_euler/p385_EllipsesInsideTriangles.py diff --git a/project_euler/p386_MaximumLengthOfAnAntichain.py b/puzzles/project_euler/p386_MaximumLengthOfAnAntichain.py similarity index 100% rename from project_euler/p386_MaximumLengthOfAnAntichain.py rename to puzzles/project_euler/p386_MaximumLengthOfAnAntichain.py diff --git a/project_euler/p387_HarshadNumbers.py b/puzzles/project_euler/p387_HarshadNumbers.py similarity index 100% rename from project_euler/p387_HarshadNumbers.py rename to puzzles/project_euler/p387_HarshadNumbers.py diff --git a/project_euler/p388_DistinctLines.py b/puzzles/project_euler/p388_DistinctLines.py similarity index 100% rename from project_euler/p388_DistinctLines.py rename to puzzles/project_euler/p388_DistinctLines.py diff --git a/project_euler/p389_PlatonicDice.py b/puzzles/project_euler/p389_PlatonicDice.py similarity index 100% rename from project_euler/p389_PlatonicDice.py rename to puzzles/project_euler/p389_PlatonicDice.py diff --git a/project_euler/p390_TrianglesWithNonRationalSidesAndIntegralArea.py b/puzzles/project_euler/p390_TrianglesWithNonRationalSidesAndIntegralArea.py similarity index 100% rename from project_euler/p390_TrianglesWithNonRationalSidesAndIntegralArea.py rename to puzzles/project_euler/p390_TrianglesWithNonRationalSidesAndIntegralArea.py diff --git a/project_euler/p391_HoppingGame.py b/puzzles/project_euler/p391_HoppingGame.py similarity index 100% rename from project_euler/p391_HoppingGame.py rename to puzzles/project_euler/p391_HoppingGame.py diff --git a/project_euler/p392_EnmeshedUnitCircle.py b/puzzles/project_euler/p392_EnmeshedUnitCircle.py similarity index 100% rename from project_euler/p392_EnmeshedUnitCircle.py rename to puzzles/project_euler/p392_EnmeshedUnitCircle.py diff --git a/project_euler/p393_MigratingAnts.py b/puzzles/project_euler/p393_MigratingAnts.py similarity index 100% rename from project_euler/p393_MigratingAnts.py rename to puzzles/project_euler/p393_MigratingAnts.py diff --git a/project_euler/p394_EatingPie.py b/puzzles/project_euler/p394_EatingPie.py similarity index 100% rename from project_euler/p394_EatingPie.py rename to puzzles/project_euler/p394_EatingPie.py diff --git a/project_euler/p395_PythagoreanTree.py b/puzzles/project_euler/p395_PythagoreanTree.py similarity index 100% rename from project_euler/p395_PythagoreanTree.py rename to puzzles/project_euler/p395_PythagoreanTree.py diff --git a/project_euler/p396_WeakGoodsteinSequence.py b/puzzles/project_euler/p396_WeakGoodsteinSequence.py similarity index 100% rename from project_euler/p396_WeakGoodsteinSequence.py rename to puzzles/project_euler/p396_WeakGoodsteinSequence.py diff --git a/project_euler/p397_TriangleOnParabola.py b/puzzles/project_euler/p397_TriangleOnParabola.py similarity index 100% rename from project_euler/p397_TriangleOnParabola.py rename to puzzles/project_euler/p397_TriangleOnParabola.py diff --git a/project_euler/p398_CuttingRope.py b/puzzles/project_euler/p398_CuttingRope.py similarity index 100% rename from project_euler/p398_CuttingRope.py rename to puzzles/project_euler/p398_CuttingRope.py diff --git a/project_euler/p399_SquarefreeFibonacciNumbers.py b/puzzles/project_euler/p399_SquarefreeFibonacciNumbers.py similarity index 100% rename from project_euler/p399_SquarefreeFibonacciNumbers.py rename to puzzles/project_euler/p399_SquarefreeFibonacciNumbers.py diff --git a/project_euler/p400_FibonacciTreeGame.py b/puzzles/project_euler/p400_FibonacciTreeGame.py similarity index 100% rename from project_euler/p400_FibonacciTreeGame.py rename to puzzles/project_euler/p400_FibonacciTreeGame.py diff --git a/project_euler/p401_SumOfSquaresOfDivisors.py b/puzzles/project_euler/p401_SumOfSquaresOfDivisors.py similarity index 100% rename from project_euler/p401_SumOfSquaresOfDivisors.py rename to puzzles/project_euler/p401_SumOfSquaresOfDivisors.py diff --git a/project_euler/p402_IntegerValuedPolynomials.py b/puzzles/project_euler/p402_IntegerValuedPolynomials.py similarity index 100% rename from project_euler/p402_IntegerValuedPolynomials.py rename to puzzles/project_euler/p402_IntegerValuedPolynomials.py diff --git a/project_euler/p403_LatticePointsEnclosedByParabolaAndLine.py b/puzzles/project_euler/p403_LatticePointsEnclosedByParabolaAndLine.py similarity index 100% rename from project_euler/p403_LatticePointsEnclosedByParabolaAndLine.py rename to puzzles/project_euler/p403_LatticePointsEnclosedByParabolaAndLine.py diff --git a/project_euler/p404_CrisscrossEllipses.py b/puzzles/project_euler/p404_CrisscrossEllipses.py similarity index 100% rename from project_euler/p404_CrisscrossEllipses.py rename to puzzles/project_euler/p404_CrisscrossEllipses.py diff --git a/project_euler/p405_ARectangularTiling.py b/puzzles/project_euler/p405_ARectangularTiling.py similarity index 100% rename from project_euler/p405_ARectangularTiling.py rename to puzzles/project_euler/p405_ARectangularTiling.py diff --git a/project_euler/p406_GuessingGame.py b/puzzles/project_euler/p406_GuessingGame.py similarity index 100% rename from project_euler/p406_GuessingGame.py rename to puzzles/project_euler/p406_GuessingGame.py diff --git a/project_euler/p407_Idempotents.py b/puzzles/project_euler/p407_Idempotents.py similarity index 100% rename from project_euler/p407_Idempotents.py rename to puzzles/project_euler/p407_Idempotents.py diff --git a/project_euler/p408_AdmissiblePathsThroughAGrid.py b/puzzles/project_euler/p408_AdmissiblePathsThroughAGrid.py similarity index 100% rename from project_euler/p408_AdmissiblePathsThroughAGrid.py rename to puzzles/project_euler/p408_AdmissiblePathsThroughAGrid.py diff --git a/project_euler/p409_NimExtreme.py b/puzzles/project_euler/p409_NimExtreme.py similarity index 100% rename from project_euler/p409_NimExtreme.py rename to puzzles/project_euler/p409_NimExtreme.py diff --git a/project_euler/p410_CircleAndTangentLine.py b/puzzles/project_euler/p410_CircleAndTangentLine.py similarity index 100% rename from project_euler/p410_CircleAndTangentLine.py rename to puzzles/project_euler/p410_CircleAndTangentLine.py diff --git a/project_euler/p411_UphillPaths.py b/puzzles/project_euler/p411_UphillPaths.py similarity index 100% rename from project_euler/p411_UphillPaths.py rename to puzzles/project_euler/p411_UphillPaths.py diff --git a/project_euler/p412_GnomonNumbering.py b/puzzles/project_euler/p412_GnomonNumbering.py similarity index 100% rename from project_euler/p412_GnomonNumbering.py rename to puzzles/project_euler/p412_GnomonNumbering.py diff --git a/project_euler/p413_OneChildNumbers.py b/puzzles/project_euler/p413_OneChildNumbers.py similarity index 100% rename from project_euler/p413_OneChildNumbers.py rename to puzzles/project_euler/p413_OneChildNumbers.py diff --git a/project_euler/p414_KaprekarConstant.py b/puzzles/project_euler/p414_KaprekarConstant.py similarity index 100% rename from project_euler/p414_KaprekarConstant.py rename to puzzles/project_euler/p414_KaprekarConstant.py diff --git a/project_euler/p415_TitanicSets.py b/puzzles/project_euler/p415_TitanicSets.py similarity index 100% rename from project_euler/p415_TitanicSets.py rename to puzzles/project_euler/p415_TitanicSets.py diff --git a/project_euler/p416_AFrogTrip.py b/puzzles/project_euler/p416_AFrogTrip.py similarity index 100% rename from project_euler/p416_AFrogTrip.py rename to puzzles/project_euler/p416_AFrogTrip.py diff --git a/project_euler/p417_ReciprocalCyclesII.py b/puzzles/project_euler/p417_ReciprocalCyclesII.py similarity index 100% rename from project_euler/p417_ReciprocalCyclesII.py rename to puzzles/project_euler/p417_ReciprocalCyclesII.py diff --git a/project_euler/p418_FactorisationTriples.py b/puzzles/project_euler/p418_FactorisationTriples.py similarity index 100% rename from project_euler/p418_FactorisationTriples.py rename to puzzles/project_euler/p418_FactorisationTriples.py diff --git a/project_euler/p419_LookAndSaySequence.py b/puzzles/project_euler/p419_LookAndSaySequence.py similarity index 100% rename from project_euler/p419_LookAndSaySequence.py rename to puzzles/project_euler/p419_LookAndSaySequence.py diff --git a/project_euler/p420_2x2PositiveIntegerMatrix.py b/puzzles/project_euler/p420_2x2PositiveIntegerMatrix.py similarity index 100% rename from project_euler/p420_2x2PositiveIntegerMatrix.py rename to puzzles/project_euler/p420_2x2PositiveIntegerMatrix.py diff --git a/project_euler/p421_PrimeFactorsOf.py b/puzzles/project_euler/p421_PrimeFactorsOf.py similarity index 100% rename from project_euler/p421_PrimeFactorsOf.py rename to puzzles/project_euler/p421_PrimeFactorsOf.py diff --git a/project_euler/p422_SequenceOfPointsOnAHyperbola.py b/puzzles/project_euler/p422_SequenceOfPointsOnAHyperbola.py similarity index 100% rename from project_euler/p422_SequenceOfPointsOnAHyperbola.py rename to puzzles/project_euler/p422_SequenceOfPointsOnAHyperbola.py diff --git a/project_euler/p423_ConsecutiveDieThrows.py b/puzzles/project_euler/p423_ConsecutiveDieThrows.py similarity index 100% rename from project_euler/p423_ConsecutiveDieThrows.py rename to puzzles/project_euler/p423_ConsecutiveDieThrows.py diff --git a/project_euler/p424_Kakuro.py b/puzzles/project_euler/p424_Kakuro.py similarity index 100% rename from project_euler/p424_Kakuro.py rename to puzzles/project_euler/p424_Kakuro.py diff --git a/project_euler/p425_PrimeConnection.py b/puzzles/project_euler/p425_PrimeConnection.py similarity index 100% rename from project_euler/p425_PrimeConnection.py rename to puzzles/project_euler/p425_PrimeConnection.py diff --git a/project_euler/p426_BoxBallSystem.py b/puzzles/project_euler/p426_BoxBallSystem.py similarity index 100% rename from project_euler/p426_BoxBallSystem.py rename to puzzles/project_euler/p426_BoxBallSystem.py diff --git a/project_euler/p427_nSequences.py b/puzzles/project_euler/p427_nSequences.py similarity index 100% rename from project_euler/p427_nSequences.py rename to puzzles/project_euler/p427_nSequences.py diff --git a/project_euler/p428_NecklaceOfCircles.py b/puzzles/project_euler/p428_NecklaceOfCircles.py similarity index 100% rename from project_euler/p428_NecklaceOfCircles.py rename to puzzles/project_euler/p428_NecklaceOfCircles.py diff --git a/project_euler/p429_SumOfSquaresOfUnitaryDivisors.py b/puzzles/project_euler/p429_SumOfSquaresOfUnitaryDivisors.py similarity index 100% rename from project_euler/p429_SumOfSquaresOfUnitaryDivisors.py rename to puzzles/project_euler/p429_SumOfSquaresOfUnitaryDivisors.py diff --git a/project_euler/p430_RangeFlips.py b/puzzles/project_euler/p430_RangeFlips.py similarity index 100% rename from project_euler/p430_RangeFlips.py rename to puzzles/project_euler/p430_RangeFlips.py diff --git a/project_euler/p431_SquareSpaceSilo.py b/puzzles/project_euler/p431_SquareSpaceSilo.py similarity index 100% rename from project_euler/p431_SquareSpaceSilo.py rename to puzzles/project_euler/p431_SquareSpaceSilo.py diff --git a/project_euler/p432_TotientSum.py b/puzzles/project_euler/p432_TotientSum.py similarity index 100% rename from project_euler/p432_TotientSum.py rename to puzzles/project_euler/p432_TotientSum.py diff --git a/project_euler/p433_StepsInEuclidAlgorithm.py b/puzzles/project_euler/p433_StepsInEuclidAlgorithm.py similarity index 100% rename from project_euler/p433_StepsInEuclidAlgorithm.py rename to puzzles/project_euler/p433_StepsInEuclidAlgorithm.py diff --git a/project_euler/p434_RigidGraphs.py b/puzzles/project_euler/p434_RigidGraphs.py similarity index 100% rename from project_euler/p434_RigidGraphs.py rename to puzzles/project_euler/p434_RigidGraphs.py diff --git a/project_euler/p435_PolynomialsOfFibonacciNumbers.py b/puzzles/project_euler/p435_PolynomialsOfFibonacciNumbers.py similarity index 100% rename from project_euler/p435_PolynomialsOfFibonacciNumbers.py rename to puzzles/project_euler/p435_PolynomialsOfFibonacciNumbers.py diff --git a/project_euler/pe/p001.html b/puzzles/project_euler/pe/p001.html similarity index 100% rename from project_euler/pe/p001.html rename to puzzles/project_euler/pe/p001.html diff --git a/project_euler/pe/p002.html b/puzzles/project_euler/pe/p002.html similarity index 100% rename from project_euler/pe/p002.html rename to puzzles/project_euler/pe/p002.html diff --git a/project_euler/pe/p003.html b/puzzles/project_euler/pe/p003.html similarity index 100% rename from project_euler/pe/p003.html rename to puzzles/project_euler/pe/p003.html diff --git a/project_euler/pe/p004.html b/puzzles/project_euler/pe/p004.html similarity index 100% rename from project_euler/pe/p004.html rename to puzzles/project_euler/pe/p004.html diff --git a/project_euler/pe/p005.html b/puzzles/project_euler/pe/p005.html similarity index 100% rename from project_euler/pe/p005.html rename to puzzles/project_euler/pe/p005.html diff --git a/project_euler/pe/p006.html b/puzzles/project_euler/pe/p006.html similarity index 100% rename from project_euler/pe/p006.html rename to puzzles/project_euler/pe/p006.html diff --git a/project_euler/pe/p007.html b/puzzles/project_euler/pe/p007.html similarity index 100% rename from project_euler/pe/p007.html rename to puzzles/project_euler/pe/p007.html diff --git a/project_euler/pe/p008.html b/puzzles/project_euler/pe/p008.html similarity index 100% rename from project_euler/pe/p008.html rename to puzzles/project_euler/pe/p008.html diff --git a/project_euler/pe/p009.html b/puzzles/project_euler/pe/p009.html similarity index 100% rename from project_euler/pe/p009.html rename to puzzles/project_euler/pe/p009.html diff --git a/project_euler/pe/p010.html b/puzzles/project_euler/pe/p010.html similarity index 100% rename from project_euler/pe/p010.html rename to puzzles/project_euler/pe/p010.html diff --git a/project_euler/pe/p011.html b/puzzles/project_euler/pe/p011.html similarity index 100% rename from project_euler/pe/p011.html rename to puzzles/project_euler/pe/p011.html diff --git a/project_euler/pe/p012.html b/puzzles/project_euler/pe/p012.html similarity index 100% rename from project_euler/pe/p012.html rename to puzzles/project_euler/pe/p012.html diff --git a/project_euler/pe/p013.html b/puzzles/project_euler/pe/p013.html similarity index 100% rename from project_euler/pe/p013.html rename to puzzles/project_euler/pe/p013.html diff --git a/project_euler/pe/p014.html b/puzzles/project_euler/pe/p014.html similarity index 100% rename from project_euler/pe/p014.html rename to puzzles/project_euler/pe/p014.html diff --git a/project_euler/pe/p015.html b/puzzles/project_euler/pe/p015.html similarity index 100% rename from project_euler/pe/p015.html rename to puzzles/project_euler/pe/p015.html diff --git a/project_euler/pe/p016.html b/puzzles/project_euler/pe/p016.html similarity index 100% rename from project_euler/pe/p016.html rename to puzzles/project_euler/pe/p016.html diff --git a/project_euler/pe/p017.html b/puzzles/project_euler/pe/p017.html similarity index 100% rename from project_euler/pe/p017.html rename to puzzles/project_euler/pe/p017.html diff --git a/project_euler/pe/p018.html b/puzzles/project_euler/pe/p018.html similarity index 100% rename from project_euler/pe/p018.html rename to puzzles/project_euler/pe/p018.html diff --git a/project_euler/pe/p019.html b/puzzles/project_euler/pe/p019.html similarity index 100% rename from project_euler/pe/p019.html rename to puzzles/project_euler/pe/p019.html diff --git a/project_euler/pe/p020.html b/puzzles/project_euler/pe/p020.html similarity index 100% rename from project_euler/pe/p020.html rename to puzzles/project_euler/pe/p020.html diff --git a/project_euler/pe/p021.html b/puzzles/project_euler/pe/p021.html similarity index 100% rename from project_euler/pe/p021.html rename to puzzles/project_euler/pe/p021.html diff --git a/project_euler/pe/p022.html b/puzzles/project_euler/pe/p022.html similarity index 100% rename from project_euler/pe/p022.html rename to puzzles/project_euler/pe/p022.html diff --git a/project_euler/pe/p023.html b/puzzles/project_euler/pe/p023.html similarity index 100% rename from project_euler/pe/p023.html rename to puzzles/project_euler/pe/p023.html diff --git a/project_euler/pe/p024.html b/puzzles/project_euler/pe/p024.html similarity index 100% rename from project_euler/pe/p024.html rename to puzzles/project_euler/pe/p024.html diff --git a/project_euler/pe/p025.html b/puzzles/project_euler/pe/p025.html similarity index 100% rename from project_euler/pe/p025.html rename to puzzles/project_euler/pe/p025.html diff --git a/project_euler/pe/p026.html b/puzzles/project_euler/pe/p026.html similarity index 100% rename from project_euler/pe/p026.html rename to puzzles/project_euler/pe/p026.html diff --git a/project_euler/pe/p027.html b/puzzles/project_euler/pe/p027.html similarity index 100% rename from project_euler/pe/p027.html rename to puzzles/project_euler/pe/p027.html diff --git a/project_euler/pe/p028.html b/puzzles/project_euler/pe/p028.html similarity index 100% rename from project_euler/pe/p028.html rename to puzzles/project_euler/pe/p028.html diff --git a/project_euler/pe/p029.html b/puzzles/project_euler/pe/p029.html similarity index 100% rename from project_euler/pe/p029.html rename to puzzles/project_euler/pe/p029.html diff --git a/project_euler/pe/p030.html b/puzzles/project_euler/pe/p030.html similarity index 100% rename from project_euler/pe/p030.html rename to puzzles/project_euler/pe/p030.html diff --git a/project_euler/pe/p031.html b/puzzles/project_euler/pe/p031.html similarity index 100% rename from project_euler/pe/p031.html rename to puzzles/project_euler/pe/p031.html diff --git a/project_euler/pe/p032.html b/puzzles/project_euler/pe/p032.html similarity index 100% rename from project_euler/pe/p032.html rename to puzzles/project_euler/pe/p032.html diff --git a/project_euler/pe/p033.html b/puzzles/project_euler/pe/p033.html similarity index 100% rename from project_euler/pe/p033.html rename to puzzles/project_euler/pe/p033.html diff --git a/project_euler/pe/p034.html b/puzzles/project_euler/pe/p034.html similarity index 100% rename from project_euler/pe/p034.html rename to puzzles/project_euler/pe/p034.html diff --git a/project_euler/pe/p035.html b/puzzles/project_euler/pe/p035.html similarity index 100% rename from project_euler/pe/p035.html rename to puzzles/project_euler/pe/p035.html diff --git a/project_euler/pe/p036.html b/puzzles/project_euler/pe/p036.html similarity index 100% rename from project_euler/pe/p036.html rename to puzzles/project_euler/pe/p036.html diff --git a/project_euler/pe/p037.html b/puzzles/project_euler/pe/p037.html similarity index 100% rename from project_euler/pe/p037.html rename to puzzles/project_euler/pe/p037.html diff --git a/project_euler/pe/p038.html b/puzzles/project_euler/pe/p038.html similarity index 100% rename from project_euler/pe/p038.html rename to puzzles/project_euler/pe/p038.html diff --git a/project_euler/pe/p039.html b/puzzles/project_euler/pe/p039.html similarity index 100% rename from project_euler/pe/p039.html rename to puzzles/project_euler/pe/p039.html diff --git a/project_euler/pe/p040.html b/puzzles/project_euler/pe/p040.html similarity index 100% rename from project_euler/pe/p040.html rename to puzzles/project_euler/pe/p040.html diff --git a/project_euler/pe/p041.html b/puzzles/project_euler/pe/p041.html similarity index 100% rename from project_euler/pe/p041.html rename to puzzles/project_euler/pe/p041.html diff --git a/project_euler/pe/p042.html b/puzzles/project_euler/pe/p042.html similarity index 100% rename from project_euler/pe/p042.html rename to puzzles/project_euler/pe/p042.html diff --git a/project_euler/pe/p043.html b/puzzles/project_euler/pe/p043.html similarity index 100% rename from project_euler/pe/p043.html rename to puzzles/project_euler/pe/p043.html diff --git a/project_euler/pe/p044.html b/puzzles/project_euler/pe/p044.html similarity index 100% rename from project_euler/pe/p044.html rename to puzzles/project_euler/pe/p044.html diff --git a/project_euler/pe/p045.html b/puzzles/project_euler/pe/p045.html similarity index 100% rename from project_euler/pe/p045.html rename to puzzles/project_euler/pe/p045.html diff --git a/project_euler/pe/p046.html b/puzzles/project_euler/pe/p046.html similarity index 100% rename from project_euler/pe/p046.html rename to puzzles/project_euler/pe/p046.html diff --git a/project_euler/pe/p047.html b/puzzles/project_euler/pe/p047.html similarity index 100% rename from project_euler/pe/p047.html rename to puzzles/project_euler/pe/p047.html diff --git a/project_euler/pe/p048.html b/puzzles/project_euler/pe/p048.html similarity index 100% rename from project_euler/pe/p048.html rename to puzzles/project_euler/pe/p048.html diff --git a/project_euler/pe/p049.html b/puzzles/project_euler/pe/p049.html similarity index 100% rename from project_euler/pe/p049.html rename to puzzles/project_euler/pe/p049.html diff --git a/project_euler/pe/p050.html b/puzzles/project_euler/pe/p050.html similarity index 100% rename from project_euler/pe/p050.html rename to puzzles/project_euler/pe/p050.html diff --git a/project_euler/pe/p051.html b/puzzles/project_euler/pe/p051.html similarity index 100% rename from project_euler/pe/p051.html rename to puzzles/project_euler/pe/p051.html diff --git a/project_euler/pe/p052.html b/puzzles/project_euler/pe/p052.html similarity index 100% rename from project_euler/pe/p052.html rename to puzzles/project_euler/pe/p052.html diff --git a/project_euler/pe/p053.html b/puzzles/project_euler/pe/p053.html similarity index 100% rename from project_euler/pe/p053.html rename to puzzles/project_euler/pe/p053.html diff --git a/project_euler/pe/p054.html b/puzzles/project_euler/pe/p054.html similarity index 100% rename from project_euler/pe/p054.html rename to puzzles/project_euler/pe/p054.html diff --git a/project_euler/pe/p055.html b/puzzles/project_euler/pe/p055.html similarity index 100% rename from project_euler/pe/p055.html rename to puzzles/project_euler/pe/p055.html diff --git a/project_euler/pe/p056.html b/puzzles/project_euler/pe/p056.html similarity index 100% rename from project_euler/pe/p056.html rename to puzzles/project_euler/pe/p056.html diff --git a/project_euler/pe/p057.html b/puzzles/project_euler/pe/p057.html similarity index 100% rename from project_euler/pe/p057.html rename to puzzles/project_euler/pe/p057.html diff --git a/project_euler/pe/p058.html b/puzzles/project_euler/pe/p058.html similarity index 100% rename from project_euler/pe/p058.html rename to puzzles/project_euler/pe/p058.html diff --git a/project_euler/pe/p059.html b/puzzles/project_euler/pe/p059.html similarity index 100% rename from project_euler/pe/p059.html rename to puzzles/project_euler/pe/p059.html diff --git a/project_euler/pe/p060.html b/puzzles/project_euler/pe/p060.html similarity index 100% rename from project_euler/pe/p060.html rename to puzzles/project_euler/pe/p060.html diff --git a/project_euler/pe/p061.html b/puzzles/project_euler/pe/p061.html similarity index 100% rename from project_euler/pe/p061.html rename to puzzles/project_euler/pe/p061.html diff --git a/project_euler/pe/p062.html b/puzzles/project_euler/pe/p062.html similarity index 100% rename from project_euler/pe/p062.html rename to puzzles/project_euler/pe/p062.html diff --git a/project_euler/pe/p063.html b/puzzles/project_euler/pe/p063.html similarity index 100% rename from project_euler/pe/p063.html rename to puzzles/project_euler/pe/p063.html diff --git a/project_euler/pe/p064.html b/puzzles/project_euler/pe/p064.html similarity index 100% rename from project_euler/pe/p064.html rename to puzzles/project_euler/pe/p064.html diff --git a/project_euler/pe/p065.html b/puzzles/project_euler/pe/p065.html similarity index 100% rename from project_euler/pe/p065.html rename to puzzles/project_euler/pe/p065.html diff --git a/project_euler/pe/p066.html b/puzzles/project_euler/pe/p066.html similarity index 100% rename from project_euler/pe/p066.html rename to puzzles/project_euler/pe/p066.html diff --git a/project_euler/pe/p067.html b/puzzles/project_euler/pe/p067.html similarity index 100% rename from project_euler/pe/p067.html rename to puzzles/project_euler/pe/p067.html diff --git a/project_euler/pe/p068.html b/puzzles/project_euler/pe/p068.html similarity index 100% rename from project_euler/pe/p068.html rename to puzzles/project_euler/pe/p068.html diff --git a/project_euler/pe/p069.html b/puzzles/project_euler/pe/p069.html similarity index 100% rename from project_euler/pe/p069.html rename to puzzles/project_euler/pe/p069.html diff --git a/project_euler/pe/p070.html b/puzzles/project_euler/pe/p070.html similarity index 100% rename from project_euler/pe/p070.html rename to puzzles/project_euler/pe/p070.html diff --git a/project_euler/pe/p071.html b/puzzles/project_euler/pe/p071.html similarity index 100% rename from project_euler/pe/p071.html rename to puzzles/project_euler/pe/p071.html diff --git a/project_euler/pe/p072.html b/puzzles/project_euler/pe/p072.html similarity index 100% rename from project_euler/pe/p072.html rename to puzzles/project_euler/pe/p072.html diff --git a/project_euler/pe/p073.html b/puzzles/project_euler/pe/p073.html similarity index 100% rename from project_euler/pe/p073.html rename to puzzles/project_euler/pe/p073.html diff --git a/project_euler/pe/p074.html b/puzzles/project_euler/pe/p074.html similarity index 100% rename from project_euler/pe/p074.html rename to puzzles/project_euler/pe/p074.html diff --git a/project_euler/pe/p075.html b/puzzles/project_euler/pe/p075.html similarity index 100% rename from project_euler/pe/p075.html rename to puzzles/project_euler/pe/p075.html diff --git a/project_euler/pe/p076.html b/puzzles/project_euler/pe/p076.html similarity index 100% rename from project_euler/pe/p076.html rename to puzzles/project_euler/pe/p076.html diff --git a/project_euler/pe/p077.html b/puzzles/project_euler/pe/p077.html similarity index 100% rename from project_euler/pe/p077.html rename to puzzles/project_euler/pe/p077.html diff --git a/project_euler/pe/p078.html b/puzzles/project_euler/pe/p078.html similarity index 100% rename from project_euler/pe/p078.html rename to puzzles/project_euler/pe/p078.html diff --git a/project_euler/pe/p079.html b/puzzles/project_euler/pe/p079.html similarity index 100% rename from project_euler/pe/p079.html rename to puzzles/project_euler/pe/p079.html diff --git a/project_euler/pe/p080.html b/puzzles/project_euler/pe/p080.html similarity index 100% rename from project_euler/pe/p080.html rename to puzzles/project_euler/pe/p080.html diff --git a/project_euler/pe/p081.html b/puzzles/project_euler/pe/p081.html similarity index 100% rename from project_euler/pe/p081.html rename to puzzles/project_euler/pe/p081.html diff --git a/project_euler/pe/p082.html b/puzzles/project_euler/pe/p082.html similarity index 100% rename from project_euler/pe/p082.html rename to puzzles/project_euler/pe/p082.html diff --git a/project_euler/pe/p083.html b/puzzles/project_euler/pe/p083.html similarity index 100% rename from project_euler/pe/p083.html rename to puzzles/project_euler/pe/p083.html diff --git a/project_euler/pe/p084.html b/puzzles/project_euler/pe/p084.html similarity index 100% rename from project_euler/pe/p084.html rename to puzzles/project_euler/pe/p084.html diff --git a/project_euler/pe/p085.html b/puzzles/project_euler/pe/p085.html similarity index 100% rename from project_euler/pe/p085.html rename to puzzles/project_euler/pe/p085.html diff --git a/project_euler/pe/p086.html b/puzzles/project_euler/pe/p086.html similarity index 100% rename from project_euler/pe/p086.html rename to puzzles/project_euler/pe/p086.html diff --git a/project_euler/pe/p087.html b/puzzles/project_euler/pe/p087.html similarity index 100% rename from project_euler/pe/p087.html rename to puzzles/project_euler/pe/p087.html diff --git a/project_euler/pe/p088.html b/puzzles/project_euler/pe/p088.html similarity index 100% rename from project_euler/pe/p088.html rename to puzzles/project_euler/pe/p088.html diff --git a/project_euler/pe/p089.html b/puzzles/project_euler/pe/p089.html similarity index 100% rename from project_euler/pe/p089.html rename to puzzles/project_euler/pe/p089.html diff --git a/project_euler/pe/p090.html b/puzzles/project_euler/pe/p090.html similarity index 100% rename from project_euler/pe/p090.html rename to puzzles/project_euler/pe/p090.html diff --git a/project_euler/pe/p091.html b/puzzles/project_euler/pe/p091.html similarity index 100% rename from project_euler/pe/p091.html rename to puzzles/project_euler/pe/p091.html diff --git a/project_euler/pe/p092.html b/puzzles/project_euler/pe/p092.html similarity index 100% rename from project_euler/pe/p092.html rename to puzzles/project_euler/pe/p092.html diff --git a/project_euler/pe/p093.html b/puzzles/project_euler/pe/p093.html similarity index 100% rename from project_euler/pe/p093.html rename to puzzles/project_euler/pe/p093.html diff --git a/project_euler/pe/p094.html b/puzzles/project_euler/pe/p094.html similarity index 100% rename from project_euler/pe/p094.html rename to puzzles/project_euler/pe/p094.html diff --git a/project_euler/pe/p095.html b/puzzles/project_euler/pe/p095.html similarity index 100% rename from project_euler/pe/p095.html rename to puzzles/project_euler/pe/p095.html diff --git a/project_euler/pe/p096.html b/puzzles/project_euler/pe/p096.html similarity index 100% rename from project_euler/pe/p096.html rename to puzzles/project_euler/pe/p096.html diff --git a/project_euler/pe/p097.html b/puzzles/project_euler/pe/p097.html similarity index 100% rename from project_euler/pe/p097.html rename to puzzles/project_euler/pe/p097.html diff --git a/project_euler/pe/p098.html b/puzzles/project_euler/pe/p098.html similarity index 100% rename from project_euler/pe/p098.html rename to puzzles/project_euler/pe/p098.html diff --git a/project_euler/pe/p099.html b/puzzles/project_euler/pe/p099.html similarity index 100% rename from project_euler/pe/p099.html rename to puzzles/project_euler/pe/p099.html diff --git a/project_euler/pe/p100.html b/puzzles/project_euler/pe/p100.html similarity index 100% rename from project_euler/pe/p100.html rename to puzzles/project_euler/pe/p100.html diff --git a/project_euler/pe/p101.html b/puzzles/project_euler/pe/p101.html similarity index 100% rename from project_euler/pe/p101.html rename to puzzles/project_euler/pe/p101.html diff --git a/project_euler/pe/p102.html b/puzzles/project_euler/pe/p102.html similarity index 100% rename from project_euler/pe/p102.html rename to puzzles/project_euler/pe/p102.html diff --git a/project_euler/pe/p103.html b/puzzles/project_euler/pe/p103.html similarity index 100% rename from project_euler/pe/p103.html rename to puzzles/project_euler/pe/p103.html diff --git a/project_euler/pe/p104.html b/puzzles/project_euler/pe/p104.html similarity index 100% rename from project_euler/pe/p104.html rename to puzzles/project_euler/pe/p104.html diff --git a/project_euler/pe/p105.html b/puzzles/project_euler/pe/p105.html similarity index 100% rename from project_euler/pe/p105.html rename to puzzles/project_euler/pe/p105.html diff --git a/project_euler/pe/p106.html b/puzzles/project_euler/pe/p106.html similarity index 100% rename from project_euler/pe/p106.html rename to puzzles/project_euler/pe/p106.html diff --git a/project_euler/pe/p107.html b/puzzles/project_euler/pe/p107.html similarity index 100% rename from project_euler/pe/p107.html rename to puzzles/project_euler/pe/p107.html diff --git a/project_euler/pe/p108.html b/puzzles/project_euler/pe/p108.html similarity index 100% rename from project_euler/pe/p108.html rename to puzzles/project_euler/pe/p108.html diff --git a/project_euler/pe/p109.html b/puzzles/project_euler/pe/p109.html similarity index 100% rename from project_euler/pe/p109.html rename to puzzles/project_euler/pe/p109.html diff --git a/project_euler/pe/p110.html b/puzzles/project_euler/pe/p110.html similarity index 100% rename from project_euler/pe/p110.html rename to puzzles/project_euler/pe/p110.html diff --git a/project_euler/pe/p111.html b/puzzles/project_euler/pe/p111.html similarity index 100% rename from project_euler/pe/p111.html rename to puzzles/project_euler/pe/p111.html diff --git a/project_euler/pe/p112.html b/puzzles/project_euler/pe/p112.html similarity index 100% rename from project_euler/pe/p112.html rename to puzzles/project_euler/pe/p112.html diff --git a/project_euler/pe/p113.html b/puzzles/project_euler/pe/p113.html similarity index 100% rename from project_euler/pe/p113.html rename to puzzles/project_euler/pe/p113.html diff --git a/project_euler/pe/p114.html b/puzzles/project_euler/pe/p114.html similarity index 100% rename from project_euler/pe/p114.html rename to puzzles/project_euler/pe/p114.html diff --git a/project_euler/pe/p115.html b/puzzles/project_euler/pe/p115.html similarity index 100% rename from project_euler/pe/p115.html rename to puzzles/project_euler/pe/p115.html diff --git a/project_euler/pe/p116.html b/puzzles/project_euler/pe/p116.html similarity index 100% rename from project_euler/pe/p116.html rename to puzzles/project_euler/pe/p116.html diff --git a/project_euler/pe/p117.html b/puzzles/project_euler/pe/p117.html similarity index 100% rename from project_euler/pe/p117.html rename to puzzles/project_euler/pe/p117.html diff --git a/project_euler/pe/p118.html b/puzzles/project_euler/pe/p118.html similarity index 100% rename from project_euler/pe/p118.html rename to puzzles/project_euler/pe/p118.html diff --git a/project_euler/pe/p119.html b/puzzles/project_euler/pe/p119.html similarity index 100% rename from project_euler/pe/p119.html rename to puzzles/project_euler/pe/p119.html diff --git a/project_euler/pe/p120.html b/puzzles/project_euler/pe/p120.html similarity index 100% rename from project_euler/pe/p120.html rename to puzzles/project_euler/pe/p120.html diff --git a/project_euler/pe/p121.html b/puzzles/project_euler/pe/p121.html similarity index 100% rename from project_euler/pe/p121.html rename to puzzles/project_euler/pe/p121.html diff --git a/project_euler/pe/p122.html b/puzzles/project_euler/pe/p122.html similarity index 100% rename from project_euler/pe/p122.html rename to puzzles/project_euler/pe/p122.html diff --git a/project_euler/pe/p123.html b/puzzles/project_euler/pe/p123.html similarity index 100% rename from project_euler/pe/p123.html rename to puzzles/project_euler/pe/p123.html diff --git a/project_euler/pe/p124.html b/puzzles/project_euler/pe/p124.html similarity index 100% rename from project_euler/pe/p124.html rename to puzzles/project_euler/pe/p124.html diff --git a/project_euler/pe/p125.html b/puzzles/project_euler/pe/p125.html similarity index 100% rename from project_euler/pe/p125.html rename to puzzles/project_euler/pe/p125.html diff --git a/project_euler/pe/p126.html b/puzzles/project_euler/pe/p126.html similarity index 100% rename from project_euler/pe/p126.html rename to puzzles/project_euler/pe/p126.html diff --git a/project_euler/pe/p127.html b/puzzles/project_euler/pe/p127.html similarity index 100% rename from project_euler/pe/p127.html rename to puzzles/project_euler/pe/p127.html diff --git a/project_euler/pe/p128.html b/puzzles/project_euler/pe/p128.html similarity index 100% rename from project_euler/pe/p128.html rename to puzzles/project_euler/pe/p128.html diff --git a/project_euler/pe/p129.html b/puzzles/project_euler/pe/p129.html similarity index 100% rename from project_euler/pe/p129.html rename to puzzles/project_euler/pe/p129.html diff --git a/project_euler/pe/p130.html b/puzzles/project_euler/pe/p130.html similarity index 100% rename from project_euler/pe/p130.html rename to puzzles/project_euler/pe/p130.html diff --git a/project_euler/pe/p131.html b/puzzles/project_euler/pe/p131.html similarity index 100% rename from project_euler/pe/p131.html rename to puzzles/project_euler/pe/p131.html diff --git a/project_euler/pe/p132.html b/puzzles/project_euler/pe/p132.html similarity index 100% rename from project_euler/pe/p132.html rename to puzzles/project_euler/pe/p132.html diff --git a/project_euler/pe/p133.html b/puzzles/project_euler/pe/p133.html similarity index 100% rename from project_euler/pe/p133.html rename to puzzles/project_euler/pe/p133.html diff --git a/project_euler/pe/p134.html b/puzzles/project_euler/pe/p134.html similarity index 100% rename from project_euler/pe/p134.html rename to puzzles/project_euler/pe/p134.html diff --git a/project_euler/pe/p135.html b/puzzles/project_euler/pe/p135.html similarity index 100% rename from project_euler/pe/p135.html rename to puzzles/project_euler/pe/p135.html diff --git a/project_euler/pe/p136.html b/puzzles/project_euler/pe/p136.html similarity index 100% rename from project_euler/pe/p136.html rename to puzzles/project_euler/pe/p136.html diff --git a/project_euler/pe/p137.html b/puzzles/project_euler/pe/p137.html similarity index 100% rename from project_euler/pe/p137.html rename to puzzles/project_euler/pe/p137.html diff --git a/project_euler/pe/p138.html b/puzzles/project_euler/pe/p138.html similarity index 100% rename from project_euler/pe/p138.html rename to puzzles/project_euler/pe/p138.html diff --git a/project_euler/pe/p139.html b/puzzles/project_euler/pe/p139.html similarity index 100% rename from project_euler/pe/p139.html rename to puzzles/project_euler/pe/p139.html diff --git a/project_euler/pe/p140.html b/puzzles/project_euler/pe/p140.html similarity index 100% rename from project_euler/pe/p140.html rename to puzzles/project_euler/pe/p140.html diff --git a/project_euler/pe/p141.html b/puzzles/project_euler/pe/p141.html similarity index 100% rename from project_euler/pe/p141.html rename to puzzles/project_euler/pe/p141.html diff --git a/project_euler/pe/p142.html b/puzzles/project_euler/pe/p142.html similarity index 100% rename from project_euler/pe/p142.html rename to puzzles/project_euler/pe/p142.html diff --git a/project_euler/pe/p143.html b/puzzles/project_euler/pe/p143.html similarity index 100% rename from project_euler/pe/p143.html rename to puzzles/project_euler/pe/p143.html diff --git a/project_euler/pe/p144.html b/puzzles/project_euler/pe/p144.html similarity index 100% rename from project_euler/pe/p144.html rename to puzzles/project_euler/pe/p144.html diff --git a/project_euler/pe/p145.html b/puzzles/project_euler/pe/p145.html similarity index 100% rename from project_euler/pe/p145.html rename to puzzles/project_euler/pe/p145.html diff --git a/project_euler/pe/p146.html b/puzzles/project_euler/pe/p146.html similarity index 100% rename from project_euler/pe/p146.html rename to puzzles/project_euler/pe/p146.html diff --git a/project_euler/pe/p147.html b/puzzles/project_euler/pe/p147.html similarity index 100% rename from project_euler/pe/p147.html rename to puzzles/project_euler/pe/p147.html diff --git a/project_euler/pe/p148.html b/puzzles/project_euler/pe/p148.html similarity index 100% rename from project_euler/pe/p148.html rename to puzzles/project_euler/pe/p148.html diff --git a/project_euler/pe/p149.html b/puzzles/project_euler/pe/p149.html similarity index 100% rename from project_euler/pe/p149.html rename to puzzles/project_euler/pe/p149.html diff --git a/project_euler/pe/p150.html b/puzzles/project_euler/pe/p150.html similarity index 100% rename from project_euler/pe/p150.html rename to puzzles/project_euler/pe/p150.html diff --git a/project_euler/pe/p151.html b/puzzles/project_euler/pe/p151.html similarity index 100% rename from project_euler/pe/p151.html rename to puzzles/project_euler/pe/p151.html diff --git a/project_euler/pe/p152.html b/puzzles/project_euler/pe/p152.html similarity index 100% rename from project_euler/pe/p152.html rename to puzzles/project_euler/pe/p152.html diff --git a/project_euler/pe/p153.html b/puzzles/project_euler/pe/p153.html similarity index 100% rename from project_euler/pe/p153.html rename to puzzles/project_euler/pe/p153.html diff --git a/project_euler/pe/p154.html b/puzzles/project_euler/pe/p154.html similarity index 100% rename from project_euler/pe/p154.html rename to puzzles/project_euler/pe/p154.html diff --git a/project_euler/pe/p155.html b/puzzles/project_euler/pe/p155.html similarity index 100% rename from project_euler/pe/p155.html rename to puzzles/project_euler/pe/p155.html diff --git a/project_euler/pe/p156.html b/puzzles/project_euler/pe/p156.html similarity index 100% rename from project_euler/pe/p156.html rename to puzzles/project_euler/pe/p156.html diff --git a/project_euler/pe/p157.html b/puzzles/project_euler/pe/p157.html similarity index 100% rename from project_euler/pe/p157.html rename to puzzles/project_euler/pe/p157.html diff --git a/project_euler/pe/p158.html b/puzzles/project_euler/pe/p158.html similarity index 100% rename from project_euler/pe/p158.html rename to puzzles/project_euler/pe/p158.html diff --git a/project_euler/pe/p159.html b/puzzles/project_euler/pe/p159.html similarity index 100% rename from project_euler/pe/p159.html rename to puzzles/project_euler/pe/p159.html diff --git a/project_euler/pe/p160.html b/puzzles/project_euler/pe/p160.html similarity index 100% rename from project_euler/pe/p160.html rename to puzzles/project_euler/pe/p160.html diff --git a/project_euler/pe/p161.html b/puzzles/project_euler/pe/p161.html similarity index 100% rename from project_euler/pe/p161.html rename to puzzles/project_euler/pe/p161.html diff --git a/project_euler/pe/p162.html b/puzzles/project_euler/pe/p162.html similarity index 100% rename from project_euler/pe/p162.html rename to puzzles/project_euler/pe/p162.html diff --git a/project_euler/pe/p163.html b/puzzles/project_euler/pe/p163.html similarity index 100% rename from project_euler/pe/p163.html rename to puzzles/project_euler/pe/p163.html diff --git a/project_euler/pe/p164.html b/puzzles/project_euler/pe/p164.html similarity index 100% rename from project_euler/pe/p164.html rename to puzzles/project_euler/pe/p164.html diff --git a/project_euler/pe/p165.html b/puzzles/project_euler/pe/p165.html similarity index 100% rename from project_euler/pe/p165.html rename to puzzles/project_euler/pe/p165.html diff --git a/project_euler/pe/p166.html b/puzzles/project_euler/pe/p166.html similarity index 100% rename from project_euler/pe/p166.html rename to puzzles/project_euler/pe/p166.html diff --git a/project_euler/pe/p167.html b/puzzles/project_euler/pe/p167.html similarity index 100% rename from project_euler/pe/p167.html rename to puzzles/project_euler/pe/p167.html diff --git a/project_euler/pe/p168.html b/puzzles/project_euler/pe/p168.html similarity index 100% rename from project_euler/pe/p168.html rename to puzzles/project_euler/pe/p168.html diff --git a/project_euler/pe/p169.html b/puzzles/project_euler/pe/p169.html similarity index 100% rename from project_euler/pe/p169.html rename to puzzles/project_euler/pe/p169.html diff --git a/project_euler/pe/p170.html b/puzzles/project_euler/pe/p170.html similarity index 100% rename from project_euler/pe/p170.html rename to puzzles/project_euler/pe/p170.html diff --git a/project_euler/pe/p171.html b/puzzles/project_euler/pe/p171.html similarity index 100% rename from project_euler/pe/p171.html rename to puzzles/project_euler/pe/p171.html diff --git a/project_euler/pe/p172.html b/puzzles/project_euler/pe/p172.html similarity index 100% rename from project_euler/pe/p172.html rename to puzzles/project_euler/pe/p172.html diff --git a/project_euler/pe/p173.html b/puzzles/project_euler/pe/p173.html similarity index 100% rename from project_euler/pe/p173.html rename to puzzles/project_euler/pe/p173.html diff --git a/project_euler/pe/p174.html b/puzzles/project_euler/pe/p174.html similarity index 100% rename from project_euler/pe/p174.html rename to puzzles/project_euler/pe/p174.html diff --git a/project_euler/pe/p175.html b/puzzles/project_euler/pe/p175.html similarity index 100% rename from project_euler/pe/p175.html rename to puzzles/project_euler/pe/p175.html diff --git a/project_euler/pe/p176.html b/puzzles/project_euler/pe/p176.html similarity index 100% rename from project_euler/pe/p176.html rename to puzzles/project_euler/pe/p176.html diff --git a/project_euler/pe/p177.html b/puzzles/project_euler/pe/p177.html similarity index 100% rename from project_euler/pe/p177.html rename to puzzles/project_euler/pe/p177.html diff --git a/project_euler/pe/p178.html b/puzzles/project_euler/pe/p178.html similarity index 100% rename from project_euler/pe/p178.html rename to puzzles/project_euler/pe/p178.html diff --git a/project_euler/pe/p179.html b/puzzles/project_euler/pe/p179.html similarity index 100% rename from project_euler/pe/p179.html rename to puzzles/project_euler/pe/p179.html diff --git a/project_euler/pe/p180.html b/puzzles/project_euler/pe/p180.html similarity index 100% rename from project_euler/pe/p180.html rename to puzzles/project_euler/pe/p180.html diff --git a/project_euler/pe/p181.html b/puzzles/project_euler/pe/p181.html similarity index 100% rename from project_euler/pe/p181.html rename to puzzles/project_euler/pe/p181.html diff --git a/project_euler/pe/p182.html b/puzzles/project_euler/pe/p182.html similarity index 100% rename from project_euler/pe/p182.html rename to puzzles/project_euler/pe/p182.html diff --git a/project_euler/pe/p183.html b/puzzles/project_euler/pe/p183.html similarity index 100% rename from project_euler/pe/p183.html rename to puzzles/project_euler/pe/p183.html diff --git a/project_euler/pe/p184.html b/puzzles/project_euler/pe/p184.html similarity index 100% rename from project_euler/pe/p184.html rename to puzzles/project_euler/pe/p184.html diff --git a/project_euler/pe/p185.html b/puzzles/project_euler/pe/p185.html similarity index 100% rename from project_euler/pe/p185.html rename to puzzles/project_euler/pe/p185.html diff --git a/project_euler/pe/p186.html b/puzzles/project_euler/pe/p186.html similarity index 100% rename from project_euler/pe/p186.html rename to puzzles/project_euler/pe/p186.html diff --git a/project_euler/pe/p187.html b/puzzles/project_euler/pe/p187.html similarity index 100% rename from project_euler/pe/p187.html rename to puzzles/project_euler/pe/p187.html diff --git a/project_euler/pe/p188.html b/puzzles/project_euler/pe/p188.html similarity index 100% rename from project_euler/pe/p188.html rename to puzzles/project_euler/pe/p188.html diff --git a/project_euler/pe/p189.html b/puzzles/project_euler/pe/p189.html similarity index 100% rename from project_euler/pe/p189.html rename to puzzles/project_euler/pe/p189.html diff --git a/project_euler/pe/p190.html b/puzzles/project_euler/pe/p190.html similarity index 100% rename from project_euler/pe/p190.html rename to puzzles/project_euler/pe/p190.html diff --git a/project_euler/pe/p191.html b/puzzles/project_euler/pe/p191.html similarity index 100% rename from project_euler/pe/p191.html rename to puzzles/project_euler/pe/p191.html diff --git a/project_euler/pe/p192.html b/puzzles/project_euler/pe/p192.html similarity index 100% rename from project_euler/pe/p192.html rename to puzzles/project_euler/pe/p192.html diff --git a/project_euler/pe/p193.html b/puzzles/project_euler/pe/p193.html similarity index 100% rename from project_euler/pe/p193.html rename to puzzles/project_euler/pe/p193.html diff --git a/project_euler/pe/p194.html b/puzzles/project_euler/pe/p194.html similarity index 100% rename from project_euler/pe/p194.html rename to puzzles/project_euler/pe/p194.html diff --git a/project_euler/pe/p195.html b/puzzles/project_euler/pe/p195.html similarity index 100% rename from project_euler/pe/p195.html rename to puzzles/project_euler/pe/p195.html diff --git a/project_euler/pe/p196.html b/puzzles/project_euler/pe/p196.html similarity index 100% rename from project_euler/pe/p196.html rename to puzzles/project_euler/pe/p196.html diff --git a/project_euler/pe/p197.html b/puzzles/project_euler/pe/p197.html similarity index 100% rename from project_euler/pe/p197.html rename to puzzles/project_euler/pe/p197.html diff --git a/project_euler/pe/p198.html b/puzzles/project_euler/pe/p198.html similarity index 100% rename from project_euler/pe/p198.html rename to puzzles/project_euler/pe/p198.html diff --git a/project_euler/pe/p199.html b/puzzles/project_euler/pe/p199.html similarity index 100% rename from project_euler/pe/p199.html rename to puzzles/project_euler/pe/p199.html diff --git a/project_euler/pe/p200.html b/puzzles/project_euler/pe/p200.html similarity index 100% rename from project_euler/pe/p200.html rename to puzzles/project_euler/pe/p200.html diff --git a/project_euler/pe/p201.html b/puzzles/project_euler/pe/p201.html similarity index 100% rename from project_euler/pe/p201.html rename to puzzles/project_euler/pe/p201.html diff --git a/project_euler/pe/p202.html b/puzzles/project_euler/pe/p202.html similarity index 100% rename from project_euler/pe/p202.html rename to puzzles/project_euler/pe/p202.html diff --git a/project_euler/pe/p203.html b/puzzles/project_euler/pe/p203.html similarity index 100% rename from project_euler/pe/p203.html rename to puzzles/project_euler/pe/p203.html diff --git a/project_euler/pe/p204.html b/puzzles/project_euler/pe/p204.html similarity index 100% rename from project_euler/pe/p204.html rename to puzzles/project_euler/pe/p204.html diff --git a/project_euler/pe/p205.html b/puzzles/project_euler/pe/p205.html similarity index 100% rename from project_euler/pe/p205.html rename to puzzles/project_euler/pe/p205.html diff --git a/project_euler/pe/p206.html b/puzzles/project_euler/pe/p206.html similarity index 100% rename from project_euler/pe/p206.html rename to puzzles/project_euler/pe/p206.html diff --git a/project_euler/pe/p207.html b/puzzles/project_euler/pe/p207.html similarity index 100% rename from project_euler/pe/p207.html rename to puzzles/project_euler/pe/p207.html diff --git a/project_euler/pe/p208.html b/puzzles/project_euler/pe/p208.html similarity index 100% rename from project_euler/pe/p208.html rename to puzzles/project_euler/pe/p208.html diff --git a/project_euler/pe/p209.html b/puzzles/project_euler/pe/p209.html similarity index 100% rename from project_euler/pe/p209.html rename to puzzles/project_euler/pe/p209.html diff --git a/project_euler/pe/p210.html b/puzzles/project_euler/pe/p210.html similarity index 100% rename from project_euler/pe/p210.html rename to puzzles/project_euler/pe/p210.html diff --git a/project_euler/pe/p211.html b/puzzles/project_euler/pe/p211.html similarity index 100% rename from project_euler/pe/p211.html rename to puzzles/project_euler/pe/p211.html diff --git a/project_euler/pe/p212.html b/puzzles/project_euler/pe/p212.html similarity index 100% rename from project_euler/pe/p212.html rename to puzzles/project_euler/pe/p212.html diff --git a/project_euler/pe/p213.html b/puzzles/project_euler/pe/p213.html similarity index 100% rename from project_euler/pe/p213.html rename to puzzles/project_euler/pe/p213.html diff --git a/project_euler/pe/p214.html b/puzzles/project_euler/pe/p214.html similarity index 100% rename from project_euler/pe/p214.html rename to puzzles/project_euler/pe/p214.html diff --git a/project_euler/pe/p215.html b/puzzles/project_euler/pe/p215.html similarity index 100% rename from project_euler/pe/p215.html rename to puzzles/project_euler/pe/p215.html diff --git a/project_euler/pe/p216.html b/puzzles/project_euler/pe/p216.html similarity index 100% rename from project_euler/pe/p216.html rename to puzzles/project_euler/pe/p216.html diff --git a/project_euler/pe/p217.html b/puzzles/project_euler/pe/p217.html similarity index 100% rename from project_euler/pe/p217.html rename to puzzles/project_euler/pe/p217.html diff --git a/project_euler/pe/p218.html b/puzzles/project_euler/pe/p218.html similarity index 100% rename from project_euler/pe/p218.html rename to puzzles/project_euler/pe/p218.html diff --git a/project_euler/pe/p219.html b/puzzles/project_euler/pe/p219.html similarity index 100% rename from project_euler/pe/p219.html rename to puzzles/project_euler/pe/p219.html diff --git a/project_euler/pe/p220.html b/puzzles/project_euler/pe/p220.html similarity index 100% rename from project_euler/pe/p220.html rename to puzzles/project_euler/pe/p220.html diff --git a/project_euler/pe/p221.html b/puzzles/project_euler/pe/p221.html similarity index 100% rename from project_euler/pe/p221.html rename to puzzles/project_euler/pe/p221.html diff --git a/project_euler/pe/p222.html b/puzzles/project_euler/pe/p222.html similarity index 100% rename from project_euler/pe/p222.html rename to puzzles/project_euler/pe/p222.html diff --git a/project_euler/pe/p223.html b/puzzles/project_euler/pe/p223.html similarity index 100% rename from project_euler/pe/p223.html rename to puzzles/project_euler/pe/p223.html diff --git a/project_euler/pe/p224.html b/puzzles/project_euler/pe/p224.html similarity index 100% rename from project_euler/pe/p224.html rename to puzzles/project_euler/pe/p224.html diff --git a/project_euler/pe/p225.html b/puzzles/project_euler/pe/p225.html similarity index 100% rename from project_euler/pe/p225.html rename to puzzles/project_euler/pe/p225.html diff --git a/project_euler/pe/p226.html b/puzzles/project_euler/pe/p226.html similarity index 100% rename from project_euler/pe/p226.html rename to puzzles/project_euler/pe/p226.html diff --git a/project_euler/pe/p227.html b/puzzles/project_euler/pe/p227.html similarity index 100% rename from project_euler/pe/p227.html rename to puzzles/project_euler/pe/p227.html diff --git a/project_euler/pe/p228.html b/puzzles/project_euler/pe/p228.html similarity index 100% rename from project_euler/pe/p228.html rename to puzzles/project_euler/pe/p228.html diff --git a/project_euler/pe/p229.html b/puzzles/project_euler/pe/p229.html similarity index 100% rename from project_euler/pe/p229.html rename to puzzles/project_euler/pe/p229.html diff --git a/project_euler/pe/p230.html b/puzzles/project_euler/pe/p230.html similarity index 100% rename from project_euler/pe/p230.html rename to puzzles/project_euler/pe/p230.html diff --git a/project_euler/pe/p231.html b/puzzles/project_euler/pe/p231.html similarity index 100% rename from project_euler/pe/p231.html rename to puzzles/project_euler/pe/p231.html diff --git a/project_euler/pe/p232.html b/puzzles/project_euler/pe/p232.html similarity index 100% rename from project_euler/pe/p232.html rename to puzzles/project_euler/pe/p232.html diff --git a/project_euler/pe/p233.html b/puzzles/project_euler/pe/p233.html similarity index 100% rename from project_euler/pe/p233.html rename to puzzles/project_euler/pe/p233.html diff --git a/project_euler/pe/p234.html b/puzzles/project_euler/pe/p234.html similarity index 100% rename from project_euler/pe/p234.html rename to puzzles/project_euler/pe/p234.html diff --git a/project_euler/pe/p235.html b/puzzles/project_euler/pe/p235.html similarity index 100% rename from project_euler/pe/p235.html rename to puzzles/project_euler/pe/p235.html diff --git a/project_euler/pe/p236.html b/puzzles/project_euler/pe/p236.html similarity index 100% rename from project_euler/pe/p236.html rename to puzzles/project_euler/pe/p236.html diff --git a/project_euler/pe/p237.html b/puzzles/project_euler/pe/p237.html similarity index 100% rename from project_euler/pe/p237.html rename to puzzles/project_euler/pe/p237.html diff --git a/project_euler/pe/p238.html b/puzzles/project_euler/pe/p238.html similarity index 100% rename from project_euler/pe/p238.html rename to puzzles/project_euler/pe/p238.html diff --git a/project_euler/pe/p239.html b/puzzles/project_euler/pe/p239.html similarity index 100% rename from project_euler/pe/p239.html rename to puzzles/project_euler/pe/p239.html diff --git a/project_euler/pe/p240.html b/puzzles/project_euler/pe/p240.html similarity index 100% rename from project_euler/pe/p240.html rename to puzzles/project_euler/pe/p240.html diff --git a/project_euler/pe/p241.html b/puzzles/project_euler/pe/p241.html similarity index 100% rename from project_euler/pe/p241.html rename to puzzles/project_euler/pe/p241.html diff --git a/project_euler/pe/p242.html b/puzzles/project_euler/pe/p242.html similarity index 100% rename from project_euler/pe/p242.html rename to puzzles/project_euler/pe/p242.html diff --git a/project_euler/pe/p243.html b/puzzles/project_euler/pe/p243.html similarity index 100% rename from project_euler/pe/p243.html rename to puzzles/project_euler/pe/p243.html diff --git a/project_euler/pe/p244.html b/puzzles/project_euler/pe/p244.html similarity index 100% rename from project_euler/pe/p244.html rename to puzzles/project_euler/pe/p244.html diff --git a/project_euler/pe/p245.html b/puzzles/project_euler/pe/p245.html similarity index 100% rename from project_euler/pe/p245.html rename to puzzles/project_euler/pe/p245.html diff --git a/project_euler/pe/p246.html b/puzzles/project_euler/pe/p246.html similarity index 100% rename from project_euler/pe/p246.html rename to puzzles/project_euler/pe/p246.html diff --git a/project_euler/pe/p247.html b/puzzles/project_euler/pe/p247.html similarity index 100% rename from project_euler/pe/p247.html rename to puzzles/project_euler/pe/p247.html diff --git a/project_euler/pe/p248.html b/puzzles/project_euler/pe/p248.html similarity index 100% rename from project_euler/pe/p248.html rename to puzzles/project_euler/pe/p248.html diff --git a/project_euler/pe/p249.html b/puzzles/project_euler/pe/p249.html similarity index 100% rename from project_euler/pe/p249.html rename to puzzles/project_euler/pe/p249.html diff --git a/project_euler/pe/p250.html b/puzzles/project_euler/pe/p250.html similarity index 100% rename from project_euler/pe/p250.html rename to puzzles/project_euler/pe/p250.html diff --git a/project_euler/pe/p251.html b/puzzles/project_euler/pe/p251.html similarity index 100% rename from project_euler/pe/p251.html rename to puzzles/project_euler/pe/p251.html diff --git a/project_euler/pe/p252.html b/puzzles/project_euler/pe/p252.html similarity index 100% rename from project_euler/pe/p252.html rename to puzzles/project_euler/pe/p252.html diff --git a/project_euler/pe/p253.html b/puzzles/project_euler/pe/p253.html similarity index 100% rename from project_euler/pe/p253.html rename to puzzles/project_euler/pe/p253.html diff --git a/project_euler/pe/p254.html b/puzzles/project_euler/pe/p254.html similarity index 100% rename from project_euler/pe/p254.html rename to puzzles/project_euler/pe/p254.html diff --git a/project_euler/pe/p255.html b/puzzles/project_euler/pe/p255.html similarity index 100% rename from project_euler/pe/p255.html rename to puzzles/project_euler/pe/p255.html diff --git a/project_euler/pe/p256.html b/puzzles/project_euler/pe/p256.html similarity index 100% rename from project_euler/pe/p256.html rename to puzzles/project_euler/pe/p256.html diff --git a/project_euler/pe/p257.html b/puzzles/project_euler/pe/p257.html similarity index 100% rename from project_euler/pe/p257.html rename to puzzles/project_euler/pe/p257.html diff --git a/project_euler/pe/p258.html b/puzzles/project_euler/pe/p258.html similarity index 100% rename from project_euler/pe/p258.html rename to puzzles/project_euler/pe/p258.html diff --git a/project_euler/pe/p259.html b/puzzles/project_euler/pe/p259.html similarity index 100% rename from project_euler/pe/p259.html rename to puzzles/project_euler/pe/p259.html diff --git a/project_euler/pe/p260.html b/puzzles/project_euler/pe/p260.html similarity index 100% rename from project_euler/pe/p260.html rename to puzzles/project_euler/pe/p260.html diff --git a/project_euler/pe/p261.html b/puzzles/project_euler/pe/p261.html similarity index 100% rename from project_euler/pe/p261.html rename to puzzles/project_euler/pe/p261.html diff --git a/project_euler/pe/p262.html b/puzzles/project_euler/pe/p262.html similarity index 100% rename from project_euler/pe/p262.html rename to puzzles/project_euler/pe/p262.html diff --git a/project_euler/pe/p263.html b/puzzles/project_euler/pe/p263.html similarity index 100% rename from project_euler/pe/p263.html rename to puzzles/project_euler/pe/p263.html diff --git a/project_euler/pe/p264.html b/puzzles/project_euler/pe/p264.html similarity index 100% rename from project_euler/pe/p264.html rename to puzzles/project_euler/pe/p264.html diff --git a/project_euler/pe/p265.html b/puzzles/project_euler/pe/p265.html similarity index 100% rename from project_euler/pe/p265.html rename to puzzles/project_euler/pe/p265.html diff --git a/project_euler/pe/p266.html b/puzzles/project_euler/pe/p266.html similarity index 100% rename from project_euler/pe/p266.html rename to puzzles/project_euler/pe/p266.html diff --git a/project_euler/pe/p267.html b/puzzles/project_euler/pe/p267.html similarity index 100% rename from project_euler/pe/p267.html rename to puzzles/project_euler/pe/p267.html diff --git a/project_euler/pe/p268.html b/puzzles/project_euler/pe/p268.html similarity index 100% rename from project_euler/pe/p268.html rename to puzzles/project_euler/pe/p268.html diff --git a/project_euler/pe/p269.html b/puzzles/project_euler/pe/p269.html similarity index 100% rename from project_euler/pe/p269.html rename to puzzles/project_euler/pe/p269.html diff --git a/project_euler/pe/p270.html b/puzzles/project_euler/pe/p270.html similarity index 100% rename from project_euler/pe/p270.html rename to puzzles/project_euler/pe/p270.html diff --git a/project_euler/pe/p271.html b/puzzles/project_euler/pe/p271.html similarity index 100% rename from project_euler/pe/p271.html rename to puzzles/project_euler/pe/p271.html diff --git a/project_euler/pe/p272.html b/puzzles/project_euler/pe/p272.html similarity index 100% rename from project_euler/pe/p272.html rename to puzzles/project_euler/pe/p272.html diff --git a/project_euler/pe/p273.html b/puzzles/project_euler/pe/p273.html similarity index 100% rename from project_euler/pe/p273.html rename to puzzles/project_euler/pe/p273.html diff --git a/project_euler/pe/p274.html b/puzzles/project_euler/pe/p274.html similarity index 100% rename from project_euler/pe/p274.html rename to puzzles/project_euler/pe/p274.html diff --git a/project_euler/pe/p275.html b/puzzles/project_euler/pe/p275.html similarity index 100% rename from project_euler/pe/p275.html rename to puzzles/project_euler/pe/p275.html diff --git a/project_euler/pe/p276.html b/puzzles/project_euler/pe/p276.html similarity index 100% rename from project_euler/pe/p276.html rename to puzzles/project_euler/pe/p276.html diff --git a/project_euler/pe/p277.html b/puzzles/project_euler/pe/p277.html similarity index 100% rename from project_euler/pe/p277.html rename to puzzles/project_euler/pe/p277.html diff --git a/project_euler/pe/p278.html b/puzzles/project_euler/pe/p278.html similarity index 100% rename from project_euler/pe/p278.html rename to puzzles/project_euler/pe/p278.html diff --git a/project_euler/pe/p279.html b/puzzles/project_euler/pe/p279.html similarity index 100% rename from project_euler/pe/p279.html rename to puzzles/project_euler/pe/p279.html diff --git a/project_euler/pe/p280.html b/puzzles/project_euler/pe/p280.html similarity index 100% rename from project_euler/pe/p280.html rename to puzzles/project_euler/pe/p280.html diff --git a/project_euler/pe/p281.html b/puzzles/project_euler/pe/p281.html similarity index 100% rename from project_euler/pe/p281.html rename to puzzles/project_euler/pe/p281.html diff --git a/project_euler/pe/p282.html b/puzzles/project_euler/pe/p282.html similarity index 100% rename from project_euler/pe/p282.html rename to puzzles/project_euler/pe/p282.html diff --git a/project_euler/pe/p283.html b/puzzles/project_euler/pe/p283.html similarity index 100% rename from project_euler/pe/p283.html rename to puzzles/project_euler/pe/p283.html diff --git a/project_euler/pe/p284.html b/puzzles/project_euler/pe/p284.html similarity index 100% rename from project_euler/pe/p284.html rename to puzzles/project_euler/pe/p284.html diff --git a/project_euler/pe/p285.html b/puzzles/project_euler/pe/p285.html similarity index 100% rename from project_euler/pe/p285.html rename to puzzles/project_euler/pe/p285.html diff --git a/project_euler/pe/p286.html b/puzzles/project_euler/pe/p286.html similarity index 100% rename from project_euler/pe/p286.html rename to puzzles/project_euler/pe/p286.html diff --git a/project_euler/pe/p287.html b/puzzles/project_euler/pe/p287.html similarity index 100% rename from project_euler/pe/p287.html rename to puzzles/project_euler/pe/p287.html diff --git a/project_euler/pe/p288.html b/puzzles/project_euler/pe/p288.html similarity index 100% rename from project_euler/pe/p288.html rename to puzzles/project_euler/pe/p288.html diff --git a/project_euler/pe/p289.html b/puzzles/project_euler/pe/p289.html similarity index 100% rename from project_euler/pe/p289.html rename to puzzles/project_euler/pe/p289.html diff --git a/project_euler/pe/p290.html b/puzzles/project_euler/pe/p290.html similarity index 100% rename from project_euler/pe/p290.html rename to puzzles/project_euler/pe/p290.html diff --git a/project_euler/pe/p291.html b/puzzles/project_euler/pe/p291.html similarity index 100% rename from project_euler/pe/p291.html rename to puzzles/project_euler/pe/p291.html diff --git a/project_euler/pe/p292.html b/puzzles/project_euler/pe/p292.html similarity index 100% rename from project_euler/pe/p292.html rename to puzzles/project_euler/pe/p292.html diff --git a/project_euler/pe/p293.html b/puzzles/project_euler/pe/p293.html similarity index 100% rename from project_euler/pe/p293.html rename to puzzles/project_euler/pe/p293.html diff --git a/project_euler/pe/p294.html b/puzzles/project_euler/pe/p294.html similarity index 100% rename from project_euler/pe/p294.html rename to puzzles/project_euler/pe/p294.html diff --git a/project_euler/pe/p295.html b/puzzles/project_euler/pe/p295.html similarity index 100% rename from project_euler/pe/p295.html rename to puzzles/project_euler/pe/p295.html diff --git a/project_euler/pe/p296.html b/puzzles/project_euler/pe/p296.html similarity index 100% rename from project_euler/pe/p296.html rename to puzzles/project_euler/pe/p296.html diff --git a/project_euler/pe/p297.html b/puzzles/project_euler/pe/p297.html similarity index 100% rename from project_euler/pe/p297.html rename to puzzles/project_euler/pe/p297.html diff --git a/project_euler/pe/p298.html b/puzzles/project_euler/pe/p298.html similarity index 100% rename from project_euler/pe/p298.html rename to puzzles/project_euler/pe/p298.html diff --git a/project_euler/pe/p299.html b/puzzles/project_euler/pe/p299.html similarity index 100% rename from project_euler/pe/p299.html rename to puzzles/project_euler/pe/p299.html diff --git a/project_euler/pe/p300.html b/puzzles/project_euler/pe/p300.html similarity index 100% rename from project_euler/pe/p300.html rename to puzzles/project_euler/pe/p300.html diff --git a/project_euler/pe/p301.html b/puzzles/project_euler/pe/p301.html similarity index 100% rename from project_euler/pe/p301.html rename to puzzles/project_euler/pe/p301.html diff --git a/project_euler/pe/p302.html b/puzzles/project_euler/pe/p302.html similarity index 100% rename from project_euler/pe/p302.html rename to puzzles/project_euler/pe/p302.html diff --git a/project_euler/pe/p303.html b/puzzles/project_euler/pe/p303.html similarity index 100% rename from project_euler/pe/p303.html rename to puzzles/project_euler/pe/p303.html diff --git a/project_euler/pe/p304.html b/puzzles/project_euler/pe/p304.html similarity index 100% rename from project_euler/pe/p304.html rename to puzzles/project_euler/pe/p304.html diff --git a/project_euler/pe/p305.html b/puzzles/project_euler/pe/p305.html similarity index 100% rename from project_euler/pe/p305.html rename to puzzles/project_euler/pe/p305.html diff --git a/project_euler/pe/p306.html b/puzzles/project_euler/pe/p306.html similarity index 100% rename from project_euler/pe/p306.html rename to puzzles/project_euler/pe/p306.html diff --git a/project_euler/pe/p307.html b/puzzles/project_euler/pe/p307.html similarity index 100% rename from project_euler/pe/p307.html rename to puzzles/project_euler/pe/p307.html diff --git a/project_euler/pe/p308.html b/puzzles/project_euler/pe/p308.html similarity index 100% rename from project_euler/pe/p308.html rename to puzzles/project_euler/pe/p308.html diff --git a/project_euler/pe/p309.html b/puzzles/project_euler/pe/p309.html similarity index 100% rename from project_euler/pe/p309.html rename to puzzles/project_euler/pe/p309.html diff --git a/project_euler/pe/p310.html b/puzzles/project_euler/pe/p310.html similarity index 100% rename from project_euler/pe/p310.html rename to puzzles/project_euler/pe/p310.html diff --git a/project_euler/pe/p311.html b/puzzles/project_euler/pe/p311.html similarity index 100% rename from project_euler/pe/p311.html rename to puzzles/project_euler/pe/p311.html diff --git a/project_euler/pe/p312.html b/puzzles/project_euler/pe/p312.html similarity index 100% rename from project_euler/pe/p312.html rename to puzzles/project_euler/pe/p312.html diff --git a/project_euler/pe/p313.html b/puzzles/project_euler/pe/p313.html similarity index 100% rename from project_euler/pe/p313.html rename to puzzles/project_euler/pe/p313.html diff --git a/project_euler/pe/p314.html b/puzzles/project_euler/pe/p314.html similarity index 100% rename from project_euler/pe/p314.html rename to puzzles/project_euler/pe/p314.html diff --git a/project_euler/pe/p315.html b/puzzles/project_euler/pe/p315.html similarity index 100% rename from project_euler/pe/p315.html rename to puzzles/project_euler/pe/p315.html diff --git a/project_euler/pe/p316.html b/puzzles/project_euler/pe/p316.html similarity index 100% rename from project_euler/pe/p316.html rename to puzzles/project_euler/pe/p316.html diff --git a/project_euler/pe/p317.html b/puzzles/project_euler/pe/p317.html similarity index 100% rename from project_euler/pe/p317.html rename to puzzles/project_euler/pe/p317.html diff --git a/project_euler/pe/p318.html b/puzzles/project_euler/pe/p318.html similarity index 100% rename from project_euler/pe/p318.html rename to puzzles/project_euler/pe/p318.html diff --git a/project_euler/pe/p319.html b/puzzles/project_euler/pe/p319.html similarity index 100% rename from project_euler/pe/p319.html rename to puzzles/project_euler/pe/p319.html diff --git a/project_euler/pe/p320.html b/puzzles/project_euler/pe/p320.html similarity index 100% rename from project_euler/pe/p320.html rename to puzzles/project_euler/pe/p320.html diff --git a/project_euler/pe/p321.html b/puzzles/project_euler/pe/p321.html similarity index 100% rename from project_euler/pe/p321.html rename to puzzles/project_euler/pe/p321.html diff --git a/project_euler/pe/p322.html b/puzzles/project_euler/pe/p322.html similarity index 100% rename from project_euler/pe/p322.html rename to puzzles/project_euler/pe/p322.html diff --git a/project_euler/pe/p323.html b/puzzles/project_euler/pe/p323.html similarity index 100% rename from project_euler/pe/p323.html rename to puzzles/project_euler/pe/p323.html diff --git a/project_euler/pe/p324.html b/puzzles/project_euler/pe/p324.html similarity index 100% rename from project_euler/pe/p324.html rename to puzzles/project_euler/pe/p324.html diff --git a/project_euler/pe/p325.html b/puzzles/project_euler/pe/p325.html similarity index 100% rename from project_euler/pe/p325.html rename to puzzles/project_euler/pe/p325.html diff --git a/project_euler/pe/p326.html b/puzzles/project_euler/pe/p326.html similarity index 100% rename from project_euler/pe/p326.html rename to puzzles/project_euler/pe/p326.html diff --git a/project_euler/pe/p327.html b/puzzles/project_euler/pe/p327.html similarity index 100% rename from project_euler/pe/p327.html rename to puzzles/project_euler/pe/p327.html diff --git a/project_euler/pe/p328.html b/puzzles/project_euler/pe/p328.html similarity index 100% rename from project_euler/pe/p328.html rename to puzzles/project_euler/pe/p328.html diff --git a/project_euler/pe/p329.html b/puzzles/project_euler/pe/p329.html similarity index 100% rename from project_euler/pe/p329.html rename to puzzles/project_euler/pe/p329.html diff --git a/project_euler/pe/p330.html b/puzzles/project_euler/pe/p330.html similarity index 100% rename from project_euler/pe/p330.html rename to puzzles/project_euler/pe/p330.html diff --git a/project_euler/pe/p331.html b/puzzles/project_euler/pe/p331.html similarity index 100% rename from project_euler/pe/p331.html rename to puzzles/project_euler/pe/p331.html diff --git a/project_euler/pe/p332.html b/puzzles/project_euler/pe/p332.html similarity index 100% rename from project_euler/pe/p332.html rename to puzzles/project_euler/pe/p332.html diff --git a/project_euler/pe/p333.html b/puzzles/project_euler/pe/p333.html similarity index 100% rename from project_euler/pe/p333.html rename to puzzles/project_euler/pe/p333.html diff --git a/project_euler/pe/p334.html b/puzzles/project_euler/pe/p334.html similarity index 100% rename from project_euler/pe/p334.html rename to puzzles/project_euler/pe/p334.html diff --git a/project_euler/pe/p335.html b/puzzles/project_euler/pe/p335.html similarity index 100% rename from project_euler/pe/p335.html rename to puzzles/project_euler/pe/p335.html diff --git a/project_euler/pe/p336.html b/puzzles/project_euler/pe/p336.html similarity index 100% rename from project_euler/pe/p336.html rename to puzzles/project_euler/pe/p336.html diff --git a/project_euler/pe/p337.html b/puzzles/project_euler/pe/p337.html similarity index 100% rename from project_euler/pe/p337.html rename to puzzles/project_euler/pe/p337.html diff --git a/project_euler/pe/p338.html b/puzzles/project_euler/pe/p338.html similarity index 100% rename from project_euler/pe/p338.html rename to puzzles/project_euler/pe/p338.html diff --git a/project_euler/pe/p339.html b/puzzles/project_euler/pe/p339.html similarity index 100% rename from project_euler/pe/p339.html rename to puzzles/project_euler/pe/p339.html diff --git a/project_euler/pe/p340.html b/puzzles/project_euler/pe/p340.html similarity index 100% rename from project_euler/pe/p340.html rename to puzzles/project_euler/pe/p340.html diff --git a/project_euler/pe/p341.html b/puzzles/project_euler/pe/p341.html similarity index 100% rename from project_euler/pe/p341.html rename to puzzles/project_euler/pe/p341.html diff --git a/project_euler/pe/p342.html b/puzzles/project_euler/pe/p342.html similarity index 100% rename from project_euler/pe/p342.html rename to puzzles/project_euler/pe/p342.html diff --git a/project_euler/pe/p343.html b/puzzles/project_euler/pe/p343.html similarity index 100% rename from project_euler/pe/p343.html rename to puzzles/project_euler/pe/p343.html diff --git a/project_euler/pe/p344.html b/puzzles/project_euler/pe/p344.html similarity index 100% rename from project_euler/pe/p344.html rename to puzzles/project_euler/pe/p344.html diff --git a/project_euler/pe/p345.html b/puzzles/project_euler/pe/p345.html similarity index 100% rename from project_euler/pe/p345.html rename to puzzles/project_euler/pe/p345.html diff --git a/project_euler/pe/p346.html b/puzzles/project_euler/pe/p346.html similarity index 100% rename from project_euler/pe/p346.html rename to puzzles/project_euler/pe/p346.html diff --git a/project_euler/pe/p347.html b/puzzles/project_euler/pe/p347.html similarity index 100% rename from project_euler/pe/p347.html rename to puzzles/project_euler/pe/p347.html diff --git a/project_euler/pe/p348.html b/puzzles/project_euler/pe/p348.html similarity index 100% rename from project_euler/pe/p348.html rename to puzzles/project_euler/pe/p348.html diff --git a/project_euler/pe/p349.html b/puzzles/project_euler/pe/p349.html similarity index 100% rename from project_euler/pe/p349.html rename to puzzles/project_euler/pe/p349.html diff --git a/project_euler/pe/p350.html b/puzzles/project_euler/pe/p350.html similarity index 100% rename from project_euler/pe/p350.html rename to puzzles/project_euler/pe/p350.html diff --git a/project_euler/pe/p351.html b/puzzles/project_euler/pe/p351.html similarity index 100% rename from project_euler/pe/p351.html rename to puzzles/project_euler/pe/p351.html diff --git a/project_euler/pe/p352.html b/puzzles/project_euler/pe/p352.html similarity index 100% rename from project_euler/pe/p352.html rename to puzzles/project_euler/pe/p352.html diff --git a/project_euler/pe/p353.html b/puzzles/project_euler/pe/p353.html similarity index 100% rename from project_euler/pe/p353.html rename to puzzles/project_euler/pe/p353.html diff --git a/project_euler/pe/p354.html b/puzzles/project_euler/pe/p354.html similarity index 100% rename from project_euler/pe/p354.html rename to puzzles/project_euler/pe/p354.html diff --git a/project_euler/pe/p355.html b/puzzles/project_euler/pe/p355.html similarity index 100% rename from project_euler/pe/p355.html rename to puzzles/project_euler/pe/p355.html diff --git a/project_euler/pe/p356.html b/puzzles/project_euler/pe/p356.html similarity index 100% rename from project_euler/pe/p356.html rename to puzzles/project_euler/pe/p356.html diff --git a/project_euler/pe/p357.html b/puzzles/project_euler/pe/p357.html similarity index 100% rename from project_euler/pe/p357.html rename to puzzles/project_euler/pe/p357.html diff --git a/project_euler/pe/p358.html b/puzzles/project_euler/pe/p358.html similarity index 100% rename from project_euler/pe/p358.html rename to puzzles/project_euler/pe/p358.html diff --git a/project_euler/pe/p359.html b/puzzles/project_euler/pe/p359.html similarity index 100% rename from project_euler/pe/p359.html rename to puzzles/project_euler/pe/p359.html diff --git a/project_euler/pe/p360.html b/puzzles/project_euler/pe/p360.html similarity index 100% rename from project_euler/pe/p360.html rename to puzzles/project_euler/pe/p360.html diff --git a/project_euler/pe/p361.html b/puzzles/project_euler/pe/p361.html similarity index 100% rename from project_euler/pe/p361.html rename to puzzles/project_euler/pe/p361.html diff --git a/project_euler/pe/p362.html b/puzzles/project_euler/pe/p362.html similarity index 100% rename from project_euler/pe/p362.html rename to puzzles/project_euler/pe/p362.html diff --git a/project_euler/pe/p363.html b/puzzles/project_euler/pe/p363.html similarity index 100% rename from project_euler/pe/p363.html rename to puzzles/project_euler/pe/p363.html diff --git a/project_euler/pe/p364.html b/puzzles/project_euler/pe/p364.html similarity index 100% rename from project_euler/pe/p364.html rename to puzzles/project_euler/pe/p364.html diff --git a/project_euler/pe/p365.html b/puzzles/project_euler/pe/p365.html similarity index 100% rename from project_euler/pe/p365.html rename to puzzles/project_euler/pe/p365.html diff --git a/project_euler/pe/p366.html b/puzzles/project_euler/pe/p366.html similarity index 100% rename from project_euler/pe/p366.html rename to puzzles/project_euler/pe/p366.html diff --git a/project_euler/pe/p367.html b/puzzles/project_euler/pe/p367.html similarity index 100% rename from project_euler/pe/p367.html rename to puzzles/project_euler/pe/p367.html diff --git a/project_euler/pe/p368.html b/puzzles/project_euler/pe/p368.html similarity index 100% rename from project_euler/pe/p368.html rename to puzzles/project_euler/pe/p368.html diff --git a/project_euler/pe/p369.html b/puzzles/project_euler/pe/p369.html similarity index 100% rename from project_euler/pe/p369.html rename to puzzles/project_euler/pe/p369.html diff --git a/project_euler/pe/p370.html b/puzzles/project_euler/pe/p370.html similarity index 100% rename from project_euler/pe/p370.html rename to puzzles/project_euler/pe/p370.html diff --git a/project_euler/pe/p371.html b/puzzles/project_euler/pe/p371.html similarity index 100% rename from project_euler/pe/p371.html rename to puzzles/project_euler/pe/p371.html diff --git a/project_euler/pe/p372.html b/puzzles/project_euler/pe/p372.html similarity index 100% rename from project_euler/pe/p372.html rename to puzzles/project_euler/pe/p372.html diff --git a/project_euler/pe/p373.html b/puzzles/project_euler/pe/p373.html similarity index 100% rename from project_euler/pe/p373.html rename to puzzles/project_euler/pe/p373.html diff --git a/project_euler/pe/p374.html b/puzzles/project_euler/pe/p374.html similarity index 100% rename from project_euler/pe/p374.html rename to puzzles/project_euler/pe/p374.html diff --git a/project_euler/pe/p375.html b/puzzles/project_euler/pe/p375.html similarity index 100% rename from project_euler/pe/p375.html rename to puzzles/project_euler/pe/p375.html diff --git a/project_euler/pe/p376.html b/puzzles/project_euler/pe/p376.html similarity index 100% rename from project_euler/pe/p376.html rename to puzzles/project_euler/pe/p376.html diff --git a/project_euler/pe/p377.html b/puzzles/project_euler/pe/p377.html similarity index 100% rename from project_euler/pe/p377.html rename to puzzles/project_euler/pe/p377.html diff --git a/project_euler/pe/p378.html b/puzzles/project_euler/pe/p378.html similarity index 100% rename from project_euler/pe/p378.html rename to puzzles/project_euler/pe/p378.html diff --git a/project_euler/pe/p379.html b/puzzles/project_euler/pe/p379.html similarity index 100% rename from project_euler/pe/p379.html rename to puzzles/project_euler/pe/p379.html diff --git a/project_euler/pe/p380.html b/puzzles/project_euler/pe/p380.html similarity index 100% rename from project_euler/pe/p380.html rename to puzzles/project_euler/pe/p380.html diff --git a/project_euler/pe/p381.html b/puzzles/project_euler/pe/p381.html similarity index 100% rename from project_euler/pe/p381.html rename to puzzles/project_euler/pe/p381.html diff --git a/project_euler/pe/p382.html b/puzzles/project_euler/pe/p382.html similarity index 100% rename from project_euler/pe/p382.html rename to puzzles/project_euler/pe/p382.html diff --git a/project_euler/pe/p383.html b/puzzles/project_euler/pe/p383.html similarity index 100% rename from project_euler/pe/p383.html rename to puzzles/project_euler/pe/p383.html diff --git a/project_euler/pe/p384.html b/puzzles/project_euler/pe/p384.html similarity index 100% rename from project_euler/pe/p384.html rename to puzzles/project_euler/pe/p384.html diff --git a/project_euler/pe/p385.html b/puzzles/project_euler/pe/p385.html similarity index 100% rename from project_euler/pe/p385.html rename to puzzles/project_euler/pe/p385.html diff --git a/project_euler/pe/p386.html b/puzzles/project_euler/pe/p386.html similarity index 100% rename from project_euler/pe/p386.html rename to puzzles/project_euler/pe/p386.html diff --git a/project_euler/pe/p387.html b/puzzles/project_euler/pe/p387.html similarity index 100% rename from project_euler/pe/p387.html rename to puzzles/project_euler/pe/p387.html diff --git a/project_euler/pe/p388.html b/puzzles/project_euler/pe/p388.html similarity index 100% rename from project_euler/pe/p388.html rename to puzzles/project_euler/pe/p388.html diff --git a/project_euler/pe/p389.html b/puzzles/project_euler/pe/p389.html similarity index 100% rename from project_euler/pe/p389.html rename to puzzles/project_euler/pe/p389.html diff --git a/project_euler/pe/p390.html b/puzzles/project_euler/pe/p390.html similarity index 100% rename from project_euler/pe/p390.html rename to puzzles/project_euler/pe/p390.html diff --git a/project_euler/pe/p391.html b/puzzles/project_euler/pe/p391.html similarity index 100% rename from project_euler/pe/p391.html rename to puzzles/project_euler/pe/p391.html diff --git a/project_euler/pe/p392.html b/puzzles/project_euler/pe/p392.html similarity index 100% rename from project_euler/pe/p392.html rename to puzzles/project_euler/pe/p392.html diff --git a/project_euler/pe/p393.html b/puzzles/project_euler/pe/p393.html similarity index 100% rename from project_euler/pe/p393.html rename to puzzles/project_euler/pe/p393.html diff --git a/project_euler/pe/p394.html b/puzzles/project_euler/pe/p394.html similarity index 100% rename from project_euler/pe/p394.html rename to puzzles/project_euler/pe/p394.html diff --git a/project_euler/pe/p395.html b/puzzles/project_euler/pe/p395.html similarity index 100% rename from project_euler/pe/p395.html rename to puzzles/project_euler/pe/p395.html diff --git a/project_euler/pe/p396.html b/puzzles/project_euler/pe/p396.html similarity index 100% rename from project_euler/pe/p396.html rename to puzzles/project_euler/pe/p396.html diff --git a/project_euler/pe/p397.html b/puzzles/project_euler/pe/p397.html similarity index 100% rename from project_euler/pe/p397.html rename to puzzles/project_euler/pe/p397.html diff --git a/project_euler/pe/p398.html b/puzzles/project_euler/pe/p398.html similarity index 100% rename from project_euler/pe/p398.html rename to puzzles/project_euler/pe/p398.html diff --git a/project_euler/pe/p399.html b/puzzles/project_euler/pe/p399.html similarity index 100% rename from project_euler/pe/p399.html rename to puzzles/project_euler/pe/p399.html diff --git a/project_euler/pe/p400.html b/puzzles/project_euler/pe/p400.html similarity index 100% rename from project_euler/pe/p400.html rename to puzzles/project_euler/pe/p400.html diff --git a/project_euler/pe/p401.html b/puzzles/project_euler/pe/p401.html similarity index 100% rename from project_euler/pe/p401.html rename to puzzles/project_euler/pe/p401.html diff --git a/project_euler/pe/p402.html b/puzzles/project_euler/pe/p402.html similarity index 100% rename from project_euler/pe/p402.html rename to puzzles/project_euler/pe/p402.html diff --git a/project_euler/pe/p403.html b/puzzles/project_euler/pe/p403.html similarity index 100% rename from project_euler/pe/p403.html rename to puzzles/project_euler/pe/p403.html diff --git a/project_euler/pe/p404.html b/puzzles/project_euler/pe/p404.html similarity index 100% rename from project_euler/pe/p404.html rename to puzzles/project_euler/pe/p404.html diff --git a/project_euler/pe/p405.html b/puzzles/project_euler/pe/p405.html similarity index 100% rename from project_euler/pe/p405.html rename to puzzles/project_euler/pe/p405.html diff --git a/project_euler/pe/p406.html b/puzzles/project_euler/pe/p406.html similarity index 100% rename from project_euler/pe/p406.html rename to puzzles/project_euler/pe/p406.html diff --git a/project_euler/pe/p407.html b/puzzles/project_euler/pe/p407.html similarity index 100% rename from project_euler/pe/p407.html rename to puzzles/project_euler/pe/p407.html diff --git a/project_euler/pe/p408.html b/puzzles/project_euler/pe/p408.html similarity index 100% rename from project_euler/pe/p408.html rename to puzzles/project_euler/pe/p408.html diff --git a/project_euler/pe/p409.html b/puzzles/project_euler/pe/p409.html similarity index 100% rename from project_euler/pe/p409.html rename to puzzles/project_euler/pe/p409.html diff --git a/project_euler/pe/p410.html b/puzzles/project_euler/pe/p410.html similarity index 100% rename from project_euler/pe/p410.html rename to puzzles/project_euler/pe/p410.html diff --git a/project_euler/pe/p411.html b/puzzles/project_euler/pe/p411.html similarity index 100% rename from project_euler/pe/p411.html rename to puzzles/project_euler/pe/p411.html diff --git a/project_euler/pe/p412.html b/puzzles/project_euler/pe/p412.html similarity index 100% rename from project_euler/pe/p412.html rename to puzzles/project_euler/pe/p412.html diff --git a/project_euler/pe/p413.html b/puzzles/project_euler/pe/p413.html similarity index 100% rename from project_euler/pe/p413.html rename to puzzles/project_euler/pe/p413.html diff --git a/project_euler/pe/p414.html b/puzzles/project_euler/pe/p414.html similarity index 100% rename from project_euler/pe/p414.html rename to puzzles/project_euler/pe/p414.html diff --git a/project_euler/pe/p415.html b/puzzles/project_euler/pe/p415.html similarity index 100% rename from project_euler/pe/p415.html rename to puzzles/project_euler/pe/p415.html diff --git a/project_euler/pe/p416.html b/puzzles/project_euler/pe/p416.html similarity index 100% rename from project_euler/pe/p416.html rename to puzzles/project_euler/pe/p416.html diff --git a/project_euler/pe/p417.html b/puzzles/project_euler/pe/p417.html similarity index 100% rename from project_euler/pe/p417.html rename to puzzles/project_euler/pe/p417.html diff --git a/project_euler/pe/p418.html b/puzzles/project_euler/pe/p418.html similarity index 100% rename from project_euler/pe/p418.html rename to puzzles/project_euler/pe/p418.html diff --git a/project_euler/pe/p419.html b/puzzles/project_euler/pe/p419.html similarity index 100% rename from project_euler/pe/p419.html rename to puzzles/project_euler/pe/p419.html diff --git a/project_euler/pe/p420.html b/puzzles/project_euler/pe/p420.html similarity index 100% rename from project_euler/pe/p420.html rename to puzzles/project_euler/pe/p420.html diff --git a/project_euler/pe/p421.html b/puzzles/project_euler/pe/p421.html similarity index 100% rename from project_euler/pe/p421.html rename to puzzles/project_euler/pe/p421.html diff --git a/project_euler/pe/p422.html b/puzzles/project_euler/pe/p422.html similarity index 100% rename from project_euler/pe/p422.html rename to puzzles/project_euler/pe/p422.html diff --git a/project_euler/pe/p423.html b/puzzles/project_euler/pe/p423.html similarity index 100% rename from project_euler/pe/p423.html rename to puzzles/project_euler/pe/p423.html diff --git a/project_euler/pe/p424.html b/puzzles/project_euler/pe/p424.html similarity index 100% rename from project_euler/pe/p424.html rename to puzzles/project_euler/pe/p424.html diff --git a/project_euler/pe/p425.html b/puzzles/project_euler/pe/p425.html similarity index 100% rename from project_euler/pe/p425.html rename to puzzles/project_euler/pe/p425.html diff --git a/project_euler/pe/p426.html b/puzzles/project_euler/pe/p426.html similarity index 100% rename from project_euler/pe/p426.html rename to puzzles/project_euler/pe/p426.html diff --git a/project_euler/pe/p427.html b/puzzles/project_euler/pe/p427.html similarity index 100% rename from project_euler/pe/p427.html rename to puzzles/project_euler/pe/p427.html diff --git a/project_euler/pe/p428.html b/puzzles/project_euler/pe/p428.html similarity index 100% rename from project_euler/pe/p428.html rename to puzzles/project_euler/pe/p428.html diff --git a/project_euler/pe/p429.html b/puzzles/project_euler/pe/p429.html similarity index 100% rename from project_euler/pe/p429.html rename to puzzles/project_euler/pe/p429.html diff --git a/project_euler/pe/p430.html b/puzzles/project_euler/pe/p430.html similarity index 100% rename from project_euler/pe/p430.html rename to puzzles/project_euler/pe/p430.html diff --git a/project_euler/pe/p431.html b/puzzles/project_euler/pe/p431.html similarity index 100% rename from project_euler/pe/p431.html rename to puzzles/project_euler/pe/p431.html diff --git a/project_euler/pe/p432.html b/puzzles/project_euler/pe/p432.html similarity index 100% rename from project_euler/pe/p432.html rename to puzzles/project_euler/pe/p432.html diff --git a/project_euler/pe/p433.html b/puzzles/project_euler/pe/p433.html similarity index 100% rename from project_euler/pe/p433.html rename to puzzles/project_euler/pe/p433.html diff --git a/project_euler/pe/p434.html b/puzzles/project_euler/pe/p434.html similarity index 100% rename from project_euler/pe/p434.html rename to puzzles/project_euler/pe/p434.html diff --git a/project_euler/pe/p435.html b/puzzles/project_euler/pe/p435.html similarity index 100% rename from project_euler/pe/p435.html rename to puzzles/project_euler/pe/p435.html diff --git a/project_euler/tmpl.py b/puzzles/project_euler/tmpl.py similarity index 100% rename from project_euler/tmpl.py rename to puzzles/project_euler/tmpl.py diff --git a/mergeTwoFiles/mergeTwoFiles.cpp b/util/mergeTwoFiles.cpp similarity index 100% rename from mergeTwoFiles/mergeTwoFiles.cpp rename to util/mergeTwoFiles.cpp