猿问

从Python转换为Ruby的脚本中奇怪的输出,为什么?

试图将这个要点转换为红宝石,这是我的代码:


$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]))

(对全局变量很抱歉...仅适用于测试,前提是所有工作都适合自己的班级)


错误在最后一行,而不是打印回[123456789, 4688]数组打印[7901231212, 4688]


为什么?错误在哪里?


梦里花落0921
浏览 174回答 2
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 !out由于您已将数组分配给,因此该条件永远不会满足out。您应该if out.empty?在这里使用。不知道是否还有其他错误。
随时随地看视频慕课网APP

相关分类

Python
我要回答