توليد مجموعة مختلفة في روبي أي كل ما يمكن من / [0-9A-زا زي] {3} /

StackOverflow https://stackoverflow.com/questions/613697

  •  03-07-2019
  •  | 
  •  

سؤال

وأشعر أنني أستخدم روبي بطريقة خاطئة هنا: أريد أن تولد كل المباريات الممكنة ل/[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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top