Deutsch   English   Français   Italiano  
<v6er2n$fd6o$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" <No_spamming@noWhere_7073.org>
Newsgroups: comp.lang.lisp
Subject: Re: X in every language syndrome
Date: Sun, 7 Jul 2024 19:42:18 -0000 (UTC)
Organization: A noiseless patient Spider
Lines: 109
Message-ID: <v6er2n$fd6o$1@dont-email.me>
References: <v6cemu$3vogb$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Injection-Date: Sun, 07 Jul 2024 21:42:19 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="988aed472a54273a376e5503f1be245e";
	logging-data="505048"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18fKLAcSJx6FMq8BfUPnLUX"
User-Agent: XanaNews/1.18.1.6
Cancel-Lock: sha1:LpKQbivOpK4m+1OVqHd3tSjUBx4=
Bytes: 4481

On 7/6/2024, B. Pym wrote:

> > The question is about so-called "bellied"
> > numbers, defined as 4-digit integers for which the sum of the two
> > "middle" digits is smaller than the sum of the two outer digits. So 1265
> > is bellied, while 4247 is not.
> 
> [ He means the sum of middle digits is larger. ]
> 
> > 
> > This checking part is easy:
> > 
> > (defun bellied-number-p (n)
> >   (> (+ (mod (truncate n 10) 10) (mod (truncate n 100) 10))
> >      (+ (mod n 10) (truncate n 1000))))
> > 
> > Now the task is to find the longest, uninterrupted sequence of bellied
> > numbers within all 4-digit number, hence from 1000 to 9999. And this is
> > where I terribly screwed up:
> > 
> > While the following code does the job,
> > 
> > (let ((max-length 0)
> >       (current-length 0)
> >       (last-bellied-number 0))
> >   (dotimes (m 9000)
> >     (let ((n (+ 1000 m)))
> >       (if (bellied-number-p n)
> >           (incf current-length)
> >           (progn
> >             (when (> current-length max-length)
> >               (setf max-length current-length)
> >               (setf last-bellied-number (1- n)))
> >             (setf current-length 0)))))
> >   (print (format t "~&Longest sequence of ~a bellied numbers ends at ~a."
> >                  max-length last-bellied-number)))
> 
> [ Another poster: ]
> 
> > TXR Lisp.
> > 
> > Having defined:
> > 
> >   (defun bellied-p (num)
> >     (let ((d (digits num)))
> >       (and (= 4 (len d))
> > 	   (< (+ [d 0] [d 3])
> > 	      (+ [d 1] [d 2])))))
> > 
> > We casually do this at the prompt:
> > 
> >   1> [find-max [partition-by bellied-p (range 1000 9999)] :
> > 	       [iff [chain car bellied-p] len (ret 0)]]
> >   (1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932
> >    1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945
> >    1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958
> >    1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971
> >    1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984
> >    1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997
> >    1998 1999)
> 
> Shorter.
> 
> Gauche Scheme:
> 
> (use gauche.sequence) ;; group-contiguous-sequence find-max
> ,print-mode pretty #t length #f width 64
> 
> (define (bellied? n)
>   (define (d i) (mod (div n (expt 10 i)) 10))
>   (> (+ (d 1) (d 2))
>      (+ (d 0) (d 3))))
> 
> (find-max
>   (group-contiguous-sequence (filter bellied? (iota 9000 1000)))
>   :key length)
> 
>   ===>
> (1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931
>  1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943
>  1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955
>  1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967
>  1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979
>  1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991
>  1992 1993 1994 1995 1996 1997 1998 1999)

A lower-level way.

(define (bellied? n)
  (define (d i) (mod (div n (expt 10 i)) 10))
  (> (+ (d 1) (d 2))
     (+ (d 0) (d 3))))

(define (calc-length i)
  (do ((j i (+ j 1)))
    ((not (bellied? j)) (- j i))))

(define (longest-bellied-seq)
  (let go ((i 1000) (start 0) (len 0))
    (if (> i 9999)
      (list start len)
      (let ((new-len (calc-length i)))
        (cond ((zero? new-len) (go (+ i 1) start len))
              ((> new-len len) (go (+ i new-len) i new-len))
              (#t (go (+ i new-len) start len)))))))

  ===>
(1920 80)