filename="${1:-example.txt}"
+iter_1=80
+iter_2=256
+
exec 3<"$filename"
OLDIFS="$IFS"
read -u 3 -a fish
IFS="$OLDIFS"
-for (( d=1; d<=80; d++ )); do
- start_fish_count=${#fish[@]}
- for (( i=0; i<$start_fish_count; i++ )); do
- if [ ${fish[$i]} -eq 0 ]; then
- fish+=(8)
- fish[$i]=6
- else
- ((fish[$i]-=1)) || fish[$i]=0
- fi
+buckets=(0 0 0 0 0 0 0 0 0)
+
+get_count() {
+ local count=0
+
+ for (( i=0; i<=8; i++ )); do
+ ((count+=${buckets[$i]}))
done
+
+ echo "$count"
+}
+
+for f in "${fish[@]}"; do
+ ((buckets[$f]+=1))
+done
+
+for (( d=1; d<=$iter_2; d++ )); do
+ orig_zeros=${buckets[0]}
+ for (( i=1; i<=8; i++ )); do
+ temp=${buckets[$i]}
+ ((buckets[$((i-1))]+=$temp)) || true
+ buckets[$i]=0
+ done
+ ((buckets[8]+=$orig_zeros)) || true
+ ((buckets[6]+=$orig_zeros)) || true
+ ((buckets[0]-=$orig_zeros)) || buckets[0]=0
+
+ [ $d -eq $iter_1 ] && echo "After $iter_1 days there are $(get_count) fish"
done
-echo "After 80 days there are ${#fish[@]} fish"
+echo "After $iter_2 days there are $(get_count) fish"