Hola un saludo a todos los chavos y chavas que se dedican a la programación por hobbie o por pasar una materia más como sea y por algun azar del destino caíste en la WeBlog de quien sabe que cosa, posiblemente buscando como hacer el cubo, cuadrado, cuadro o rectangulo (de que lo hay los hay) magico en lenguaje de programación Ruby, si es aquel donde al sumar los lados la suma final tanto horizontal, vertical y diagonal es la misma, el más conocido es el cuadro de 3*3 pero hoy haremos la solución para todos los cuadros impares o al menos la gran mayoria.
#creamos un programa que contendrá nuestro metodos
#el cual se llamara magic_square
class OddMagicSquare
attr_reader :square
def initialize(n)
@square = Array.new(n) #creamos nuestro arreglo
@square.each_index {|i| @square[i] = Array.new(n)}
middle = n/2 #obtenemos la mitad
@square[0][middle] = 1
@pos = [0,middle]
@len = n
end
def printing_magic_square #es toda la parte visual para que se vea bonito
v_border = '+' + '-' * (6 * @len - 1) + '+'
@square.each do |row|
puts v_border
row.each do |r|
if r then
print format('|' + "%4d" + ' ', r)
else
print '| nil '
end
end
print "|\n"
end
puts v_border
end
def iterate_square
value = 2
last_value = @len ** 2
while true do
move
fill value
break if value == last_value
value = value + 1
end
end
private
def fill(value) #introducimos el valor correspondiente
@square[@pos[0]][@pos[1]] = value
end
def move
move_down if not move_diagonal_up
end
def move_diagonal_up
# obtener posicion siguiente
future_pos = Array.new(2)
@pos[0] == 0 ? future_pos[0] = @len - 1 : future_pos[0] = @pos[0] - 1
@pos[1] == @len - 1 ? future_pos[1] = 0 : future_pos[1] = @pos[1] + 1
#checar si esta vacio o no
if @square[future_pos[0]][future_pos[1]] then
return false
else
@pos = future_pos
end
return true
end
def move_down
@pos[0] == @len - 1 ? @pos[0] = 0 : @pos[0] = @pos[0] + 1
end
end
#este es otro archivo
require 'magic_square' #llamamos al programa anterior
#n = ARGV[0].to_i
puts "Da el número de lados del cuadrado: "
STDOUT.flush
n1=gets.chomp
n=n1.to_i
raise 'el numero debe de ser impar y mayor a 2' if n % 2 == 0 or n < 3
odd_magic_square = OddMagicSquare.new(n)
odd_magic_square.iterate_square
odd_magic_square.printing_magic_square
Bueno espero el código te haya sido de gran ayuda saludos cordiales deja tus comentarios por favor que para mi son muy importante, hasta pronto y salud!!!!!!!.
English:
magic square in programation language Ruby, only odd magic square.
Fuente de inspiración: Ruby Quiz