Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #41935

Re: Strings and numbers

From Paul Rubin <no.email@nospam.invalid>
Newsgroups comp.lang.forth
Subject Re: Strings and numbers
Date 2015-09-10 17:22 -0700
Organization A noiseless patient Spider
Message-ID <87oah9st2o.fsf@jester.gateway.pace.com> (permalink)
References (4 earlier) <msccfm$c7p$1@dont-email.me> <mskosf$1tr$1@dont-email.me> <877fo0t4y0.fsf@jester.gateway.pace.com> <99b72d58-0b1a-4e09-9c34-42ebb844fff8@googlegroups.com> <f8c62977-77d0-47ca-9f21-3c9589ec49a0@googlegroups.com>

Show all headers | View raw


Richard Todd <richard.wesley.todd@gmail.com> writes:
> I spent a few minutes with Paul's answer, because it's so much
> nicer-looking than mine.  ...  This is a really interesting program to
> me, because I could never have written it.  It keeps searching after
> it finds the solution -- an option I would never have considered, but
> which really simplifies the logic.  Also, num usually returns nothing,
> but on one one call in the middle of the sequence it leaves 'n' on the
> stack. Really nice!

Wow, thanks for the kind words.  The purpose of keeping on searching was
to find all the solutions in the event there was more than one (I didn't
know before writing that).  I didn't notice that num had a variable
stack effect!  That's actually a code smell, imho.  Originally I printed
out n there instead of returning it on the stack, but saw there was only
one value printed so I returned it for cleanliness reasons.

I changed the program to use your multiply-by-10 trick for 32-bit
systems and also to stop searching after the first solution, by
throwing/catching an exception (below).

>  My program is over-engineered and convoluted by comparison.

I've been wanting to study yours because it does a better job than mine
at splitting the code into small factors, which makes it easier to avoid
using locals, improving its Forth purity :).  Anyway, here's my current
version:
================================================================
\ http://programmingpraxis.com/2015/07/21/a-number-puzzle
\ Now works in 64 and 32 bit gforth, thanks to Richard Todd
\ for the multiply-by-10 trick

: .bit ( i -- n ) 1 swap lshift ;	   \ bits are numbered from 0
: clear-bit ( n i -- n ) .bit invert and ;	  \ clear bit i in n
: test-bit ( n i -- flag ) .bit and 0<> ;	  \ true if bit i is 1
: append-digit ( n i -- n ) swap 10 * + ;

: num { r n s -- n }
    s 0= if n throw then
    10 1 do 
	n i append-digit
	s i test-bit
	over r mod 0= and if
	    r 1+ swap  s i clear-bit recurse
	else drop
	then
    loop ;

: solve/10 ( -- n ) 1 0 $3fe ['] num catch
    2nip nip ;				\ cleanup stack from exception
: go ( -- ) solve/10 10 m* d. cr ;

go					\ should print 3816547290 
bye
================================================================

Back to comp.lang.forth | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Strings and numbers Steve Graham <solitary.wanderer52@gmail.com> - 2015-08-03 13:24 -0700
  Re: Strings and numbers Julian Fondren <julian.fondren@gmail.com> - 2015-08-03 13:51 -0700
    Re: Strings and numbers "Rod Pemberton" <boo@fasdfrewar.cdm> - 2015-08-03 17:38 -0400
    Re: Strings and numbers Steve Graham <solitary.wanderer52@gmail.com> - 2015-08-03 14:44 -0700
  Re: Strings and numbers Paul Rubin <no.email@nospam.invalid> - 2015-08-03 20:59 -0700
    Re: Strings and numbers Steve Graham <solitary.wanderer52@gmail.com> - 2015-08-04 12:19 -0700
      Re: Strings and numbers "WJ" <w_a_x_man@yahoo.com> - 2015-08-07 09:29 +0000
        Re: Strings and numbers "WJ" <w_a_x_man@yahoo.com> - 2015-09-04 15:14 +0000
          Re: Strings and numbers "WJ" <w_a_x_man@yahoo.com> - 2015-09-07 19:34 +0000
            Re: Strings and numbers Julian Fondren <julian.fondren@gmail.com> - 2015-09-08 11:48 -0700
            Re: Strings and numbers Paul Rubin <no.email@nospam.invalid> - 2015-09-09 00:41 -0700
              Re: Strings and numbers Richard Todd <richard.wesley.todd@gmail.com> - 2015-09-10 00:32 -0700
                Re: Strings and numbers Richard Todd <richard.wesley.todd@gmail.com> - 2015-09-10 10:29 -0700
                Re: Strings and numbers Paul Rubin <no.email@nospam.invalid> - 2015-09-10 17:22 -0700
                Re: Strings and numbers Richard Todd <richard.wesley.todd@gmail.com> - 2015-09-10 21:34 -0700
                Re: Strings and numbers humptydumpty <ouatubi@gmail.com> - 2015-09-11 02:16 -0700
                Re: Strings and numbers humptydumpty <ouatubi@gmail.com> - 2015-09-11 07:33 -0700
                Re: Strings and numbers Paul Rubin <no.email@nospam.invalid> - 2015-09-13 00:12 -0700
                Re: Strings and numbers humptydumpty <ouatubi@gmail.com> - 2015-09-13 02:09 -0700
                Re: Strings and numbers Paul Rubin <no.email@nospam.invalid> - 2015-09-11 15:53 -0700
                Re: Strings and numbers Andrew Haley <andrew29@littlepinkcloud.invalid> - 2015-12-18 16:02 -0600
            Re: Strings and numbers "WJ" <w_a_x_man@yahoo.com> - 2015-09-12 23:38 +0000
              Re: Strings and numbers "WJ" <w_a_x_man@yahoo.com> - 2015-09-13 19:41 +0000
            Re: Strings and numbers "WJ" <w_a_x_man@yahoo.com> - 2015-11-29 18:09 +0000

csiph-web