Advertisement
JoelSjogren

Untitled

Aug 9th, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. clear_functions()
  2.  
  3. cur.execute("""
  4. SET @base_value = 2,
  5. @extracting_column = 2,
  6. @number_of_columns = 40,
  7. @number_of_layers = 5,
  8. @active_side = 2;
  9. """)
  10.  
  11. cur.execute(f"""
  12. CREATE FUNCTION numbering_formula
  13. (
  14. layer INT,
  15. side INT,
  16. column_ INT
  17. )
  18. RETURNS int
  19. BEGIN
  20. DECLARE loop_ INT;
  21. DECLARE a_upper INT;
  22. DECLARE ch0 INT;
  23. DECLARE ch1 INT;
  24. DECLARE extra INT;
  25. DECLARE a_lower INT;
  26. DECLARE cdb0 INT;
  27. DECLARE cde0 INT;
  28. DECLARE cdb1 INT;
  29. DECLARE cde1 INT;
  30.  
  31. IF NOT (1 <= layer AND layer <= @number_of_layers AND (side = 1 OR side = 2) AND 1 <= column_ AND column_ <= @number_of_columns AND column_ != @extracting_column) THEN
  32. RETURN -1;
  33. END IF;
  34.  
  35. SET side = CASE WHEN @active_side = 1 THEN side else flip_side(side) END;
  36. SET loop_ = CASE WHEN abs(column_ - @extracting_column) <= @base_value THEN layer - 1 ELSE layer + abs(column_ - @extracting_column) - @base_value - 1 END;
  37.  
  38. IF abs(column_ - @extracting_column) <= @base_value THEN
  39. SET a_upper = lower_area(loop_ + 1);
  40. SET ch0 = circ_horz(loop_, @extracting_column);
  41. SET ch1 = circ_horz(loop_, flip_column(@extracting_column));
  42. SET extra = (CASE WHEN side = 1 THEN 0 ELSE ch0 + ch1 END) + (CASE WHEN column_ > @extracting_column THEN 0 ELSE ch0 END);
  43. RETURN a_upper - 2*(ch0 + ch1) + extra + abs(column_ - @extracting_column);
  44. ELSE
  45. SET a_lower = lower_area(loop_);
  46. SET cdb0 = circ_diag_before(layer, side, column_, loop_, @extracting_column);
  47. SET cde0 = circ_diag_exists(layer, side, column_, loop_, @extracting_column);
  48. SET cdb1 = circ_diag_before(layer, side, 2*@extracting_column - column_, loop_, @extracting_column);
  49. SET cde1 = circ_diag_exists(layer, side, 2*@extracting_column - column_, loop_, @extracting_column);
  50. RETURN a_lower + 2*(cdb0 + cdb1) + (CASE WHEN side = 1 THEN 0 ELSE cde0 + cde1 END) + (CASE WHEN column_ > @extracting_column THEN 0 ELSE cde1 END) + 1;
  51. END IF;
  52. END
  53. """)
  54.  
  55. cur.execute("""
  56. CREATE FUNCTION flip_side
  57. (
  58. side INT
  59. )
  60. RETURNS INT
  61. BEGIN
  62. RETURN CASE WHEN side = 1 THEN 2 ELSE 1 END;
  63. END
  64. """)
  65.  
  66. cur.execute("""
  67. CREATE FUNCTION flip_column
  68. (
  69. column_ INT
  70. )
  71. RETURNS INT
  72. BEGIN
  73. RETURN @number_of_columns - column_ + 1;
  74. END
  75. """)
  76.  
  77. cur.execute("""
  78. CREATE FUNCTION lower_area
  79. (
  80. loop_ INT
  81. )
  82. RETURNS INT
  83. BEGIN
  84. RETURN 2 * (area_diag(loop_, @extracting_column) +
  85. area_diag(loop_, flip_column(@extracting_column)) +
  86. area_horz(loop_, @extracting_column) +
  87. area_horz(loop_, flip_column(@extracting_column)));
  88. END
  89. """)
  90.  
  91. cur.execute("""
  92. CREATE FUNCTION area_diag
  93. (
  94. loop_ INT,
  95. extracting_column INT
  96. )
  97. RETURNS INT
  98. BEGIN
  99. IF extracting_column + @base_value > @number_of_columns THEN
  100. RETURN 0;
  101. END IF;
  102.  
  103. RETURN bin2(loop_) - bin2(loop_ + extracting_column + @base_value - @number_of_columns) - bin2(loop_ - @number_of_layers) + bin2(loop_ + extracting_column + @base_value - @number_of_columns - @number_of_layers);
  104. END
  105. """)
  106.  
  107. cur.execute("""
  108. CREATE FUNCTION bin2
  109. (
  110. n INT
  111. )
  112. RETURNS INT
  113. BEGIN
  114. RETURN CASE WHEN n > 0 THEN n*(n-1) DIV 2 ELSE 0 END;
  115. END
  116. """)
  117.  
  118. cur.execute("""
  119. CREATE FUNCTION min_
  120. (
  121. a INT,
  122. b INT
  123. )
  124. RETURNS INT
  125. BEGIN
  126. RETURN CASE WHEN a < b THEN a ELSE b END;
  127. END
  128. """)
  129.  
  130. cur.execute("""
  131. CREATE FUNCTION max_
  132. (
  133. a INT,
  134. b INT
  135. )
  136. RETURNS INT
  137. BEGIN
  138. RETURN CASE WHEN a < b THEN b ELSE a END;
  139. END
  140. """)
  141.  
  142. cur.execute("""
  143. CREATE FUNCTION area_horz
  144. (
  145. loop_ INT,
  146. extracting_column INT
  147. )
  148. RETURNS INT
  149. BEGIN
  150. RETURN min_(@base_value, @number_of_columns - extracting_column)*min_(loop_, @number_of_layers);
  151. END
  152. """)
  153.  
  154. cur.execute("""
  155. CREATE FUNCTION circ_horz
  156. (
  157. loop_ INT,
  158. extracting_column INT
  159. )
  160. RETURNS INT
  161. BEGIN
  162. RETURN CASE WHEN loop_ < @number_of_layers THEN min_(@base_value, @number_of_columns - extracting_column) ELSE 0 END;
  163. END
  164. """)
  165.  
  166. cur.execute("""
  167. CREATE FUNCTION circ_diag_before
  168. (
  169. layer INT,
  170. side INT,
  171. column_ INT,
  172. loop_ INT,
  173. extracting_column INT
  174. )
  175. RETURNS INT
  176. BEGIN
  177. IF column_ < extracting_column THEN
  178. SET column_ = flip_column(column_);
  179. SET extracting_column = flip_column(extracting_column);
  180. END IF;
  181.  
  182. RETURN max_(0, min_(layer - 1, @number_of_columns - column_));
  183. END
  184. """)
  185.  
  186. cur.execute("""
  187. CREATE FUNCTION circ_diag_exists
  188. (
  189. layer INT,
  190. side INT,
  191. column_ INT,
  192. loop_ INT,
  193. extracting_column INT
  194. )
  195. RETURNS INT
  196. BEGIN
  197. IF column_ < extracting_column THEN
  198. SET column_ = flip_column(column_);
  199. SET extracting_column = flip_column(extracting_column);
  200. END IF;
  201.  
  202. RETURN cast(column_ <= @number_of_columns AS INT);
  203. END
  204. """)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement