Sha256: d8be6145ec593390eda04a4c36f2025db840440eaa3bd0977c69104ab845b609

Contents?: true

Size: 1.81 KB

Versions: 396

Compression:

Stored size: 1.81 KB

Contents

local combinations

local function generate_combinations(a, n, offset)
  if n > (#a - offset) then
    return
  end

  if n == 0 then
    coroutine.yield({})
    return
  end

  for v in combinations(a, n - 1, offset + 1) do
    table.insert(v, 1, a[1 + offset])
    coroutine.yield(v)
  end

  for v in combinations(a, n, offset + 1) do
    coroutine.yield(v)
  end
end

function combinations(a, n, offset)
  return coroutine.wrap(function() generate_combinations(a, n, offset or 0) end)
end

local function generate_permutations(a, n)
  if n == 0 then
    coroutine.yield(a)
  else
    for i = 1, n do
      a[n], a[i] = a[i], a[n]
      generate_permutations(a, n - 1)
      a[n], a[i] = a[i], a[n]
    end
  end
end

local function permutations(a)
  return coroutine.wrap(function () generate_permutations(a, #a) end)
end

local function unique_letters(s)
  local letter_set = {}
  s:gsub('%a', function(l)
    letter_set[l] = true
  end)

  local letters = {}
  for l in pairs(letter_set) do
    table.insert(letters, l)
  end

  return letters
end

local function populate_letter_map(letter_map, letters, values)
  for i = 1, #letters do
    letter_map[letters[i]] = values[i]
  end
end

local function evaluates_true(solution)
  return load('return ' .. solution)()
end

local function has_no_leading_zeros(solution)
  return not (solution:find('^0%d+') or solution:find('%D0%d+'))
end

local function solve(puzzle)
  local letters = unique_letters(puzzle)
  local letter_map = {}

  for c in combinations({ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, #letters) do
    for p in permutations(c) do
      populate_letter_map(letter_map, letters, p)
      local solution = puzzle:gsub('%a', letter_map)
      if evaluates_true(solution) and has_no_leading_zeros(solution) then
        return letter_map
      end
    end
  end
end

return {
  solve = solve
}

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.179 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.178 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.177 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.176 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.175 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.174 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.173 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.172 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.171 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.170 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.169 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.167 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.166 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.165 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.164 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.163 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.162 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.161 tracks/lua/exercises/alphametics/example.lua
trackler-2.2.1.160 tracks/lua/exercises/alphametics/example.lua