У меня есть матрица (массив массивов) в форме
[1, 2, 3, 4]
[12, 23, 34]
[123, 234]
[1234]
И хочу создать последовательности этой матрицы, которые следуют друг за другом и (преобразуются в строку) той же длины, что и массив с индексом 0 (самый верхний). Таким образом, результатом этого будет
[1, 2, 3, 4]
[12, 3, 4]
[1, 23, 4]
[1, 2, 34]
[12, 34]
[123, 4]
[1, 234]
[1234]
То, что я хочу достичь, - это получить все части строки, которые могут быть напрямую связаны друг с другом и разделены я подматрицами (как показано в примере).
Язык реализации не имеет значения, но предпочтительно, например, Python, java, ruby, С#, clojure, Psudo или другого языка на довольно высоком уровне.
Я улучшил код из предыдущего.
a = ["1", "2", "3", "4"]
['', '.'].repeated_permutation(a.length - 1).map{|b| a.zip(b).join.split('.')}
предоставит вам:
[
["1234"],
["123", "4"],
["12", "34"],
["12", "3", "4"],
["1", "234"],
["1", "23", "4"],
["1", "2", "34"],
["1", "2", "3", "4"]
]
Здесь версия Python ( отредактирована, чтобы быть более кратким, благодаря предложениям FMc):
def consecutive_slice(arr):
yield arr
mx = len(arr) + 1
for size in xrange(2, mx):
for i in xrange(mx - size):
yield(arr[:i] + [''.join(arr[i:i+size])] + arr[i+size:])
Пример использования:
>>> for seq in consecutive_slice(['1', '2', '3', '4']):
... print(seq)
...
['1', '2', '3', '4']
['12', '3', '4']
['1', '23', '4']
['1', '2', '34']
['123', '4']
['1', '234']
['1234']
['12','34']
О, вот классное функциональное (это?) однострочное решение:
a = [1,2,3,4]
result = [array]
2.upto(a.size){ |s| a.each_cons(s).with_index{ |g, i| result << [*(a-g)[0, i], g.join.to_i, *(a-g)[i..-1]] } }
result
# [[1, 2, 3, 4],
# [12, 3, 4],
# [1, 23, 4],
# [1, 2, 34],
# [123, 4],
# [1, 234],
# [1234]]
def adj(ar)
result = [ar]
2.upto ar.size do |j|
0.upto ar.size-j do |i|
result << [*ar[0, i], ar[i,j].join.to_i, *ar[i+j..-1]]
end
end
result
end
Тест
a = [*1..5]
adj a
# [[1, 2, 3, 4, 5],
# [12, 3, 4, 5],
# [1, 23, 4, 5],
# [1, 2, 34, 5],
# [1, 2, 3, 45],
# [123, 4, 5],
# [1, 234, 5],
# [1, 2, 345],
# [1234, 5],
# [1, 2345],
# [12345]]
ИЗМЕНИТЬ
Если вы хотите, чтобы он работал с Ruby 1.8.7 (верхний - 1.9 +)
def adj(ar)
result = [ar]
2.upto ar.size do |j|
0.upto ar.size-j do |i|
result << [ar[0, i], ar[i,j].join.to_i, ar[i+j..-1]].flatten
end
end
result
end
a = (1..5).to_a
adj a
#=> same result
"Ruby"
решение stackoverflow.com/questions/5984489/…
(версия Ruby) Я считаю, что это работает в общем случае для вашей матрицы. Я преобразовал в строки, чтобы сортировка получилась хорошо. Отредактировано, чтобы включить ['12', '34'] в сгенерированную последовательность.
m = [['1', '2', '3', '4'], ['12', '23', '34'], ['123', '234'], ['1234']]
m0 = m.first.join
seq = m.map do |row|
( 1..row.size ).map { |e| row.combination( e ).to_a }.flatten( 1 ).map do |a|
m0.include?( str = a.join ) ? ( m0.delete( str ).chars.to_a + a ).sort : nil
end.compact.uniq
end.flatten 1