Skip to content

Instantly share code, notes, and snippets.

@eLafo
Created November 2, 2011 10:00
Show Gist options
  • Select an option

  • Save eLafo/1333299 to your computer and use it in GitHub Desktop.

Select an option

Save eLafo/1333299 to your computer and use it in GitHub Desktop.
Enunciado del problema 1 para la code review

#GENERACIÓN ALEATORIA DE NUBES DE TAGS A PARTIR DE KEYWORDS

##Problema real A partir de un fichero con 2574 keywords, hay que generar un número determinado de nubes de forma que:

  • Cada nube se comprondrá de 20 keywords
  • Cada keyword aparezca 50 veces, en nubes diferentes
  • Una keyword no puede aparecer repetida en una misma nube
  • Todas las nubes han de ser diferentes, considerándose como diferentes dos nubes que, al menos, difieran en una keyword y teniendo en cuenta que la posición de cada keyword dentro de la nube de no es relevante.
  • Este proceso se ejecutará una sola vez.

##Notas En este problema en concreto hay solución porque 2574 * 50 / 20 da un número entero. En caso de que no hubiera solución, bastaría con que no hubiera un par de nubes cuya diferencia de apariciones en nubes fuera > 1, o lo que es lo mismo, para todos los pares de keywords k1 y k2, se cumple que el número de apariciones de k1 (nk1) - número de apariciones de k2 (nk2) no es mayor de 1:

|nk1 - nk2| <= 1

##Objetivo

Implementar un algoritmo que resuelva este problema.

@frsantos
Copy link
Copy Markdown

frsantos commented Nov 3, 2011

Equipo Quico - Andres - Florent

clouds = []
num_clouds = (2574 * 50 / 20).to_i

while clouds.uniq.size != num_clouds do
  puts "Restarting #{clouds.uniq.size} #{clouds.size}"

  clouds = []
  keywords_step1 = (1..2574).to_a
  keywords_step2 = []

  num_clouds.times do
    if keywords_step1.size < 20
      cloud1 = keywords_step1.dup
      cloud2 = keywords_step2.shuffle.slice(0, 20 - cloud1.size)
      clouds << (cloud1 + cloud2).sort

      keywords_step1 += (keywords_step2 - cloud2)
      keywords_step2 = cloud2
    else
      cloud = keywords_step1.shuffle.slice(0, 20)
      clouds << cloud.sort
      keywords_step1 -= cloud
      keywords_step2 += cloud

      if keywords_step1.empty?
        keywords_step1, keywords_step2 = keywords_step2, keywords_step1
      end
    end
  end
end

p clouds

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