2013-02-08 10 views
6

Come si genererebbe una stringa alfanumerica sequenziale?Genera sequenza alfanumerica in Ruby

Ogni stringa deve contenere solo 8 caratteri.

I caratteri possibili per ogni posizione sono:

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

Inoltre, se possibile vorrei scegliere il punto di partenza della sequenza.

Ad esempio:

00000001 
00000002 
00000003 
00000005 
... 
0000L3FH 
0000L3FJ 
0000L3FK 
0000L3FL 
0000L3FM 
0000L3FN 
0000L3FP 
... 
0000L4FP 
0000L4FQ 
0000L4FR 
0000L4FS 
... 
0000M000 
0000M001 
0000M002 

risposta

13

Quella è una permutazione con ripetizione. Gli array possono farlo fuori dalla scatola.

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

risposta molto buona e obsoleto completamente mio. Imparato ancora un'altra cosa in rubino :) –

+0

Huh, impara qualcosa di nuovo ogni giorno! – bheeshmar

+0

Sarebbe possibile seminare con un punto di partenza? – holaSenor

0

Questo consente di impostare il punto di partenza:

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

Dove posso trovare la documentazione sul metodo dup sulla riga 4 nel blocco? – holaSenor

+0

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

+0

@ tester123 Lo ha reso più breve (e dup-less). – steenslag