Day 18
This commit is contained in:
156
18/01.sh
Executable file
156
18/01.sh
Executable file
@@ -0,0 +1,156 @@
|
||||
#!/bin/bash
|
||||
|
||||
representations=()
|
||||
while read line; do
|
||||
representation=()
|
||||
nests=0
|
||||
for ((i=0;i<${#line};i++)); do
|
||||
case ${line:$i:1} in
|
||||
'[')
|
||||
nests=$((nests+1))
|
||||
;;
|
||||
']')
|
||||
nests=$((nests-1))
|
||||
;;
|
||||
',')
|
||||
;;
|
||||
*)
|
||||
representation+=( $nests':'${line:$i:1} )
|
||||
;;
|
||||
esac
|
||||
done
|
||||
representations+=( $(sed 's/ /_/g' <<< ${representation[@]}) )
|
||||
done
|
||||
|
||||
representation=( $(sed 's/_/ /g' <<< ${representations[0]}) )
|
||||
for ((j=1;j<${#representations[@]};j++)); do
|
||||
sum_representation=( $(sed 's/_/ /g' <<< ${representations[$j]}) )
|
||||
for ((i=0;i<${#representation[@]};i++)); do
|
||||
node=${representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
representation[$i]=$((node_nests+1))':'$node_value
|
||||
done
|
||||
for ((i=0;i<${#sum_representation[@]};i++)); do
|
||||
node=${sum_representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
representation+=( $((node_nests+1))':'$node_value )
|
||||
done
|
||||
changes=1
|
||||
while [ $changes -eq 1 ]; do
|
||||
changes=0
|
||||
for ((i=0;i<${#representation[@]};i++)); do
|
||||
node=${representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
if [ $node_nests -gt 4 ]; then
|
||||
following_node=${representation[$((i+1))]}
|
||||
following_node_nests=${following_node%':'*}
|
||||
following_node_value=${following_node#*':'}
|
||||
if [ $node_nests -eq $following_node_nests ]; then
|
||||
changes=1
|
||||
new_representation=()
|
||||
if [ $i -gt 0 ]; then
|
||||
prev_value=${representation[$((i-1))]}
|
||||
prev_nests=${prev_value%':'*}
|
||||
prev_value=${prev_value#*':'}
|
||||
representation[$((i-1))]=$prev_nests':'$((prev_value+node_value))
|
||||
new_representation+=( ${representation[@]:0:$i} )
|
||||
fi
|
||||
new_representation+=( $((node_nests-1))':'0 )
|
||||
if [ $i -lt $((${#representation[@]}-2)) ]; then
|
||||
next_value=${representation[$((i+2))]}
|
||||
next_nests=${next_value%':'*}
|
||||
next_value=${next_value#*':'}
|
||||
representation[$((i+2))]=$next_nests':'$((next_value+following_node_value))
|
||||
new_representation+=( ${representation[@]:$((i+2))} )
|
||||
fi
|
||||
representation=( ${new_representation[@]} )
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [ $changes -eq 0 ]; then
|
||||
for ((i=0;i<${#representation[@]};i++)); do
|
||||
node=${representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
if [ $node_value -gt 9 ]; then
|
||||
changes=1
|
||||
new_representation=()
|
||||
if [ $i -gt 0 ]; then
|
||||
new_representation+=( ${representation[@]:0:$i} )
|
||||
fi
|
||||
value_left=$(($node_value/2))
|
||||
value_right=$value_left
|
||||
if [ $((node_value%2)) -eq 1 ]; then
|
||||
value_right=$((value_right+1))
|
||||
fi
|
||||
new_representation+=( $((node_nests+1))':'$value_left $((node_nests+1))':'$value_right )
|
||||
if [ $i -lt $((${#representation[@]}-1)) ]; then
|
||||
new_representation+=( ${representation[@]:$((i+1))} )
|
||||
fi
|
||||
representation=( ${new_representation[@]} )
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
declare -A tree_representation
|
||||
|
||||
last_key=''
|
||||
for node in ${representation[@]}; do
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
current_key=''
|
||||
if [ -z $last_key ]; then
|
||||
current_key=$(for ((i=0;i<$node_nests;i++)); do echo -n 0; done)
|
||||
tree_representation[$current_key]=$node_value
|
||||
else
|
||||
if [ ${#last_key} -eq $node_nests ]; then
|
||||
current_key=$(( 2#$last_key + 2#01 ))
|
||||
current_key=$(echo "ibase=A;obase=2;$current_key" | bc)
|
||||
while [ ${#current_key} -lt $node_nests ]; do
|
||||
current_key=0$current_key
|
||||
done
|
||||
tree_representation[$current_key]=$node_value
|
||||
elif [ ${#last_key} -lt $node_nests ]; then
|
||||
current_key=$(( 2#$last_key + 2#01 ))
|
||||
current_key=$(echo "ibase=A;obase=2;$current_key" | bc)
|
||||
while [ ${#current_key} -lt ${#last_key} ]; do
|
||||
current_key=0$current_key
|
||||
done
|
||||
while [ ${#current_key} -lt $node_nests ]; do
|
||||
current_key=${current_key}0
|
||||
done
|
||||
tree_representation[$current_key]=$node_value
|
||||
else
|
||||
current_key=${last_key:0:$node_nests}
|
||||
current_key=$(( 2#$current_key + 2#01 ))
|
||||
current_key=$(echo "ibase=A;obase=2;$current_key" | bc)
|
||||
while [ ${#current_key} -lt $node_nests ]; do
|
||||
current_key=0$current_key
|
||||
done
|
||||
tree_representation[$current_key]=$node_value
|
||||
fi
|
||||
fi
|
||||
last_key=$current_key
|
||||
done
|
||||
|
||||
magnitude=0
|
||||
for tree_representation_node in ${!tree_representation[@]}; do
|
||||
temp_magnitude=${tree_representation[$tree_representation_node]}
|
||||
for ((i=0;i<${#tree_representation_node};i++)); do
|
||||
if [ ${tree_representation_node:$i:1} -eq 0 ]; then
|
||||
temp_magnitude=$((temp_magnitude*3))
|
||||
else
|
||||
temp_magnitude=$((temp_magnitude*2))
|
||||
fi
|
||||
done
|
||||
magnitude=$((magnitude+temp_magnitude))
|
||||
done
|
||||
|
||||
echo $magnitude
|
||||
167
18/02.sh
Executable file
167
18/02.sh
Executable file
@@ -0,0 +1,167 @@
|
||||
#!/bin/bash
|
||||
|
||||
representations=()
|
||||
max_magnitude=0
|
||||
while read line; do
|
||||
representation=()
|
||||
nests=0
|
||||
for ((i=0;i<${#line};i++)); do
|
||||
case ${line:$i:1} in
|
||||
'[')
|
||||
nests=$((nests+1))
|
||||
;;
|
||||
']')
|
||||
nests=$((nests-1))
|
||||
;;
|
||||
',')
|
||||
;;
|
||||
*)
|
||||
representation+=( $nests':'${line:$i:1} )
|
||||
;;
|
||||
esac
|
||||
done
|
||||
representations+=( $(sed 's/ /_/g' <<< ${representation[@]}) )
|
||||
done
|
||||
|
||||
for ((k=0;k<${#representations[@]};k++)); do
|
||||
for ((j=0;j<${#representations[@]};j++)); do
|
||||
if [ $j -eq $k ]; then
|
||||
continue
|
||||
fi
|
||||
representation=( $(sed 's/_/ /g' <<< ${representations[$k]}) )
|
||||
sum_representation=( $(sed 's/_/ /g' <<< ${representations[$j]}) )
|
||||
for ((i=0;i<${#representation[@]};i++)); do
|
||||
node=${representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
representation[$i]=$((node_nests+1))':'$node_value
|
||||
done
|
||||
for ((i=0;i<${#sum_representation[@]};i++)); do
|
||||
node=${sum_representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
representation+=( $((node_nests+1))':'$node_value )
|
||||
done
|
||||
changes=1
|
||||
while [ $changes -eq 1 ]; do
|
||||
changes=0
|
||||
for ((i=0;i<${#representation[@]};i++)); do
|
||||
node=${representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
if [ $node_nests -gt 4 ]; then
|
||||
following_node=${representation[$((i+1))]}
|
||||
following_node_nests=${following_node%':'*}
|
||||
following_node_value=${following_node#*':'}
|
||||
if [ $node_nests -eq $following_node_nests ]; then
|
||||
changes=1
|
||||
new_representation=()
|
||||
if [ $i -gt 0 ]; then
|
||||
prev_value=${representation[$((i-1))]}
|
||||
prev_nests=${prev_value%':'*}
|
||||
prev_value=${prev_value#*':'}
|
||||
representation[$((i-1))]=$prev_nests':'$((prev_value+node_value))
|
||||
new_representation+=( ${representation[@]:0:$i} )
|
||||
fi
|
||||
new_representation+=( $((node_nests-1))':'0 )
|
||||
if [ $i -lt $((${#representation[@]}-2)) ]; then
|
||||
next_value=${representation[$((i+2))]}
|
||||
next_nests=${next_value%':'*}
|
||||
next_value=${next_value#*':'}
|
||||
representation[$((i+2))]=$next_nests':'$((next_value+following_node_value))
|
||||
new_representation+=( ${representation[@]:$((i+2))} )
|
||||
fi
|
||||
representation=( ${new_representation[@]} )
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if [ $changes -eq 0 ]; then
|
||||
for ((i=0;i<${#representation[@]};i++)); do
|
||||
node=${representation[$i]}
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
if [ $node_value -gt 9 ]; then
|
||||
changes=1
|
||||
new_representation=()
|
||||
if [ $i -gt 0 ]; then
|
||||
new_representation+=( ${representation[@]:0:$i} )
|
||||
fi
|
||||
value_left=$(($node_value/2))
|
||||
value_right=$value_left
|
||||
if [ $((node_value%2)) -eq 1 ]; then
|
||||
value_right=$((value_right+1))
|
||||
fi
|
||||
new_representation+=( $((node_nests+1))':'$value_left $((node_nests+1))':'$value_right )
|
||||
if [ $i -lt $((${#representation[@]}-1)) ]; then
|
||||
new_representation+=( ${representation[@]:$((i+1))} )
|
||||
fi
|
||||
representation=( ${new_representation[@]} )
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
declare -A tree_representation
|
||||
|
||||
last_key=''
|
||||
for node in ${representation[@]}; do
|
||||
node_nests=${node%':'*}
|
||||
node_value=${node#*':'}
|
||||
current_key=''
|
||||
if [ -z $last_key ]; then
|
||||
current_key=$(for ((i=0;i<$node_nests;i++)); do echo -n 0; done)
|
||||
tree_representation[$current_key]=$node_value
|
||||
else
|
||||
if [ ${#last_key} -eq $node_nests ]; then
|
||||
current_key=$(( 2#$last_key + 2#01 ))
|
||||
current_key=$(echo "ibase=A;obase=2;$current_key" | bc)
|
||||
while [ ${#current_key} -lt $node_nests ]; do
|
||||
current_key=0$current_key
|
||||
done
|
||||
tree_representation[$current_key]=$node_value
|
||||
elif [ ${#last_key} -lt $node_nests ]; then
|
||||
current_key=$(( 2#$last_key + 2#01 ))
|
||||
current_key=$(echo "ibase=A;obase=2;$current_key" | bc)
|
||||
while [ ${#current_key} -lt ${#last_key} ]; do
|
||||
current_key=0$current_key
|
||||
done
|
||||
while [ ${#current_key} -lt $node_nests ]; do
|
||||
current_key=${current_key}0
|
||||
done
|
||||
tree_representation[$current_key]=$node_value
|
||||
else
|
||||
current_key=${last_key:0:$node_nests}
|
||||
current_key=$(( 2#$current_key + 2#01 ))
|
||||
current_key=$(echo "ibase=A;obase=2;$current_key" | bc)
|
||||
while [ ${#current_key} -lt $node_nests ]; do
|
||||
current_key=0$current_key
|
||||
done
|
||||
tree_representation[$current_key]=$node_value
|
||||
fi
|
||||
fi
|
||||
last_key=$current_key
|
||||
done
|
||||
|
||||
magnitude=0
|
||||
for tree_representation_node in ${!tree_representation[@]}; do
|
||||
temp_magnitude=${tree_representation[$tree_representation_node]}
|
||||
for ((i=0;i<${#tree_representation_node};i++)); do
|
||||
if [ ${tree_representation_node:$i:1} -eq 0 ]; then
|
||||
temp_magnitude=$((temp_magnitude*3))
|
||||
else
|
||||
temp_magnitude=$((temp_magnitude*2))
|
||||
fi
|
||||
done
|
||||
magnitude=$((magnitude+temp_magnitude))
|
||||
done
|
||||
if [ $magnitude -gt $max_magnitude ]; then
|
||||
max_magnitude=$magnitude
|
||||
fi
|
||||
unset tree_representation
|
||||
done
|
||||
done
|
||||
|
||||
|
||||
echo $max_magnitude
|
||||
Reference in New Issue
Block a user