LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

#!/usr/bin/env lua

local input =
[[
a → b, c, d, z
b → d, e, f, z
c → d, e, f, z
d → e, f, z
e → f, z
f → g, h, j, z
g → h, i, j, z
h → i, j, k, z
i → j, k, l, z
j → k, m, z
k → l, n, o, z
l → m, z
m → n, o, z
n → o, z
o → p, z
p → q, z
q → r, z
r → s, z
s → t, u, z
t → u, v, z
u → v, w, z
v → w, z
w → x, y, z
x → y, z
y → z
z → (нет исходящих)
]]

local paths = { }

for start,list,val in input:gmatch('(%w)%s+→(.-)\n') do
    paths[start] = { }
    for v in list:gmatch('%s+(%w)') do
        if not paths[start][v] then
           paths[start][v] = v
        end
    end
    ---
    for k, p in pairs(paths) do
        for x,v in pairs(p) do
            if x == start  then
               p[x] = paths[start]
            end
        end
    end
end

local count = 0

local function trace(path,name)
    for k,v in pairs(path) do
        if k == 'z' then
           io.write(name..'z \n')
           count = count + 1
        else
           trace(v,name..k..' -> ')
        end
    end
end

trace(paths['a'],'')
print(count)
...
22061

Не сразу понял, долго тупил. Затем ещё дольше тупил почему у меня 51599 путей выходит, пока не понял что я ищу все пути от всех к z, а надо только от a к z

Исходная версия LINUX-ORG-RU, :


local input =
[[
a → b, c, d, z
b → d, e, f, z
c → d, e, f, z
d → e, f, z
e → f, z
f → g, h, j, z
g → h, i, j, z
h → i, j, k, z
i → j, k, l, z
j → k, m, z
k → l, n, o, z
l → m, z
m → n, o, z
n → o, z
o → p, z
p → q, z
q → r, z
r → s, z
s → t, u, z
t → u, v, z
u → v, w, z
v → w, z
w → x, y, z
x → y, z
y → z
z → (нет исходящих)
]]

local paths = { }

for start,list,val in input:gmatch('(%w)%s+→(.-)\n') do
    paths[start] = { }
    for v in list:gmatch('%s+(%w)') do
        if not paths[start][v] then
           paths[start][v] = v
        end
    end
    ---
    for k, p in pairs(paths) do
        for x,v in pairs(p) do
            if x == start  then
               p[x] = paths[start]
            end
        end
    end
end

local count = 0

local function trace(path,name)
    for k,v in pairs(path) do
        if k == 'z' then
           io.write(name..'z \n')
           count = count + 1
        else
           trace(v,name..k..' -> ')
        end
    end
end

trace(paths['a'],'')
print(count)
...
22061

Не сразу понял, долго тупил. Затем ещё дольше тупил почему у меня 51599 путей выходит, пока не понял что я ищу все пути от всех к z, а надо только от a к z