# [PQ][Perl Quiz 2001-02-02 No.0064]

alphabet = (0x21 .. 0x7E).map{|c|c.chr}

tmp = alphabet.dup
trh = {}
until tmp.empty?
  pre = tmp.shift
  post, = tmp.slice!(rand tmp.size)
  trh[pre] = post
  trh[post] = pre
end

trh.each do |k,v|
  if trh[trh[k]] != k
    p [i, trh[k], trh[trh[k]]]
    raise
  end
end

trs = trh.indexes(*alphabet).to_s.gsub(/[\\\']/) { "\\#$&" }

if alphabet.to_s.tr("\\x21-\\x7E", '#{trs}') == alphabet.to_s
  puts %Q{ARGF.each do |line| puts line.tr("\\x21-\\x7E", '#{trs}') end}
else
  puts %Q{trh = #{trh.inspect}
ARGF.each do |line|
  puts line.gsub("[\\x21-\\x7E]") {trh[$&]}
end}
end

