Cuadro Magico en Ruby

cuadro magico puraslineas
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

Etiquetas: , , , , , , , , , , , , ,

2 comentarios a “Cuadro Magico en Ruby”

  1. Neo dice:

    jajaaj inche luigi de donde lo bajaste xDD crei q lo hacias tu pero en ingles? jajajajaja

  2. GianBros dice:

    Que onda Neo gracias por tu comentario jajajaja pero shhh nadie sabe jajajaja, no mames compadre pues me dicen que es de un día para otro y sin tiempo pues tenia que conseguir uno no tan obio y que sea facil de comprensión, y ese esta sencillo y corto, bueno espero les sirva y sic al rato edito y pongo el autor original es que aparece ahi donde dice “fuente de inspiración” pero no recuerdo cual de todos los weyes que estan ahi lo hizo jajajaja. Pero ni se da cuenta sale nos andamos viendo en la uni y no me q