aboutsummaryrefslogtreecommitdiff
path: root/challenge-214/roger-bell-west/lua/ch-2.lua
diff options
context:
space:
mode:
author冯昶 <fengchang@novel-supertv.com>2023-05-02 14:47:44 +0800
committer冯昶 <fengchang@novel-supertv.com>2023-05-02 14:47:44 +0800
commitfb913ef4e973a29450b92ca89588e839bf6635f6 (patch)
tree94abff55c6006a2b0a4b1da93a5e661753e00fea /challenge-214/roger-bell-west/lua/ch-2.lua
parentefea8410c80647939ae587536a4f1f66dd2c3a4a (diff)
parent6cc2e38f43011f65d7deaf1e03cf55e4306a53e5 (diff)
downloadperlweeklychallenge-club-fb913ef4e973a29450b92ca89588e839bf6635f6.tar.gz
perlweeklychallenge-club-fb913ef4e973a29450b92ca89588e839bf6635f6.tar.bz2
perlweeklychallenge-club-fb913ef4e973a29450b92ca89588e839bf6635f6.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'challenge-214/roger-bell-west/lua/ch-2.lua')
-rwxr-xr-xchallenge-214/roger-bell-west/lua/ch-2.lua86
1 files changed, 86 insertions, 0 deletions
diff --git a/challenge-214/roger-bell-west/lua/ch-2.lua b/challenge-214/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..04a9cf7f6f
--- /dev/null
+++ b/challenge-214/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,86 @@
+#! /usr/bin/lua
+
+-- from Roger's lualib
+function deepcopy(src)
+ local dst = {}
+ for k, v in pairs(src) do
+ if type(v) == "table" then
+ v = deepcopy(v)
+ end
+ dst[k] = v
+ end
+ return dst
+end
+
+function collectpoints(a)
+ local m = {}
+ local s = 1
+ while s <= #a do
+ local k = a[s]
+ local e = s
+ while e <= #a and a[e] == k do
+ e = e + 1
+ end
+ table.insert(m, {k, e - s})
+ s = e
+ end
+ local rv = 0
+ local stack = { { m, 0 } }
+ while #stack > 0 do
+ local s = table.remove(stack)
+ if #(s[1]) == 0 then
+ if rv < s[2] then
+ rv = s[2]
+ end
+ else
+ for i = 1, #(s[1]) do
+ local ss = deepcopy(s)
+ ss[2] = ss[2] + ss[1][i][2] * ss[1][i][2]
+ table.remove(ss[1], i)
+ j = i
+ while true do
+ if j > 1 and
+ j <= #(ss[1]) and
+ ss[1][j][1] == ss[1][j - 1][1] then
+ ss[1][j][2] = ss[1][j][2] + ss[1][j - 1][2]
+ table.remove(ss[1], j - 1)
+ j = j - 1
+ else
+ break
+ end
+ end
+ table.insert(stack, ss)
+ end
+ end
+ end
+ return rv
+end
+
+if collectpoints({2, 4, 3, 3, 3, 4, 5, 4, 2}) == 23 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if collectpoints({1, 2, 2, 2, 2, 1}) == 20 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if collectpoints({1}) == 1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if collectpoints({2, 2, 2, 1, 1, 2, 2, 2}) == 40 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
+