Решение на Пет функции от Марио Димитров

Обратно към всички решения

Към профила на Марио Димитров

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 16 успешни тест(а)
  • 0 неуспешни тест(а)

Код

from functools import cmp_to_key
def is_pangram(sentence):
ALPHA_SIZE = 30
if len(sentence) < ALPHA_SIZE:
return False
chars_lower = set()
sentence_lower = sentence.lower()
for char in sentence_lower:
if char >= 'а' and char <= 'я':
chars_lower.add(char)
return len(chars_lower) == ALPHA_SIZE
def char_histogram(text):
hist = dict()
for char in text:
if not char in hist:
hist[char] = 0
hist[char] += 1
return hist
def sort_by(func, arguments):
arguments.sort(key=cmp_to_key(func))
return arguments
def group_by_type(dictionary):
groups = dict()
for key in dictionary:
type_ = type(key)
if not type_ in groups:
groups[type_] = dict()
groups[type_][key] = dictionary[key]
return groups
def is_anagram(word_a, word_b):
chars_a = char_histogram(word_a.lower())
chars_b = char_histogram(word_b.lower())
for key in chars_a:
if key >= 'a' and key <= 'z':
if len(chars_b) == 0:
return False
if not key in chars_b or not chars_a[key] == chars_b[key]:
return False
chars_b.pop(key)
return True
# Somewhat less lame
def anagrams(words):
anagram_groups = []
words_set = set()
for word in words:
if not word in words_set:
group = list(filter(lambda b: is_anagram(word, b), words))
words_set.add(word)
for word_in in group:
words_set.add(word_in)
anagram_groups.append(group)
return anagram_groups

Лог от изпълнението

................
----------------------------------------------------------------------
Ran 16 tests in 0.009s

OK

История (2 версии и 2 коментара)

Марио обнови решението на 14.03.2014 23:46 (преди над 10 години)

+def is_pangram(sentence):
+ ALPHA_SIZE = 30
+ if len(sentence) < ALPHA_SIZE:
+ return False
+ charsLower = set()
+ sentenceLower = sentence.lower()
+ for char in sentence:
+ if char >= 'а' and char <= 'я':
+ charsLower.add(char)
+ return len(charsLower) == ALPHA_SIZE
+
+
+def char_histogram(text):
+ hist = dict()
+ for char in text:
+ if not char in hist:
+ hist[char] = 0
+ hist[char] += 1
+ return hist
+
+
+def cmp_to_key(mycmp):
+ 'Convert a cmp= function into a key= function'
+ class K(object):
+ def __init__(self, obj, *args):
+ self.obj = obj
+
+ def __lt__(self, other):
+ return mycmp(self.obj, other.obj) < 0
+
+ def __gt__(self, other):
+ return mycmp(self.obj, other.obj) > 0
+
+ def __eq__(self, other):
+ return mycmp(self.obj, other.obj) == 0
+
+ def __le__(self, other):
+ return mycmp(self.obj, other.obj) <= 0
+
+ def __ge__(self, other):
+ return mycmp(self.obj, other.obj) >= 0
+
+ def __ne__(self, other):
+ return mycmp(self.obj, other.obj) != 0
+ return K
+
+
+def sort_by(func, arguments):
+ arguments.sort(key=cmp_to_key(func))
+ return arguments
+
+
+def group_by_type(dictionary):
+ groups = dict()
+ for key in dictionary:
+ type_ = type(key)
+ if not type_ in groups:
+ groups[type_] = dict()
+ groups[type_][key] = dictionary[key]
+ return groups
+
+
+def is_anagram(word_a, word_b):
+ chars_a = char_histogram(word_a)
+ chars_b = char_histogram(word_b)
+ for key in chars_a:
+ if len(chars_b) == 0:
+ return False
+ if not key in chars_b or not chars_a[key] == chars_b[key]:
+ return False
+ chars_b.pop(key)
+ return True
+
+
+# Very, very lame
+
+
+def anagrams(words):
+ anagram_groups = []
+ words_set = set()
+ for lead_word in words:
+ if not lead_word in words_set:
+ cur_group = [lead_word]
+ for candidate in words:
+ if not candidate == lead_word:
+ if is_anagram(lead_word, candidate):
+ cur_group.append(candidate)
+ words_set.add(candidate)
+ anagram_groups.append(cur_group)
+ return anagram_groups

