initial commit
This commit is contained in:
10
shawdows_of_the_knight_episode_1/.gitignore
vendored
Normal file
10
shawdows_of_the_knight_episode_1/.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/bower_components/
|
||||||
|
/node_modules/
|
||||||
|
/.pulp-cache/
|
||||||
|
/output/
|
||||||
|
/generated-docs/
|
||||||
|
/.psc-package/
|
||||||
|
/.psc*
|
||||||
|
/.purs*
|
||||||
|
/.psa*
|
||||||
|
/.spago
|
||||||
22
shawdows_of_the_knight_episode_1/.vscode/tasks.json
vendored
Normal file
22
shawdows_of_the_knight_episode_1/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||||
|
// for the documentation about the tasks.json format
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "build_purescript",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "spago bundle-app && uglifyj s index.js --compress --mangle --output index.js",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "build_purescript_old",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "spago bundle-app && sed -i \"$ d\" index.js && uglifyjs index.js --compress --mangle --output index.js",
|
||||||
|
"group": "build"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
441
shawdows_of_the_knight_episode_1/index.js
Normal file
441
shawdows_of_the_knight_episode_1/index.js
Normal file
@@ -0,0 +1,441 @@
|
|||||||
|
// Generated by purs bundle 0.13.6
|
||||||
|
var PS = {};
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Control.Semigroupoid"] = $PS["Control.Semigroupoid"] || {};
|
||||||
|
var exports = $PS["Control.Semigroupoid"];
|
||||||
|
var Semigroupoid = function (compose) {
|
||||||
|
this.compose = compose;
|
||||||
|
};
|
||||||
|
var semigroupoidFn = new Semigroupoid(function (f) {
|
||||||
|
return function (g) {
|
||||||
|
return function (x) {
|
||||||
|
return f(g(x));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
exports["semigroupoidFn"] = semigroupoidFn;
|
||||||
|
})(PS);
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Control.Category"] = $PS["Control.Category"] || {};
|
||||||
|
var exports = $PS["Control.Category"];
|
||||||
|
var Control_Semigroupoid = $PS["Control.Semigroupoid"];
|
||||||
|
var Category = function (Semigroupoid0, identity) {
|
||||||
|
this.Semigroupoid0 = Semigroupoid0;
|
||||||
|
this.identity = identity;
|
||||||
|
};
|
||||||
|
var identity = function (dict) {
|
||||||
|
return dict.identity;
|
||||||
|
};
|
||||||
|
var categoryFn = new Category(function () {
|
||||||
|
return Control_Semigroupoid.semigroupoidFn;
|
||||||
|
}, function (x) {
|
||||||
|
return x;
|
||||||
|
});
|
||||||
|
exports["identity"] = identity;
|
||||||
|
exports["categoryFn"] = categoryFn;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.intSub = function (x) {
|
||||||
|
return function (y) {
|
||||||
|
/* jshint bitwise: false */
|
||||||
|
return x - y | 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})(PS["Data.Ring"] = PS["Data.Ring"] || {});
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.intAdd = function (x) {
|
||||||
|
return function (y) {
|
||||||
|
/* jshint bitwise: false */
|
||||||
|
return x + y | 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.intMul = function (x) {
|
||||||
|
return function (y) {
|
||||||
|
/* jshint bitwise: false */
|
||||||
|
return x * y | 0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})(PS["Data.Semiring"] = PS["Data.Semiring"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.Semiring"] = $PS["Data.Semiring"] || {};
|
||||||
|
var exports = $PS["Data.Semiring"];
|
||||||
|
var $foreign = $PS["Data.Semiring"];
|
||||||
|
var Semiring = function (add, mul, one, zero) {
|
||||||
|
this.add = add;
|
||||||
|
this.mul = mul;
|
||||||
|
this.one = one;
|
||||||
|
this.zero = zero;
|
||||||
|
};
|
||||||
|
var semiringInt = new Semiring($foreign.intAdd, $foreign.intMul, 1, 0);
|
||||||
|
exports["semiringInt"] = semiringInt;
|
||||||
|
})(PS);
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.Ring"] = $PS["Data.Ring"] || {};
|
||||||
|
var exports = $PS["Data.Ring"];
|
||||||
|
var $foreign = $PS["Data.Ring"];
|
||||||
|
var Data_Semiring = $PS["Data.Semiring"];
|
||||||
|
var Ring = function (Semiring0, sub) {
|
||||||
|
this.Semiring0 = Semiring0;
|
||||||
|
this.sub = sub;
|
||||||
|
};
|
||||||
|
var ringInt = new Ring(function () {
|
||||||
|
return Data_Semiring.semiringInt;
|
||||||
|
}, $foreign.intSub);
|
||||||
|
exports["ringInt"] = ringInt;
|
||||||
|
})(PS);
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.CommutativeRing"] = $PS["Data.CommutativeRing"] || {};
|
||||||
|
var exports = $PS["Data.CommutativeRing"];
|
||||||
|
var Data_Ring = $PS["Data.Ring"];
|
||||||
|
var CommutativeRing = function (Ring0) {
|
||||||
|
this.Ring0 = Ring0;
|
||||||
|
};
|
||||||
|
var commutativeRingInt = new CommutativeRing(function () {
|
||||||
|
return Data_Ring.ringInt;
|
||||||
|
});
|
||||||
|
exports["commutativeRingInt"] = commutativeRingInt;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.intDegree = function (x) {
|
||||||
|
return Math.min(Math.abs(x), 2147483647);
|
||||||
|
};
|
||||||
|
|
||||||
|
// See the Euclidean definition in
|
||||||
|
// https://en.m.wikipedia.org/wiki/Modulo_operation.
|
||||||
|
exports.intDiv = function (x) {
|
||||||
|
return function (y) {
|
||||||
|
if (y === 0) return 0;
|
||||||
|
return y > 0 ? Math.floor(x / y) : -Math.floor(x / -y);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.intMod = function (x) {
|
||||||
|
return function (y) {
|
||||||
|
if (y === 0) return 0;
|
||||||
|
var yy = Math.abs(y);
|
||||||
|
return ((x % yy) + yy) % yy;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})(PS["Data.EuclideanRing"] = PS["Data.EuclideanRing"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.EuclideanRing"] = $PS["Data.EuclideanRing"] || {};
|
||||||
|
var exports = $PS["Data.EuclideanRing"];
|
||||||
|
var $foreign = $PS["Data.EuclideanRing"];
|
||||||
|
var Data_CommutativeRing = $PS["Data.CommutativeRing"];
|
||||||
|
var EuclideanRing = function (CommutativeRing0, degree, div, mod) {
|
||||||
|
this.CommutativeRing0 = CommutativeRing0;
|
||||||
|
this.degree = degree;
|
||||||
|
this.div = div;
|
||||||
|
this.mod = mod;
|
||||||
|
};
|
||||||
|
var euclideanRingInt = new EuclideanRing(function () {
|
||||||
|
return Data_CommutativeRing.commutativeRingInt;
|
||||||
|
}, $foreign.intDegree, $foreign.intDiv, $foreign.intMod);
|
||||||
|
var div = function (dict) {
|
||||||
|
return dict.div;
|
||||||
|
};
|
||||||
|
exports["div"] = div;
|
||||||
|
exports["euclideanRingInt"] = euclideanRingInt;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.fromNumberImpl = function (just) {
|
||||||
|
return function (nothing) {
|
||||||
|
return function (n) {
|
||||||
|
/* jshint bitwise: false */
|
||||||
|
return (n | 0) === n ? just(n) : nothing;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.toNumber = function (n) {
|
||||||
|
return n;
|
||||||
|
};
|
||||||
|
})(PS["Data.Int"] = PS["Data.Int"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.Maybe"] = $PS["Data.Maybe"] || {};
|
||||||
|
var exports = $PS["Data.Maybe"];
|
||||||
|
var Control_Category = $PS["Control.Category"];
|
||||||
|
var Nothing = (function () {
|
||||||
|
function Nothing() {
|
||||||
|
|
||||||
|
};
|
||||||
|
Nothing.value = new Nothing();
|
||||||
|
return Nothing;
|
||||||
|
})();
|
||||||
|
var Just = (function () {
|
||||||
|
function Just(value0) {
|
||||||
|
this.value0 = value0;
|
||||||
|
};
|
||||||
|
Just.create = function (value0) {
|
||||||
|
return new Just(value0);
|
||||||
|
};
|
||||||
|
return Just;
|
||||||
|
})();
|
||||||
|
var maybe = function (v) {
|
||||||
|
return function (v1) {
|
||||||
|
return function (v2) {
|
||||||
|
if (v2 instanceof Nothing) {
|
||||||
|
return v;
|
||||||
|
};
|
||||||
|
if (v2 instanceof Just) {
|
||||||
|
return v1(v2.value0);
|
||||||
|
};
|
||||||
|
throw new Error("Failed pattern match at Data.Maybe (line 217, column 1 - line 217, column 51): " + [ v.constructor.name, v1.constructor.name, v2.constructor.name ]);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
var fromMaybe = function (a) {
|
||||||
|
return maybe(a)(Control_Category.identity(Control_Category.categoryFn));
|
||||||
|
};
|
||||||
|
exports["Nothing"] = Nothing;
|
||||||
|
exports["Just"] = Just;
|
||||||
|
exports["fromMaybe"] = fromMaybe;
|
||||||
|
})(PS);
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.Int"] = $PS["Data.Int"] || {};
|
||||||
|
var exports = $PS["Data.Int"];
|
||||||
|
var $foreign = $PS["Data.Int"];
|
||||||
|
var Data_Maybe = $PS["Data.Maybe"];
|
||||||
|
var fromNumber = $foreign.fromNumberImpl(Data_Maybe.Just.create)(Data_Maybe.Nothing.value);
|
||||||
|
exports["fromNumber"] = fromNumber;
|
||||||
|
exports["toNumber"] = $foreign.toNumber;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.showIntImpl = function (n) {
|
||||||
|
return n.toString();
|
||||||
|
};
|
||||||
|
})(PS["Data.Show"] = PS["Data.Show"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Data.Show"] = $PS["Data.Show"] || {};
|
||||||
|
var exports = $PS["Data.Show"];
|
||||||
|
var $foreign = $PS["Data.Show"];
|
||||||
|
var Show = function (show) {
|
||||||
|
this.show = show;
|
||||||
|
};
|
||||||
|
var showInt = new Show($foreign.showIntImpl);
|
||||||
|
var show = function (dict) {
|
||||||
|
return dict.show;
|
||||||
|
};
|
||||||
|
exports["Show"] = Show;
|
||||||
|
exports["show"] = show;
|
||||||
|
exports["showInt"] = showInt;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.log = function (s) {
|
||||||
|
return function () {
|
||||||
|
console.log(s);
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})(PS["Effect.Console"] = PS["Effect.Console"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Effect.Console"] = $PS["Effect.Console"] || {};
|
||||||
|
var exports = $PS["Effect.Console"];
|
||||||
|
var $foreign = $PS["Effect.Console"];
|
||||||
|
exports["log"] = $foreign.log;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// module Math
|
||||||
|
|
||||||
|
exports.abs = Math.abs;
|
||||||
|
})(PS["Math"] = PS["Math"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Math"] = $PS["Math"] || {};
|
||||||
|
var exports = $PS["Math"];
|
||||||
|
var $foreign = $PS["Math"];
|
||||||
|
exports["abs"] = $foreign.abs;
|
||||||
|
})(PS);
|
||||||
|
(function(exports) {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.readline = readline
|
||||||
|
|
||||||
|
exports.parseInput = function() {
|
||||||
|
var inputs = readline().split(' ');
|
||||||
|
var W = parseInt(inputs[0]); // width of the building.
|
||||||
|
var H = parseInt(inputs[1]); // height of the building.
|
||||||
|
var N = parseInt(readline()); // maximum number of turns before game over.
|
||||||
|
var inputs = readline().split(' ');
|
||||||
|
var X0 = parseInt(inputs[0]);
|
||||||
|
var Y0 = parseInt(inputs[1]);
|
||||||
|
return {
|
||||||
|
width: W,
|
||||||
|
height: H,
|
||||||
|
turns: N,
|
||||||
|
x: X0,
|
||||||
|
y: Y0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(PS["Reader"] = PS["Reader"] || {});
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Reader"] = $PS["Reader"] || {};
|
||||||
|
var exports = $PS["Reader"];
|
||||||
|
var $foreign = $PS["Reader"];
|
||||||
|
exports["parseInput"] = $foreign.parseInput;
|
||||||
|
exports["readline"] = $foreign.readline;
|
||||||
|
})(PS);
|
||||||
|
(function($PS) {
|
||||||
|
// Generated by purs version 0.13.6
|
||||||
|
"use strict";
|
||||||
|
$PS["Main"] = $PS["Main"] || {};
|
||||||
|
var exports = $PS["Main"];
|
||||||
|
var Data_EuclideanRing = $PS["Data.EuclideanRing"];
|
||||||
|
var Data_Int = $PS["Data.Int"];
|
||||||
|
var Data_Maybe = $PS["Data.Maybe"];
|
||||||
|
var Data_Show = $PS["Data.Show"];
|
||||||
|
var Effect_Console = $PS["Effect.Console"];
|
||||||
|
var $$Math = $PS["Math"];
|
||||||
|
var Reader = $PS["Reader"];
|
||||||
|
var Pos = (function () {
|
||||||
|
function Pos(value0, value1) {
|
||||||
|
this.value0 = value0;
|
||||||
|
this.value1 = value1;
|
||||||
|
};
|
||||||
|
Pos.create = function (value0) {
|
||||||
|
return function (value1) {
|
||||||
|
return new Pos(value0, value1);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return Pos;
|
||||||
|
})();
|
||||||
|
var Area = (function () {
|
||||||
|
function Area(value0, value1) {
|
||||||
|
this.value0 = value0;
|
||||||
|
this.value1 = value1;
|
||||||
|
};
|
||||||
|
Area.create = function (value0) {
|
||||||
|
return function (value1) {
|
||||||
|
return new Area(value0, value1);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return Area;
|
||||||
|
})();
|
||||||
|
var showPos = new Data_Show.Show(function (v) {
|
||||||
|
return Data_Show.show(Data_Show.showInt)(v.value0) + (" " + Data_Show.show(Data_Show.showInt)(v.value1));
|
||||||
|
});
|
||||||
|
var calcArea = function (input) {
|
||||||
|
var rY = Pos.create(0)(input.height - 1 | 0);
|
||||||
|
var rX = Pos.create(0)(input.width - 1 | 0);
|
||||||
|
return new Area(rX, rY);
|
||||||
|
};
|
||||||
|
var abs = function (x) {
|
||||||
|
return Data_Maybe.fromMaybe(-1 | 0)(Data_Int.fromNumber($$Math.abs(Data_Int.toNumber(x))));
|
||||||
|
};
|
||||||
|
var getMiddlePos = function (v) {
|
||||||
|
var y = Data_EuclideanRing.div(Data_EuclideanRing.euclideanRingInt)(abs(v.value1.value0 + v.value1.value1 | 0))(2);
|
||||||
|
var x = Data_EuclideanRing.div(Data_EuclideanRing.euclideanRingInt)(abs(v.value0.value0 + v.value0.value1 | 0))(2);
|
||||||
|
return new Pos(x, y);
|
||||||
|
};
|
||||||
|
var loop = function (input) {
|
||||||
|
return function (area) {
|
||||||
|
var yUp = function (y) {
|
||||||
|
return new Pos(y - 1 | 0, 0);
|
||||||
|
};
|
||||||
|
var yDown = function (y) {
|
||||||
|
return new Pos(y + 1 | 0, input.height - 1 | 0);
|
||||||
|
};
|
||||||
|
var xRight = function (x) {
|
||||||
|
return new Pos(x + 1 | 0, input.width - 1 | 0);
|
||||||
|
};
|
||||||
|
var xLeft = function (x) {
|
||||||
|
return new Pos(x - 1 | 0, 0);
|
||||||
|
};
|
||||||
|
var shrinkArea = function (v) {
|
||||||
|
return function (v1) {
|
||||||
|
if (v === "U") {
|
||||||
|
return new Area(new Pos(v1.value0, v1.value0), yUp(v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "D") {
|
||||||
|
return new Area(new Pos(v1.value0, v1.value0), yDown(v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "R") {
|
||||||
|
return new Area(xRight(v1.value0), new Pos(v1.value1, v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "L") {
|
||||||
|
return new Area(xLeft(v1.value0), new Pos(v1.value1, v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "UR") {
|
||||||
|
return new Area(xRight(v1.value0), yUp(v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "DR") {
|
||||||
|
return new Area(xRight(v1.value0), yDown(v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "DL") {
|
||||||
|
return new Area(xLeft(v1.value0), yDown(v1.value1));
|
||||||
|
};
|
||||||
|
if (v === "UL") {
|
||||||
|
return new Area(xLeft(v1.value0), yUp(v1.value1));
|
||||||
|
};
|
||||||
|
return new Area(new Pos(9999, 9999), new Pos(9999, 9999));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return function __do() {
|
||||||
|
var dir = Reader.readline();
|
||||||
|
var pos = new Pos(input.x, input.y);
|
||||||
|
var area$prime = shrinkArea(dir)(pos);
|
||||||
|
var v = getMiddlePos(area$prime);
|
||||||
|
var input$prime = {
|
||||||
|
x: v.value0,
|
||||||
|
y: v.value1,
|
||||||
|
height: input.height,
|
||||||
|
turns: input.turns,
|
||||||
|
width: input.width
|
||||||
|
};
|
||||||
|
Effect_Console.log(Data_Show.show(Data_Show.showInt)(v.value0) + (" " + Data_Show.show(Data_Show.showInt)(v.value1)))();
|
||||||
|
return loop(input$prime)(area$prime)();
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
var main = function __do() {
|
||||||
|
var input = Reader.parseInput();
|
||||||
|
return loop(input)(calcArea(input))();
|
||||||
|
};
|
||||||
|
exports["Pos"] = Pos;
|
||||||
|
exports["Area"] = Area;
|
||||||
|
exports["main"] = main;
|
||||||
|
exports["calcArea"] = calcArea;
|
||||||
|
exports["loop"] = loop;
|
||||||
|
exports["getMiddlePos"] = getMiddlePos;
|
||||||
|
exports["abs"] = abs;
|
||||||
|
exports["showPos"] = showPos;
|
||||||
|
})(PS);
|
||||||
|
PS["Main"].main();
|
||||||
128
shawdows_of_the_knight_episode_1/packages.dhall
Normal file
128
shawdows_of_the_knight_episode_1/packages.dhall
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
{-
|
||||||
|
Welcome to your new Dhall package-set!
|
||||||
|
|
||||||
|
Below are instructions for how to edit this file for most use
|
||||||
|
cases, so that you don't need to know Dhall to use it.
|
||||||
|
|
||||||
|
## Warning: Don't Move This Top-Level Comment!
|
||||||
|
|
||||||
|
Due to how `dhall format` currently works, this comment's
|
||||||
|
instructions cannot appear near corresponding sections below
|
||||||
|
because `dhall format` will delete the comment. However,
|
||||||
|
it will not delete a top-level comment like this one.
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
Most will want to do one or both of these options:
|
||||||
|
1. Override/Patch a package's dependency
|
||||||
|
2. Add a package not already in the default package set
|
||||||
|
|
||||||
|
This file will continue to work whether you use one or both options.
|
||||||
|
Instructions for each option are explained below.
|
||||||
|
|
||||||
|
### Overriding/Patching a package
|
||||||
|
|
||||||
|
Purpose:
|
||||||
|
- Change a package's dependency to a newer/older release than the
|
||||||
|
default package set's release
|
||||||
|
- Use your own modified version of some dependency that may
|
||||||
|
include new API, changed API, removed API by
|
||||||
|
using your custom git repo of the library rather than
|
||||||
|
the package set's repo
|
||||||
|
|
||||||
|
Syntax:
|
||||||
|
Replace the overrides' "{=}" (an empty record) with the following idea
|
||||||
|
The "//" or "⫽" means "merge these two records and
|
||||||
|
when they have the same value, use the one on the right:"
|
||||||
|
-------------------------------
|
||||||
|
let overrides =
|
||||||
|
{ packageName =
|
||||||
|
upstream.packageName // { updateEntity1 = "new value", updateEntity2 = "new value" }
|
||||||
|
, packageName =
|
||||||
|
upstream.packageName // { version = "v4.0.0" }
|
||||||
|
, packageName =
|
||||||
|
upstream.packageName // { repo = "https://www.example.com/path/to/new/repo.git" }
|
||||||
|
}
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Example:
|
||||||
|
-------------------------------
|
||||||
|
let overrides =
|
||||||
|
{ halogen =
|
||||||
|
upstream.halogen // { version = "master" }
|
||||||
|
, halogen-vdom =
|
||||||
|
upstream.halogen-vdom // { version = "v4.0.0" }
|
||||||
|
}
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
### Additions
|
||||||
|
|
||||||
|
Purpose:
|
||||||
|
- Add packages that aren't already included in the default package set
|
||||||
|
|
||||||
|
Syntax:
|
||||||
|
Replace the additions' "{=}" (an empty record) with the following idea:
|
||||||
|
-------------------------------
|
||||||
|
let additions =
|
||||||
|
{ package-name =
|
||||||
|
{ dependencies =
|
||||||
|
[ "dependency1"
|
||||||
|
, "dependency2"
|
||||||
|
]
|
||||||
|
, repo =
|
||||||
|
"https://example.com/path/to/git/repo.git"
|
||||||
|
, version =
|
||||||
|
"tag ('v4.0.0') or branch ('master')"
|
||||||
|
}
|
||||||
|
, package-name =
|
||||||
|
{ dependencies =
|
||||||
|
[ "dependency1"
|
||||||
|
, "dependency2"
|
||||||
|
]
|
||||||
|
, repo =
|
||||||
|
"https://example.com/path/to/git/repo.git"
|
||||||
|
, version =
|
||||||
|
"tag ('v4.0.0') or branch ('master')"
|
||||||
|
}
|
||||||
|
, etc.
|
||||||
|
}
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Example:
|
||||||
|
-------------------------------
|
||||||
|
let additions =
|
||||||
|
{ benchotron =
|
||||||
|
{ dependencies =
|
||||||
|
[ "arrays"
|
||||||
|
, "exists"
|
||||||
|
, "profunctor"
|
||||||
|
, "strings"
|
||||||
|
, "quickcheck"
|
||||||
|
, "lcg"
|
||||||
|
, "transformers"
|
||||||
|
, "foldable-traversable"
|
||||||
|
, "exceptions"
|
||||||
|
, "node-fs"
|
||||||
|
, "node-buffer"
|
||||||
|
, "node-readline"
|
||||||
|
, "datetime"
|
||||||
|
, "now"
|
||||||
|
]
|
||||||
|
, repo =
|
||||||
|
"https://github.com/hdgarrood/purescript-benchotron.git"
|
||||||
|
, version =
|
||||||
|
"v7.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-------------------------------
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
let upstream =
|
||||||
|
https://github.com/purescript/package-sets/releases/download/psc-0.13.6-20200404/packages.dhall sha256:f239f2e215d0cbd5c203307701748581938f74c4c78f4aeffa32c11c131ef7b6
|
||||||
|
|
||||||
|
let overrides = {=}
|
||||||
|
|
||||||
|
let additions = {=}
|
||||||
|
|
||||||
|
in upstream // overrides // additions
|
||||||
17
shawdows_of_the_knight_episode_1/spago.dhall
Normal file
17
shawdows_of_the_knight_episode_1/spago.dhall
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{-
|
||||||
|
Welcome to a Spago project!
|
||||||
|
You can edit this file as you like.
|
||||||
|
-}
|
||||||
|
{ name = "shadown_of_the_knight"
|
||||||
|
, dependencies =
|
||||||
|
[ "arrays"
|
||||||
|
, "console"
|
||||||
|
, "effect"
|
||||||
|
, "integers"
|
||||||
|
, "math"
|
||||||
|
, "psci-support"
|
||||||
|
, "random"
|
||||||
|
]
|
||||||
|
, packages = ./packages.dhall
|
||||||
|
, sources = [ "src/**/*.purs", "test/**/*.purs" ]
|
||||||
|
}
|
||||||
91
shawdows_of_the_knight_episode_1/src/Main.purs
Normal file
91
shawdows_of_the_knight_episode_1/src/Main.purs
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
module Main where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
import Data.Array (filter, head, length, reverse, sort, sortBy, (!!), (..))
|
||||||
|
import Data.Int (fromNumber, toNumber)
|
||||||
|
import Data.Maybe (fromMaybe)
|
||||||
|
import Effect (Effect)
|
||||||
|
import Effect.Console (error, log)
|
||||||
|
import Math as M
|
||||||
|
import Range (Range(..), Area(..), Pos(..), range, fromPos)
|
||||||
|
import Reader (GameInput, parseInput, readline)
|
||||||
|
|
||||||
|
main :: Effect Unit
|
||||||
|
main = do
|
||||||
|
input <- parseInput
|
||||||
|
loop input (calcArea input)
|
||||||
|
|
||||||
|
calcArea :: GameInput -> Area
|
||||||
|
calcArea input = Area rX rY
|
||||||
|
where
|
||||||
|
rX = range 0 $ input.width - 1
|
||||||
|
rY = range 0 $ input.height - 1
|
||||||
|
|
||||||
|
loop :: GameInput -> Area -> Effect Unit
|
||||||
|
loop input area = do
|
||||||
|
dir <- readline
|
||||||
|
|
||||||
|
let pos = Pos input.x input.y
|
||||||
|
|
||||||
|
let area' = shrinkArea dir area (fromPos pos)
|
||||||
|
let (Pos x y) = getMiddlePos area'
|
||||||
|
let input' = input { x = x, y = y }
|
||||||
|
|
||||||
|
log $ show x <> " " <> show y
|
||||||
|
|
||||||
|
loop input' area'
|
||||||
|
|
||||||
|
where
|
||||||
|
shrinkArea :: String -> Area -> Range -> Area
|
||||||
|
shrinkArea "U" a (Range x y) = Area (Range x x) (yUp a y)
|
||||||
|
shrinkArea "D" a (Range x y) = Area (Range x x) (yDown a y)
|
||||||
|
shrinkArea "R" a (Range x y) = Area (xRight a x) (Range y y)
|
||||||
|
shrinkArea "L" a (Range x y) = Area (xLeft a x) (Range y y)
|
||||||
|
shrinkArea "UR" a (Range x y) = Area (xRight a x) (yUp a y)
|
||||||
|
shrinkArea "DR" a (Range x y) = Area (xRight a x) (yDown a y)
|
||||||
|
shrinkArea "DL" a (Range x y) = Area (xLeft a x) (yDown a y)
|
||||||
|
shrinkArea "UL" a (Range x y) = Area (xLeft a x) (yUp a y)
|
||||||
|
shrinkArea _ _ _ = Area (Range 9999 9999) (Range 9999 9999)
|
||||||
|
xRight (Area (Range x1 x2) _) x = Range (x+1) (input.width-1)
|
||||||
|
xLeft (Area (Range x1 x2) _) x = Range (x-1) 0
|
||||||
|
yUp (Area _ (Range y1 y2)) y = Range (y-1) 0
|
||||||
|
yDown (Area _ (Range y1 y2)) y = Range (y+1) (input.height-1)
|
||||||
|
|
||||||
|
maxPos :: Pos -> Int
|
||||||
|
maxPos (Pos x y) = max x y
|
||||||
|
|
||||||
|
minPos :: Pos -> Int
|
||||||
|
minPos (Pos x y) = min x y
|
||||||
|
|
||||||
|
getMiddlePos :: Area -> Pos
|
||||||
|
getMiddlePos (Area (Range x1 x2) (Range y1 y2)) = Pos x y
|
||||||
|
where
|
||||||
|
x = abs (x1 + x2) / 2
|
||||||
|
y = abs (y1 + y2) / 2
|
||||||
|
-- minX = min \(Pos x y) -> x
|
||||||
|
-- minY = min \(Pos x y) -> y
|
||||||
|
-- maxX = max \(Pos x y) -> x
|
||||||
|
-- maxY = max \(Pos x y) -> y
|
||||||
|
|
||||||
|
abs :: Int -> Int
|
||||||
|
abs x = fromMaybe (-1) $ fromNumber $ M.abs $ toNumber x
|
||||||
|
|
||||||
|
-- nextMove :: Building -> Pos -> Array Pos -> Pos
|
||||||
|
-- nextMove building pos bombDirs =
|
||||||
|
-- fromMaybe (Pos 100 100) $ head $ sortBy comparePos validPos
|
||||||
|
-- where comparePos :: Pos -> Pos -> Ordering
|
||||||
|
-- comparePos p1 p2 = compare (posVal p2) (posVal p1)
|
||||||
|
-- validPos :: Array Pos
|
||||||
|
-- validPos = filter (posValid building) possiblePos
|
||||||
|
-- possiblePos = map (addPos pos) bombDirs
|
||||||
|
--
|
||||||
|
-- posValid :: Building -> Pos -> Boolean
|
||||||
|
-- posValid (Building w h) (Pos x y) = x <= w && y <= h
|
||||||
|
--
|
||||||
|
-- posVal :: Pos -> Int
|
||||||
|
-- posVal (Pos x y) = fromMaybe 0 $ fromNumber $ absNum x + absNum y
|
||||||
|
-- where absNum = abs <<< toNumber
|
||||||
|
--
|
||||||
|
-- addPos :: Pos -> Pos -> Pos
|
||||||
|
-- addPos (Pos x1 y1) (Pos x2 y2) = Pos (x1+x2) (y1+y2)
|
||||||
24
shawdows_of_the_knight_episode_1/src/Ruler.purs
Normal file
24
shawdows_of_the_knight_episode_1/src/Ruler.purs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
module Range
|
||||||
|
( Area(..)
|
||||||
|
, Pos(..)
|
||||||
|
, Range(..)
|
||||||
|
, range
|
||||||
|
, fromPos
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
-- data Building = Building Int Int
|
||||||
|
data Pos = Pos Int Int
|
||||||
|
data Area = Area Range Range
|
||||||
|
|
||||||
|
instance showPos :: Show Pos where
|
||||||
|
show (Pos x y) = show x <> " " <> show y
|
||||||
|
|
||||||
|
fromPos :: Pos -> Range
|
||||||
|
fromPos (Pos x y) = range x y
|
||||||
|
|
||||||
|
data Range = Range Int Int
|
||||||
|
|
||||||
|
range :: Int -> Int -> Range
|
||||||
|
range x y = Range (min x y) (max x y)
|
||||||
20
shawdows_of_the_knight_episode_1/src/ffi/Reader.js
Normal file
20
shawdows_of_the_knight_episode_1/src/ffi/Reader.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.readline = readline
|
||||||
|
|
||||||
|
exports.parseInput = function() {
|
||||||
|
var inputs = readline().split(' ');
|
||||||
|
var W = parseInt(inputs[0]); // width of the building.
|
||||||
|
var H = parseInt(inputs[1]); // height of the building.
|
||||||
|
var N = parseInt(readline()); // maximum number of turns before game over.
|
||||||
|
var inputs = readline().split(' ');
|
||||||
|
var X0 = parseInt(inputs[0]);
|
||||||
|
var Y0 = parseInt(inputs[1]);
|
||||||
|
return {
|
||||||
|
width: W,
|
||||||
|
height: H,
|
||||||
|
turns: N,
|
||||||
|
x: X0,
|
||||||
|
y: Y0,
|
||||||
|
}
|
||||||
|
};
|
||||||
15
shawdows_of_the_knight_episode_1/src/ffi/Reader.purs
Normal file
15
shawdows_of_the_knight_episode_1/src/ffi/Reader.purs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
module Reader where
|
||||||
|
|
||||||
|
import Effect (Effect)
|
||||||
|
|
||||||
|
type GameInput =
|
||||||
|
{ width :: Int
|
||||||
|
, height :: Int
|
||||||
|
, turns :: Int
|
||||||
|
, x :: Int
|
||||||
|
, y :: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
foreign import parseInput :: Effect GameInput
|
||||||
|
|
||||||
|
foreign import readline :: Effect String
|
||||||
19
shawdows_of_the_knight_episode_1/test/Main.purs
Normal file
19
shawdows_of_the_knight_episode_1/test/Main.purs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
module Test.Main where
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
import Effect (Effect)
|
||||||
|
import Effect.Console (log)
|
||||||
|
|
||||||
|
|
||||||
|
main :: Effect Unit
|
||||||
|
main = do
|
||||||
|
let input = {
|
||||||
|
x: 20,
|
||||||
|
y: 20,
|
||||||
|
width: 100,
|
||||||
|
height: 100,
|
||||||
|
turns: 50
|
||||||
|
}
|
||||||
|
-- loop input $ calcWindows input
|
||||||
|
log "hi"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user