Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: rec.puzzles Subject: Re: The "Strand" puzzle --- ( Continued Fractions using Lisp orPython? ) Date: Fri, 2 Aug 2024 12:06:09 -0000 (UTC) Organization: A noiseless patient Spider Lines: 57 Message-ID: References: <6f90c2b4abed28c153dea46de3af408d@www.novabbs.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Fri, 02 Aug 2024 14:06:10 +0200 (CEST) Injection-Info: dont-email.me; posting-host="7aeb7d3f9bdbec13555d482a35ea9d08"; logging-data="2962087"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/MRArzTV3B4udG/huthECm" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:1xBRfgo+azIZCBCamSJJlv+IyjQ= Bytes: 2420 B. Pym wrote: > HenHanna wrote: > > > > > e.g. -------- For the (street)  Numbers (1,2,3,4,5,6,7,8) > > > > > > > >        (1,2,3,4,5)  and  (7,8)  both add up to 15. > > > > > > > > > > > > > > > > "In a given street of houses with consecutive numbers between > > > > 50 and 500, find the house number, for which, the sum of > > > > numbers on the left is equal to the sum of numbers on the > > > > right" > > Gauche Scheme > > (define (strand lst) > (let go ((left-sum 0) (tail lst)) > (if (null? tail) > #f > (let ((right-sum (fold + 0 (cdr tail)))) > (cond ((< left-sum right-sum) > (go (+ left-sum (car tail)) (cdr tail))) > ((= left-sum right-sum) (car tail)) > (#t #f)))))) > > (strand '(1 2 3 4 5 6 7 8)) > ===> > 6 > > (lrange 2 5) > ===> > (2 3 4) > > (any > (lambda (n) > (if (strand (lrange 50 n)) > n > #f)) > (lrange 500 50 -1)) > ===> > 352 > > (strand (lrange 50 352)) > Faster: (define (strand lst) (let go ((left-sum 0) (right-sum (fold + 0 (cdr lst))) (tail lst)) (cond ((< left-sum right-sum) (go (+ left-sum (car tail)) (- right-sum (cadr tail)) (cdr tail))) ((= left-sum right-sum) (car tail)) (else #f))))