Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 116,606 of 117,927    |
|    B. Pym to B. Pym    |
|    Re: X in every language syndrome    |
|    07 Jul 24 19:40:26    |
      From: No_spamming@noWhere_7073.org              On 7/7/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)       >       >       > In Forth?              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)              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca