Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connectionsPath: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" 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: References: <6f90c2b4abed28c153dea46de3af408d@www.novabbs.com> 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))))