3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8},
{a: 9, b: 10},
{a: 11, b: 12},
{a: 13, b: 14},
{a: 15, b: 16},
{a: 17, b: 18},
]
n = 2 # how many elements we need to take
i = a.index({a: 1, b: 2})
unless i.nil?
# start = (i - n) <= 0 ? 0 : i - n
start = (i - n).clamp(0, Float::INFINITY)
finish = i + n
p a[start..finish]
end
Пришла мысль, что подобного класса задачки можно решать и в декларативном стиле - с помощью pattern matching. Наподобие как regexp для строк: a = [1, 2, 3, 4] result = case a in [*, x1, 2, x2, *] [x1, 2, x2] in [2, x2, *] [2, x2] in [x1, 2, *] [x1, 2] in [2] [2] else nil end p result Код запускал на repl-е с поддержкой pattern matching. Что думаете? Можно как-то упростить? Сложность в том, что количество случаев, которые нужно прописывать сильно растёт, если допускается больше чем один "граничный" элемент вокруг "корневого".
Обсуждают сегодня