Entradas con la etiqueta ‘programation’

Cuadro Magico en Ruby

Lunes, 8 de Marzo de 2010

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

Torres de Hanoi en Ruby (recursividad)

Martes, 2 de Marzo de 2010

Hola amig@s programadores, el día de hoy les dejo un buen programa hecho en Ruby, en donde vemos recursividad, las famosisimas torres de Hanoi, y elevar a alguna potencia en el lenguaje de programación Ruby, un excelente lenguaje muy actual y muy sencillo bueno en parte jajaja, sale amig@s espero les agrade y les sea de gran ayuda a continuacion el codigo fuente:

 

class Hanoi#definimos nuestra clase
def tower(n,desde,hacia,temp)#entra numero de discos
   if n==1 #si se ha llegado al ultimo disco
      puts "mover disco del poste"
      puts (desde)
      puts "hacia el poste"
      puts (hacia)
      puts "\n"
   else #en caso contrario
     tower(n-1,desde,temp,hacia)#llamar al metodo
     tower(1,desde,hacia,temp)#volver a llamar al metodo
     tower(n-1,temp,hacia,desde)#y volverlo a llamar pro tercera ocasión
   end
 end#fin del metodo tower

def nmovi(x)#para calcular numero de movimientos
   move=(2**x)-1#formula de las torres de hanoi
   puts "El numero de movimientos a efectuar es de:"
   puts (move)
   puts("\n")
end

end

#interfaz
torre=Hanoi.new#llamamos y creamos a partir de nuestra clase
   puts "Da el numero de discos a mover: "
   STDOUT.flush
   disco=gets.chomp
   discos=disco.to_i#convertimos el numero de discos a entero
   torre.nmovi(discos)#llamamos al numero de movimientos
   torre.tower(discos,1,3,2)
#llamamos al metodo de las torres de hanoi y entran inicialmente
#numero de dicos,desde el poste inicial, hasta el poste final
#y el poste temporal

Recuerda dejar tu comentario saludos cordiales y hasta pronto.
English:

Tower of Hanoi in programming language Ruby, use recursion, source!!!.