Рубиновые и диофантовы уравнения - проблемы с хешем

Я новичок в программировании и рубине. Я работаю над кодом, который имеет дело с конкретным диофантовым уравнением (из проблемы открытого программного обеспечения MIT), и просто пытаюсь понять, что я могу с ним сделать.

Код создает три массива и два хеша для конкретного линейного уравнения с тремя переменными.

Вот код:

def diophantine_solutions(x)
  #For all x > 1, finds values for a, b, c such that 6a + 9b + 20c = x,
  #Creates array of solvable x, unsolvable x, 
  #Creates hash of solvable x with possible values of a, b, c

  nopes=(1..x).to_a #will contain sums with no solutions at the end
  yups=[] #has solvalbes
  yups_values=[] #solutions for a, b, c
  yups_hash={} #sums with the solutions

  while x>0
    for a in (0..x/6):
      for b in (0..x/9):
        for c in (0..x/20):
          total=6*a + 9*b + 20*c
          if total==x
            yups<< x
            yups_values<< [a, b, c]
          end          
        end
      end
    end
    x=x-1
  end

  yups_hash=[yups.zip(yups_values)]
  yups=yups.uniq
  nopes=nopes-yups
  puts yups_hash[20]
end

diophantine_solutions(20)

Сейчас я пытаюсь получить доступ к отдельным хэш-парам, чтобы убедиться, что они выстраиваются правильно, но

puts yups_hash[] 

возвращает ноль для любого числа. Любая помощь? Кроме того, будучи новым, как я, если есть лучшие способы сделать что-нибудь, что я сделал, я был бы признателен, если бы вы сообщили мне.

1 ответ

Решение

Вероятно, должно быть:

yups_hash = Hash[yups.zip(yups_values)]

С оговоркой, что я не знаю, что должно происходить, но yups_hash name подразумевает, что это должен быть хеш, а не массив с кучей массивов в нем.

Как только есть реальный хеш, получается 20:

0 0 1

Это соответствует определению, по крайней мере.

Другие вопросы по тегам