Advertisement
Guest User

chargen.rb

a guest
Aug 19th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 3.11 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. require 'optparse'
  3. require 'set'
  4.  
  5. =begin
  6. ===============================================
  7.   Random character generator script
  8.  
  9.   Command-line usage:
  10.     ./chargen.rb [-w <length>] [-a] text
  11.  
  12.   REPL usage:
  13.     process "text", alphabet: <is_alphabet_mode>
  14.  
  15. ===============================================
  16. =end
  17.  
  18. module CharacterGenerator
  19.   @@Ranges = [
  20.     (0x0021..0x007E), # Numbers
  21.     (0x0100..0x024F), # Latin extended
  22.     (0x0250..0x02AF), # IPA extensions
  23.     (0x0370..0x052F), # Greek/Cyrillic
  24.     (0x2200..0x22FF), # Math
  25.     (0x4E00..0x9FFF), # CJK
  26.   ]
  27.  
  28.   public
  29.  
  30.   def self.from_range(range_start, range_end)
  31.     range_bounds = [range_start, range_end].sort
  32.     range = (range_bounds[0]..range_bounds[1])
  33.     try_conversion range
  34.   end
  35.  
  36.   def self.ranges()
  37.     @@Ranges
  38.   end
  39.  
  40.   private
  41.  
  42.   def self.try_conversion(range)
  43.     is_valid_unicode = lambda { |sym| not sym.match(/[[:print:]]/).nil? }
  44.  
  45.     conversion_successful = false
  46.  
  47.     range_array = range.to_a
  48.     while range_array.length > 0 do
  49.       ordinal = range_array.delete range_array.sample
  50.       unichar = [ordinal].pack('U*')
  51.       if is_valid_unicode.call unichar
  52.         conversion_successful = true
  53.         break
  54.       end
  55.     end
  56.  
  57.     if conversion_successful
  58.       return unichar
  59.     else
  60.       raise EncodingError.new "No valid characters in range"
  61.     end
  62.   end
  63. end
  64.  
  65. def get_random_char
  66.   range = CharacterGenerator.ranges.sample
  67.   CharacterGenerator.from_range(range.first, range.last)
  68. end
  69.  
  70. def process(text, opt = {alphabet: false})
  71.   out = ''
  72.   if opt[:alphabet]
  73.     charset = text.split('').to_set
  74.     alphabet = {}
  75.     charset.each do |c|
  76.       # todo: random chars for alphabet may be duplicate
  77.       alphabet[c] = if (c == ' ') then ' ' else get_random_char end
  78.     end
  79.     out = text.gsub /./, alphabet
  80.   else
  81.     out = text.split('').map{|c| if (c) == ' ' then c else get_random_char end}.join('')
  82.   end
  83.  
  84.   puts out
  85.   out
  86. end
  87.  
  88. def abracadabra(char_count)
  89.   out = ''
  90.   if char_count > 0
  91.     char_count.times do
  92.       out += [*'a'..'z'].sample
  93.     end
  94.   end
  95.   out
  96. end
  97.  
  98. param = {
  99.   is_alphabet: false,
  100.   is_word: false,
  101.   word_length: 0
  102. }
  103.  
  104. opts = OptionParser.new do |opt|
  105.   opt.on('-a', '--alphabet', 'Display string in random character alphabet mode') do |o|
  106.     param[:is_alphabet] = true
  107.   end
  108.   opt.on('-w', '--word LENGTH', Integer, 'Output random word of specified length') do |o|
  109.     param[:is_word] = true
  110.     param[:word_length] = o
  111.   end
  112.   opt.on('-h', '--help', 'Show this message') do
  113.     puts opts
  114.     exit
  115.   end
  116. end
  117. opts.parse!(ARGV)
  118.  
  119. if (param[:is_word] || !param[:is_alphabet]) && ARGV.length > 0
  120.   puts 'Only non-random alphabet mode can have argument strings'
  121.   exit
  122. end
  123.  
  124. input = ''
  125. if param[:is_word]
  126.   input = abracadabra(param[:word_length])
  127. elsif (ARGV.length == 0)
  128.   words = []
  129.   rand(1..5).times do
  130.     words.push abracadabra(rand(3..20))
  131.   end
  132.   input = words.join(' ')
  133. else
  134.   input = ARGV.join(' ')
  135. end
  136.  
  137. process(input, alphabet: param[:is_alphabet])
  138.  
  139. '10581099003210871080107610861088'.scan(/.{4}/).map(&:to_i).pack('U*')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement