توليد مجموعة مختلفة في روبي أي كل ما يمكن من / [0-9A-زا زي] {3} /
سؤال
وأشعر أنني أستخدم روبي بطريقة خاطئة هنا: أريد أن تولد كل المباريات الممكنة ل/[0-9A-Za-z]{3}/
التعبير العادية
وأنا لا يمكن استخدام succ
ل"999".succ => "1000"
و"zZz".succ => "aaAa"
.
أواجه مشكلة في استخدام نطاقات لأنني لا يمكن أن يبدو ل(0..9), ('A'..'Z'), ('a'..'z')
اتحاد
وهكذا كتبت:
def alphaNumeric
#range and succ don't cut it for [0-9a-zA-Z]
(0..9).each{|x|yield x.to_s}
('a'..'z').each{|x|yield x}
('A'..'Z').each{|x|yield x}
end
def alphaNumericX3
alphaNumeric{ |a|
alphaNumeric{ |b|
alphaNumeric{ |c|
yield a+b+c
}
}
}
end
alphaNumericX3.each{|x|p x}
وسؤالي هو 2 مرات:
هل هناك طريقة أقل قبيحة، وهناك طريقة حيث يمكن تعريف alphaNumericX3
من (alphaNumeric, 3)
المعلمات؟
وPS أنا على علم أن أتمكن من تحديد فئة جديدة لنطاق. ولكن ذلك بالتأكيد لا أقصر. إذا كنت تستطيع جعل هذه الكتلة المقبل أقصر وأكثر وضوحا من كتلة أعلاه، يرجى القيام به:
class AlphaNum
include Comparable
attr :length
def initialize(s)
@a=s.chars.to_a
@length=@a.length
end
def to_s
@a.to_s
end
def <=>(other)
@a.to_s <=> other.to_s
end
def succ
def inc(x,n)
return AlphaNum.new('0'*(@length+1)) if x<0
case n[x]
when '9'
n[x]='A'
when 'Z'
n[x]='a'
when 'z'
n[x]='0'
return inc(x-1,n)
else
n[x]=n[x].succ
end
return AlphaNum.new(n.to_s)
end
inc(@length-1,@a.clone)
end
end
# (AlphaNum.new('000')..AlphaNum.new('zzz')).each{|x|p x}
# === alphaNumericX3.each{|x|p x}
المحلول
استخدم Array#product
:
alpha_numerics = ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a
alpha_numerics
.product(alpha_numerics, alpha_numerics)
.map { |triplet| triplet.join('') }
نصائح أخرى
class String
def nextify
case self
when '9' then 'A'
when 'Z' then 'a'
when 'z' then '0'
else self.succ
end
end
end
class AlphaNum
def initialize(string)
@string = string
end
def succ
@string.split(//).inject("") { |s,n| s << n.nextify }
end
def method_missing(*args, &block)
@string.send(*args, &block)
end
end
a = AlphaNum.new("999")
puts a.succ #=> 'AAA'
لا تنتمي إلى StackOverflow