###### tags `python-kata`
# Python, kata e almorzo / Python, kata y desayuno - 9ª Edición
Hola!
Breves instrucciones a continuación para que todo vaya fluido!
1. Nos juntaremos en grupos de 2-3 personas
1. Elegiremos conjuntamente y al "azar" un ejercicio de https://leetcode.com/
1. Resolveremos el problema en iteraciones de 10 minutos.
1. Al final cada iteración decideremos entre todos los grupos si damos finalizado el problema o continuamos iterando para refactorizar u optimizar.
1. Finalizado el problema, copiaremos la solución en este documento en el espacio reservado para cada grupo.
1. Revisaremos y comentaremos soluciones de cada grupo.
1. Revisaremos soluciones de otros usuarios en Leetcode o Hackerank en Python, y en otros lenguajes.
1. Si queda tiempo volvemos al _Paso 2_.
Además..
1. No es necesario que todo el mundo traiga portatil (1 de cada 2 o 3 es suficiente) ni es necesario instalar nada.
1. Se puede acompañar de café, te, galletas, desayuno inglés...(recuerda teclear sin chocolate en los dedos)
2. No importa el nivel o la experiencia individual, lo importante es aprender todos de todos.
3. La reunión es informal y el objetivo es aprender pasando un buen rato!
- [Ediciones anteriores](https://github.com/aindustriosa/python-kata-e-almorzo)
## Ejercicios:
- https://leetcode.com/problems/ransom-note/
- https://leetcode.com/problems/distribute-candies/
- https://leetcode.com/problems/keyboard-row/
### Grupo 1 - Integrantes: Alex & Dani
_Código:_
https://leetcode.com/problems/ransom-note/
```python
# Versión con ifs
from collections import Counter
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
counterNote = Counter(ransomNote)
counterMagazine = Counter(magazine)
for letter, count in counterNote.items():
if letter not in counterMagazine:
return False
if counterMagazine[letter] < counterNote[letter]:
return False
return True
# Versión con list comprehensions
from collections import Counter
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
counterNote = Counter(ransomNote)
counterMagazine = Counter(magazine)
return all([False if
letter not in counterMagazine or counterMagazine[letter] < counterNote[letter]) else True for letter, count in counterNote.items()
]
)
```
https://leetcode.com/problems/distribute-candies/
```python
class Solution:
def distributeCandies(self, candyType: List[int]) -> int:
candies_to_eat = len(candyType)//2
unique_candies_types = len(set(candyType))
return min([candies_to_eat, unique_candies_types])
```
```python
class Solution:
def findWords(self, words: List[str]) -> List[str]:
keyboard = [
"qwertyuiop",
"asdfghjkl",
"zxcvbnm",
]
result = []
for word in words:
set_word = set(word.lower())
for row in keyboard:
r = set_word - set(row)
if r == set():
result.append(word)
return result
```python
def findWords(self, words: List[str]) -> List[str]:
keyboard = [
set("qwertyuiop"),
set("asdfghjkl"),
set("zxcvbnm"),
]
def can_write(word):
set_word = set(word.lower())
for row in keyboard:
if not set_word - row:
return True
return False
return [
word for word in words if can_write(word)
]
```
### Grupo 2 - Integrantes: Breixo & Nacho
#### RansomNote
```python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
magazine_list = [*magazine]
for a in ransomNote:
if a in magazine_list:
magazine_list.pop(magazine_list.index(a))
else:
return False
return True
```
#### A dieta
```python
class Solution:
def distributeCandies(self, candyType: List[int]) -> int:
return int(min(len(set(candyType)), len(candyType) / 2))
```
#### Palabras con teclado
```python
class Solution:
def findWords(self, words: List[str]) -> List[str]:
frow = set("qwertyuiop")
srow = set("asdfghjkl")
trow = set("zxcvbnm")
result = []
for w in words:
s = set(w.lower())
if len(s) == max(len(s.intersection(frow)),
len(s.intersection(srow)),
len(s.intersection(trow))):
result.append(w)
return result
```
### Grupo 3 - Integrantes: Sergio y Eduardo
_Código:_
```python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
while len(ransomNote) >0 :
pos=magazine.find(ransomNote[0])
if pos == -1 :
return False
magazine=magazine[0:pos]+magazine[pos+1:]
ransomNote=ransomNote[1:]
return True
```
### Grupo 4 - Integrantes: Luís, Serhii, Jose
_Código:_
```python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
ransomNote = list(ransomNote)
magazine = list(magazine)
for i in ransomNote:
if i in magazine:
magazine.remove(i)
else:
return False
return True
```
```python
from collections import Counter
class Solution:
def distributeCandies(self, candyType: List[int]) -> int:
tipos = len(Counter(candyType).keys())
max_candys = int(len(candyType)/2)
if tipos < max_candys:
return int(tipos)
return max_candys
```
```python
class Solution:
def findWords(self, words: List[str]) -> List[str]:
first = 'qwertyuiop'
second = 'asdfghjkl'
third = 'zxcvbnm'
resultados = []
for j in words:
i = j.lower()
if (len(list(set(i) & set(first))) == len(set(i))) or (len(list(set(i) & set(second))) == len(set(i))) or (len(list(set(i) & set(third))) == len(set(i))):
resultados.append(j)
return resultados
```
### Grupo 5 - Integrantes: Miguel y Carlos
#### Keyboard Row
###### Normal
```python
class Solution:
def findWords(self, words: List[str]) -> List[str]:
result = []
rows = ("qwertyuiop", "asdfghjkl", "zxcvbnm")
for row in rows:
for word in words:
for i in range(len(word)):
if word[i].lower() not in row:
break
if i == len(word) - 1:
result.append(word)
return result
```
###### One Liner
```python
class Solution:
def findWords(self, words: List[str]) -> List[str]:
return [word for word in words if any(all(c in row for c in word.lower()) for row in (list("qwertyuiop"), list("asdfghjkl"), list("zxcvbnm")))]
```
_Código:_
```python
class Solution:
def distributeCandies(self, candyType: List[int]) -> int:
length = len(candyType)//2
set_length = len(set(candyType))
return set_length if set_length < length else length
```
```python
def remove_character(string, index):
new_str = ""
for i in range(len(string)):
if index == i:
continue
new_str += string[i]
return new_str
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
if len(magazine) < len(ransomNote):
return False
for character in ransomNote:
for magazine_character in range(len(magazine)):
# print(f"{ransomNote} : {magazine}")
if character == magazine[magazine_character]:
magazine = remove_character(magazine, magazine_character)
break
if magazine_character == len(magazine) - 1:
return False
return True
```
```python
class Solution(object):
def canConstruct(self, ransomNote, magazine):
ransomNote_list = list(ransomNote)
ransomNote_set = list(dict.fromkeys(ransomNote_list))
return all(magazine.count(c) >= ransomNote_list.count(c) for c in ransomNote_set)
```
## FRIKADAS