-2

have tried to convert this gist in ruby, this is my code:

$char_map = ('!.' + '0123456789' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz').scan(/./)
$int_map  = Hash.new
$char_map.each_with_index {|v,k| $int_map[v] = k }
$cutoff = ($char_map.count) - 11

# Converts an integer to its text-encoded form.
def to_chars(value)

  if value < $cutoff
    return $char_map[value]
  end
  value -= $cutoff
  out = []
  while value != 0
    value, rem = value.divmod($char_map.count)
    out.push($char_map[rem])
  end
  # handle when value == cutoff
  if !out
    out.push($char_map[value])
  end
  out.push($char_map[$cutoff + out.count - 1])
  out.reverse!
  return out.join('')

end


# Converts characters from the provided string back into their integer
# representation, and returns both the desired integer as well as the number
# of bytes consumed from the character string (this function can accept a
# string that is the result of a concatenation of results from to_chars() ).
def to_val(chars)

  chars = chars.scan(/./)
  first = $int_map[chars[0]]
  if first < $cutoff
    return first, 1
  end
  first -= $cutoff - 1
  dec = []
  for ch in chars[1..1+first] do
    dec.push($int_map[ch])
  end
  value = dec.pop() + $cutoff
  m = $char_map.count

  while dec != []
    value += m * dec.pop()
    m *= $char_map.count
  end
  return value, first + 1

end

# Converts a sequence of integers into a string that represents those
# integers.
def from_sequence(lst)
  lst.map! {|int| to_chars(int)}
  return lst.join('')
end
# Converts a string that rappresents a sequence of integers back into a 
# a list of integers
def from_string(str)
  out = []
  i = 0
  while i < str.length
      this, used = to_val(str[i, str.length - i])
    out.push(this)
    i += used
  end
  return out
end

p to_chars(123456789)
p to_val(to_chars(123456789))
p from_string(from_sequence([123456789,4688]))

(Sorry for global vars ect... is only for testing, when works fit all in own class)

The error is in last line, instead of print back the [123456789, 4688] array print [7901231212, 4688]

Why? where is the error?

4

1 に答える 1

2

エンコードされたテキストの長さを最後の文字に格納したため (逆にすると、最初の文字になりました)、to_varメソッドでfirstは、エンコードされたテキストの長さを の後に格納しましたfirst -= $cutoff - 1。ただし、 を繰り返すことchars[1..1+first]で、実際にfirst + 1文字を訪問しました。ここでは排他的範囲を使用する必要があります: chars[1...1+first]、またはchars[1..first].

また、Ruby は空配列をtrue値と見なし、 と のみfalseを とnil見なしますfalse。したがって、メソッドでは、配列を に割り当てているためto_chars、条件が満たされることはありません。ここを使うべきです。if !outoutif out.empty?

他に間違いがあるかどうかはわかりません。

于 2013-06-18T11:55:02.030 に答える