Set: Difference between revisions

Content added Content deleted
No edit summary
(→‎{{header|RPL}}: better versions of INTER and DIFFL, handling now repeated items)
Line 6,856: Line 6,856:
"Azerty" #4 3.14 3 →LIST
"Azerty" #4 3.14 3 →LIST
{{works with|Halcyon Calc|4.2.7}}
{{works with|Halcyon Calc|4.2.7}}
We first need a command to remove an item for a list
≪ DUP2 1 + OVER SIZE SUB ROT ROT
IF DUP 1 == THEN DROP2 ELSE
1 SWAP 1 - SUB SWAP +
END
≫ '<span style="color:blue">POPL</span>' STO <span style="color:grey">@ ''( { a1 .. ak .. an } k → { a1 .. an } )''</span>
{| class="wikitable"
{| class="wikitable"
! RPL code
! RPL code
Line 6,861: Line 6,867:
|-
|-
|
|
≪ POS SIGN ≫ ''''IN?'''' STO
≪ POS SIGN ≫ '<span style="color:blue">IN?</span>' STO
≪ → a b
≪ → a b
Line 6,867: Line 6,873:
b j GET '''IF''' a OVER POS '''THEN''' DROP '''ELSE''' + '''END'''
b j GET '''IF''' a OVER POS '''THEN''' DROP '''ELSE''' + '''END'''
'''NEXT'''
'''NEXT'''
≫ ≫ ''''UNION'''' STO
≫ ≫ '<span style="color:blue">UNION</span>' STO
≪ → a b
≪ → a b
≪ { } 1 a SIZE '''FOR''' j
≪ { } b
a j GET '''IF''' b OVER POS '''THEN''' + '''ELSE''' DROP '''END'''
1 a SIZE '''FOR''' j
NEXT
a j GET
''''INTER'''' STO
'''IF''' DUP2 POS '''THEN'''
LAST ROT SWAP <span style="color:blue">POPL</span>
ROT ROT + SWAP
'''ELSE''' DROP '''END'''
'''NEXT''' DROP
≫ ≫ ‘<span style="color:blue">INTER</span>’ STO
≪ → a b
≪ → a b
≪ { } 1 a SIZE '''FOR''' j
≪ { } b
a j GET IF b OVER POS '''THEN''' DROP '''ELSE''' + '''END'''
1 a SIZE '''FOR''' j
'''NEXT'''
a j GET
''''DIFFL'''' STO
'''IF''' DUP2 POS NOT '''THEN'''
LAST ROT SWAP <span style="color:blue">POPL</span>
ROT ROT + SWAP
'''ELSE''' DROP '''END'''
'''NEXT''' DROP
≫ ≫ ‘<span style="color:blue">DIFFL</span>’ STO
≪ → a b
≪ → a b
Line 6,885: Line 6,901:
'''IF''' b a j GET POS NOT '''THEN''' 1 SF a SIZE 'j' STO '''END'''
'''IF''' b a j GET POS NOT '''THEN''' 1 SF a SIZE 'j' STO '''END'''
'''NEXT''' 1 FC?
'''NEXT''' 1 FC?
≫ ≫ ''''INCL'''?' STO
≫ ≫ '<span style="color:blue">INCL</span>'?' STO
≪DUP2 '''INCL?''' ROT ROT SWAP '''INCL?''' AND
≪ DUP2 '''INCL?''' ROT ROT SWAP '<span style="color:blue">DIFFL</span>' AND
≫ ''''SAME?'''' STO
≫ '<span style="color:blue">SAME?</span>' STO
|
|
'''IN?''' ''( {A} m -- boolean )'' // 1 if m ∈ A
<span style="color:blue">IN?</span> ''( {A} m -- boolean )'' // 1 if m ∈ A
.
'''UNION''' ''( {A} {B} -- {A ∪ B} )''
<span style="color:blue">UNION</span> ''( {A} {B} -- {A ∪ B} )''
Scan {B}...
Scan {B}...
... and add to {A} all {B} items not already in {A}
... and add to {A} all {B} items not already in {A}
.
.
.
<span style="color:blue">INTER</span> ''( {A} {B} -- {A ∩ B} )''
.
Put a copy of {B} in stack
'''INTER''' ''( {A} {B} -- {A ∩ B} )''
Scan {A}...
Scan {A}
... and keep {A} items also in {B}
if {A} item in copy of {B}
.
remove it from copy of {B}
.
add it to result
'''DIFFL''' ''( {A} {B} -- {A ∖ B} )''
Scan {A}...
... and keep {A} items not in {B}
.
.
<span style="color:blue">DIFFL</span> ''( {A} {B} -- {A ∖ B} )''
.
Put a copy of {B} in stack
'''INCL?''' ''( {A} {B} -- boolean )'' // true if {A} ⊆ {B}
Scan {A}
if {A} item not in copy of {B}
remove it from copy of {B}
add it to result
<span style="color:blue">INCL?</span> ''( {A} {B} -- boolean )'' // true if {A} ⊆ {B}
Scan {A}...
Scan {A}...
... and break loop if an {A} item is not in {B}
... and break loop if an {A} item is not in {B}
return flag 1, set if loop has been broken
return flag 1, set if loop has been broken
.
.
'''SAME?''' ''( {A} {B} -- boolean )'' // true if {A} = {B}
<span style="color:blue">SAME</span> ''( {A} {B} -- boolean )'' // true if {A} = {B}
{A} = {B} <=> {A} ⊆ {B} and {B} ⊆ {A}
{A} = {B} <=> {A} ⊆ {B} and {B} ⊆ {A}
|}
|}