Skip to content

Instantly share code, notes, and snippets.

@vitalyp
Created October 19, 2015 12:10
Show Gist options
  • Save vitalyp/6b544b72b98068371257 to your computer and use it in GitHub Desktop.
Save vitalyp/6b544b72b98068371257 to your computer and use it in GitHub Desktop.
pyramid_matrix
def pyramid_matrix n
nums = (0..(n/2.0).ceil-1).map{|m| [[m+1]*([4*n-8*m-4,1].max)] }.flatten
mx, ci, cd = ([!:&]*n*n).each_slice(n).to_a, n, 0
nums.each do |i|
ci = ci - 1
mx[cd][ci] ||= i
if ci == 0 || mx[cd][ci-1]
ci, cd = n - cd - 1, ci
mx = mx.transpose.map(&:reverse)
end
end
mx
end
require 'test/unit/assertions'
include Test::Unit::Assertions
assert_equal([[1]], pyramid_matrix(1), 'Oooo, 1s error')
assert_equal([[1,1],[1,1]], pyramid_matrix(2), 'Oooo, 2s error')
assert_equal([[1,1,1],[1,2,1],[1,1,1]], pyramid_matrix(3), 'Oooo, 3s error')
assert_equal([[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]], pyramid_matrix(4), 'Oooo, 4s error')
puts 'Ok'
@vitalyp
Copy link
Author

vitalyp commented Oct 19, 2015

Описание: для решения я сначала вычислил ряд всех чисел матрицы.
Последовательность которую я выбрал: начиная от элемента [0][0], затем в направлении часовой стрелки, обходя внешний шар, потом углубляясь внутрь и т.д. (по форме ракушки).
Затем имея все эти числа - берем пустую матрицу, и 'накручиваем' на нее этот ряд чисел, в том же порядке.
То-есть, в два этапа.
Для вычисления ряда чисел для каждой цифры (1 или 2 и т.д.), я вывел формулу: 4N-4
Для примера
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
N=4
Единиц будет: 4N-4 = 4_4 - 4 = 12 штук.
Двоек будет: 4M-4 (где M = N-2 = 2, а -2 потому-что внутренний слой отделяется от внешнего слоя всегда двумя цифрами слева-справа и снизу-сверху, т.е. это такая себе (N-2) матрица ):
Получается, что двоек будет 4_(N-2)-4 = 4*(4-2)-4= 4 штуки.
Строим массив из всего этого безобразия: [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2]
Затем , имея этот ряд, остается заполнить результирующую матрицу этими значениями

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment