Tôi đã lấy sự tự do của việc thay đổi thứ tự của magic
thông số của bạn theo giả định rằng cơ số 10 là phổ biến hơn và tùy chọn:
def magic(digits,base=10)
raise "Max magic base of 36" unless base <= 36
(base**digits).times do |i|
str = "%#{digits}s" % i.to_s(base)
parts = str.scan(/./).map{ |n| n.to_i(base)+1 }
yield *parts
end
end
magic(3,2){ |a,b,c| p [a,b,c] }
#=> [1, 1, 1]
#=> [1, 1, 2]
#=> [1, 2, 1]
#=> [1, 2, 2]
#=> [2, 1, 1]
#=> [2, 1, 2]
#=> [2, 2, 1]
#=> [2, 2, 2]
magic(2,16){ |a,b| p [a,b] }
#=> [1, 1]
#=> [1, 2]
#=> [1, 3]
#=> ...
#=> [16, 15]
#=> [16, 16]
Giải thích:
By dịch vấn đề gốc từ 1..10
đến 0..9
và ghép các chữ số mà chúng tôi thấy rằng đầu ra chỉ đếm, với quyền truy cập vào từng chữ số.
0000
0001
0002
...
0010
0011
0012
...
9997
9998
9999
Vì vậy, đó là mã của tôi ở trên.Nó đếm từ 0 lên đến số lượng tối đa (dựa trên số lượng các chữ số và phép giá trị mỗi chữ số), và đối với mỗi số đó:
Chuyển đổi số vào thích hợp 'cơ sở':
i.to_s(base) # e.g. 9.to_s(8) => "11", 11.to_s(16) => "b"
Sử dụng String#%
để pad chuỗi với số đúng của các nhân vật:
"%#{digits}s" % ... # e.g. "%4s" % "5" => " 5"
Hóa chuỗi đơn này vào một mảng của chuỗi ký tự duy nhất s:
str.scan(/./) # e.g. " 31".scan(/./) => [" ","3","1"]
Lưu ý rằng trong Ruby 1.9 này được thực hiện tốt hơn với str.chars
Chuyển đổi mỗi một trong các chuỗi ký tự duy nhất trở thành một số:
n.to_i(base) # e.g. "b".to_i(16) => 11, " ".to_i(3) => 0
Thêm 1 tới mỗi của những con số này, vì mong muốn bắt đầu từ 1 thay vì 0
Ghép mảng số mới này làm đối số t o khối, một số cho mỗi khối param:
yield *parts
gì đầu ra nào bạn mong đợi? là một cái gì đó như '1 2 3 4 \ n 5 6 7 8 \ n 9 10' hoặc' 0 0 0 1 \ n 0 0 0 2 ... '? –
@nash No; mã đầu tiên tự chạy. Nếu bạn điều chỉnh tất cả '(1..10)' thành '(0..9)' thì bạn sẽ nhận được ''0 0 0 0', '0 0 0 1', ... '9 9 9 8', '9 9 9 9''. – Phrogz
Đây là bản sao của http://stackoverflow.com/questions/5226895/combine-array-of-array-into-all-possible-combinations-forward-only-in-ruby/5227021#5227021, nhưng tôi thích điều này câu hỏi của câu trả lời tốt hơn. –