Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[Herramienta scripting] Clase Bitset

Ver el tema anterior Ver el tema siguiente Ir abajo

[Herramienta scripting] Clase Bitset

Mensaje por orochii el 2013-10-28, 02:59

Clase Bitset
Autor: Orochii Zouveleki - Versión 1.00 (para Ruby en general)

Descripción:
Una cosa que recordé de mis momentos en que he tocado el tal OHRRPGCE, un editor opensource para hacer juegos RPG (y otros debido al scripting) de estilo retro.

Un bitset es simplemente un array de bits que se pueden accesar y cambiar por separado. La principal característica y diferencia comparado a un array es que usa muchísima menos memoria, y DEBERÍA de ser más rápido. Su principal deficiencia claro, es que sólo guarda valores booleanos, es decir, true/false. Pero para ciertos usos debería ir bastante bien.

Características:

  • Maneja un valor numérico como un array.
  • Nota: Por ahora hay pocas funciones pero supongo se irán agregando. Iré tomando inspiración en la clase Array xD...


Script:
Código:
# Clase Bitset - Maneja un "array" de bits.
class Bitset
 
  # Constructor
  def initialize
    @@bitset = 0b00000000
  end
 
  #= Setter y getter =
  # Getter
  def [](i)
    ((@@bitset >> i) & 0b01)==1
  end
  #Setter
  def []=(i,n)
    cv=(0b10**i)
    @@bitset = (@@bitset & cv) if (n==true)||(n==1)
    @@bitset = (@@bitset ^ cv) if (n==false)||(n==0)
  end
 
  #= Conversores =
  #Entero
  def to_i
    @@bitset
  end
  #Punto flotante
  def to_f
    @@bitset.to_f
  end
  #Cadena de texto
  def to_s
    sprintf("%#b", @@bitset)
  end
  #Array
  def to_a
    ary = []
    to_s.each_byte{|b|
      ary.push(false) if b==48
      ary.push(true) if b==49
    }
    ary
  end
  #Hash
  def to_hash
    hash = {}
    i = 0
    to_s.each_byte{|b|
      hash[i] = false if b==48
      hash[i] = true if b==49
    }
    ary
  end
end
Instrucciones de uso:
Pegar sobre Main, o en Data y luego usar require (?). Whatever.
La clase tiene los siguientes métodos:
Spoiler:

new
El método constructor.
Ej.:
Código:
var = Bitset.new
[]=(i,n)
Seteador de un valor. Recibe la posición en el set de bits, y un valor (true o false)
Ej.:
Código:
var[2] = false
[]
Obtiene un valor. Recibe la posición en el set de bits.
Ej.:
Código:
var[2]
to_i
Convierte el bitset en un número entero.
Ej.:
Código:
var.to_i
to_f
Convierte el bitset en un número de punto flotante.
Ej.:
Código:
var.to_f
to_s
Convierte el bitset en una cadena de texto.
Ej.:
Código:
var.to_s
to_a
Convierte el bitset en un arreglo (array).
Ej.:
Código:
var.to_a

Compatibilidad:
Puede ser usado fuera del RPG Maker. Es un script de Ruby. Por lo tanto debería ir con lo que sea.

Registro de versiones:
28/10/2013 1.01. Agregados conversores.
27/10/2013 1.00. Versión inicial.

Preguntas Frecuentes:
Por ahora, nein.

Saludos,
Orochii Zouveleki


Última edición por orochii el 2013-10-29, 00:41, editado 2 veces
avatar
orochii
Reportero

0/3

Créditos 7792

Gracias : 461

Volver arriba Ir abajo

Re: [Herramienta scripting] Clase Bitset

Mensaje por Wecoc el 2013-10-28, 10:11

Como nuevas funciones, quizá to_s, to_a, to_i y to_f le vendrian bien, no sé. Igualmente no le veo mucha utilidad, mola que sea más rápido pero le veo demasiada limitación ahora mismo :( Aún así es interesante.
avatar
Wecoc
Administrador
Administrador



Créditos 12284

Gracias : 645

Volver arriba Ir abajo

Re: [Herramienta scripting] Clase Bitset

Mensaje por silvanash el 2013-10-28, 14:00

En realidad, es bastante útil para guardar mucha información para algunas cosas. Por ejemplo, un engine (sí, un engine) que tenga un montón de botones en pantalla. Con esto podrías anotar muy rápido cuáles están apretados y cuáles no, y se supone que es más eficiente que un array clásico.

Lo de to_i y to _f no le veo sentido xD. Si sólo trabaja con booleanos, da igual si son integers o no.

Adenda: wecoquete, por amor de la criatura que prefieras, ponte un avatar. Mis ojos no soportan verte postear como Shiro.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 205

Gracias : 251

Volver arriba Ir abajo

Re: [Herramienta scripting] Clase Bitset

Mensaje por orochii el 2013-10-28, 15:08

Okay, ahí agregué los conversores. Soporta int, float, string y array. Después podría hacer to_hash supongo, pero es que debo ir a clases x'D!.

Ahora nos leemos, salut,
OZ
avatar
orochii
Reportero

0/3

Créditos 7792

Gracias : 461

Volver arriba Ir abajo

Re: [Herramienta scripting] Clase Bitset

Mensaje por Wecoc el 2013-10-28, 18:00

Orochii: Dí que sí, con dos cojones.
¿Tileset, Bitmap? ¡Los scritpers de verdad usamos Tilemap y Bitset! (?) xD

Silva: Lo decía porque encontré esto por google.

Código:
class Array
  def to_bitset
    self.inject(0){ |ret, cur| ret + 2**cur }
  end
end

class Integer
  def to_bitset
    ret = []
    i = 0
    while self >= x = x ? x*2 : 1
      ret << i if 0 < self[i]
      i+=1
    end
    ret
  end
end

#class Float
#  def to_bitset
#    (0..Math.log(self)/Math.log(2)).select{ |e| 0<self & 2**e }
#  end
#end
Y me quedé con cara de más tonto.

Si es que además de no verle la utilidad encima no entiendo del todo cómo funciona. Soy la repera oigan xDD

Edito: Orochii, creo que no hiciste bien el paso a array.
avatar
Wecoc
Administrador
Administrador



Créditos 12284

Gracias : 645

Volver arriba Ir abajo

Re: [Herramienta scripting] Clase Bitset

Mensaje por orochii el 2013-10-29, 00:43

Oh vaya, cierto, ese to_a no servía x'D. Okay, ahora debería andar. Los bytes no eran 1 ni 0, sino 48 y 49 (valores correspondientes a los caracteres 0 y 1). Y aparte creo que no retornaba lo que debía x'D. Ahora debería funcionar.
También hice un to_hash. No está hecho como de la manera más megaguay, pero ahí va xd (?).

Ahora sigo agregando cosas, por ahora lo dejo así,
Orochii Zouveleki
avatar
orochii
Reportero

0/3

Créditos 7792

Gracias : 461

Volver arriba Ir abajo

Re: [Herramienta scripting] Clase Bitset

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.