Class: Set
- Inherits:
-
Object
- Object
- Set
- Defined in:
- lib/setfu.rb
Instance Attribute Summary collapse
-
#entropy ⇒ Object
Returns the value of attribute entropy.
Class Method Summary collapse
- .digit_chars ⇒ Object
- .letter_chars ⇒ Object
- .lowercase_chars ⇒ Object
- .parse_chars ⇒ Object
- .uppercase_chars ⇒ Object
Instance Method Summary collapse
- #!=(item) ⇒ Object
- #&(item) ⇒ Object
-
#**(item) ⇒ Object
intersection test.
- #-(item) ⇒ Object
- #<(item) ⇒ Object
- #<=(item) ⇒ Object
-
#==(item) ⇒ Object
comparison operators:.
- #===(item) ⇒ Object
-
#[](*pset) ⇒ Object
new behavior …
-
#[]=(*pset, value) ⇒ Object
pset goes in the box, value after ‘=’.
- #^(item) ⇒ Object
- #add(items) ⇒ Object
- #add!(items) ⇒ Object
- #add_digit_chars ⇒ Object
- #add_digit_chars! ⇒ Object
- #add_letter_chars ⇒ Object
- #add_letter_chars! ⇒ Object
- #add_lowercase_chars ⇒ Object
- #add_lowercase_chars! ⇒ Object
- #add_opposing_case ⇒ Object
- #add_opposing_case! ⇒ Object
- #add_parse_chars ⇒ Object
- #add_parse_chars! ⇒ Object
- #add_uppercase_chars ⇒ Object
- #add_uppercase_chars! ⇒ Object
-
#coerce(other) ⇒ Object
this only works on integer …
- #count ⇒ Object
- #dup ⇒ Object
- #each_member ⇒ Object
- #empty? ⇒ Boolean
- #include?(items) ⇒ Boolean
-
#initialize(data = nil) ⇒ Set
constructor
A new instance of Set.
-
#max ⇒ Object
look from left.
- #min ⇒ Object
- #mode ⇒ Object
-
#rand(elm_count, format = :set) ⇒ Object
:array :array_chars :string :set.
- #recalculate_entropy! ⇒ Object
- #replace(ent) ⇒ Object
- #set_bits!(bits) ⇒ Object
- #set_case(mode = :mode_equal) ⇒ Object
- #to_a(int = true) ⇒ Object
- #to_i ⇒ Object
- #to_ra(int = true, th = 3) ⇒ Object
- #to_s ⇒ Object
- #to_set ⇒ Object
- #zap! ⇒ Object
- #|(item) ⇒ Object
- #~@ ⇒ Object
Constructor Details
#initialize(data = nil) ⇒ Set
Returns a new instance of Set.
122 123 124 125 126 127 |
# File 'lib/setfu.rb', line 122 def initialize(data=nil) @bits = 0 @entropy = 0 add!(data) unless data.nil? self end |
Instance Attribute Details
#entropy ⇒ Object
Returns the value of attribute entropy.
4 5 6 |
# File 'lib/setfu.rb', line 4 def entropy @entropy end |
Class Method Details
.digit_chars ⇒ Object
31 32 33 34 35 36 |
# File 'lib/setfu.rb', line 31 def self.digit_chars set = Set.new set.set_bits!(287948901175001088) set.entropy=58 return set end |
.letter_chars ⇒ Object
24 25 26 27 28 29 |
# File 'lib/setfu.rb', line 24 def self.letter_chars set = Set.new set.set_bits!(10633823810298881996379053697534001152) set.entropy=123 return set end |
.lowercase_chars ⇒ Object
17 18 19 20 21 22 |
# File 'lib/setfu.rb', line 17 def self.lowercase_chars set = Set.new set.set_bits!(10633823807823001954701781295154855936) set.entropy=123 return set end |
Instance Method Details
#!=(item) ⇒ Object
241 242 243 244 245 246 247 248 |
# File 'lib/setfu.rb', line 241 def !=(item) if(item.class==Set) rtn = item.to_i != self.to_i else rtn = Set.new(item).to_i != self.to_i end rtn end |
#&(item) ⇒ Object
196 197 198 199 200 201 202 203 204 205 |
# File 'lib/setfu.rb', line 196 def &(item) rtn = self.dup if(item.class==Set) rtn.set_bits!(rtn.to_i & item.to_i) else rtn = Set.new(item) rtn.set_bits!(@bits & rtn.to_i) end rtn end |
#**(item) ⇒ Object
intersection test
225 226 227 228 229 |
# File 'lib/setfu.rb', line 225 def **(item) # intersection test set_item = Set.new(item) return false if (self & set_item).empty? return true end |
#-(item) ⇒ Object
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
# File 'lib/setfu.rb', line 207 def -(item) rtn = Set.new rtn.entropy = self.entropy a = self.to_i if(item.class==Set) b = item.to_i rtn.entropy = item.entropy else b = Set.new(item) rtn.entropy = b.entropy b = b.to_i end c = a & b d = c ^ a rtn.set_bits!(d) rtn end |
#<(item) ⇒ Object
283 284 285 286 287 |
# File 'lib/setfu.rb', line 283 def <(item) si = Set.new item return false if (si == self) # not a 'proper' subset return si.include?(self) end |
#<=(item) ⇒ Object
278 279 280 281 |
# File 'lib/setfu.rb', line 278 def <=(item) si = Set.new item return si.include?(self) end |
#==(item) ⇒ Object
comparison operators:
232 233 234 235 236 237 238 239 |
# File 'lib/setfu.rb', line 232 def ==(item) if(item.class==Set) rtn = item.to_i == self.to_i else rtn = Set.new(item).to_i == self.to_i end rtn end |
#===(item) ⇒ Object
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
# File 'lib/setfu.rb', line 255 def ===(item) # self ... when clause ... # item ... case clause ... case(item) # Note: coerce does not work in this context ... md = item.to_set.mode || @mode case md when :mode_intersection return item ** self when :mode_sub return item <= self when :mode_proper return item < self when :mode_super return self <= item when :mode_superproper return self < item else return self == item end end |
#[](*pset) ⇒ Object
new behavior … single element returns true/false multi element … returns subset
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
# File 'lib/setfu.rb', line 444 def [](*pset) idx = nil if pset.count==1 # check for single instance inst[5], inst['t'] if pset.first.kind_of? Integer idx = pset.first elsif pset.first.kind_of? String if pset.first.length == 1 idx = pset.first.ord end end end unless idx.nil? raise "Negative indexes are illegal for Set" if idx < 0 self.entropy = idx+1 y = @bits & (1<<idx) return true if y > 0 return false end return pset.to_set & self end |
#[]=(*pset, value) ⇒ Object
pset goes in the box, value after ‘=’
465 466 467 468 469 470 471 472 473 474 |
# File 'lib/setfu.rb', line 465 def []=(*pset,value) # pset goes in the box, value after '=' pset = pset.to_set state = value ? true : false if state replace pset | self # add elements to set else replace self - pset # remove elements from set end return state # this gets ignored, but to be safe, do what the previous version did end |
#^(item) ⇒ Object
173 174 175 176 177 178 179 180 181 182 |
# File 'lib/setfu.rb', line 173 def ^(item) rtn = self.dup if(item.class==Set) rtn.set_bits!(rtn.to_i ^ item.to_i) else rtn = Set.new(item) rtn.set_bits!(@bits ^ rtn.to_i) end rtn end |
#add(items) ⇒ Object
319 320 321 |
# File 'lib/setfu.rb', line 319 def add(items) dup.add!(items) end |
#add!(items) ⇒ Object
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 |
# File 'lib/setfu.rb', line 289 def add!(items) if(items.class==Set) @bits |= items.to_i entropy = items.entropy elsif(items.class==Range) f=items.first.ord l=items.last.ord f,l = l,f if f>l t = (l-f)+1 t = (1 << t)-1 @bits |= t << f self.entropy = l+1 elsif(items.respond_to? :each_char) items.each_char do |item| @bits |= 1 << item.ord self.entropy = item.ord+1 end elsif(items.respond_to? :each) items.each do |item| add! item end else #assume number raise "negative numbers are not allowed" if items < 0 pos = 1 << items @bits |= pos self.entropy = items+1 end self end |
#add_digit_chars ⇒ Object
68 69 70 |
# File 'lib/setfu.rb', line 68 def add_digit_chars return Set.digit_chars | self end |
#add_digit_chars! ⇒ Object
63 64 65 66 |
# File 'lib/setfu.rb', line 63 def add_digit_chars! add! Set.digit_chars self end |
#add_letter_chars ⇒ Object
90 91 92 |
# File 'lib/setfu.rb', line 90 def add_letter_chars return Set.letter_chars | self end |
#add_letter_chars! ⇒ Object
94 95 96 97 |
# File 'lib/setfu.rb', line 94 def add_letter_chars! add! Set.letter_chars self end |
#add_lowercase_chars ⇒ Object
86 87 88 |
# File 'lib/setfu.rb', line 86 def add_lowercase_chars return Set.lowercase_chars | self end |
#add_lowercase_chars! ⇒ Object
81 82 83 84 |
# File 'lib/setfu.rb', line 81 def add_lowercase_chars! add! Set.lowercase_chars self end |
#add_opposing_case ⇒ Object
110 111 112 |
# File 'lib/setfu.rb', line 110 def add_opposing_case dup.add_opposing_case! end |
#add_opposing_case! ⇒ Object
99 100 101 102 103 104 105 106 107 108 |
# File 'lib/setfu.rb', line 99 def add_opposing_case! aa = Set.lowercase_chars bb = Set.uppercase_chars ka = aa & self # subset lower case kb = bb & self # subset upper case @bits |= ka.to_i >> 32 @bits |= kb.to_i << 32 self.entropy = 32 + kb.recalculate_entropy! if self.entropy <= 123 self end |
#add_parse_chars ⇒ Object
59 60 61 |
# File 'lib/setfu.rb', line 59 def add_parse_chars return Set.parse_chars | self end |
#add_parse_chars! ⇒ Object
53 54 55 56 57 |
# File 'lib/setfu.rb', line 53 def add_parse_chars! # add! [0..47, 58..64, 91..96, 123..126] add! Set.parse_chars self end |
#add_uppercase_chars ⇒ Object
77 78 79 |
# File 'lib/setfu.rb', line 77 def add_uppercase_chars return Set.uppercase_chars | self end |
#add_uppercase_chars! ⇒ Object
72 73 74 75 |
# File 'lib/setfu.rb', line 72 def add_uppercase_chars! add! Set.uppercase_chars self end |
#coerce(other) ⇒ Object
this only works on integer … String, Array, Range does not implement: &, |, ^
162 163 164 165 |
# File 'lib/setfu.rb', line 162 def coerce(other) #puts "TESTING ... coerce called!" return [self, other] # does not seem to get called ... end |
#count ⇒ Object
369 370 371 372 373 374 375 |
# File 'lib/setfu.rb', line 369 def count cnt = 0 each_member do |toss| cnt += 1 end cnt end |
#dup ⇒ Object
167 168 169 170 171 |
# File 'lib/setfu.rb', line 167 def dup rtn = Set.new rtn.replace(self) return rtn end |
#each_member ⇒ Object
354 355 356 357 358 359 360 361 362 363 |
# File 'lib/setfu.rb', line 354 def each_member bits = @bits pos = 0 while bits > 0 yield pos if ((bits & 1) == 1) pos += 1 bits >>= 1 end self end |
#empty? ⇒ Boolean
323 324 325 |
# File 'lib/setfu.rb', line 323 def empty? @bits == 0 end |
#include?(items) ⇒ Boolean
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# File 'lib/setfu.rb', line 327 def include?(items) if(items.class==Set) return (@bits & items.to_i) == items.to_i elsif(items.class==Range) f=items.first.ord l=items.last.ord f,l = l,f if f>l t = (l-f)+1 t = (1 << t)-1 t = t << f return (@bits & t) == t elsif(items.respond_to? :each_char) items.each_char do |item| t = 1 << item.ord return false if 0 == (t & @bits) end elsif(items.respond_to? :each) items.each do |item| return false if false==include?(item) end else #assume number t = 1 << items.abs return false if 0 == (t & @bits) end return true end |
#max ⇒ Object
look from left
490 491 492 493 494 495 496 497 498 499 500 501 502 503 |
# File 'lib/setfu.rb', line 490 def max #look from left #byebug return nil if empty? range = (self.entropy)..(0) while((range.first - range.last) >= 2) do mid = ((range.first - range.last) >> 1) + range.last top = (range.first)..(mid) bot = (mid)..(range.last) range = self ** top ? top : bot end #byebug return range.first if (self[range.first]) range.last end |
#min ⇒ Object
476 477 478 479 480 481 482 483 484 485 486 487 488 |
# File 'lib/setfu.rb', line 476 def min return nil if empty? range = (self.entropy)..(0) while((range.first - range.last) >= 2) do mid = ((range.first - range.last) >> 1) + range.last top = (range.first)..(mid) bot = (mid)..(range.last) range = self ** bot ? bot : top end #byebug return range.last if (self[range.last]) range.first end |
#mode ⇒ Object
118 119 120 |
# File 'lib/setfu.rb', line 118 def mode return @mode end |
#rand(elm_count, format = :set) ⇒ Object
:array :array_chars :string :set
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 |
# File 'lib/setfu.rb', line 506 def rand(elm_count, format = :set) raise "rand minimum count too low" if elm_count < 1 ary = self.to_a ary.shuffle! ary = ary[0..(elm_count-1)] case format when :array return ary when :array_chars rtn = [] ary.each do |elm| rtn.push elm.chr end return rtn when :string rtn = [] ary.each do |elm| rtn.push elm.chr end return rtn.join "" else # :set return ary.to_set end end |
#recalculate_entropy! ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/setfu.rb', line 135 def recalculate_entropy! @entropy = 0 bits = @bits num = 1 << 8192 while(bits > num) @entropy += 8192 bits >>= 8192 end num = 1 << 256 while(bits > num) @entropy += 256 bits >>= 256 end num = 1 << 16 while(bits > num) @entropy += 16 bits >>= 16 end while(bits > 0) @entropy += 1 bits >>= 1 end #@entropy += 1 @entropy end |
#replace(ent) ⇒ Object
45 46 47 48 49 50 51 |
# File 'lib/setfu.rb', line 45 def replace(ent) ent = ent.to_set @mode = ent.mode @entropy = ent.entropy @bits = ent.to_i self end |
#set_bits!(bits) ⇒ Object
430 431 432 433 |
# File 'lib/setfu.rb', line 430 def set_bits!(bits) raise "negative numbers are not allowed" if bits.to_i < 0 @bits = bits.to_i end |
#set_case(mode = :mode_equal) ⇒ Object
250 251 252 253 |
# File 'lib/setfu.rb', line 250 def set_case(mode=:mode_equal) @mode = mode self end |
#to_a(int = true) ⇒ Object
385 386 387 388 389 390 391 |
# File 'lib/setfu.rb', line 385 def to_a(int = true) rtn = [] each_member do |num| rtn.push int ? num : num.chr end rtn end |
#to_i ⇒ Object
365 366 367 |
# File 'lib/setfu.rb', line 365 def to_i return @bits end |
#to_ra(int = true, th = 3) ⇒ Object
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 |
# File 'lib/setfu.rb', line 393 def to_ra(int=true, th=3) raise "Threshold too low" unless th >= 2 rtn = [] cnt = 0 last = -100 flag = false th -= 1 each_member do |num| # byebug unless int rtn.push int ? num : num.chr if ((last+1)==num) # byebug if cnt.nil? cnt += 1 flag = cnt >= th elsif flag save = rtn.pop tmp = rtn.pop(cnt+1) range = (tmp.first)..(tmp.last) rtn.push range rtn.push save cnt = 0 last = -100 flag = false else cnt = 0 end last = num end #byebug if flag # convert final range tmp = rtn.pop(cnt+1) range = (tmp.first)..(tmp.last) rtn.push range end rtn end |
#to_s ⇒ Object
377 378 379 380 381 382 383 |
# File 'lib/setfu.rb', line 377 def to_s rtn = "" each_member do |ch| rtn += ch.chr end rtn end |
#to_set ⇒ Object
114 115 116 |
# File 'lib/setfu.rb', line 114 def to_set return self end |
#zap! ⇒ Object
129 130 131 132 133 |
# File 'lib/setfu.rb', line 129 def zap! @bits = 0 @entropy = 0 self end |
#|(item) ⇒ Object
184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/setfu.rb', line 184 def |(item) rtn = self.dup if(item.class==Set) rtn.set_bits!(rtn.to_i | item.to_i) self.entropy=item.entropy else rtn = Set.new(item) rtn.set_bits!(@bits | rtn.to_i) end rtn end |
#~@ ⇒ Object
435 436 437 438 439 440 |
# File 'lib/setfu.rb', line 435 def ~@() rtn = dup mask = (1 << @entropy) - 1 rtn.set_bits!(mask ^ @bits) rtn end |