Анаграма е дума или фраза образувана от буквите на друга дума или фраза, чрез пермутация.

  • Твоето решение не прави разлика между буква и символ.
  • Някои променливи са ти в camelCase, вместо snake_case. Няма да получиш нито една точка за домашното, ако това не се промени, преди крайния срок
  • Защо си дефинирал клас в тялото на функция и си му дал абсурдното име K?
  • Имплементацията ти на anagrams е... Very, Very lame, indeed

Марио обнови решението на 16.03.2014 02:35 (преди над 10 години)

+from functools import cmp_to_key
+
+
def is_pangram(sentence):
ALPHA_SIZE = 30
if len(sentence) < ALPHA_SIZE:
return False
- charsLower = set()
- sentenceLower = sentence.lower()
- for char in sentence:
+ chars_lower = set()
+ sentence_lower = sentence.lower()
+ for char in sentence_lower:
if char >= 'а' and char <= 'я':
- charsLower.add(char)
- return len(charsLower) == ALPHA_SIZE
+ chars_lower.add(char)
+ return len(chars_lower) == ALPHA_SIZE
def char_histogram(text):
hist = dict()
for char in text:
if not char in hist:
hist[char] = 0
hist[char] += 1
return hist
-def cmp_to_key(mycmp):
- 'Convert a cmp= function into a key= function'
- class K(object):
- def __init__(self, obj, *args):
- self.obj = obj
-
- def __lt__(self, other):
- return mycmp(self.obj, other.obj) < 0
-
- def __gt__(self, other):
- return mycmp(self.obj, other.obj) > 0
-
- def __eq__(self, other):
- return mycmp(self.obj, other.obj) == 0
-
- def __le__(self, other):
- return mycmp(self.obj, other.obj) <= 0
-
- def __ge__(self, other):
- return mycmp(self.obj, other.obj) >= 0
-
- def __ne__(self, other):
- return mycmp(self.obj, other.obj) != 0
- return K
-
-
def sort_by(func, arguments):
arguments.sort(key=cmp_to_key(func))
return arguments
def group_by_type(dictionary):
groups = dict()
for key in dictionary:
type_ = type(key)
if not type_ in groups:
groups[type_] = dict()
groups[type_][key] = dictionary[key]
return groups
def is_anagram(word_a, word_b):
- chars_a = char_histogram(word_a)
- chars_b = char_histogram(word_b)
+ chars_a = char_histogram(word_a.lower())
+ chars_b = char_histogram(word_b.lower())
for key in chars_a:
- if len(chars_b) == 0:
- return False
- if not key in chars_b or not chars_a[key] == chars_b[key]:
- return False
- chars_b.pop(key)
+ if key >= 'a' and key <= 'z':
+ if len(chars_b) == 0:
+ return False
+ if not key in chars_b or not chars_a[key] == chars_b[key]:
+ return False
+ chars_b.pop(key)
return True
-# Very, very lame
+# Somewhat less lame
def anagrams(words):
anagram_groups = []
words_set = set()
- for lead_word in words:
- if not lead_word in words_set:
- cur_group = [lead_word]
- for candidate in words:
- if not candidate == lead_word:
- if is_anagram(lead_word, candidate):
- cur_group.append(candidate)
- words_set.add(candidate)
- anagram_groups.append(cur_group)
+ for word in words:
+ if not word in words_set:
+ group = list(filter(lambda b: is_anagram(word, b), words))
+ words_set.add(word)
+ for word_in in group:
+ words_set.add(word_in)
+ anagram_groups.append(group)
return anagram_groups

  • thanks, не се сетих за разл. брой интервали, тирета, а да предполагам ли латиница? Това ми напомня - дали може да се пусне функционалност за автоматична проверка на тестове от потребителите - връща дали авторовите решения са минали успешно предложените тестове
  • все още свиквам с естетическите особености на snake_case
  • отне ми време да се сетя че дори няма нужда да го пиша
  • е на c++ бих написал нещо с treemap за записване на повтарянията на букви в думата и после разпределяне по класове с някакъв trie, ноо...