• Re: Remove part of a list

    From B. Pym@21:1/5 to All on Sat Jul 20 16:23:20 2024
    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))

    Gauche Scheme

    (define (strictly-increasing couples)
    (let1 n #f
    (filter
    (^c (let1 sum (apply + c)
    (and (or (not n) (> sum n)) (set! n sum))))
    couples)))

    (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))

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Kaz Kylheku@21:1/5 to B. Pym on Sat Jul 20 21:07:23 2024
    On 2024-07-20, B. Pym <Nobody447095@here-nor-there.org> wrote:
    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))

    Gauche Scheme

    (define (strictly-increasing couples)
    (let1 n #f
    (filter
    (^c (let1 sum (apply + c)
    (and (or (not n) (> sum n)) (set! n sum))))
    couples)))

    (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))

    Simple pop in a loop and conditionally collect.

    (defun strictly-increasing (lists)
    (build (iflet ((list (pop lists)))
    (let ((val (sum list)))
    (add list)
    (whilet ((list (pop lists)))
    (whena (> (sum list) val)
    (set val it)
    (add list)))))))
    strictly-increasing
    (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))

    --
    TXR Programming Language: http://nongnu.org/txr
    Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal
    Mastodon: @Kazinator@mstdn.ca

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