Advertisement
Guest User

Untitled

a guest
Dec 4th, 2018
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 KB | None | 0 0
  1. #!/usr/bin/env bash
  2.  
  3. _qsort()
  4. {
  5. (($# == 0)) && {
  6. unset qreturn
  7. return
  8. }
  9.  
  10. local pivot="$1"; shift
  11. local i
  12. local -a higher
  13. local -a lower
  14.  
  15. for i in "$@"; do
  16. if [[ "$i" < "${pivot}" ]]; then
  17. lower+=("$i")
  18. else
  19. higher+=("$i")
  20. fi
  21. done
  22.  
  23. _qsort "${higher[@]}"
  24. higher=("${qreturn[@]}")
  25.  
  26. _qsort "${lower[@]}"
  27. qreturn+=("${pivot}" "${higher[@]}")
  28. }
  29.  
  30. qsort()
  31. (
  32. qreturn=()
  33. _qsort "$@"
  34. printf "%s\\n" "${qreturn[@]}"
  35. )
  36.  
  37. part1()
  38. {
  39. [[ -f "${PWD}/input" ]] && {
  40. mapfile -t file < "${PWD}/input"
  41. mapfile -t file < <(qsort "${file[@]}")
  42.  
  43. i="0"
  44. while ((i < ${#file[@]})); do
  45. read -r _ _ _ id _ <<< "${file[$i]}"
  46. id="${id/'#'}"
  47.  
  48. if [[ "${midnight_list[$id]}" ]]; then
  49. read -ra midnight <<< "${midnight_list[$id]}"
  50. else
  51. for j in {0..59}; do
  52. midnight[$j]="0"
  53. done
  54. fi
  55.  
  56. ((i++))
  57. j="0"
  58. while [[ ! "${file[$i]}" =~ 'Guard' ]] && ((i < ${#file[@]})); do
  59. ((i++)); ((j++))
  60. done
  61.  
  62. for ((k = i - j; k < i; k++)); do
  63. read -r _ sleep_time _ <<< "${file[$((k++))]}"
  64. read -r _ wake_time _ <<< "${file[$k]}"
  65.  
  66. sleep_time="${sleep_time/*:}"
  67. sleep_time="${sleep_time/']'}"
  68. sleep_time="$((10#${sleep_time}))"
  69.  
  70. wake_time="${wake_time/*:}"
  71. wake_time="${wake_time/']'}"
  72. wake_time="$((10#${wake_time}))"
  73.  
  74. for ((l = sleep_time; l < wake_time; l++)); do
  75. ((midnight[l]++))
  76. done
  77. done
  78.  
  79. printf -v midnight_list[$id] "%d " "${midnight[@]}"
  80. done
  81.  
  82. for id in "${!midnight_list[@]}"; do
  83. unset total_time
  84. unset max
  85.  
  86. read -ra midnight <<< "${midnight_list[$id]}"
  87. for i in "${midnight[@]}"; do
  88. ((total_time += i))
  89. ((max = i > ${max:=0} ? i : ${max:=0}))
  90. done
  91.  
  92. printf -v midnight_list[$id] "%d " \
  93. "${total_time}" \
  94. "${max}" \
  95. "${midnight[@]}"
  96. done
  97.  
  98. unset max
  99. for id in "${!midnight_list[@]}"; do
  100. read -ra midnight <<< "${midnight_list[$id]}"
  101. ((max = midnight[0] > ${max:=0} ? midnight[0] : ${max:=0}))
  102. done
  103.  
  104. for id in "${!midnight_list[@]}"; do
  105. max_min="0"
  106. read -ra midnight <<< "${midnight_list[$id]}"
  107. ((max == midnight[0])) && \
  108. for minute in "${midnight[@]:2}"; do
  109. if ((midnight[1] != minute)); then
  110. ((max_min++))
  111. else
  112. break 2
  113. fi
  114. done
  115. done
  116.  
  117. printf "ID: %d\\nMinute: %d\\n" "${id}" "${max_min}"
  118. printf "Part1: %d\\n\\n" "$((id * max_min))"
  119. }
  120. }
  121.  
  122. part2()
  123. {
  124. [[ "${midnight_list[*]}" ]] && {
  125. unset max
  126. for id in "${!midnight_list[@]}"; do
  127. read -ra midnight <<< "${midnight_list[$id]}"
  128. ((max = midnight[1] > ${max:=0} ? midnight[1] : ${max:=0}))
  129. done
  130.  
  131. for id in "${!midnight_list[@]}"; do
  132. max_min="0"
  133. read -ra midnight <<< "${midnight_list[$id]}"
  134. ((max == midnight[1])) && \
  135. for minute in "${midnight[@]:2}"; do
  136. if ((midnight[1] != minute)); then
  137. ((max_min++))
  138. else
  139. break 2
  140. fi
  141. done
  142. done
  143.  
  144. printf "ID: %d\\nMinute: %d\\n" "${id}" "${max_min}"
  145. printf "Part2: %d\\n" "$((id * max_min))"
  146. }
  147. }
  148.  
  149. main()
  150. {
  151. part1
  152. part2
  153. }
  154.  
  155. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement