main.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. const fs = require('fs');
  2. function Box(str) {
  3. this.hash = str;
  4. var letters = {};
  5. for (var i=0; i < this.hash.length; ++i) {
  6. var l = this.hash[i];
  7. if (letters[l] === undefined)
  8. letters[l] = 0;
  9. letters[l]++;
  10. }
  11. this.lettersByCount = {};
  12. for (var i in letters)
  13. if (this.lettersByCount[letters[i]] === undefined)
  14. this.lettersByCount[letters[i]] = true;
  15. }
  16. Box.prototype.compareWith = function(other) {
  17. var diff = -1;
  18. for (var i=0, len=Math.min(this.hash.length, other.hash.length); i < len; ++i)
  19. if (this.hash[i] != other.hash[i]) {
  20. if (diff != -1)
  21. return false;
  22. diff = i;
  23. }
  24. return diff == -1 ? false : diff;
  25. }
  26. function read(cb) {
  27. fs.readFile('./input', 'utf8', (err, data) => {
  28. var lines = [];
  29. data.split("\n").forEach((line) => {
  30. if (line.length > 0)
  31. lines.push(new Box(line));
  32. });
  33. cb(lines);
  34. });
  35. }
  36. function ex1() {
  37. read(function(boxes) {
  38. var count3 = 0,
  39. count2 = 0;
  40. boxes.forEach(function(box) {
  41. if (box.lettersByCount[3])
  42. count3++;
  43. if (box.lettersByCount[2])
  44. count2++;
  45. });
  46. console.log(count2 * count3);
  47. });
  48. }
  49. function ex2() {
  50. read(function(boxes) {
  51. for (var i=0; i <boxes.length -1; ++i)
  52. for (var j =i+1; j < boxes.length; ++j) {
  53. var diff = boxes[i].compareWith(boxes[j]);
  54. if (diff !== false) {
  55. console.log(boxes[i].hash.substr(0, diff) +boxes[i].hash.substr(diff +1));
  56. return;
  57. }
  58. }
  59. });
  60. }
  61. ex1();
  62. ex2();