aoc_1210.slt 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. # https://github.com/MaterializeInc/advent-of-code-2023/blob/main/week1/aoc_1210.md
  10. mode cockroach
  11. statement ok
  12. CREATE TABLE input (input TEXT);
  13. statement ok
  14. INSERT INTO input VALUES (
  15. 'SJJL|-.LFSS.S-|7-L-L-L|F7FS|J.LL-.|J.L7SJ|.J-7F..-S7|7SFSSSJLLJ|-..L..J-L7JJS.J-7-LJ-|.J7||.LF.7.7SF7LL-.|7-7F77|LFJFSS77JF.S.|.-F
  16. J..-.--S|SL.|S.7L7-|SFL.FJF7L-LJ-SFL|L|--F.-FS|7.LJLJ.-.|LF|J.L-JJJ7F|S..FSSSLL-F.-FFL7-7LLLFJ.LFSSJFF7F.7F|F7LJ|F||L7.7.7|7-|J77S
  17. JL7|JSJ|FLLSLFF|-7JSJSJFL|L.J|||J-S.S..|-SF-|----JS.-J|JJ.|-F||.FL..JLL7.-LJ7FSJFL..|F7JJJ|LLJFFJJFLL7.LJJJF--FFLS-|LLLS-..-|S|J7F
  18. |JFF-L|F7|.F.L7J-7F-.LSF7J-|S7|FLS--JF.SF.S.S.LSLL..F7.SS7L|7J|.---|7JL|7SLL|SS.JLLL|L.7..JL||JL|JL.S777.|-JSSL|S.7JJFLJ.SJ-.|L|FJ
  19. 7|L-S7|JFL.SJ7FL|.LLJ.F7SF-.-SL77-FJ7S-J|SS-|L-J|J.7F|.7.S.LS-|.JJJ|.S|.|777-LJ-.J.7-LSSL|SJ.J.-F.-LSS-SJ.LL|S7|FJL77.FFFJJ.-LS-|-
  20. SJ.-|..-LF7-FS.S|7F|LJ--SS-SFFF||S7|FF.7..F7|JFJJJ--7JLS||S7J--J-JF-|7SFJ|7.||||7LS|-..FJ.|S77JF.F77L.|.-F.L.-J-FL-JFL-|.S.LJ|J.L7
  21. FF7F-.7.-LS-FF.--LL.|.7L-J7FS-.F--S7.LJLL.-7FF|7J7L..S7LJL7-JLF-S7JJ|-LS7S-|JLF7LFSJSF7L-F.7S-|7S-.F||.J.-F|-SJL|SFF7|-|F--||7LJ7F
  22. S.J7L.F|S-.F|FSJ|--|L.JS77JL7.SS7|FJFFF-F|.SF7LL.JFL7SJJLL|LLSS.L|F.|F-|S|JJ--FJLFJJ7..77.S|LJFJJS.-7S-LJ|L|S-J|FLLLJFSSFS.J-FS|LJ
  23. SF.77J-L-7|FF-J-77-L-F|J.|F.J7SJL..SF||S77.7J|J.L-|-7L-JSJ.S.-FL-F7FL|SSFS7-|S-.L.FF-L-F..J-FS77.JJ-SF7SS--.JLLSJ.F7LS.JS|..J|J|7S
  24. J|L-7|77|-F-SF7-..7|.77L7.LJLLL..LSJFLJ|-|L7|-S||||F|LLF77-LF||-|S.JL.|.LF7S7.FFF--SFF.-J-F.F7JJ.7JLJ-7S-LLSFLJ7.-JF.SSLLSSSJSSF7.
  25. .|.L.|.|FJ.L||.77L-SJ.|F7-.L7LJ7LJ||.SJF-.||SF..L|JSL.-S.SFLSJLJ7S-FFFJ7F.J-L...|LFLF-SSLS7F|7J.-.F||.|L|JLJ|LJ...FSJ||---7|.--LF.
  26. LFJ|7L|S||..J|7S..J--.77F7-7F.S-J777.||FFL|.|-FJSSFFLSJ.|J-.JS-FSS.|F7.S.SJ-JJS.-S|LJJ-JLJS-7SSF7JS7.|J77-JS7J.F|JFFF|S-F||SS.|LFF
  27. FJ-|F7.F-LLF-.J7LS|LJSSF|.7S||-F|7S.J.|JSJLLJF-LS|SFJ7LL7SSS7S.S-|.S7||SLFSLFL|.LJ-S77|L|F|S-.7F7F.JJ-FL|J7S.7J.FJ7S|JJ|L7F7F|S|.|
  28. ..JF.-L|JFL-FS|FJ77..S|-SLFLL7||SL|-L-.|.7JLF7J--7J-7S7L77JLJFS.J.7..7S7F7|S7|.LFLJS-.L|LS7FJFL-L-L-7S77-LJ-.JFFJ.J7L.FJSJLFSJ|L7F
  29. FFLS|-S.|F|SLFL|SF|JLS|FFFSJLJ|F.J|LSJJ7FS|LL7-.J-LFJ|7JJ.7|J.-JF.L...LS7LFJJF7JJ.L...|S..-7.-S.JFLLSLFS|JFJ-.L|L.L7FSJ.|LFL-F7F.7
  30. SJ-7LS7.-FL|F.FJ|7|SJL7-J77L-FF.F-|7-|7JL.SF7|FSL-J|.LL.|.7LSJS||7SL7.7.JSFFJFS-7.LLLS..7L.SFFJ--|-SFF7||SJS-7|-|J-.SSJ|.77.|-L.F-
  31. .LJJ-L7.---.S-7.7|FS..SJ|SLJ|FS|SLLLFJ7.F-F7LL7S-S-JF.7F7LL-J-.|L|-|-.L.7SSS|SL||-|JFFL.J7SJSF.F.F7S|FL--LLJ-L.SJ.LLJLLFS7J-.|FJ.J
  32. JSFLJ|.JJFFLF|F|LJ||L7-J7JS.|LL7JSFSJJSSLFJ7|L.FJJLL-FFLSS.FJ-.SSSLLJL777FL.-..7SF-.-.SFF-.J7F|JJS---L|.L|-.FSJ-||S-LJFS.S7|J-7J-S
  33. L77SLFJ7FJ.|-|.|7LJS7LL.-7.LFJLSFJ|S-FJ..LJ.7-SJ-|LJ77|JFLSF|.SJ.|L--L|S7-SS.-.F-JS--|SLS-SS-F77LF..JS-FJF.SJ7.FJ|-SF-LSLL||J.|-.7
  34. .-S|S--FSJ--7|F7-L|-SS-JL|FLFFJL7-FJJSJS7SJL7.SS|S|.LLSS7FS-.J-JSF.|777--7.|J|7S|.L|L|SL|SSF|7L.F|JF.FJ--.J-|S.S.SSS..SL-|S.S.L|-J
  35. 7JSJ7|J7--LSS|7SLFSJ-.SF-|77||....7.L7J|7|7|.-.LJ..LSJ7|SFLSFJF|JFL7F|7|LJFJ7|LJSSJ.7-|7JSJL.J|F.|.J7-F7-F|-S.-LS-.-JS.SSS|JLS||F-
  36. SJL.LL7JJS-S|-SF-LS.7FL-F7L|F7.SFFF7J77-SLF|.LFFLLSS7S|----SLL7FL7||LFFSJLF-.|7F--JF7..JL---S.SSSJF|SLSJ.-L|LFJJL-7S-7FF--SL||FLSL
  37. F7S.|7SL-|.F|.L.-.7L|LLL-L7SJL-JJJ|J-FJLSLF7F7JFJ7.FL|7J.7F.|.JSL.|L7S---.F-.-.FSL|LLSFLF|7.7-|J7-|-7..-SJF-|S|J7LL7FSJ|F.7JJF.7|J
  38. S.L|SL|JF..SLJL|S.F7-||77LLFJ.S|S-LL.J-7|FF-SJJJL|J.FLJLL7JFFJ..FFJLSSSS-|-77-S-.F777--|S.---.F-SLL|S7S7SJLSF-S.-|LJ7-L--7..-|.7L.
  39. F.|7.-JL|7L.JFF|LLLJF-S7F|LF-7LL|7|.J-S..S|FFJ7.FSL.|-LJ-|JLLL.LLL-7-F-|L-L-|.77SJSF-SF7.SFJL|.F|.SS..FL7L.7FSL7SL7SJSSFSS|SF.-F77
  40. .SLL.JL|L.77S.77L|SJF..FL|-F.S-SS.7SS-LLFS|L.S7J7L|F|L-7|JJ-77SF-77|LFLSF7LJFS||LJJ|J7.-LFF-L.|LF.LS|J-.LJ|J.L|--J7.S.-L.-LFF7F77-
  41. --J-.SL--L7JJSFJLJS.FL.7-F7-SJS.L.S.LF|7J-|77FS|-J-|S.FSLS.7.J|J.LLF-LL.S--7S.-LSS|JLJF.S|.F7SLSS.L-L.|F-JL|LFS-S.J77-L7.|7|S|.S.|
  42. 7SJS-|F-.F...LFSJFLFLFFFJ||JL--J|S.LJ-LL|7S-FF-J.7F.JJ|L-.JF7J|L|S-.LJ|S.SFSLLS.L7SJFSJ.SL--L|F.S.SLS.|S.-..7F7|LSF|SJFS7FJ7S|J.-J
  43. 7...J.L--7S-SF.LSJ7JLJFL7LFFLJ..|FFL-7FSJ|S|LLL.FL7-LL|-JFF-||L-JF7FLJJLL-|S...S.|L.-FJF.FS-.7.JJ|.L7J.LSSS7.S..J-7|-SFSSF7S..SL7F
  44. LJFFJJFLS..|.L7J.-S7-.-|--|7JJFL-.|JF|.S.-.J|F7|SFSF|-L-SJLL.-.---L7FS-LL7|FS7L.J|||S-F|SJFL7F7|-L7L.SS.FL.LSF-7|F.F.|7FJLJF7L--SL
  45. -J-S.F--.SFF..L7JJ.FSLJLLSS7F7JJJ.JLLLF|.7SFSL7L|-FSS.|7LS777LL7--.7F-.L|L.-F-7..|LS-J.LJL..F.S-J7-7LL7-L7LF|LS.J7LL|77S-F.S.|.7FS
  46. J|LJ7LS|-.|7L777|-|LL77JF--7LSF|L||S...-.JLS.|..7-|LL7S.JF.-.JFJF7JFFL.|S-7.J.7.JJ-LJL-7LF--LL|J.L|-LL7L-FF7-.-SL.S7.LF.|JFS--7.FS
  47. 7-L7SSSL7S|S|-L|.7.S|-7.SJSF7|S7J7|JLLSFJS.FL.L-LSFF.SF-7-7-S||S.JLFSLS-F-S|LSFS.JL-77|7.7-7.|FJL|SL-.JLLS-J|.SJF|-|LFSLJF-JFSJ|F.
  48. SLL.-JJJLFFSFF|JJLF-|-SSFL7.|-FF|-J7.SS|FS7J7.S7.7|-FS7L-.SJ-|FF.7-|SF..7S7F-S-S||L-7|SFF-.S|--|7S-L7JJLFJ..|.SJFS.7J---L--.S|F-7J
  49. .F.FLJJ|J|JF|LJ-SL.|77FJ-LL|S-JJ7F-LLSL-SFLLFJ7SS|JJFFF7JFF-J.-..|7F-7|-JFF.FJJ.L.|J|SJJ|..J||J.J|.|7-S---F..-SLS.7.7SFF-L.7.S||-7
  50. JF-SFL.S|LL7FF-.F...JSS||.7-JFJLFS.J|7|S7SJ|-J.|-|L|JS.7F-7F|F|.|JSJSS7FLLS.S7--L-7.--SSLJL||77-F|.FJ7|7JS|F7JJ-L-J-|JSSSF..LF-LJS
  51. L-F|F77SFS7JS-JFS77FF|SJFFLJS|LJ7J-.L.L--FSS77S.J.7FLLSLS|77LFLJ|7|L-7..-F77S.-S--F..|JLF|-7L.S7J|F|-LJ.FJ7|.7SSL.7JS.-.L|-FLL-JF7
  52. 7F|FF-SLLJL|||FL-F.77L.L-J.J|F-||.7.-S7F-7F-7.|LSS7LL.SJS--L|L-F.JSS-|7FSSSLJ.-|L|7F|F-LS.J-LLL-SLFF.F7SFSJLJ-S.LLFJF|7JLF.S7-F--F
  53. -L7J-FL-L|...7.SL.FSJ||7--FF7L7.J-FSL-SFL.F|7|||7F.-F..--L-S--JLFJ7J.|7-LJ.L|L..L|.7|7.|S7FLLJS-J|S7|JJSFJJ.7JLJ7FS-L7S7FSSF-L-S7|
  54. .J|.JJL7--SS-S|L-LLLF|S7JJ7L-F-S.|-|7FL-.7SJ7S.FSF.|S7|-|L.L..-L.-LJL-|7-7L.7S7F|77JL77SL7|JLLF|LJS|LJFL-FSL.F.-JSS7-FF|S.||..S7SF
  55. JF-77L-L.FS-SLLJFSL.-7|S.L7.S.JLS7SJ.7J7|LJJSLSJF.-F|SFFS|||F77-.-.J||7FLJF--7LL|L.7.77SF|FJF-LJFJS|-FJ|L|L.7JJ|F..|L.LL..J-|J-|.L
  56. 7.|L-.-SFFS||.-|JLLLJ7-7JF|7F||SL-FS-J7SSJFJ--|J-SJ-|F||JL7F|F|J.LJS-JJ-S|JS.J.|.|7-F.7|LS--F7-.F|JJ.LS--.-|.J|J|SF.FS-JS.LLLF7S-F
  57. SFL.FJF7S.JF7JS7--|S.JJ7F--SS7L|SJ.J.SJ|SJ77-SLSFJJ7|-77-S7L-7S..-.L.JS.S7FFF|-77.SS-LF|LSFLFLJJL|FL.-LL|J-JFJ7-.L|.LSJ.77LJFF7L7.
  58. .L-F-F.FS7.F7JL7.7J7J|J|SFSJ7LLSSFJ-FSJ-.7.SLFJJF.FJJ|7.L777J7.S77...7|SFS-.L7.FS.J.-S.FJS7SJLJS-J|LJ-.J|L--F|S||SLJFJJJJSSF-L.FLJ
  59. |7.SS-FSS-FL||SL.7L|7.7FL.77S|F.S-.LFSS.SJJ-77JFL7F-SS.SLFLFSJ|.LF7SJJFJ||F7F|SLF.||JSF-J-..-77S.|.S||F7--7FL7LLS7||-.7|JJ-.7FLS-F
  60. 7JL-..7.L.-SS.J7FS-L-L|F.JLF-.|.7.F-SL.-7JF.S7-FSJ-|F.LJ--FJ.SLF--|L7.F-L7-S-77.S.7.JFSLJ-FS77JJ|||S7J-JSJ.|-|F7L--L7S|LF-J|LS..--
  61. F.-JSF-.SF7LFF-F7-.|.77SF|.SFL.-S|L7-7.--F77SSSL-FSLF7FL7|SLFLS|FF7L-JJJL7.J-|-|F-.-L7-.JJ|F7.7-F-L.LJ7JJSLJFL.7|L7LS7|L-FJ7L-LJJS
  62. |-J7.L---.7-77-7FLF7.JJ-LS.|-S|-S7JS7SJ|.J|L..SJ.J|7SL.7|.LJ.S-7F--.7S.J-.SS7.7SS7-SFLJ|SJ-|L7|S.FF7S-7S.SF7S.|JL-S-F|.777FJSFL77J
  63. 7JFF7-|S.J.FSJ-.L|S|L.-JJJSLS7F|7J-7FLS7SF|.|J7LJ-|S7..7SJL...SS7J.|L|SFJ.7F-.--F.777J77L.F|-L-|.7SS..7JL-S-L.J7FFFSSS77-S..L|..L|
  64. J7JFL-||F.S--LFLS7L|.L.SJL.-LFFSJJ.7FJL|SJ-JJJS7|LSL7.F-J7.-|L-J.|.JL77J7J.|..FLSJ.LLJ||LLL|.SF77S--J-.-|S7F||77F|JJLF|-L..|-|7--7
  65. .|7SJS-....7LJ.7L-SF--|L.LLFJSFF|.JF.-LFF7LJJ7.JJ..7L|-S.FLJ7-F7S-||J77SFJ.LSLLF|.F-F7-|FF7FJ.7LF.L-J-.F7.F7JFFS|--L7-.-S|7-LF|..S
  66. 7F7.JLSJ7|7L.FJ|J7JJLF7JJFJ7.L-J-FJFFLL|.LFL-L|-|J|-||J-F-.JF-|7J..7F.S|J7.SFJS7.JLLL-S7SJSF-77JL-LF77L-S|FS.JLJ7SLF|FJ.F|-S|L|-JF
  67. .J-.|J--F--J-77-|7-JJ.7SJSJJ7|F|.FLJ.7JFJ.J-L.S|-7|-J7.FLSS|J-|--.JS7-L.7L7S7JSJJ||-S-L-7J|SLJF7FJSS|.L.F-F7LL.F7.7-L.7SL|.777|J77
  68. J7-7.|S-LS7|FJLJ-SF||S7777-|.77FSL|SFLFF.SS7|L-.JFSJ7.|L|LJF|J|7-S7S7-FL.FJJ77|SL|J.SJ-|FL-|7.JJS-S|SS|L-7LJ-S7-J-F-JLL-|LSJ|JLJ7.
  69. S77SS7J.JFFL7|S-L.SSFL.S|SJ||JJ7.SSJS|LJ--.J|-.-S7JLJJSFJ-L-FS|SL77JLJ-LJS|FJL---L|.S7LF-JJ7-|S|....SJLJSJ-.LJ.FL7.FLS.7L.-LJ-S7|S
  70. FL|JJF|FFFJ.JJSL--F.FJFJ-FLLLJ|F|SLLSL77JS7L.777--JFJ|F|JS|.|.-|7L..L-SL7-7JSF-|.J.J--S|JSS|S.F|.L7LSSFSL-.F|F|7S--JJ|S-F7F-7LLFL|');
  71. query II
  72. WITH MUTUALLY RECURSIVE
  73. lines(line TEXT, row_no INT) AS (
  74. SELECT regexp_split_to_array(input, '\n')[i], i
  75. FROM input, generate_series(1, array_length(regexp_split_to_array(input, '\n'), 1)) i
  76. ),
  77. symbols(symb TEXT, row_no INT, col_no INT) as (
  78. SELECT substring(line, j, 1), row_no, j
  79. FROM lines, generate_series(1, length(line)) j
  80. ),
  81. -- Each location that is pipe has two neighbors
  82. edge1(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  83. SELECT
  84. row_no,
  85. col_no,
  86. CASE WHEN symb = '-' THEN row_no
  87. WHEN symb = '|' THEN row_no - 1
  88. WHEN symb = 'F' THEN row_no + 1
  89. WHEN symb = 'L' THEN row_no - 1
  90. WHEN symb = 'J' THEN row_no
  91. WHEN symb = '7' THEN row_no
  92. ELSE NULL
  93. END,
  94. CASE WHEN symb = '-' THEN col_no - 1
  95. WHEN symb = '|' THEN col_no
  96. WHEN symb = 'F' THEN col_no
  97. WHEN symb = 'L' THEN col_no
  98. WHEN symb = 'J' THEN col_no - 1
  99. WHEN symb = '7' THEN col_no - 1
  100. ELSE NULL
  101. END
  102. FROM symbols
  103. WHERE symb != '.' AND symb != 'S'
  104. ),
  105. edge2(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  106. SELECT
  107. row_no,
  108. col_no,
  109. CASE WHEN symb = '-' THEN row_no
  110. WHEN symb = '|' THEN row_no + 1
  111. WHEN symb = 'F' THEN row_no
  112. WHEN symb = 'L' THEN row_no
  113. WHEN symb = 'J' THEN row_no - 1
  114. WHEN symb = '7' THEN row_no + 1
  115. ELSE NULL
  116. END,
  117. CASE WHEN symb = '-' THEN col_no + 1
  118. WHEN symb = '|' THEN col_no
  119. WHEN symb = 'F' THEN col_no + 1
  120. WHEN symb = 'L' THEN col_no + 1
  121. WHEN symb = 'J' THEN col_no
  122. WHEN symb = '7' THEN col_no
  123. ELSE NULL
  124. END
  125. FROM symbols
  126. WHERE symb != '.' AND symb != 'S'
  127. ),
  128. -- Symmetrized graph
  129. symm(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  130. SELECT r1, c1, r2, c2
  131. FROM (
  132. SELECT * FROM edge1
  133. UNION ALL
  134. SELECT * FROM edge2
  135. UNION ALL
  136. SELECT r2, c2, r1, c1 FROM edge1
  137. UNION ALL
  138. SELECT r2, c2, r1, c1 FROM edge2
  139. UNION ALL
  140. SELECT row_no, col_no, row_no + 1, col_no FROM symbols WHERE symb = 'S'
  141. UNION ALL
  142. SELECT row_no, col_no, row_no, col_no + 1 FROM symbols WHERE symb = 'S'
  143. UNION ALL
  144. SELECT row_no, col_no, row_no - 1, col_no FROM symbols WHERE symb = 'S'
  145. UNION ALL
  146. SELECT row_no, col_no, row_no, col_no - 1 FROM symbols WHERE symb = 'S'
  147. )
  148. GROUP BY r1, c1, r2, c2
  149. HAVING COUNT(*) = 2
  150. ),
  151. reach(r INT, c INT) AS (
  152. SELECT row_no, col_no
  153. FROM symbols
  154. WHERE symb = 'S'
  155. UNION
  156. SELECT r2, c2
  157. FROM reach, symm
  158. WHERE r = r1 AND c = c1
  159. ),
  160. part1(part1 BIGINT) AS (
  161. SELECT COUNT(*)/2 FROM reach
  162. ),
  163. -- Part 2: how many cells are *inside* the loop?
  164. -- All (1, *) and (*, 1) cells have their upper left outside the loop (outer edge of the diagram).
  165. -- Each cell inherits from its UL neighbor, toggled by any pipe except '7' and 'L' pipe.
  166. -- Rewrite the pipe to have symbols, and resolve 'S' to actual oriented pipe.
  167. pipe(r INT, c INT, symb TEXT) AS (
  168. SELECT r, c, symb
  169. FROM reach, symbols
  170. WHERE r = row_no AND c = col_no AND symb != 'S'
  171. UNION
  172. SELECT
  173. row_no,
  174. col_no,
  175. CASE WHEN row_no = s1.r1 AND col_no = s1.c1 + 1 AND row_no = s2.r2 + 1 AND col_no = s2.c2 THEN 'J' -- toggle
  176. WHEN row_no = s1.r1 AND col_no = s1.c1 + 1 AND row_no = s2.r2 AND col_no = s2.c2 - 1 THEN '-' -- toggle
  177. WHEN row_no = s1.r1 AND col_no = s1.c1 + 1 AND row_no = s2.r2 - 1 AND col_no = s2.c2 THEN '7' -- no toggle
  178. WHEN row_no = s1.r1 + 1 AND col_no = s1.c1 AND row_no = s2.r2 AND col_no = s2.c2 - 1 THEN 'L' -- no toggle
  179. WHEN row_no = s1.r1 + 1 AND col_no = s1.c1 AND row_no = s2.r2 - 1 AND col_no = s2.c2 THEN '|' -- toggle
  180. WHEN row_no = s1.r1 AND col_no = s1.c1 - 1 AND row_no = s2.r2 AND col_no = s2.c2 - 1 THEN 'F' -- toggle
  181. ELSE '???'
  182. END
  183. FROM symbols, symm s1, symm s2
  184. WHERE symb = 'S'
  185. AND row_no = s1.r1
  186. AND col_no = s1.c1
  187. AND row_no = s2.r1
  188. AND col_no = s2.c1
  189. ),
  190. -- Enclosed(1,*) and Enclosed(*,1) are all false.
  191. -- Enclosed(x+1,y+1) = Enclosed(x,y) perhaps toggled by pipe(x,y)
  192. status(r INT, c INT, encl BOOL) AS (
  193. SELECT row_no, col_no, false
  194. FROM symbols
  195. WHERE row_no = 1 OR col_no = 1
  196. UNION
  197. SELECT
  198. row_no + 1,
  199. col_no + 1,
  200. CASE WHEN pipe.symb IN (VALUES ('J'),('-'),('|'),('F')) THEN NOT encl
  201. ELSE encl
  202. END
  203. FROM status LEFT JOIN pipe ON (status.r = pipe.r AND status.c = pipe.c)
  204. JOIN symbols ON (status.r = symbols.row_no AND status.c = symbols.col_no)
  205. ),
  206. part2(part2 BIGINT) AS (
  207. SELECT COUNT(*)
  208. FROM status
  209. WHERE encl = true AND (r, c) NOT IN (SELECT r, c FROM pipe)
  210. )
  211. SELECT * FROM part1, part2;
  212. ----
  213. 1439 2073
  214. query T multiline
  215. EXPLAIN OPTIMIZED PLAN WITH(humanized expressions, arity, join implementations) AS VERBOSE TEXT FOR
  216. WITH MUTUALLY RECURSIVE
  217. lines(line TEXT, row_no INT) AS (
  218. SELECT regexp_split_to_array(input, '\n')[i], i
  219. FROM input, generate_series(1, array_length(regexp_split_to_array(input, '\n'), 1)) i
  220. ),
  221. symbols(symb TEXT, row_no INT, col_no INT) as (
  222. SELECT substring(line, j, 1), row_no, j
  223. FROM lines, generate_series(1, length(line)) j
  224. ),
  225. -- Each location that is pipe has two neighbors
  226. edge1(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  227. SELECT
  228. row_no,
  229. col_no,
  230. CASE WHEN symb = '-' THEN row_no
  231. WHEN symb = '|' THEN row_no - 1
  232. WHEN symb = 'F' THEN row_no + 1
  233. WHEN symb = 'L' THEN row_no - 1
  234. WHEN symb = 'J' THEN row_no
  235. WHEN symb = '7' THEN row_no
  236. ELSE NULL
  237. END,
  238. CASE WHEN symb = '-' THEN col_no - 1
  239. WHEN symb = '|' THEN col_no
  240. WHEN symb = 'F' THEN col_no
  241. WHEN symb = 'L' THEN col_no
  242. WHEN symb = 'J' THEN col_no - 1
  243. WHEN symb = '7' THEN col_no - 1
  244. ELSE NULL
  245. END
  246. FROM symbols
  247. WHERE symb != '.' AND symb != 'S'
  248. ),
  249. edge2(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  250. SELECT
  251. row_no,
  252. col_no,
  253. CASE WHEN symb = '-' THEN row_no
  254. WHEN symb = '|' THEN row_no + 1
  255. WHEN symb = 'F' THEN row_no
  256. WHEN symb = 'L' THEN row_no
  257. WHEN symb = 'J' THEN row_no - 1
  258. WHEN symb = '7' THEN row_no + 1
  259. ELSE NULL
  260. END,
  261. CASE WHEN symb = '-' THEN col_no + 1
  262. WHEN symb = '|' THEN col_no
  263. WHEN symb = 'F' THEN col_no + 1
  264. WHEN symb = 'L' THEN col_no + 1
  265. WHEN symb = 'J' THEN col_no
  266. WHEN symb = '7' THEN col_no
  267. ELSE NULL
  268. END
  269. FROM symbols
  270. WHERE symb != '.' AND symb != 'S'
  271. ),
  272. -- Symmetrized graph
  273. symm(r1 INT, c1 INT, r2 INT, c2 INT) AS (
  274. SELECT r1, c1, r2, c2
  275. FROM (
  276. SELECT * FROM edge1
  277. UNION ALL
  278. SELECT * FROM edge2
  279. UNION ALL
  280. SELECT r2, c2, r1, c1 FROM edge1
  281. UNION ALL
  282. SELECT r2, c2, r1, c1 FROM edge2
  283. UNION ALL
  284. SELECT row_no, col_no, row_no + 1, col_no FROM symbols WHERE symb = 'S'
  285. UNION ALL
  286. SELECT row_no, col_no, row_no, col_no + 1 FROM symbols WHERE symb = 'S'
  287. UNION ALL
  288. SELECT row_no, col_no, row_no - 1, col_no FROM symbols WHERE symb = 'S'
  289. UNION ALL
  290. SELECT row_no, col_no, row_no, col_no - 1 FROM symbols WHERE symb = 'S'
  291. )
  292. GROUP BY r1, c1, r2, c2
  293. HAVING COUNT(*) = 2
  294. ),
  295. reach(r INT, c INT) AS (
  296. SELECT row_no, col_no
  297. FROM symbols
  298. WHERE symb = 'S'
  299. UNION
  300. SELECT r2, c2
  301. FROM reach, symm
  302. WHERE r = r1 AND c = c1
  303. ),
  304. part1(part1 BIGINT) AS (
  305. SELECT COUNT(*)/2 FROM reach
  306. ),
  307. -- Part 2: how many cells are *inside* the loop?
  308. -- All (1, *) and (*, 1) cells have their upper left outside the loop (outer edge of the diagram).
  309. -- Each cell inherits from its UL neighbor, toggled by any pipe except '7' and 'L' pipe.
  310. -- Rewrite the pipe to have symbols, and resolve 'S' to actual oriented pipe.
  311. pipe(r INT, c INT, symb TEXT) AS (
  312. SELECT r, c, symb
  313. FROM reach, symbols
  314. WHERE r = row_no AND c = col_no AND symb != 'S'
  315. UNION
  316. SELECT
  317. row_no,
  318. col_no,
  319. CASE WHEN row_no = s1.r1 AND col_no = s1.c1 + 1 AND row_no = s2.r2 + 1 AND col_no = s2.c2 THEN 'J' -- toggle
  320. WHEN row_no = s1.r1 AND col_no = s1.c1 + 1 AND row_no = s2.r2 AND col_no = s2.c2 - 1 THEN '-' -- toggle
  321. WHEN row_no = s1.r1 AND col_no = s1.c1 + 1 AND row_no = s2.r2 - 1 AND col_no = s2.c2 THEN '7' -- no toggle
  322. WHEN row_no = s1.r1 + 1 AND col_no = s1.c1 AND row_no = s2.r2 AND col_no = s2.c2 - 1 THEN 'L' -- no toggle
  323. WHEN row_no = s1.r1 + 1 AND col_no = s1.c1 AND row_no = s2.r2 - 1 AND col_no = s2.c2 THEN '|' -- toggle
  324. WHEN row_no = s1.r1 AND col_no = s1.c1 - 1 AND row_no = s2.r2 AND col_no = s2.c2 - 1 THEN 'F' -- toggle
  325. ELSE '???'
  326. END
  327. FROM symbols, symm s1, symm s2
  328. WHERE symb = 'S'
  329. AND row_no = s1.r1
  330. AND col_no = s1.c1
  331. AND row_no = s2.r1
  332. AND col_no = s2.c1
  333. ),
  334. -- Enclosed(1,*) and Enclosed(*,1) are all false.
  335. -- Enclosed(x+1,y+1) = Enclosed(x,y) perhaps toggled by pipe(x,y)
  336. status(r INT, c INT, encl BOOL) AS (
  337. SELECT row_no, col_no, false
  338. FROM symbols
  339. WHERE row_no = 1 OR col_no = 1
  340. UNION
  341. SELECT
  342. row_no + 1,
  343. col_no + 1,
  344. CASE WHEN pipe.symb IN (VALUES ('J'),('-'),('|'),('F')) THEN NOT encl
  345. ELSE encl
  346. END
  347. FROM status LEFT JOIN pipe ON (status.r = pipe.r AND status.c = pipe.c)
  348. JOIN symbols ON (status.r = symbols.row_no AND status.c = symbols.col_no)
  349. ),
  350. part2(part2 BIGINT) AS (
  351. SELECT COUNT(*)
  352. FROM status
  353. WHERE encl = true AND (r, c) NOT IN (SELECT r, c FROM pipe)
  354. )
  355. SELECT * FROM part1, part2;
  356. ----
  357. Explained Query:
  358. With
  359. cte l0 =
  360. Project (#0, #2, #3) // { arity: 3 }
  361. Map (substr(#1{line}, #2{j}, 1)) // { arity: 4 }
  362. FlatMap generate_series(1, char_length(#1{line}), 1) // { arity: 3 }
  363. Project (#1, #2) // { arity: 2 }
  364. Map (array_index(regexp_split_to_array["\n", case_insensitive=false](#0{input}), integer_to_bigint(#1{i}))) // { arity: 3 }
  365. FlatMap generate_series(1, (regexp_split_to_array["\n", case_insensitive=false](#0{input}) array_length 1), 1) // { arity: 2 }
  366. ReadStorage materialize.public.input // { arity: 1 }
  367. cte l1 =
  368. Project (#0..=#2, #4, #5) // { arity: 5 }
  369. Map ((#2{symb} = "-"), case when #3 then #0{row_no} else case when (#2{symb} = "|") then (#0{row_no} - 1) else case when (#2{symb} = "F") then (#0{row_no} + 1) else case when (#2{symb} = "L") then (#0{row_no} - 1) else case when (#2{symb} = "J") then #0{row_no} else case when (#2{symb} = "7") then #0{row_no} else null end end end end end end, case when #3 then (#1{col_no} - 1) else case when (#2{symb} = "|") then #1{col_no} else case when (#2{symb} = "F") then #1{col_no} else case when (#2{symb} = "L") then #1{col_no} else case when (#2{symb} = "J") then (#1{col_no} - 1) else case when (#2{symb} = "7") then (#1{col_no} - 1) else null end end end end end end) // { arity: 6 }
  370. Get l0 // { arity: 3 }
  371. cte l2 =
  372. Project (#0..=#2, #4, #5) // { arity: 5 }
  373. Map ((#2{symb} = "-"), case when #3 then #0{row_no} else case when (#2{symb} = "|") then (#0{row_no} + 1) else case when (#2{symb} = "F") then #0{row_no} else case when (#2{symb} = "L") then #0{row_no} else case when (#2{symb} = "J") then (#0{row_no} - 1) else case when (#2{symb} = "7") then (#0{row_no} + 1) else null end end end end end end, case when #3 then (#1{col_no} + 1) else case when (#2{symb} = "|") then #1{col_no} else case when (#2{symb} = "F") then (#1{col_no} + 1) else case when (#2{symb} = "L") then (#1{col_no} + 1) else case when (#2{symb} = "J") then #1{col_no} else case when (#2{symb} = "7") then #1{col_no} else null end end end end end end) // { arity: 6 }
  374. Get l0 // { arity: 3 }
  375. cte l3 =
  376. Project (#0..=#3) // { arity: 4 }
  377. Filter (#4{count} = 2) // { arity: 5 }
  378. Reduce group_by=[#0..=#3] aggregates=[count(*)] // { arity: 5 }
  379. Union // { arity: 4 }
  380. Project (#0, #1, #3, #4) // { arity: 4 }
  381. Filter (#2{symb} != ".") AND (#2{symb} != "S") // { arity: 5 }
  382. Get l1 // { arity: 5 }
  383. Project (#0, #1, #3, #4) // { arity: 4 }
  384. Filter (#2{symb} != ".") AND (#2{symb} != "S") // { arity: 5 }
  385. Get l2 // { arity: 5 }
  386. Project (#3, #4, #0, #1) // { arity: 4 }
  387. Filter (#2{symb} != ".") AND (#2{symb} != "S") AND (#3) IS NOT NULL AND (#4) IS NOT NULL // { arity: 5 }
  388. Get l1 // { arity: 5 }
  389. Project (#3, #4, #0, #1) // { arity: 4 }
  390. Filter (#2{symb} != ".") AND (#2{symb} != "S") AND (#3) IS NOT NULL AND (#4) IS NOT NULL // { arity: 5 }
  391. Get l2 // { arity: 5 }
  392. Project (#0, #1, #3, #1) // { arity: 4 }
  393. Filter (#2{symb} = "S") // { arity: 4 }
  394. Map ((#0{row_no} + 1)) // { arity: 4 }
  395. Get l0 // { arity: 3 }
  396. Project (#0, #1, #0, #3) // { arity: 4 }
  397. Filter (#2{symb} = "S") // { arity: 4 }
  398. Map ((#1{col_no} + 1)) // { arity: 4 }
  399. Get l0 // { arity: 3 }
  400. Project (#0, #1, #3, #1) // { arity: 4 }
  401. Filter (#2{symb} = "S") // { arity: 4 }
  402. Map ((#0{row_no} - 1)) // { arity: 4 }
  403. Get l0 // { arity: 3 }
  404. Project (#0, #1, #0, #3) // { arity: 4 }
  405. Filter (#2{symb} = "S") // { arity: 4 }
  406. Map ((#1{col_no} - 1)) // { arity: 4 }
  407. Get l0 // { arity: 3 }
  408. cte l4 =
  409. Project (#0, #1) // { arity: 2 }
  410. Filter (#2{symb} = "S") // { arity: 3 }
  411. Get l0 // { arity: 3 }
  412. cte l5 =
  413. ArrangeBy keys=[[#0{r1}, #1{c1}]] // { arity: 4 }
  414. Get l3 // { arity: 4 }
  415. Return // { arity: 2 }
  416. With Mutually Recursive
  417. cte l6 =
  418. Distinct project=[#0, #1] // { arity: 2 }
  419. Union // { arity: 2 }
  420. Get l4 // { arity: 2 }
  421. Project (#4, #5) // { arity: 2 }
  422. Join on=(#0{r} = #2{r1} AND #1{c} = #3{c1}) type=differential // { arity: 6 }
  423. implementation
  424. %0:l6[#0{r}, #1{c}]UKK » %1:l5[#0{r1}, #1{c1}]KK
  425. ArrangeBy keys=[[#0{r}, #1{c}]] // { arity: 2 }
  426. Filter (#0{r}) IS NOT NULL AND (#1{c}) IS NOT NULL // { arity: 2 }
  427. Get l6 // { arity: 2 }
  428. Get l5 // { arity: 4 }
  429. cte l7 =
  430. Reduce aggregates=[count(*)] // { arity: 1 }
  431. Project () // { arity: 0 }
  432. Get l6 // { arity: 2 }
  433. cte l8 =
  434. Distinct project=[#0..=#2] // { arity: 3 }
  435. Union // { arity: 3 }
  436. Project (#0, #1, #4) // { arity: 3 }
  437. Join on=(#0{r} = #2{row_no} AND #1{c} = #3{col_no}) type=differential // { arity: 5 }
  438. implementation
  439. %0:l6[#0{r}, #1{c}]UKK » %1:l0[#0{row_no}, #1{col_no}]KKf
  440. ArrangeBy keys=[[#0{r}, #1{c}]] // { arity: 2 }
  441. Filter (#0{r}) IS NOT NULL AND (#1{c}) IS NOT NULL // { arity: 2 }
  442. Get l6 // { arity: 2 }
  443. ArrangeBy keys=[[#0{row_no}, #1{col_no}]] // { arity: 3 }
  444. Filter (#2{symb} != "S") // { arity: 3 }
  445. Get l0 // { arity: 3 }
  446. Project (#0, #1, #8) // { arity: 3 }
  447. Map (case when ((#0{row_no} = #0{r1}) AND (#0{row_no} = (#6{r2} + 1)) AND (#1{col_no} = #7{c2}) AND (#1{col_no} = (#1{c1} + 1))) then "J" else case when ((#0{row_no} = #0{r1}) AND (#0{row_no} = #6{r2}) AND (#1{col_no} = (#1{c1} + 1)) AND (#1{col_no} = (#7{c2} - 1))) then "-" else case when ((#0{row_no} = #0{r1}) AND (#0{row_no} = (#6{r2} - 1)) AND (#1{col_no} = #7{c2}) AND (#1{col_no} = (#1{c1} + 1))) then "7" else case when ((#0{row_no} = #6{r2}) AND (#0{row_no} = (#0{r1} + 1)) AND (#1{col_no} = #1{c1}) AND (#1{col_no} = (#7{c2} - 1))) then "L" else case when ((#0{row_no} = (#0{r1} + 1)) AND (#0{row_no} = (#6{r2} - 1)) AND (#1{col_no} = #1{c1}) AND (#1{col_no} = #7{c2})) then "|" else case when ((#0{row_no} = #0{r1}) AND (#0{row_no} = #6{r2}) AND (#1{col_no} = (#1{c1} - 1)) AND (#1{col_no} = (#7{c2} - 1))) then "F" else "???" end end end end end end) // { arity: 9 }
  448. Join on=(#0{row_no} = #2{r1} = #4{r1} AND #1{col_no} = #3{c1} = #5{c1}) type=delta // { arity: 8 }
  449. implementation
  450. %0:l4 » %1:l3[#0{r1}, #1{c1}]KK » %2:l5[#0{r1}, #1{c1}]KK
  451. %1:l3 » %0:l4[#0{row_no}, #1{col_no}]KKef » %2:l5[#0{r1}, #1{c1}]KK
  452. %2:l5 » %0:l4[#0{row_no}, #1{col_no}]KKef » %1:l3[#0{r1}, #1{c1}]KK
  453. ArrangeBy keys=[[#0{row_no}, #1{col_no}]] // { arity: 2 }
  454. Get l4 // { arity: 2 }
  455. ArrangeBy keys=[[#0{r1}, #1{c1}]] // { arity: 2 }
  456. Project (#0, #1) // { arity: 2 }
  457. Get l3 // { arity: 4 }
  458. Get l5 // { arity: 4 }
  459. cte l9 =
  460. ArrangeBy keys=[[#0{r}, #1{c}]] // { arity: 3 }
  461. Get l17 // { arity: 3 }
  462. cte l10 =
  463. Project (#0..=#2, #5) // { arity: 4 }
  464. Join on=(#0{r} = #3{r} AND #1{c} = #4{c}) type=differential // { arity: 6 }
  465. implementation
  466. %0:l9[#0{r}, #1{c}]KK » %1:l8[#0{r}, #1{c}]KK
  467. Get l9 // { arity: 3 }
  468. ArrangeBy keys=[[#0{r}, #1{c}]] // { arity: 3 }
  469. Get l8 // { arity: 3 }
  470. cte l11 =
  471. Project (#2, #3, #6, #7) // { arity: 4 }
  472. Map ((#0{r} + 1), (#1{c} + 1)) // { arity: 8 }
  473. Join on=(#0{r} = #4{row_no} AND #1{c} = #5{col_no}) type=differential // { arity: 6 }
  474. implementation
  475. %0[#0{r}, #1{c}]KK » %1:l0[#0{row_no}, #1{col_no}]KK
  476. ArrangeBy keys=[[#0{r}, #1{c}]] // { arity: 4 }
  477. Union // { arity: 4 }
  478. Map (null) // { arity: 4 }
  479. Union // { arity: 3 }
  480. Negate // { arity: 3 }
  481. Project (#0..=#2) // { arity: 3 }
  482. Join on=(#0{r} = #3 AND #1{c} = #4) type=differential // { arity: 5 }
  483. implementation
  484. %1[#0, #1]UKKA » %0:l9[#0{r}, #1{c}]KK
  485. Get l9 // { arity: 3 }
  486. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  487. Distinct project=[#0, #1] // { arity: 2 }
  488. Project (#0, #1) // { arity: 2 }
  489. Get l10 // { arity: 4 }
  490. Get l17 // { arity: 3 }
  491. Get l10 // { arity: 4 }
  492. ArrangeBy keys=[[#0{row_no}, #1{col_no}]] // { arity: 2 }
  493. Project (#0, #1) // { arity: 2 }
  494. Get l0 // { arity: 3 }
  495. cte l12 =
  496. Distinct project=[#0] // { arity: 1 }
  497. Project (#1) // { arity: 1 }
  498. Get l11 // { arity: 4 }
  499. cte l13 =
  500. Reduce group_by=[#0] aggregates=[any((#0{symb} = #1{right_col0_0}))] // { arity: 2 }
  501. FlatMap wrap1("J", "-", "|", "F") // { arity: 2 }
  502. Get l12 // { arity: 1 }
  503. cte l14 =
  504. ArrangeBy keys=[[#0]] // { arity: 1 }
  505. Get l12 // { arity: 1 }
  506. cte l15 =
  507. Union // { arity: 2 }
  508. Get l13 // { arity: 2 }
  509. Project (#0, #2) // { arity: 2 }
  510. Map (false) // { arity: 3 }
  511. Join on=(#0 = #1) type=differential // { arity: 2 }
  512. implementation
  513. %1:l14[#0]UK » %0[#0]K
  514. ArrangeBy keys=[[#0]] // { arity: 1 }
  515. Union // { arity: 1 }
  516. Negate // { arity: 1 }
  517. Project (#0) // { arity: 1 }
  518. Get l13 // { arity: 2 }
  519. Get l12 // { arity: 1 }
  520. Get l14 // { arity: 1 }
  521. cte l16 =
  522. Union // { arity: 2 }
  523. Get l15 // { arity: 2 }
  524. Project (#0, #2) // { arity: 2 }
  525. FlatMap guard_subquery_size(#1{count}) // { arity: 3 }
  526. Reduce group_by=[#0] aggregates=[count(*)] // { arity: 2 }
  527. Project (#0) // { arity: 1 }
  528. Get l15 // { arity: 2 }
  529. cte l17 =
  530. Distinct project=[#0..=#2] // { arity: 3 }
  531. Union // { arity: 3 }
  532. Project (#0, #1, #3) // { arity: 3 }
  533. Filter ((#0{row_no} = 1) OR (#1{col_no} = 1)) // { arity: 4 }
  534. Map (false) // { arity: 4 }
  535. Get l0 // { arity: 3 }
  536. Project (#2, #3, #6) // { arity: 3 }
  537. Map (case when #5{any} then NOT(#0{encl}) else #0{encl} end) // { arity: 7 }
  538. Join on=(#1 = #4) type=differential // { arity: 6 }
  539. implementation
  540. %0:l11[#1]K » %1[#0]K
  541. ArrangeBy keys=[[#1]] // { arity: 4 }
  542. Get l11 // { arity: 4 }
  543. ArrangeBy keys=[[#0]] // { arity: 2 }
  544. Union // { arity: 2 }
  545. Get l16 // { arity: 2 }
  546. Project (#0, #2) // { arity: 2 }
  547. Map (null) // { arity: 3 }
  548. Join on=(#0 = #1) type=differential // { arity: 2 }
  549. implementation
  550. %1:l14[#0]UK » %0[#0]K
  551. ArrangeBy keys=[[#0]] // { arity: 1 }
  552. Union // { arity: 1 }
  553. Negate // { arity: 1 }
  554. Distinct project=[#0] // { arity: 1 }
  555. Project (#0) // { arity: 1 }
  556. Get l16 // { arity: 2 }
  557. Get l12 // { arity: 1 }
  558. Get l14 // { arity: 1 }
  559. Return // { arity: 2 }
  560. With
  561. cte l18 =
  562. Project (#0, #1) // { arity: 2 }
  563. Filter (#2{encl} = true) // { arity: 3 }
  564. Get l17 // { arity: 3 }
  565. cte l19 =
  566. Reduce aggregates=[count(*)] // { arity: 1 }
  567. Union // { arity: 0 }
  568. Negate // { arity: 0 }
  569. Project () // { arity: 0 }
  570. Join on=(#0 = #2{right_col0_2} AND #1 = #3{right_col1_3}) type=differential // { arity: 4 }
  571. implementation
  572. %1[#0, #1]UKKA » %0:l18[#0, #1]UKKef
  573. ArrangeBy keys=[[#0, #1]] // { arity: 2 }
  574. Get l18 // { arity: 2 }
  575. ArrangeBy keys=[[#0{right_col0_2}, #1{right_col1_3}]] // { arity: 2 }
  576. Distinct project=[#0{right_col0_2}, #1{right_col1_3}] // { arity: 2 }
  577. Project (#0, #1) // { arity: 2 }
  578. Get l8 // { arity: 3 }
  579. Project () // { arity: 0 }
  580. Get l18 // { arity: 2 }
  581. Return // { arity: 2 }
  582. CrossJoin type=differential // { arity: 2 }
  583. implementation
  584. %0[×]U » %1[×]U
  585. ArrangeBy keys=[[]] // { arity: 1 }
  586. Project (#1) // { arity: 1 }
  587. Map ((#0{count} / 2)) // { arity: 2 }
  588. Union // { arity: 1 }
  589. Get l7 // { arity: 1 }
  590. Map (0) // { arity: 1 }
  591. Union // { arity: 0 }
  592. Negate // { arity: 0 }
  593. Project () // { arity: 0 }
  594. Get l7 // { arity: 1 }
  595. Constant // { arity: 0 }
  596. - ()
  597. ArrangeBy keys=[[]] // { arity: 1 }
  598. Union // { arity: 1 }
  599. Get l19 // { arity: 1 }
  600. Map (0) // { arity: 1 }
  601. Union // { arity: 0 }
  602. Negate // { arity: 0 }
  603. Project () // { arity: 0 }
  604. Get l19 // { arity: 1 }
  605. Constant // { arity: 0 }
  606. - ()
  607. Source materialize.public.input
  608. Target cluster: quickstart
  609. EOF