123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #!/usr/bin/ruby
- #
- ## https://rosettacode.org/wiki/MySet#Sidef
- #
- class MySet(*set) {
- method init {
- var elems = set;
- set = Hash.new;
- elems.each { |e| self += e }
- }
- method +(elem) {
- set{elem} = elem;
- self;
- }
- method del(elem) {
- set.delete(elem);
- }
- method has(elem) {
- set.has_key(elem);
- }
- method ∪(MySet that) {
- MySet(set.values..., that.values...);
- }
- method ∩(MySet that) {
- MySet(set.keys.grep{ |k| k ∈ that } \
- .map { |k| set{k} }...);
- }
- method ∖(MySet that) {
- MySet(set.keys.grep{|k| !(k ∈ that) } \
- .map {|k| set{k} }...);
- }
- method ^(MySet that) {
- var d = ((self ∖ that) ∪ (that ∖ self));
- MySet(d.values...);
- }
- method count { set.len }
- method ≡(MySet that) {
- (self ∖ that -> count.is_zero) && (that ∖ self -> count.is_zero);
- }
- method values { set.values }
- method ⊆(MySet that) {
- that.set.keys.each { |k|
- k ∈ self || return false;
- }
- return true;
- }
- method to_s {
- "Set{" + set.values.map{|e| "#{e}"}.sort.join(', ') + "}"
- }
- }
- class Object {
- method ∈(MySet set) {
- set.has(self);
- }
- }
- #
- ## Testing
- #
- var x = MySet(1, 2, 3);
- 5..7 -> each { |i| x += i };
- var y = MySet(1, 2, 4, x);
- say "set x is: #{x}";
- say "set y is: #{y}";
- [1,2,3,4,x].each { |elem|
- say ("#{elem} is ", elem ∈ y ? '' : 'not', " in y");
- }
- var (w, z);
- say ("union: ", x ∪ y);
- say ("intersect: ", x ∩ y);
- say ("z = x ∖ y = ", z = (x ∖ y) );
- say ("y is ", x ⊆ y ? "" : "not ", "a subset of x");
- say ("z is ", x ⊆ z ? "" : "not ", "a subset of x");
- say ("z = (x ∪ y) ∖ (x ∩ y) = ", z = ((x ∪ y) ∖ (x ∩ y)));
- say ("w = x ^ y = ", w = (x ^ y));
- say ("w is ", w ≡ z ? "" : "not ", "equal to z");
- say ("w is ", w ≡ x ? "" : "not ", "equal to x");
|