Added skip function for faster exit. Part 2 still broken

This commit is contained in:
2024-12-10 00:07:07 +08:00
parent ad1778c8f0
commit c7c4a05cb0

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
FILE=input FILE=$1
# Sparse sequence # Sparse sequence
read -r -a SPARSE_ARRAY <<< "$( read -r -a SPARSE_ARRAY <<< "$(
INDEX=0 INDEX=0
@ -15,13 +15,13 @@ read -r -a SPARSE_ARRAY <<< "$(
else else
for (( i=1; i<=CHAR; i++ )) for (( i=1; i<=CHAR; i++ ))
do do
printf ". " printf "%s " '-1'
done done
fi fi
(( INDEX++ )) (( INDEX++ ))
done <<< "$( sed -E 's/(.)/\1\n/g' "$FILE" | grep -v '^$' )" done <<< "$( sed -E 's/(.)/\1\n/g' "$FILE" | grep -v '^$' )"
)" )"
printf "%s" "${SPARSE_ARRAY[@]}" printf "%s" "${SPARSE_ARRAY[@]}" | fold -w 100
printf "\n" printf "\n"
printf "Sparse array len: %s\n" "${#SPARSE_ARRAY[@]}" printf "Sparse array len: %s\n" "${#SPARSE_ARRAY[@]}"
SHADOW_ARRAY=( "${SPARSE_ARRAY[@]}" ) SHADOW_ARRAY=( "${SPARSE_ARRAY[@]}" )
@ -29,12 +29,19 @@ SHADOW_ARRAY=( "${SPARSE_ARRAY[@]}" )
# Start by working backwards # Start by working backwards
j=$(( ${#SPARSE_ARRAY[@]} - 1 )) # Moveable index since file blocks jump j=$(( ${#SPARSE_ARRAY[@]} - 1 )) # Moveable index since file blocks jump
k=0 # SHADOW_ARRAY cursor k=0 # SHADOW_ARRAY cursor
LAST_SKIP=9999
while [[ $j -ge 0 ]] while [[ $j -ge 0 ]]
do do
if [[ ${SPARSE_ARRAY[j]} != '.' ]] # Find a file
if [[ ${SPARSE_ARRAY[j]} -eq -1 ]]
then then
# Not a file
(( j-- ))
continue
fi
# Get file size # Get file size
# j moved to index before file head
FILE_SIZE=0 FILE_SIZE=0
ID=${SPARSE_ARRAY[j]} ID=${SPARSE_ARRAY[j]}
while [[ ${SPARSE_ARRAY[j]} == "$ID" ]] while [[ ${SPARSE_ARRAY[j]} == "$ID" ]]
@ -42,23 +49,31 @@ do
(( FILE_SIZE++ )) (( FILE_SIZE++ ))
(( j-- )) (( j-- ))
done done
printf "File ID: %s, File size: %s\n" "$ID" "$FILE_SIZE" 2>&1 #printf "File ID: %s, File size: %s\n" "$ID" "$FILE_SIZE" 2>&1
# Since search space is constantly decreasing
# Contiguous space can only keep getting smaller
if [[ $FILE_SIZE -ge $LAST_SKIP ]]
then
printf "File %s size %s skipped. Last skip: %s\n" "$ID" "$FILE_SIZE" "$LAST_SKIP"
continue
fi
# Search for available contiguous space # Search for available contiguous space
# Search from start until the file itself # Search from start until the file itself
k=0 k=0
while [[ $k -lt $(( j - FILE_SIZE )) ]] while [[ $k -le $j ]] && [[ $k -le ${#SHADOW_ARRAY[@]} ]]
do do
CONT_SPACE=0 CONT_SPACE=0
# Skip ahead until first match of space # Skip ahead until first match of space
while [[ ${SHADOW_ARRAY[k]} != "." ]] while [[ ${SHADOW_ARRAY[k]} -ne -1 ]] && [[ $k -le ${#SHADOW_ARRAY[@]} ]]
do do
(( k++ )) (( k++ ))
done done
# Space found, now get contiguous length # Space found, now get contiguous length
while [[ ${SHADOW_ARRAY[k]} == '.' ]] while [[ ${SHADOW_ARRAY[k]} -eq -1 ]] && [[ $k -le ${#SHADOW_ARRAY[@]} ]]
do do
(( CONT_SPACE++ )) (( CONT_SPACE++ ))
(( k++ )) (( k++ ))
@ -68,33 +83,33 @@ do
if [[ $FILE_SIZE -le $CONT_SPACE ]] ;then break; fi if [[ $FILE_SIZE -le $CONT_SPACE ]] ;then break; fi
done done
# Can proceed # Space length ok, can proceed
if [[ $FILE_SIZE -le $CONT_SPACE ]] if [[ $FILE_SIZE -le $CONT_SPACE ]]
then then
# Move the file to the contiguous space # Move the file to head of contiguous space
(( k-= CONT_SPACE )) (( k-= CONT_SPACE ))
while [[ $FILE_SIZE -gt 0 ]] while [[ $FILE_SIZE -gt 0 ]] && \
[[ ${SHADOW_ARRAY[k]} -eq -1 ]] && \
[[ ${SHADOW_ARRAY[j+FILE_SIZE]} -ne -1 ]]
do do
SHADOW_ARRAY[k]=$ID SHADOW_ARRAY[k]=$ID
SHADOW_ARRAY[j+FILE_SIZE]='.' SHADOW_ARRAY[j+FILE_SIZE]=-1
(( k++ )) (( k++ ))
(( FILE_SIZE-- )) (( FILE_SIZE-- ))
done done
else else
# Skip the file LAST_SKIP=$FILE_SIZE
printf "File %s skipped. File size: %s\n" "$ID" "$FILE_SIZE"
continue continue
fi fi
else
(( j-- ))
fi
done done
printf "%s" "${SHADOW_ARRAY[@]}" printf "%s " "${SHADOW_ARRAY[@]}" | fold -w 100 | tee final-result | cat
printf "\n" printf "\n"
# Generate checksum for sparse array # Generate checksum for shadow array
CHECKSUM=0 CHECKSUM=0
for (( i=0; i<${#SHADOW_ARRAY[@]}; i++ )) for (( i=0; i<${#SHADOW_ARRAY[@]}; i++ ))
do do
if [[ ${SHADOW_ARRAY[i]} != "." ]] ;then (( CHECKSUM += i * SHADOW_ARRAY[i] )); fi if [[ ${SHADOW_ARRAY[i]} -ne -1 ]] ;then (( CHECKSUM += i * SHADOW_ARRAY[i] )); fi
done done
printf "%s" "$CHECKSUM" printf "%s\n" "$CHECKSUM"