Day 15
[advent-of-code-2019.git] / day04 / get_valid_passwords.sh
1 #!/bin/bash
2
3 filename=${1:-input.txt}
4 exec 3<"${filename}"
5
6 read -u 3 line
7
8 start_password=${line%-*}
9 end_password=${line#*-}
10
11 check_valid_1() {
12     cur_password=$1
13     last_val=${cur_password:0:1}
14     got_dupe=0
15     if [ $cur_password -ge $start_password ] && [ $cur_password -le $end_password ]; then
16         for (( a=1; a<${#cur_password}; a++ )); do
17             val=${cur_password:$a:1}
18             if [ $val -ge $last_val ]; then
19                 if [ $val -eq $last_val ]; then
20                     got_dupe=1
21                 fi
22             else
23                 return 1
24             fi
25             last_val=$val
26         done
27         if [ $got_dupe -eq 1 ]; then
28             return 0
29         fi
30     else
31         return 1
32     fi
33
34     return 1
35 }
36
37 check_valid_2() {
38     cur_password=$1
39     last_val=${cur_password:0:1}
40     val=$last_val
41     dupe_count=1
42     got_dupe=0
43     if [ $cur_password -ge $start_password ] && [ $cur_password -le $end_password ]; then
44         for (( a=1; a<${#cur_password}; a++ )); do
45             val=${cur_password:$a:1}
46             if [ $val -ge $last_val ]; then
47                 if [ $val -eq $last_val ]; then
48                     dupe_count=$((dupe_count+1))
49                 else
50                     # only pairs
51                     if [ $dupe_count -eq 2 ]; then
52                         got_dupe=1
53                     fi
54                     dupe_count=1
55                 fi
56             else
57                 return 1
58             fi
59             last_val=$val
60         done
61         if [ $dupe_count -eq 2 ]; then
62             got_dupe=1
63         fi
64         if [ $got_dupe -eq 1 ]; then
65             return 0
66         else
67             return 1
68         fi
69     else
70         return 1
71     fi
72
73     return 1
74 }
75
76 get_next() {
77     password=$1
78     temp_password=$((password+1))
79     last_val=${temp_password:0:1}
80     new_password="$last_val"
81     for (( a=1; a<${#temp_password}; a++ )); do
82         val=${temp_password:$a:1}
83         if [ $val -lt $last_val ]; then
84             val=$last_val
85             for (( b=$a; b<${#temp_password}; b++ )); do
86                 new_password+=$val
87             done
88             echo "$new_password"
89             return 0
90         fi
91         new_password+=$val
92         last_val=$val
93     done
94
95     echo "$new_password"
96 }
97
98 cur_password=$start_password
99 valid_passwords=0
100 valid_passwords_2=0
101 while [ $cur_password -le $end_password ]; do
102     #echo -n "$cur_password: "
103     if ( check_valid_1 $cur_password ); then
104         #echo -n valid
105         valid_passwords=$((valid_passwords+1))
106         if ( check_valid_2 $cur_password ); then
107             #echo " valid"
108             valid_passwords_2=$((valid_passwords_2+1))
109         else
110             #echo " invalid"
111             true
112         fi
113     else
114         #echo invalid
115         true
116     fi
117     cur_password=$(get_next $cur_password)
118 done
119
120 echo "There are $valid_passwords valid passwords"
121 echo "And $valid_passwords_2 really valid passwords"