Programación | Aprendiendo Ruby 0002.1

Programita para identificar números primos.

Se me está haciendo tedioso aprender por temas, empezaré a probar por retos. Es decir, hoy quiero crear un programita que me siga si un número es primo o no. Es obvio que usaré condicionales, A partir de ahí, no sé. Veamos como lo soluciono.


Condicional 1

Crear programa donde de acuerdo al número que nos escriba el usuario, el programa nos diga is este número es menor, igual o mayor a 10

print "Ingresa un número: "
num = gets.chomp.to_i  #Ruby lee el número, le quitamos los caracteres ocultos y lo convertimos a entero.

if num < 10 # Si num es menor que diez..
	puts "El numero es menor a 10" # imprimes esto
elsif num == 10 # De lo contrario, si num es identico a 10
	puts "El número es igual a 10" # imprimes esto
else # De lo contrario
	puts "el número es mayor a 10" # Haces esto
end

Muy simple ¿No?

Intentemos hacer los siguiente:

EJERCICIO Identificando números primos con lo aprendido.

Recuerdo la criba de Eratostónes como una forma de identificar números primos. Lo que quiero hacer es un programa donde yo inserte un número y me diga si es primo o no, para deducirlo iré dividiendo el número entre los primeros 10 números primos, si no es divisible entre ninguno de ellos, daremos por hecho que es primo (Solo para practicar)

Intento de Solución 1
# EJERCICIO-3-Condicionales-2.rb
# IDENTIFICANDO NÚMEROS PRIMOS

print "Dame un número: "
num = gets.chomp.to_i

#Haremos uso de la divisińn modular.

if num.modulo(2) != 0 && num.modulo(3) != 0 && num.modulo(5) != 0 && num.modulo(7) != 0 && num.modulo(11) != 0 && num.modulo(13) != 0 && num.modulo(17) != 0 && num.modulo(19) != 0 && num.modulo(23) != 0 && num.modulo(29) != 0 && num.modulo(31) != 0
puts "El número #{num} es primo." 
else
puts "El número #{num} NO es primo." 
# Hasta aqui todo bien, sin embargo, en caso de que no sea primo, quiero que me diga entre que números es divisible.

unless num.modulo(2) != 0 then puts "Porque es divisible entre 2" end
unless num.modulo(3) != 0 then puts "Porque es divisible entre 3" end
unless num.modulo(5) != 0 then puts "Porque es divisible entre 5" end
unless num.modulo(7) != 0 then puts "Porque es divisible entre 7" end
unless num.modulo(11) != 0 then puts "Porque es divisible entre 11" end
unless num.modulo(13) != 0 then puts "Porque es divisible entre 13" end
unless num.modulo(17) != 0 then puts "Porque es divisible entre 17" end
unless num.modulo(19) != 0 then puts "Porque es divisible entre 19" end
unless num.modulo(23) != 0 then puts "Porque es divisible entre 23" end
unless num.modulo(29) != 0 then puts "Porque es divisible entre 29" end
unless num.modulo(31) != 0 then puts "Porque es divisible entre 31" end



end

Funciona genial!!!! Pero no me gustan las ultimas lineas es repetitivo y aburrido, siento que debe haber otra forma “Mas elegante de resolverlo”. Se me ocurre hacerlo con arrays.

*Un arreglo o array es una lista ordenada de elementos de cualquier tipo.*

Se me ocurre guardar todos los elementos a dividir en un arreglo y después que solo se opere con todos sus elementos internos.

el arreglo tendría la siguiente forma:

divisores = [2,3,5,7,11,13,17,19,23,29,31]

Intento de Solución 2

# IDENTIFICANDO NÚMEROS PRIMOS

print "Dame un número: "
num = gets.chomp.to_i

#Haremos uso de la divisińn modular.

if num.modulo(2) != 0 && num.modulo(3) != 0 && num.modulo(5) != 0 && num.modulo(7) != 0 && num.modulo(11) != 0 && num.modulo(13) != 0 && num.modulo(17) != 0 && num.modulo(19) != 0 && num.modulo(23) != 0 && num.modulo(29) != 0 && num.modulo(31) != 0
puts "El número #{num} es primo." 
else
puts "El número #{num} NO es primo." 
# Hasta aqui todo bien, sin embargo, en caso de que no sea primo, quiero que me diga entre que números es divisible.

# Haré un array para hacer el recorrido de divisiones
divisores = [2,3,5,7,11,13,17,19,23,29,31]

divisores.each do |divisor|
	if num.modulo(divisor) == 0 then puts "Porque es divisible entre #{divisor}" end
end

Ahora funciona con menos líneas de código ^^'... ¡ Y hemos hecho nuestra primeras iteraciones!

El método each acepta un bloque de código y lo ejecuta por cada elemento de la lista que se ira mandando a llamar con la variable definida entre los || (algunos les dicen pipes, no sé como se llaman realmente estos símbolos)

es decir: Por cada elemento en la lista, divisor va tomando su valor y se ejecuta la expresión > if num.modulo(divisor) == 0 then puts “Porque es divisible entre #{divisor}” end

Me ha entrado la curiosidad ¿Podría usar el array, y el método each para hacer mas elegante el if?

Intento de Solución 3

Conseguí esto:

# IDENTIFICANDO NÚMEROS PRIMOS

print "Dame un número: "
num = gets.chomp.to_i

#Haremos uso de la divisińn modular.

# Haré un array para hacer el recorrido de divisiones
divisores = [2,3,5,7,11,13,17,19,23,29,31]
variableContador = 0
divisores.each do |divisor|
	if num.modulo(divisor) == 0 then puts "Es divisible entre #{divisor}" else variableContador += 1 end
end

if variableContador != divisores.count then puts "Por lo tanto el número #{num} NO es primo" else puts "El número #{num} es primo" end

Estoy seguro que debe haber soluciones mas elegantes, pero como un tipo al que la programación siempre le ha dado quebraderos de cabeza, me siento muy a gusto con el resultado ^^'