• .re: need help with data structure problem

    From Robert L.@21:1/5 to Kenny Tilton on Mon Feb 21 04:48:13 2022
    hi, I need to write a function (join_similar expr) where expr is
    adata structure with the following format ( (x1 y1) (x2 y2) (x3 y3)...
    (xn yn)),

    join_similar will return an expression like ( (x1 y1 y2) (x3 y3) ...)
    when x1=x2

    for instance:
    *(join_similar '((3 4) (7 5) (3 6) (7 8) (3 9) (0 1))

    would return:
    ((3 4 6 9) (7 5 8) (0 1))



    Kenny Tilton wrote:

    Lieven Marchand wrote:
    CL-USER 9 > (defun join-similar (list)
    (loop with ht = (make-hash-table)
    for (first second) in list
    do
    (pushnew second (gethash first ht nil))
    finally (return (loop for first being each hash-key in ht using (hash-value rest) collect (cons first rest)))))
    JOIN-SIMILAR

    Isn't LOOP beautiful? <g,d&r>

    <g> No...

    (defun join-similar (pairs &aux result)
    (dolist (pair pairs (nreverse result))
    (nconc (or (assoc (first pair) result)
    (first (push (list (first pair)) result)))
    (list (second pair)))))


    Gauche Scheme or Racket:

    ;; Racket needs these SRFIs:
    (require srfi/1)
    (require srfi/26)

    (define (amerge kv a)
    (cons
    (cond ((assoc (car kv) a) => (cut append <> (cdr kv)))
    (else kv))
    (alist-delete (car kv) a)))

    (define (join-similar pairs) (fold amerge '() pairs))


    (join-similar '((3 4) (7 5) (3 6) (7 8) (3 9) (0 1)))
    ===>
    '((0 1) (3 4 6 9) (7 5 8))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)