RosettaCodeData/Task/Set/PureBasic/set.purebasic

171 lines
5.3 KiB
Plaintext

Procedure.s booleanText(b) ;returns 'True' or 'False' for a boolean input
If b: ProcedureReturn "True": EndIf
ProcedureReturn "False"
EndProcedure
Procedure.s listSetElements(Map a(), delimeter.s = " ") ;format elements for display
Protected output$
ForEach a()
output$ + MapKey(a()) + delimeter
Next
ProcedureReturn "(" + RTrim(output$, delimeter) + ")"
EndProcedure
Procedure.s listSortedSetElements(Map a(), delimeter.s = " ") ;format elements for display as sorted for easy comparison
Protected output$
NewList b.s()
ForEach a()
AddElement(b()): b() = MapKey(a())
Next
SortList(b(), #PB_Sort_Ascending | #PB_Sort_NoCase)
ForEach b()
output$ + b() + delimeter
Next
ProcedureReturn "(" + RTrim(output$, delimeter) + ")"
EndProcedure
Procedure cardinalityOf(Map a())
ProcedureReturn MapSize(a())
EndProcedure
Procedure createSet(elements.s, Map o(), delimeter.s = " ", clearSet = 1)
Protected i, elementCount
If clearSet: ClearMap(o()): EndIf
elementCount = CountString(elements, delimeter) + 1 ;add one for the last element which won't have a delimeter
For i = 1 To elementCount
AddMapElement(o(), StringField(elements, i, delimeter))
Next
ProcedureReturn MapSize(o())
EndProcedure
Procedure adjoinTo(elements.s, Map o(), delimeter.s = " ")
ProcedureReturn createSet(elements, o(), delimeter, 0)
EndProcedure
Procedure disjoinFrom(elements.s, Map o(), delimeter.s = " ")
Protected i, elementCount
elementCount = CountString(elements, delimeter) + 1 ;add one for the last element which won't have a delimeter
For i = 1 To elementCount
DeleteMapElement(o(), StringField(elements, i, delimeter))
Next
ProcedureReturn MapSize(o())
EndProcedure
Procedure isElementOf(element.s, Map a())
ProcedureReturn FindMapElement(a(), element)
EndProcedure
Procedure unionOf(Map a(), Map b(), Map o())
CopyMap(a(), o())
ForEach b()
AddMapElement(o(), MapKey(b()))
Next
ProcedureReturn MapSize(o())
EndProcedure
Procedure intersectionOf(Map a(), Map b(), Map o())
ClearMap(o())
ForEach a()
If FindMapElement(b(), MapKey(a()))
AddMapElement(o(), MapKey(a()))
EndIf
Next
ProcedureReturn MapSize(o())
EndProcedure
Procedure differenceOf(Map a(), Map b(), Map o())
CopyMap(a(), o())
ForEach b()
If FindMapElement(o(), MapKey(b()))
DeleteMapElement(o())
Else
AddMapElement(o(), MapKey(b()))
EndIf
Next
ProcedureReturn MapSize(o())
EndProcedure
Procedure isSubsetOf(Map a(), Map b()) ;boolean
ForEach a()
If Not FindMapElement(b(), MapKey(a()))
ProcedureReturn 0
EndIf
Next
ProcedureReturn 1
EndProcedure
Procedure isProperSubsetOf(Map a(), Map b()) ;boolean
If MapSize(a()) = MapSize(b())
ProcedureReturn 0
EndIf
ProcedureReturn isSubsetOf(a(), b())
EndProcedure
Procedure isEqualTo(Map a(), Map b())
If MapSize(a()) = MapSize(b())
ProcedureReturn isSubsetOf(a(), b())
EndIf
ProcedureReturn 0
EndProcedure
Procedure isEmpty(Map a()) ;boolean
If MapSize(a())
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
If OpenConsole()
NewMap a()
NewMap b()
NewMap o() ;for output sets
NewMap c()
createSet("red blue green orange yellow", a())
PrintN("Set A = " + listSortedSetElements(a()) + " of cardinality " + Str(cardinalityOf(a())) + ".")
createSet("lady green red", b())
PrintN("Set B = " + listSortedSetElements(b()) + " of cardinality " + Str(cardinalityOf(b())) + ".")
PrintN("'red' is an element of A is " + booleanText(isElementOf("red", a())) + ".")
PrintN("'red' is an element of B is " + booleanText(isElementOf("red", b())) + ".")
PrintN("'blue' is an element of B is " + booleanText(isElementOf("blue", b())) + ".")
unionOf(a(), b(), o())
PrintN(#crlf$ + "Union of A & B is " + listSortedSetElements(o()) + ".")
intersectionOf(a(), b(), o())
PrintN("Intersection of A & B is " + listSortedSetElements(o()) + ".")
differenceOf(a(), b(), o())
PrintN("Difference of A & B is " + listSortedSetElements(o()) + ".")
PrintN(listSortedSetElements(a()) + " equals " + listSortedSetElements(a()) + " is " + booleanText(isEqualTo(a(), a())) + ".")
PrintN(listSortedSetElements(a()) + " equals " + listSortedSetElements(b()) + " is " + booleanText(isEqualTo(a(), b())) + ".")
createSet("red green", c())
PrintN(#crlf$ + listSortedSetElements(c()) + " is a subset of " + listSortedSetElements(a()) + " is "+ booleanText(isSubsetOf(c(), a())) + ".")
PrintN(listSortedSetElements(c()) + " is a proper subset of " + listSortedSetElements(b()) + " is "+ booleanText(isProperSubsetOf(c(), b())) + ".")
PrintN(listSortedSetElements(c()) + " is a proper subset of " + listSortedSetElements(a()) + " is "+ booleanText(isProperSubsetOf(c(), a())) + ".")
PrintN(listSortedSetElements(b()) + " is a proper subset of " + listSortedSetElements(b()) + " is "+ booleanText(isProperSubsetOf(b(), b())) + ".")
PrintN(#crlf$ + "Set C = " + listSortedSetElements(c()) + " of cardinality " + Str(cardinalityOf(c())) + ".")
adjoinTo("dog cat mouse", c())
PrintN("Add 'dog cat mouse' to C to get " + listSortedSetElements(c()) + " of cardinality " + Str(cardinalityOf(c())) + ".")
disjoinFrom("red green dog", c())
PrintN("Take away 'red green dog' from C to get " + listSortedSetElements(c()) + " of cardinality " + Str(cardinalityOf(c())) + ".")
Print(#crlf$ + #crlf$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf