Created
October 19, 2015 12:10
-
-
Save vitalyp/6b544b72b98068371257 to your computer and use it in GitHub Desktop.
pyramid_matrix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Описание: для решения я сначала вычислил ряд всех чисел матрицы.
Последовательность которую я выбрал: начиная от элемента [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]
Затем , имея этот ряд, остается заполнить результирующую матрицу этими значениями