Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit fdbbeae

Browse filesBrowse files
feat[2020-day-02]: count the valid passwords under the new rules
Rules changed, as shopkeeper was thinking about old employer in Part 1
1 parent 03a33e7 commit fdbbeae
Copy full SHA for fdbbeae

File tree

3 files changed

+82
-6
lines changed
Filter options

3 files changed

+82
-6
lines changed

‎2020/day-02/cleanupPasswords.js

Copy file name to clipboardExpand all lines: 2020/day-02/cleanupPasswords.js
+45Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const splitRecord = (row) => {
1313

1414
/**
1515
* Splits a password validation rule into its component parts
16+
* using the original rules
1617
*/
1718
const oldSplitRule = (rule) => {
1819
const splitRow = rule.split(/-| /)
@@ -24,8 +25,25 @@ const oldSplitRule = (rule) => {
2425
}
2526
}
2627

28+
/**
29+
* Splits a password validation rule into its component parts
30+
* using the new rules
31+
*/
32+
const newSplitRule = (rule) => {
33+
const splitRow = rule.split(/-| /)
34+
35+
return {
36+
positions: [
37+
Number(splitRow[0]),
38+
Number(splitRow[1])
39+
],
40+
char: String(splitRow[2])
41+
}
42+
}
43+
2744
/**
2845
* Validates a password against the specified rule
46+
* using the original rules
2947
*/
3048
const oldIsValidPassword = (rule, password) => {
3149
// count how many times `rule.char` exists in `password`
@@ -40,17 +58,44 @@ const oldIsValidPassword = (rule, password) => {
4058
return true
4159
}
4260

61+
/**
62+
* Validates a password against the specified rule
63+
* using the new rules
64+
*/
65+
const newIsValidPassword = (rule, password) => {
66+
let matches = 0
67+
rule.positions.forEach((pos) => {
68+
// index starts with 1
69+
if (password[pos - 1] === rule.char) {
70+
matches++
71+
}
72+
})
73+
// Only one match allowed, not 2, not 0
74+
return (matches === 1)
75+
}
76+
4377
const oldIsValidRecord = (record) => {
4478
const { rule, password } = splitRecord(record)
4579
const parsedRule = oldSplitRule(rule)
4680
return oldIsValidPassword(parsedRule, password)
4781
}
4882

83+
const newIsValidRecord = (record) => {
84+
const { rule, password } = splitRecord(record)
85+
const parsedRule = newSplitRule(rule)
86+
return newIsValidPassword(parsedRule, password)
87+
}
88+
4989
module.exports = {
5090
old: {
5191
splitRule: oldSplitRule,
5292
isValidPassword: oldIsValidPassword,
5393
isValidRecord: oldIsValidRecord
5494
},
95+
cur: {
96+
splitRule: newSplitRule,
97+
isValidPassword: newIsValidPassword,
98+
isValidRecord: newIsValidRecord
99+
},
55100
splitRecord
56101
}

‎2020/day-02/cleanupPasswords.test.js

Copy file name to clipboardExpand all lines: 2020/day-02/cleanupPasswords.test.js
+32-1Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-env mocha */
22
const { expect } = require('chai')
3-
const { splitRecord, old } = require('./cleanupPasswords')
3+
const { splitRecord, old, cur } = require('./cleanupPasswords')
44

55
const testData = [
66
'1-3 a: abcde',
@@ -53,4 +53,35 @@ describe('--- Day 2: Password Philosophy ---', () => {
5353
})
5454
})
5555
})
56+
describe('Part 2', () => {
57+
describe('splitRule()', () => {
58+
it('splits a password formatting rule into component parts', () => {
59+
testData.forEach((row, idx) => {
60+
const { rule, password } = splitRecord(row)
61+
const { positions, char } = cur.splitRule(rule)
62+
expect(`${positions.join('-')} ${char}: ${password}`).to.equal(testData[idx])
63+
})
64+
})
65+
})
66+
describe('isValidPassword()', () => {
67+
it('checks if a specified password matches the specified rule', () => {
68+
const expectedResults = [true, false, false]
69+
testData.forEach((row, idx) => {
70+
const { rule, password } = splitRecord(row)
71+
const ruleObj = cur.splitRule(rule)
72+
expect(cur.isValidPassword(ruleObj, password))
73+
.to.equal(expectedResults[idx])
74+
})
75+
})
76+
})
77+
describe('isValidRecord()', () => {
78+
it('checks if a specified record contains valid rule and password', () => {
79+
const expectedResults = [true, false, false]
80+
testData.forEach((row, idx) => {
81+
expect(cur.isValidRecord(row))
82+
.to.equal(expectedResults[idx])
83+
})
84+
})
85+
})
86+
})
5687
})

‎2020/day-02/solution.js

Copy file name to clipboardExpand all lines: 2020/day-02/solution.js
+5-5Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const fs = require('fs')
22
const path = require('path')
33
const filePath = path.join(__dirname, 'input.txt')
44
const { linesToArray } = require('../../2018/inputParser')
5-
const { isValidRecord } = require('./cleanupPasswords')
5+
const { old, cur } = require('./cleanupPasswords')
66

77
fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => {
88
if (err) throw err
@@ -16,14 +16,14 @@ fs.readFile(filePath, { encoding: 'utf8' }, (err, initData) => {
1616

1717
const part1 = () => {
1818
const data = resetInput()
19-
// Count the valid passwords
20-
return data.filter(isValidRecord).length
19+
// Count the valid passwords with old rules
20+
return data.filter(old.isValidRecord).length
2121
}
2222

2323
const part2 = () => {
2424
const data = resetInput()
25-
console.debug(data)
26-
return 'No answer yet'
25+
// Count the valid passwords with new rules
26+
return data.filter(cur.isValidRecord).length
2727
}
2828
const answers = []
2929
answers.push(part1())

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.