Тестирование на панграмму
Я видел способ проверить, является ли строка панграммой - предложением, содержащим каждую букву алфавита - но я не совсем понял это. Я хочу знать, почему мой путь не работает.
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) букв алфавита. Затем он обрабатывает строку, символ за символом, удаляя этот символ из первого массива (если он все еще там). После этого он просто проверяет, является ли первый массив пустым. Если это так, символы в строке привели к удалению всех символов в массиве, и поэтому строка является панграммой. Если нет, некоторый символ "пропал" в строке, и этот символ все еще находится в массиве.