This commit is contained in:
2021-12-18 16:44:05 +01:00
parent 0fe7f62d9e
commit b41f654948
2 changed files with 323 additions and 0 deletions

156
18/01.sh Executable file
View 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