Тестирование на панграмму

Я видел способ проверить, является ли строка панграммой - предложением, содержащим каждую букву алфавита - но я не совсем понял это. Я хочу знать, почему мой путь не работает.

def is_pangram(string)

  alpha = ("a".."z").to_a
  i = 0
  while i < string.length
    if string.downcase[i] == alpha.any? 
        alpha.delete(string.downcase[i])
    end
    i += 1
  end

  if alpha.length > 0
    puts "This string is not a pangram"
  else
    puts "This string is a pangram"
  end

  puts alpha.length
  puts alpha
end

is_pangram("The quick brown fox jumps over the lazy dog")

3 ответа

Как насчет следующего?

def is_pangram?(str)
  str.downcase.scan(/[a-z]/).uniq.size == 26
end

is_pangram? "The quick brown dog jumps over the lazy fox."
  #=> true
is_pangram? "The quick brown dog jumps over the wary fox."
  #=> false

Алексей уже ответил на вопрос... вот немного более чистый способ сделать это.

def is_pangram(string)

  alpha = ("a".."z").to_a
  string.downcase.split("").each do |i|
    alpha.delete(i) if alpha.include?(i)
  end

  if alpha.empty?
    puts "This string is a pangram"
  else
    puts "This string is not a pangram"
  end

  puts alpha.length
  puts alpha
end

is_pangram("The quick brown fox jumps over the lazy dog")

но я не совсем понял это

(Предполагаемый) алгоритм строит массив, содержащий все (26) букв алфавита. Затем он обрабатывает строку, символ за символом, удаляя этот символ из первого массива (если он все еще там). После этого он просто проверяет, является ли первый массив пустым. Если это так, символы в строке привели к удалению всех символов в массиве, и поэтому строка является панграммой. Если нет, некоторый символ "пропал" в строке, и этот символ все еще находится в массиве.

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