Deutsch English Français Italiano |
<v8k59k$382b5$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" <Nobody447095@here-nor-there.org> Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: The "Strand" puzzle --- ( Continued Fractions using Lisp orPython? ) Date: Sat, 3 Aug 2024 02:39:52 -0000 (UTC) Organization: A noiseless patient Spider Lines: 68 Message-ID: <v8k59k$382b5$1@dont-email.me> References: <v7u7qd$2dgbs$1@dont-email.me> <6f90c2b4abed28c153dea46de3af408d@www.novabbs.com> <v88ood$jnp6$1@dont-email.me> <v8fkps$23nr5$1@dont-email.me> <v8ikg2$2qrts$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Sat, 03 Aug 2024 04:39:52 +0200 (CEST) Injection-Info: dont-email.me; posting-host="a358947f45c9b99589af96dcca686d10"; logging-data="3410277"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX199gXi9Br2gbfjCcexf/NKF" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:Zt7P8ANA+N4CnCChTJXH32k9O1c= Bytes: 2858 B. Pym wrote: > B. Pym 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)) > > ===> > > 251 > > > 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)) > Using "do": (define (strand lst) (do ((tail lst (cdr tail)) (left-sum 0 (+ left-sum (car tail))) (right-sum (fold + 0 (cdr lst)) (- right-sum (cadr tail)))) ((>= left-sum right-sum) (if (= left-sum right-sum) (car tail) #f))))