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)