Понял, почему ХС занимались этой темой. Реальность всегда субъективна, объективной реальности не существует. Объективная реальность это Пустота. Мы видим те вещи, которым даём названия и которые играют роль для нас. Как в ролевой игре. Ведь можно по-разному их собирать из разрозненных частей и всё имеет бесконечное число трактовок. Рядом есть разные реальности. Одни не видят то, что видят другие, наша реальность только код трактовки. ПМ действительно хакерский способ работы с реальностью 
pack = " Ac Kc Qc Jc Xc 9c 8c 7c 6c"
     .." Ad Kd Qd Jd Xd 9d 8d 7d 6d"
     .." Ah Kh Qh Jh Xh 9h 8h 7h 6h"
     .." As Ks Qs Js Xs 9s 8s 7s 6s"
shuf = {}    -- Таблица для перетасовки карт
for str in string.gmatch(pack, "%w+") do
  note = {nm, nd} ; note.nm = str
  table.insert(shuf, note)  -- Заполняем таблицу перетасовки
end
all = #shuf ; tot = 0
inp = io.read() ; mask = {}  -- Карты и таблица для маски
for str in string.gmatch(inp, "([^%s]*)(%s?)") do
  table.insert(mask, str)    -- Заполняем таблицу маски
end
for i = 1, all - #mask do
  table.insert(mask, "") end  -- Доводим до размера колоды
for r = 1, 10000 do
  for i = all, 1, -1 do
    local j = math.random(i)
    shuf[i], shuf[j] = shuf[j], shuf[i]  -- Перетасовываем карты
    for q = 1, #mask do
      if shuf[i].nm == mask[q] then  -- Ищем совпадения с маской
        table.remove(shuf, i) break end  -- Удаляем лишние карты
    end
  end
  for i = 1, #shuf do shuf[i].nd = nil end  -- Очищаем метки узлов
  nod = 0 ; down = {}    -- Таблица для слива карт
  for i = 1, all do
    if mask[i] ~= "" then    -- Ищем непустые карты в маске
      note = {nm, nd} ; note.nm = mask[i]
      table.insert(shuf, i, note)  -- Вставляем в колоду
    end
    table.insert(down, shuf[i].nm)  -- Пополняем таблицу слива
    local q, wi = #down, #down
    while q > 2 and q <= #down do
      while string.sub(down[q], 1, 1) == string.sub(down[q-2], 1, 1) or
      string.sub(down[q], 2, 2) == string.sub(down[q-2], 2, 2) do
        table.remove(down, q-2)  -- Удаляем слитые карты
        if q > 4 then q = q - 2  -- 2 шага к началу таблицы
        elseif q == 4 then q = 3  -- Дошли до 3 карты
        else break end
      end
      q = q + 1    -- Обратно к концу таблицы
    end
    if #down < wi then
      nod = nod + 1 ; shuf[i].nd = true end  -- Фиксируем узлы
  end
  if #down == 2 then    -- Определяем сложившийся пасьянс
    local out = "<"
    for i = 1, all do
      if shuf[i].nd then sp = "><"
      else sp = " " end
      out = out..shuf[i].nm..sp  -- Скидываем карты в строку
    end
    print(out.."\b ("..nod..")\n") ; tot = tot + 1
  end
end
if tot > 0 then print("Total: "..tot)
else print("Failed ("..#down..")") end
Ом Ваджрасаттва Самая Манупалая Ваджрасаттва Тенопа Тишта Дридхо Ме Бхава Сутокайо Ме Бхава Супокайо Ме Бхава Ануракто Ме Бхава Сарва Сиддхиме Праяца Сарва Карма Суца Ме Читтам Шриям Куру Хум Ха Ха Ха Ха Хо Бхагаван Сарва Татхагата Ваджра Ма Ме Мунца Ваджри Бхава Маха Самая Саттва Ах Хум Пхат