-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution1.java
120 lines (102 loc) · 4.27 KB
/
Solution1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
// --- Day 4: Passport Processing ---
// You arrive at the airport only to realize that you grabbed your North Pole
// Credentials instead of your passport. While these documents are extremely
// similar, North Pole Credentials aren't issued by a country and therefore
// aren't actually valid documentation for travel in most of the world.
// It seems like you're not the only one having problems, though; a very long
// line has formed for the automatic passport scanners, and the delay could
// upset your travel itinerary.
// Due to some questionable network security, you realize you might be able to
// solve both of these problems at the same time.
// The automatic passport scanners are slow because they're having trouble
// detecting which passports have all required fields. The expected fields are
// as follows:
// byr (Birth Year)
// iyr (Issue Year)
// eyr (Expiration Year)
// hgt (Height)
// hcl (Hair Color)
// ecl (Eye Color)
// pid (Passport ID)
// cid (Country ID)
// Passport data is validated in batch files (your puzzle input). Each passport
// is represented as a sequence of key:value pairs separated by spaces or
// newlines. Passports are separated by blank lines.
// Here is an example batch file containing four passports:
// ecl:gry pid:860033327 eyr:2020 hcl:#fffffd
// byr:1937 iyr:2017 cid:147 hgt:183cm
// iyr:2013 ecl:amb cid:350 eyr:2023 pid:028048884
// hcl:#cfa07d byr:1929
// hcl:#ae17e1 iyr:2013
// eyr:2024
// ecl:brn pid:760753108 byr:1931
// hgt:179cm
// hcl:#cfa07d eyr:2025 pid:166559648
// iyr:2011 ecl:brn hgt:59in
// The first passport is valid - all eight fields are present. The second
// passport is invalid - it is missing hgt (the Height field).
// The third passport is interesting; the only missing field is cid, so it looks
// like data from North Pole Credentials, not a passport at all! Surely, nobody
// would mind if you made the system temporarily ignore missing cid fields.
// Treat this "passport" as valid.
// The fourth passport is missing two fields, cid and byr. Missing cid is fine,
// but missing any other field is not, so this passport is invalid.
// According to the above rules, your improved system would report 2 valid
// passports.
// Count the number of valid passports - those that have all required fields.
// Treat cid as optional. In your batch file, how many passports are valid?
public class Solution1 {
public static void main(String[] args) {
List<List<String>> input = getInput();
System.out.println(countValid(input));
}
private static List<List<String>> getInput() {
List<String> fields = new ArrayList<>();
List<List<String>> input = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
br.lines().forEach(line -> {
if (!line.isEmpty())
fields.addAll(Arrays.asList(line.trim().split("[ ]+"))); // populate fields with values
else {
input.add(new ArrayList<>(fields)); // add those fields to the input if the line is empty
fields.clear();
}
});
if (!fields.isEmpty()) // check if there were values left after EOF
input.add(fields);
} catch (Exception e) {
System.out.println(e);
}
return input;
}
private static int countValid(List<List<String>> input) {
int validPassports = 0;
for (List<String> fields : input) {
if (fields.size() >= 7)
if (checkValid(fields))
validPassports++;
}
return validPassports;
}
private static boolean checkValid(List<String> fields) {
final List<String> validValues = Arrays.asList("pid:", "ecl:", "eyr:", "iyr:", "hgt:", "hcl:", "byr:");
boolean control;
for (String param : validValues) {
control = false;
for (String field : fields) {
if (field.contains(param)) {
control = true;
break;
}
}
if (!control)
return false;
}
return true;
}
}