Skip to content

Instantly share code, notes, and snippets.

@kanedaki
Created February 6, 2018 14:54
Show Gist options
  • Save kanedaki/21780ea02a09e9cc619d4b8a356ebc6c to your computer and use it in GitHub Desktop.
Save kanedaki/21780ea02a09e9cc619d4b8a356ebc6c to your computer and use it in GitHub Desktop.
The objetive as simple as writing a function that recives an integer `n` and return an array from `1` to `n` where:
- Multiples of 3 have been replaced with `Fizz`
- Multiples of 5 have been replaced with `Buzz`
- Multiples of both have been replaced with `FizzBuzz`
fizzBuzzToN(0) // => []
fizzBuzzToN(5) // => [1,2,'Fizz', 4, 'Buzz']
fizzBuzzToN(15) // => [1,2,'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz']
@kanedaki
Copy link
Author

Given a function receiving an array of integers and an integer, return if there is a couple of elements in the array which sum is equal
to the number given

hasSumEqualTo([1,3,4,6], 9) // => true
hasSumEqualTo([1,3,4,6], 8) // => false

  1. Do it
  2. Refactor legibility
  3. Refactor performance
    a. Ordered
    b. Not ordered

@VictorIrix
Copy link

VictorIrix commented May 21, 2018

Buenas noches Miguel, soy Victor esta tarde estuve haciendo la prueba junto a Luis y a Luna. Ahora me he puesto a darle una vuelta a el problema que deje a medio terminar, abordando la solución desde el mismo punto de vista que tenía durante la entrevista, que por un lado era evitar hacerla recursiva (siendo este método el natural dada la explicación que nos facilitaste) y orientando mi búsqueda de la solución a un objeto que me sirva de diccionario de posibles soluciones. A el voy añadiendo como llave el valor numérico de la resta que se produce entre el número y resultado que buscamos. De este modo si existe alguna combinación de llave que coincide con un numero que empiezo a explorar en el array se añaden a un conjunto de posibles soluciones.

El nombre de la función a cambiado puesto que esta kata la tenía pendiente en CodeWars y recibe así allí el nombre. He comprobado con sus test el rendimiento y es ligeramente mejor a la solución con recursividad.

const hasPair = (arr, result) => {
  let dictionary = {}, candidates = [];
  for (i=0; i<arr.length; i++) {
    candidates = checker(arr, i , dictionary, result, candidates)
    if(resolver(candidates)) return true // Comprobación por si ya encontró una pareja adecuada. Acorta 300 ms los test random.
  }
  return resolver(candidates);
}

const checker = (arr, i, dictionary, result, candidates) => {
  if((dictionary[arr[i]] !== undefined)) {
    candidates.push([dictionary[arr[i]], arr[i]])
  } else {
    dictionary[result - arr[i]] = arr[i];
  }
  return candidates;
}

const resolver = (arr) => arr.length >= 1 ? true : false

Me he servido de ayuda de otras katas que había hecho con "diccionarios" como un traductor de números romanos o uno del alfabeto Polaco (y sus numerosas vocales).

Te agradezco el tiempo que nos has dedicado, y creo que hablo en nombre de los tres al decir que hemos quedado encantados con la empresa y su filosofía. Caso aparte del "stack" que empleáis, que desde que Yaiza me lo comento me tiene curioseando.

Un saludo, Victor Rodriguez.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment