2013-02-08 31 views
6

Sıralı bir alfasayısal dizge oluşturmaya nasıl giderim?Ruby'de bir alfasayısal dizi oluştur

Her dize yalnızca 8 karakter olmalıdır. Her pozisyon için olası

karakterler şunlardır: Mümkünse

["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "B", "C", "D", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Y", "Z"] 

Ayrıca, dizinin başlangıç ​​noktasını seçmek istiyorum. Örneğin

:

tekrarlama ile bir permütasyon
00000001 
00000002 
00000003 
00000005 
... 
0000L3FH 
0000L3FJ 
0000L3FK 
0000L3FL 
0000L3FM 
0000L3FN 
0000L3FP 
... 
0000L4FP 
0000L4FQ 
0000L4FR 
0000L4FS 
... 
0000M000 
0000M001 
0000M002 

cevap

13

. Diziler bunu kutudan yapabilir.

chars = %w(0 1 2 B C) 
sequencer = chars.repeated_permutation(chars.size) #OP:replace chars.size by 8 
10.times{p sequencer.next} 
#["0", "0", "0", "0", "0"] 
#["0", "0", "0", "0", "1"] 
#["0", "0", "0", "0", "2"] 
#["0", "0", "0", "0", "B"] 
#["0", "0", "0", "0", "C"] 
#["0", "0", "0", "1", "0"] 
#["0", "0", "0", "1", "1"] 
#["0", "0", "0", "1", "2"] 
#["0", "0", "0", "1", "B"] 
#["0", "0", "0", "1", "C"] 

p sequencer.next 
#["0", "0", "0", "2", "0"] 
+1

çok iyi bir cevap ve tamamen benim rafa kaldırmıştır. Ruby'de başka bir yeni şey öğrendim :) –

+0

Huh, her gün yeni bir şeyler öğren! – bheeshmar

+0

Bir başlangıç ​​noktasıyla tohumlamak mümkün mü? – holaSenor

0

Bu seferki başlangıç ​​noktası ayarlamak için izin verir:

dial = %w(0 1 2 A B) 
start_position = %w(A B 0) #for instance. 

p clock = start_position.map{|char| dial.rotate(dial.index(char))} 
#[["A","B","0","1","2"], ["B","0","1","2","A"], ["0","1","2","A","B"]] 

# start ticking: 
clock.shift.product(*clock){|tick|p tick} 
#["A", "B", "0"] 
#["A", "B", "1"] 
#["A", "B", "2"] 
#["A", "B", "A"] 
#["A", "B", "B"] 
#["A", "0", "0"] 
#... 
+0

Blokta 4. satırda dup yöntemiyle ilgili belgeleri nerede bulabilirim? – holaSenor

+0

bulundu Object class. http://ruby-doc.org/core-1.9.3/Object.html#method-i-dup – holaSenor

+0

@ tester123 Daha kısa (ve dup-less) yaptık. – steenslag