• Re: Remove part of a list

    From B. Pym@Nobody447095@here-nor-there.org to comp.lang.lisp on Sat Jun 28 23:37:54 2025
    From Newsgroup: comp.lang.lisp

    I have this list = '((8 2) (8 3) (8 4) (7 4) (6 4) (5 4) (4 4)
    (4 5) (3 5) (3 6) (4 6) (4 5) (4 4) (5 4) (6 4) (7 4) (8 4)
    (8 5) (9 5) (10 5))

    And i want to remove the part os list that begin in '(8 4) to
    the '(8 4)..

    The result sould be this: = '((8 2) (8 3) (8 4) (8 5) (9 5) (10 5))

    It looks as if the resulting sequence is the longest subsequence of
    the original sequence, in which the sums of the value pairs are
    strictly increasing.


    Can anyone help me?

    Maybe this?

    (defun strictly-increasing (input-pair-list)
    (loop with max = nil
    for pair in input-pair-list
    for pair-value = (apply #'+ pair)
    when (or (null max) (> pair-value max))
    collect pair and
    do (setf max pair-value))))

    Testing in SBCL:

    (defun strictly-increasing (input-pair-list)
    (loop with max = nil
    for pair in input-pair-list
    for pair-value = (apply #'+ pair)
    when (or (null max) (> pair-value max))
    collect pair and
    do (setf max pair-value))))

    STRICTLY-INCREASING
    *
    debugger invoked on a SB-INT:SIMPLE-READER-ERROR in thread
    #<THREAD "main thread" RUNNING {23EAC1B9}>:
    unmatched close parenthesis

    (strictly-increasing
    '((8 2) (8 3) (8 4) (7 4) (6 4) (5 4) (4 4)
    (4 5) (3 5) (3 6) (4 6) (4 5) (4 4) (5 4) (6 4) (7 4) (8 4)
    (8 5) (9 5) (10 5)))
    ===>
    ((8 2) (8 3) (8 4) (8 5) (9 5) (10 5))

    If one uses a Lispy language, then instead of using
    a macro whose source measures 60 kilobytes, he can
    simply use recursion.

    Gauche Scheme

    (define (strict seq :optional (m 0))
    (if (null? seq)
    ()
    (let* ((pair (pop! seq)) (n (apply + pair)))
    (if (> n m)
    (cons pair (strict seq n))
    (strict seq m)))))

    (strict
    '((8 2) (8 3) (8 4) (7 4) (6 4) (5 4) (4 4)
    (4 5) (3 5) (3 6) (4 6) (4 5) (4 4) (5 4) (6 4) (7 4) (8 4)
    (8 5) (9 5) (10 5)))

    ===>
    ((8 2) (8 3) (8 4) (8 5) (9 5) (10 5))
    --- Synchronet 3.21d-Linux NewsLink 1.2