###### tags `python-kata` # Python, kata e almorzo / Python, kata y desayuno - 4ª 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/ o https://www.hackerrank.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! Anteriores ediciones: - [Primera Edición](https://hackmd.io/ZFqsaJQAQQGm8z2sPTwA3g) - [Segunda Edición](https://hackmd.io/FO4AHdfHTASNM_1ahFn8DQ) - [Tercera Edición](https://hackmd.io/-sF1xb0ASkC98ArsOgdItA?view) ## Ejercicios seleccionados: - https://leetcode.com/problems/nim-game/ - https://leetcode.com/problems/add-two-numbers/ ### Grupo 1 - David, Carlos: _Código:_ ```python class Solution: def canWinNim(self, n: int) -> bool: return n % 4 ``` _Código:_ ```python # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None def convert_listnode_to_reversed_list(listnode): result_list = [] x = listnode while True: if x.next is None: result_list.append(x.val) break else: result_list.append(x.val) x = x.next return result_list[::-1] def revert_list_and_convert_to_listnode(original_list): node = ListNode(original_list[-1]) for n, x in enumerate(original_list[::-1]): if n == 0: continue new_node = ListNode(x) node.next = new_node # Isto non vai node = new_node return node class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: l1_list = convert_listnode_to_reversed_list(l1) l2_list = convert_listnode_to_reversed_list(l2) number_1 = int("".join(map(str, l1_list[::-1]))) number_2 = int("".join(map(str, l2_list[::-1]))) result = str(number_1 + number_2) # Isto non vai result_listnode = revert_list_and_convert_to_listnode(result) return result_listnode ``` ### Grupo 2 - Xurxo, Daniel: _Código:_ ```python class Solution: def canWinNim(self, n: int) -> bool: return (n % 4) ``` No funciona :( ~~~python class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: if not l1.next and not l2.next: return ListNode(l1.val + l2.val) if not l1.next: return l2 if not l2.next: return l1 node = ListNode(l1.val + l2.val % 10) node.next = self.addTwoNumbers(l1.next, l2.next) if node.next.val > 9: node.val += node.next.val // 10 node.next.val = node.next.val % 10 return node ~~~ ### Grupo 3 - Sergio, Vilchez, Álex: _Código:_ ```python class Solution: def canWinNim(self, n: int) -> bool: return (n % 4) != 0 ``` ```python class Solution: def _listToNumber(self, lista, mult = 1): if lista is None: return 0 return lista.val * mult + self._listToNumber(lista.next, mult * 10) def _numberToList(self, numero): if numero == 0: return None elemento = ListNode(numero % 10) elemento.next = self._numberToList(numero // 10) return elemento def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: n = self._listToNumber(l1) + self._listToNumber(l2) if n == 0: return ListNode(0) return self._numberToList(n) ``` --- ## A Posteriori: Xurxo ```python # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = None class SumList: def __init__(self, l1: ListNode, l2: ListNode, carry: int = 0): self.val = l1.val + l2.val + carry next_carry = 0 if self.val > 9: next_carry, self.val = divmod(self.val, 10) l1next = l1.next or ListNode(0) l2next = l2.next or ListNode(0) if l1.next or l2.next or next_carry: self.next = SumList(l1next, l2next, next_carry) else: self.next = None class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: return SumList(l1, l2) ``` --- ## A Posteriori: David ```python def to_list(listnode): result_list = [] while listnode.next: result_list.append(listnode.val) listnode = listnode.next result_list.append(listnode.val) return result_list def to_listnode(iterable): listnode = ListNode(iterable[0]) current_node = listnode for x in iterable[1:]: new_node = ListNode(x) current_node.next = new_node current_node = new_node return listnode class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: l1_list = to_list(l1)[::-1] l2_list = to_list(l2)[::-1] number_1 = int("".join(map(str, l1_list))) number_2 = int("".join(map(str, l2_list))) result = str(number_1 + number_2) return to_listnode(result[::-1]) ```