Как заставить этот алгоритм Javascript Anagram работать в Ruby? - PullRequest
0 голосов
/ 20 июня 2019

В своих исследованиях алгоритмов и структур данных я стараюсь делать в Ruby то, что я изучаю, используя Javascript. Оба языка имеют свой собственный способ подъема переменных и работы с правдой / ложью.

Этот алгоритм прекрасно работает в JS, но в Ruby я получаю классический undefined method + 'для nil: NilClass` при запуске троичного файла о существовании хэша.

Я пытался заранее сделать некоторые условия, чтобы убедиться, что ничего не пройдет, если объект не существует.

Вот решение Javascript:

function validAnagram(str1, str2){
    if (str1.length !== str2.length) {
        return false;
    }
  const strOneObj = {};
  const strTwoObj = {}; 

  for (let char of str1) {
      strOneObj[char] = strOneObj[char] + 1 || 1;
    }
   for (let char of str2) {
       strTwoObj[char] = strTwoObj[char] + 1 || 1;
   } 

  for (let values in strOneObj) {
    if (strOneObj[values] !== strTwoObj[values]) {
      return false; 
    }
    return true; 
  }

}

validAnagram('cinema', 'ice')

Вот версия для Ruby:

def valid_anagram(str1, str2)
  if str1.length != str2.length 
    false 
  else 
    str_one_hash = {}
    str_two_hash = {}

    str1.split('').each do |char|
      if str_one_hash == nil 
        str_one_hash[char] = 0 
      else 
        str_one_hash[char] += 1
      end 

    (str_one_hash.keys & str_one_hash.keys).each do |char, count| 
      if str_one_hash[char] != str_one_hash[char]
        false
      end 
    end 
  end   
    true 
end 

valid_anagram("cinema", "iceman")

Вкратце: как мне заставить это работать в прекрасном Ruby?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Рубиновый способ сделать это

def valid_anagram(str1, str2)
  if str1.length != str2.length 
    false 
  else 
    str_one_hash = str1.split('').map{|char| [char, str1.count(char)]}.to_h
    str_two_hash = str2.split('').map{|char| [char, str2.count(char)]}.to_h
    str_one_hash == str_two_hash
  end   
end
1 голос
/ 20 июня 2019

Ты так близко.

if str_one_hash == nil является виновником.

if str_one_hash[char] == nil - это то, что вы ищете.

Примечание: вы можете установить значение по умолчанию вашего хэша равным 0, вызвав str_one_hash = Hash.new { 0 } - устраняя проверку nil.

...