Rename days to 2 digits always
[advent-of-code-2019.git] / day04 / get_valid_passwords.sh
diff --git a/day04/get_valid_passwords.sh b/day04/get_valid_passwords.sh
new file mode 100644 (file)
index 0000000..9dd1562
--- /dev/null
@@ -0,0 +1,110 @@
+#!/bin/bash
+
+start_password=254032
+end_password=789860
+
+check_valid_1() {
+    cur_password=$1
+    last_val=${cur_password:0:1}
+    val=$last_val
+    got_dupe=0
+    if [ $cur_password -ge $start_password ] && [ $cur_password -le $end_password ]; then
+        for (( a=1; a<${#cur_password}; a++ )); do
+            val=${cur_password:$a:1}
+            if [ $val -ge $last_val ]; then
+                if [ $val -eq $last_val ]; then
+                    got_dupe=1
+                fi
+            else
+                return 1
+            fi
+            last_val=$val
+        done
+        if [ $got_dupe -eq 1 ]; then
+            return 0
+        fi
+    else
+        return 1
+    fi
+
+    return 1
+}
+
+check_valid_2() {
+    cur_password=$1
+    last_val=${cur_password:0:1}
+    val=$last_val
+    dupe_count=1
+    got_dupe=0
+    if [ $cur_password -ge $start_password ] && [ $cur_password -le $end_password ]; then
+        for (( a=1; a<${#cur_password}; a++ )); do
+            val=${cur_password:$a:1}
+            if [ $val -ge $last_val ]; then
+                if [ $val -eq $last_val ]; then
+                    dupe_count=$((dupe_count+1))
+                else
+                    # only pairs
+                    if [ $dupe_count -eq 2 ]; then
+                        got_dupe=1
+                    fi
+                    dupe_count=1
+                fi
+            else
+                return 1
+            fi
+            last_val=$val
+        done
+        if [ $dupe_count -eq 2 ]; then
+            got_dupe=1
+        fi
+        if [ $got_dupe -eq 1 ]; then
+            return 0
+        else
+            return 1
+        fi
+    else
+        return 1
+    fi
+
+    return 1
+}
+
+get_next() {
+    password=$1
+    temp_password=$((password+1))
+    last_val=${temp_password:0:1}
+    new_password="$last_val"
+    for (( a=1; a<${#temp_password}; a++ )); do
+        val=${temp_password:$a:1}
+        if [ $val -lt $last_val ]; then
+            val=$last_val
+        fi
+        new_password+=$val
+        last_val=$val
+    done
+
+    echo "$new_password"
+}
+
+cur_password=$start_password
+valid_passwords=0
+valid_passwords_2=0
+while [ $cur_password -le $end_password ]; do
+    echo -n "$cur_password: "
+    if ( check_valid_1 $cur_password ); then
+        echo -n valid
+        valid_passwords=$((valid_passwords+1))
+        if ( check_valid_2 $cur_password ); then
+            echo " valid"
+            valid_passwords_2=$((valid_passwords_2+1))
+        else
+            echo " invalid"
+        fi
+    else
+        echo invalid
+    fi
+    cur_password=$(get_next $cur_password)
+done
+
+echo "There are $valid_passwords valid passwords"
+echo "And $valid_passwords_2 really valid passwords"