2

次の形式の行列(配列の配列)があります

[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]

私が達成したいのは、相互に直接接続してiサブ配列を分割できる文字列のすべての部分を取得することです(例を参照)。

実装言語は無関係ですが、Python、Java、Ruby、C#、clojure、Psudoコード、またはその他のかなり高いレベルの言語が望ましいです。

4

5 に答える 5

4

以前のコードからコードを改善しました。

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"]
]
于 2011-05-12T21:53:22.183 に答える
2

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']
于 2011-05-12T22:11:35.640 に答える
1
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
于 2011-05-12T21:28:56.317 に答える
1

ああ、これがクールな機能的な(そうですか?)1行のソリューションです:

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]]
于 2011-05-12T22:45:43.203 に答える
0

(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
于 2011-05-12T23:57:25.987 に答える