From 38d2b7f80bd4ee32dd322695f13cdc2bcef143b1 Mon Sep 17 00:00:00 2001 From: Peter Hayes Date: Sun, 19 Oct 2014 22:02:17 -0700 Subject: [PATCH] fixes to Making Change in preparation for next lesson --- EditDistance/src/editDistance.js | 43 ++++------ EditDistance/src/fuzzyStringMatch.js | 56 +++++++------ Graphics/css/app.css | 16 ++++ Graphics/index.html | 16 ++++ Graphics/js/init.js | 6 ++ Graphics/js/lib/jquery.js | 4 + Graphics/js/lib/underscore.js | 1 + Graphics/js/point2D.js | 21 +++++ Graphics/js/point3D.js | 5 ++ Graphics/js/shape.js | 43 ++++++++++ MakingChange/spec/amountsToTest.js | 12 +-- MakingChange/spec/spec.js | 51 +++++------- MakingChange/src/change.js | 113 ++++++++------------------- 13 files changed, 220 insertions(+), 167 deletions(-) create mode 100644 Graphics/css/app.css create mode 100644 Graphics/index.html create mode 100644 Graphics/js/init.js create mode 100644 Graphics/js/lib/jquery.js create mode 100644 Graphics/js/lib/underscore.js create mode 100644 Graphics/js/point2D.js create mode 100644 Graphics/js/point3D.js create mode 100644 Graphics/js/shape.js diff --git a/EditDistance/src/editDistance.js b/EditDistance/src/editDistance.js index 5968e11..119186a 100644 --- a/EditDistance/src/editDistance.js +++ b/EditDistance/src/editDistance.js @@ -1,7 +1,3 @@ -// Note: The metric used here is Damerau–Levenshtein distance. -// This metric imposes a uniform cost for insertion, deletion, -// substitutions, and transposition, as these compose the most -// common human typing mistakes. var editDistance = function(str1, str2) { if (str1 === str2) { return 0; @@ -11,47 +7,42 @@ var editDistance = function(str1, str2) { return str1.length || str2.length; } - if (str2.length > str1.length) { - var temp = str1; - str1 = str2; - str2 = temp; - } - var len1 = str1.length; var len2 = str2.length; - var prevPrevRow; - var prevRow = []; + // Set up the matrix. + var matrix = []; + for (var row = 0; row <= len1; row++) { + var arr = new Array(len2 + 1); + matrix.push(arr); + } + + for (var row = 0; row <= len1; row++) { + matrix[row][0] = row; + } - // Fill in previous row with empty subsequences. for (var col = 0; col <= len2; col++) { - prevRow[col] = col; + matrix[0][col] = col; } - var currRow = [1]; - // Fake iterating through the whole matrix, - // but remembering only two rows at a time. for (var row = 1; row <= len1; row++) { for (var col = 1; col <= len2; col++) { // If two strings match at their final character, their LCS // is the LCS of their prefixes, plus that final character. if (str1[row-1] === str2[col-1]) { - currRow[col] = prevRow[col-1]; + matrix[row][col] = matrix[row-1][col-1]; // Otherwise, their LCS is the best LCS that results from // trimming either of their final characters, plus one. } else { - var del = prevRow[col] + 1; - var ins = currRow[col-1] + 1; - var sub = prevRow[col-1] + 1; - currRow[col] = Math.min(del, ins, sub); + var del = matrix[row-1][col]; + var ins = matrix[row][col-1]; + var sub = matrix[row-1][col-1]; + matrix[row][col] = Math.min(del, ins, sub) + 1; } } - prevPrevRow = prevRow; - prevRow = currRow; - currRow = [row + 1]; } - return prevRow[len2]; + return matrix[len1][len2]; }; \ No newline at end of file diff --git a/EditDistance/src/fuzzyStringMatch.js b/EditDistance/src/fuzzyStringMatch.js index 2f26207..b1a1509 100644 --- a/EditDistance/src/fuzzyStringMatch.js +++ b/EditDistance/src/fuzzyStringMatch.js @@ -1,41 +1,49 @@ var fuzzyStringMatch = function(text, query) { + if (query === text) { + return 0; + } + + if (!query.length || !text.length) { + return query.length || text.length; + } - var qLen = query.length; - var tLen = text.length; + var queryLen = query.length; + var textLen = text.length; - var prevPrevRow; - var prevRow = []; - // Fill in previous row with empty subsequences. - for (var col = 0; col <= tLen; col++) { - prevRow[col] = 0; + // Set up the matrix. + var matrix = []; + for (var row = 0; row <= queryLen; row++) { + var newRow = new Array(textLen + 1); + newRow[0] = row; + if (row === 0) { + for (var col = 1; col <= textLen; col++) { + newRow[col] = 0; + } + } + matrix.push(newRow); } - var currRow = [1]; // Fake iterating through the whole matrix, // but remembering only two rows at a time. - for (var row = 1; row <= qLen; row++) { - for (var col = 1; col <= tLen; col++) { + for (var row = 1; row <= queryLen; row++) { + for (var col = 1; col <= textLen; col++) { // If two strings match at their final character, their LCS // is the LCS of their prefixes, plus that final character. if (query[row-1] === text[col-1]) { - currRow[col] = prevRow[col-1]; + matrix[row][col] = matrix[row-1][col-1]; + // Otherwise, their LCS is the best LCS that results from - // trimming either of their final characters. + // trimming either of their final characters, plus one. } else { - var del = prevRow[col] + 1; - var ins = currRow[col-1] + 1; - var sub = prevRow[col-1] + 1; - currRow[col] = Math.min(del, ins, sub); - }; + var del = matrix[row-1][col] + 1; + var ins = matrix[row][col-1] + 1; + var sub = matrix[row-1][col-1] + 1; + matrix[row][col] = Math.min(del, ins, sub); + } } - prevPrevRow = prevRow; - prevRow = currRow; - currRow = [row + 1]; } - - var min = Math.min.apply(null, prevRow); - console.log(min, qLen); - return (qLen-min)/qLen; + var minDistance = Math.min.apply(null, matrix[queryLen]); + return 1 - minDistance/queryLen; }; diff --git a/Graphics/css/app.css b/Graphics/css/app.css new file mode 100644 index 0000000..60bdd53 --- /dev/null +++ b/Graphics/css/app.css @@ -0,0 +1,16 @@ +.viewport { + position: relative; + width: 512px; + height: 512px; + margin: 50px auto; + background-color: #eee; + border: 1px solid #ccc; +} + +.point { + position: absolute; + width:0; + height:0; + border:2px solid black; + border-radius: 2px; +} \ No newline at end of file diff --git a/Graphics/index.html b/Graphics/index.html new file mode 100644 index 0000000..2311c3f --- /dev/null +++ b/Graphics/index.html @@ -0,0 +1,16 @@ + + + Graphics! + + + + + + + + + +
+
+ + \ No newline at end of file diff --git a/Graphics/js/init.js b/Graphics/js/init.js new file mode 100644 index 0000000..e9d7db3 --- /dev/null +++ b/Graphics/js/init.js @@ -0,0 +1,6 @@ +$(document).ready(function() { + var cube = new Cube(new Point3D(0, 0, 0), 100); + var rendered = cube.points.map(function(p) { + return new Point2D(p.x, p.y); + }); +}); \ No newline at end of file diff --git a/Graphics/js/lib/jquery.js b/Graphics/js/lib/jquery.js new file mode 100644 index 0000000..50d1b22 --- /dev/null +++ b/Graphics/js/lib/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st("