Set consolidation: Difference between revisions
Content added Content deleted
m (→{{header|TXR}}: Drop @(do ...)) |
|||
Line 1,628: | Line 1,628: | ||
Original solution: |
Original solution: |
||
⚫ | |||
<lang txr>@(do |
|||
⚫ | |||
(defun fnd (p x) (if (eq [p x] x) x (fnd p [p x]))) |
|||
(defun uni (p x y) |
|||
(let ((xr (fnd p x)) (yr (fnd p y))) |
|||
(set [p xr] yr))) |
|||
(defun consoli (sets) |
|||
(let ((p (hash))) |
|||
(each ((s sets)) |
|||
(each ((e s)) |
|||
(mkset p e) |
|||
(uni p e (car s)))) |
|||
(hash-values |
|||
[group-by (op fnd p) (hash-keys |
|||
[group-by identity (flatten sets)])]))) |
|||
;; tests |
|||
(each ((test '(((a b) (c d)) |
|||
((a b) (b d)) |
|||
((a b) (c d) (d b)) |
|||
((h i k) (a b) (c d) (d b) (f g h))))) |
|||
(format t "~s -> ~s\n" test (consoli test)))</lang> |
|||
{{out}} |
{{out}} |
||
<pre>((a b) (c d)) -> (( |
<pre>((a b) (c d)) -> ((b a) (d c)) |
||
((a b) (b d)) -> (( |
((a b) (b d)) -> ((b a d)) |
||
((a b) (c d) (d b)) -> (( |
((a b) (c d) (d b)) -> ((b a d c)) |
||
((h i k) (a b) (c d) (d b) (f g h)) -> ( |
((h i k) (a b) (c d) (d b) (f g h)) -> ((g f k i h) (b a d c)</pre> |
||
{{trans|Racket}} |
{{trans|Racket}} |
||
⚫ | |||
<lang txr>@(do |
|||
⚫ | |||
(defun empty-p (set) (zerop (hash-count set))) |
|||
(defun consoli (ss) |
|||
(defun combi (cs s) |
|||
(cond ((empty-p s) cs) |
|||
((null cs) (list s)) |
|||
((empty-p (hash-isec s (first cs))) |
|||
(cons (first cs) (combi (rest cs) s))) |
|||
(t (consoli (cons (hash-uni s (first cs)) (rest cs)))))) |
|||
[reduce-left combi ss nil]) |
|||
;; tests |
|||
(each ((test '(((a b) (c d)) |
|||
((a b) (b d)) |
|||
((a b) (c d) (d b)) |
|||
((h i k) (a b) (c d) (d b) (f g h))))) |
|||
(format t "~s -> ~s\n" test |
|||
[mapcar hash-keys (consoli [mapcar mkset test])]))</lang> |
|||
{{out}} |
{{out}} |
||
<pre>((a b) (c d)) -> ((b a) (d c)) |
<pre>((a b) (c d)) -> ((b a) (d c)) |
||
((a b) (b d)) -> ((b a |
((a b) (b d)) -> ((d b a)) |
||
((a b) (c d) (d b)) -> (( |
((a b) (c d) (d b)) -> ((d c b a)) |
||
((h i k) (a b) (c d) (d b) (f g h)) -> ((g f k i h) ( |
((h i k) (a b) (c d) (d b) (f g h)) -> ((g f k i h) (d c b a))</pre> |
||
=={{header|VBScript}}== |
=={{header|VBScript}}== |