Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.forth > #13050 > unrolled thread
| Started by | Albert van der Horst <albert@spenarnc.xs4all.nl> |
|---|---|
| First post | 2012-06-18 19:00 +0000 |
| Last post | 2012-06-20 03:15 -0500 |
| Articles | 10 on this page of 30 — 10 participants |
Back to article view | Back to comp.lang.forth
Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-18 19:00 +0000
Re: Euro's and Dollars. "A. K." <akk@nospam.org> - 2012-06-18 23:18 +0200
Re: Euro's and Dollars. Mark Wills <markrobertwills@yahoo.co.uk> - 2012-06-19 00:20 -0700
Re: Euro's and Dollars. "Elizabeth D. Rather" <erather@forth.com> - 2012-06-18 21:51 -1000
Re: Euro's and Dollars. vandys@vsta.org - 2012-06-19 00:49 +0000
Re: Euro's and Dollars. Spam@ControlQ.com - 2012-06-18 21:43 -0400
Re: Euro's and Dollars. "A. K." <akk@nospam.org> - 2012-06-19 07:20 +0200
Re: Euro's and Dollars. Ecki <ecki@intershop.de> - 2012-06-19 09:26 +0200
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-19 15:58 +0000
Re: Euro's and Dollars. "A. K." <akk@nospam.org> - 2012-06-19 19:58 +0200
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-20 01:31 +0000
Re: Euro's and Dollars. "A. K." <akk@nospam.org> - 2012-06-20 07:15 +0200
Re: Euro's and Dollars. Ecki <ecki@intershop.de> - 2012-06-20 10:15 +0200
Re: Euro's and Dollars. anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2012-06-20 10:46 +0000
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-20 17:39 +0000
Re: Euro's and Dollars. anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2012-06-21 16:21 +0000
Re: Euro's and Dollars. Andrew Haley <andrew29@littlepinkcloud.invalid> - 2012-06-21 11:58 -0500
Re: Euro's and Dollars. anton@mips.complang.tuwien.ac.at (Anton Ertl) - 2012-06-22 14:57 +0000
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-21 20:38 +0000
Re: Euro's and Dollars. vandys@vsta.org - 2012-06-19 15:49 +0000
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-19 15:43 +0000
Re: Euro's and Dollars. vandys@vsta.org - 2012-06-19 15:51 +0000
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-19 15:41 +0000
Re: Euro's and Dollars. Paul Rubin <no.email@nospam.invalid> - 2012-06-19 10:26 -0700
Re: Euro's and Dollars. Paul Rubin <no.email@nospam.invalid> - 2012-06-19 23:34 -0700
Re: Euro's and Dollars. Andrew Haley <andrew29@littlepinkcloud.invalid> - 2012-06-19 12:41 -0500
Re: Euro's and Dollars. Paul Rubin <no.email@nospam.invalid> - 2012-06-19 11:10 -0700
Re: Euro's and Dollars. Albert van der Horst <albert@spenarnc.xs4all.nl> - 2012-06-20 03:12 +0000
Re: Euro's and Dollars. Paul Rubin <no.email@nospam.invalid> - 2012-06-19 23:51 -0700
Re: Euro's and Dollars. Andrew Haley <andrew29@littlepinkcloud.invalid> - 2012-06-20 03:15 -0500
Page 2 of 2 — ← Prev page 1 [2]
| From | Albert van der Horst <albert@spenarnc.xs4all.nl> |
|---|---|
| Date | 2012-06-19 15:43 +0000 |
| Message-ID | <m5vfo0.1g6@spenarnc.xs4all.nl> |
| In reply to | #13054 |
In article <a4a0kpFeidU1@mid.individual.net>, <vandys@vsta.org> wrote:
>Albert van der Horst <albert@spenarnc.xs4all.nl> wrote:
>> In studying Scheme I came across the example program to count
>> in how many ways one dollar can be changed.
>
>From: vandys@vsta.org
>To: Albert van der Horst <albert@spenarnc.xs4all.nl>
>Subject: Re: Euro's and Dollars.
>In-Reply-To: <m5tu4r.9ba@spenarnc.xs4all.nl>
>X-Newsgroups: comp.lang.forth
>
>In article <m5tu4r.9ba@spenarnc.xs4all.nl> you wrote:
>> In studying Scheme I came across the example program to count
>> in how many ways one dollar can be changed.
>
>Here's the search in Prolog, FWIW (not tested, just wanted to play with
>the idea):
>
>% A solution
>change(_, 0, _, Solve) :- debug("solve", Solve), !, fail.
>
>% No solution
>change([], _, _) :- !, fail.
>change([Coin|_], Balance, _) :-
> Coin > Balance, !, fail.
>
>% Apply current coin
>change(Coins, Balance, Solve) :-
> [Coin|_]=Coins,
> Balance2 is Balance-Coin,
> change(Coins, Balance2, [Coin|Solve]).
>
>% Step down to next coin
>change([_|Coins], Balance, Solve) :- change(Coins, Balance, Solve).
>
>Invocation for US money WRT one dollar:
>
>change([1, 5, 10, 25, 50], 100, []).
Correct me if I'm wrong, but doesn't this generate all solutions,
instead of counting them?
>
>--
>Andy Valencia
>Home page: http://www.vsta.org/andy/
>To contact me: http://www.vsta.org/contact/andy.html
--
--
Albert van der Horst, UTRECHT,THE NETHERLANDS
Economic growth -- being exponential -- ultimately falters.
albert@spe&ar&c.xs4all.nl &=n http://home.hccnet.nl/a.w.m.van.der.horst
[toc] | [prev] | [next] | [standalone]
| From | vandys@vsta.org |
|---|---|
| Date | 2012-06-19 15:51 +0000 |
| Message-ID | <a4blg7F5vfU2@mid.individual.net> |
| In reply to | #13064 |
Albert van der Horst <albert@spenarnc.xs4all.nl> wrote: > Correct me if I'm wrong, but doesn't this generate all solutions, > instead of counting them? Yes, I guess I should've just bumped a counter when I hit the solution. The way I wrote it you'd "wc -l" afterwards and get a count of the number of debug output lines. -- Andy Valencia Home page: http://www.vsta.org/andy/ To contact me: http://www.vsta.org/contact/andy.html
[toc] | [prev] | [next] | [standalone]
| From | Albert van der Horst <albert@spenarnc.xs4all.nl> |
|---|---|
| Date | 2012-06-19 15:41 +0000 |
| Message-ID | <m5vfli.1em@spenarnc.xs4all.nl> |
| In reply to | #13050 |
In article <m5tu4r.9ba@spenarnc.xs4all.nl>,
Albert van der Horst <albert@spenarnc.xs4all.nl> wrote:
>In studying Scheme I came across the example program to count
>in how many ways one dollar can be changed.
>Of much more interest is the same problem for the Euro.
>
>This can be even shorter in Forth.
>Translating the Lisp source is probably easier then debugging a
>Forth version. :-(
Elizabeth has called this insane stacktrashing, let's see.
The explanation why the lisp program worked runs several pages.
>-----------8< --------------------------------
>CREATE kind-of-coins 0 , 1 , 5 , 10 , 25 , 50 ,
>: first-denomination kind-of-coins SWAP CELLS + @ ;
>
>( amount kinds-of-coins -- count )
>: cc OVER 0= IF 2DROP 1 ELSE OVER 0< OVER 0= OR IF 2DROP 0 ELSE
> 2DUP 1- RECURSE >R >R R@ first-denomination - R> RECURSE R> +
> THEN THEN ;
( amount kinds-of-coins -- same same flag )
: zero-amount OVER 0= ;
( amount kinds-of-coins -- same same flag )
: negative-amount-or-no-coins?
OVER 0< OVER 0= OR ;
( amount kinds-of-coins -- amount lesser-kinds-of-coins )
: one-less-kind 1- ;
( amount kinds-of-coins -- new-amount kinds-of-coins )
: one-less-large-coin >R R@ first-denomination - R> ;
\ Personally prefer this over :
: one-less-large-coin DUP first-denomination NEGATE ROT + SWAP ;
( amount kinds-of-coins -- count )
: cc [ RECURSIVE ( so we can call cc from within ) ]
\ We can compose an amount of zero in exactly one way, regardless of
\ the coins available. (or is this nanny-granny comment?)
zero-amount? IF 2DROP 1 ELSE
\ We cannot realize a negative amount, or any amount using no
\ coins (except zero, but that has already been take into account.)
negative-amount-or-no-coins? IF 2DROP 0 ELSE
\ Possibility one: don't use largest denomination
2DUP one-less-kind 2>R ( a k -- a k )
\ Possibility two: do use largest denomination so at least one of it.
one-less-coin 2>R ( a k -- )
( empty stack, all arguments on return stack )
2R> cc 2R> cc +
THEN THEN ;
Disclaimer : above code for illustration purposes. It has not been
tested.
>
>( amount -- count )
>: count-change 5 cc ;
>
>100 count-change "Dollars :" TYPE . CR
>
>-----------8< --------------------------------
>
>For euro's you need:
>
>-----------8< --------------------------------
>CREATE euro-change 0 , 1 , 2 , 5 , 10 , 20 , 50 ,
>: count-change 6 cc ;
>-----------8< --------------------------------
>
>
>Dollars : 292
>
>Euro's : 4562
>
>The Euro wins. (As long as you use cents and tuppences,
> which will be over shortly.)
>
>Now for the $100 question.
>If we order the coins in descending order then :
>
>A. It gives a wrong result
>B. It runs faster
>C. It runs slower but not by an order of magnitude
>D. It runs so slow that you may loose your patience, or risk
> a stack overflow
>
>Groetjes Albert
>
P.S. the worst trashing occurred by a news reader that changed
2DUP 1- RECURSE >R >R R@ first-denomination - R> RECURSE R> +
into
2DUP 1- RECURSE>R>R R@ first-denomination - R> RECURSE R> +
--
--
Albert van der Horst, UTRECHT,THE NETHERLANDS
Economic growth -- being exponential -- ultimately falters.
albert@spe&ar&c.xs4all.nl &=n http://home.hccnet.nl/a.w.m.van.der.horst
[toc] | [prev] | [next] | [standalone]
| From | Paul Rubin <no.email@nospam.invalid> |
|---|---|
| Date | 2012-06-19 10:26 -0700 |
| Message-ID | <7xbokftdqe.fsf@ruckus.brouhaha.com> |
| In reply to | #13063 |
Albert van der Horst <albert@spenarnc.xs4all.nl> writes:
> Elizabeth has called this insane stacktrashing, let's see.
> The explanation why the lisp program worked runs several pages.
Here's a more verbose version using gforth locals.
================================================================
CREATE dollarcoins 1 , 5 , 10 , 25 , 50 ,
CREATE eurocoins 1 , 2 , 5 , 10 , 20 , 50 ,
VALUE coins
: coin-at { n } coins n cells + @ ;
: cc { amount coin-index -- n }
amount 0=
if 1
else
coin-index 0< amount 0< or
if 0
else
amount coin-index 1- recurse
amount coin-index coin-at -
coin-index recurse
+
then
then
;
: dollar ( -- ) dollarcoins TO coins 100 5 cc . ;
: euro ( -- ) eurocoins TO coins 100 6 cc . ;
[toc] | [prev] | [next] | [standalone]
| From | Paul Rubin <no.email@nospam.invalid> |
|---|---|
| Date | 2012-06-19 23:34 -0700 |
| Message-ID | <7xfw9qo5jq.fsf@ruckus.brouhaha.com> |
| In reply to | #13073 |
Paul Rubin <no.email@nospam.invalid> writes:
> : dollar ( -- ) dollarcoins TO coins 100 5 cc . ;
> : euro ( -- ) eurocoins TO coins 100 6 cc . ;
Should say
: dollar ( -- ) dollarcoins TO coins 100 4 cc . ;
: euro ( -- ) eurocoins TO coins 100 5 cc . ;
of course.
[toc] | [prev] | [next] | [standalone]
| From | Andrew Haley <andrew29@littlepinkcloud.invalid> |
|---|---|
| Date | 2012-06-19 12:41 -0500 |
| Message-ID | <ZeadnXrO7ddPJH3SnZ2dnUVZ8iudnZ2d@supernews.com> |
| In reply to | #13063 |
Albert van der Horst <albert@spenarnc.xs4all.nl> wrote: > Elizabeth has called this insane stacktrashing, let's see. > The explanation why the lisp program worked runs several pages. Interesting. Where is that example from? Andrew.
[toc] | [prev] | [next] | [standalone]
| From | Paul Rubin <no.email@nospam.invalid> |
|---|---|
| Date | 2012-06-19 11:10 -0700 |
| Message-ID | <7x4nq7tbpa.fsf@ruckus.brouhaha.com> |
| In reply to | #13074 |
Andrew Haley <andrew29@littlepinkcloud.invalid> writes: >> The explanation why the lisp program worked runs several pages. > Interesting. Where is that example from? A little web searching finds: http://mitpress.mit.edu/sicp/full-text/sicp/book/node16.html
[toc] | [prev] | [next] | [standalone]
| From | Albert van der Horst <albert@spenarnc.xs4all.nl> |
|---|---|
| Date | 2012-06-20 03:12 +0000 |
| Message-ID | <m5wble.34c@spenarnc.xs4all.nl> |
| In reply to | #13077 |
In article <7x4nq7tbpa.fsf@ruckus.brouhaha.com>,
Paul Rubin <no.email@nospam.invalid> wrote:
>Andrew Haley <andrew29@littlepinkcloud.invalid> writes:
>>> The explanation why the lisp program worked runs several pages.
>> Interesting. Where is that example from?
>
>A little web searching finds:
>
> http://mitpress.mit.edu/sicp/full-text/sicp/book/node16.html
Right
Structure and interpretation of computer programs
Abelson Sussman and Sussman
A classic course about scheme. It is quite to my liking, but
some may find it too math oriented.
The book shows its age (1990) with sentences like:
"It will take quite a while for that 292 to be computed."
(Actually more like 2 mS in Forth, I don't know yet how
to measure it in Scheme, but it is not noticeable.)
Groetjes Albert
--
--
Albert van der Horst, UTRECHT,THE NETHERLANDS
Economic growth -- being exponential -- ultimately falters.
albert@spe&ar&c.xs4all.nl &=n http://home.hccnet.nl/a.w.m.van.der.horst
[toc] | [prev] | [next] | [standalone]
| From | Paul Rubin <no.email@nospam.invalid> |
|---|---|
| Date | 2012-06-19 23:51 -0700 |
| Message-ID | <7xoboexypk.fsf@ruckus.brouhaha.com> |
| In reply to | #13091 |
Albert van der Horst <albert@spenarnc.xs4all.nl> writes:
> The book shows its age (1990) with sentences like:
> "It will take quite a while for that 292 to be computed."
>
> (Actually more like 2 mS in Forth, I don't know yet how
> to measure it in Scheme, but it is not noticeable.)
Here is a memoized python version. With the memoization turned off, the
euro calculation takes a noticable time (maybe 0.2 sec). With
memoization there's no noticable pause.
================================================================
def memoize(f, sentinel=object()):
memo = {}
def m(*args):
if args in memo:
return memo[args]
memo[args] = v = f(*args)
return v
return m
@memoize
def cc(amount, coins):
if not(coins) or amount < 0: return 0
if amount == 0: return 1
return cc(amount-coins[0],coins) + cc(amount,coins[1:])
print 'dollar',cc(100,(1,5,10,25,50))
print 'euro',cc(100,(1,2,5,10,20,50))
[toc] | [prev] | [next] | [standalone]
| From | Andrew Haley <andrew29@littlepinkcloud.invalid> |
|---|---|
| Date | 2012-06-20 03:15 -0500 |
| Message-ID | <XJCdnT-vG5oiG3zSnZ2dnUVZ8t6dnZ2d@supernews.com> |
| In reply to | #13077 |
Paul Rubin <no.email@nospam.invalid> wrote: > Andrew Haley <andrew29@littlepinkcloud.invalid> writes: >>> The explanation why the lisp program worked runs several pages. >> Interesting. Where is that example from? > > A little web searching finds: > > http://mitpress.mit.edu/sicp/full-text/sicp/book/node16.html Ah thanks, it's from SICP. I looked in the index but couldn't find it. Andrew.
[toc] | [prev] | [standalone]
Page 2 of 2 — ← Prev page 1 [2]
Back to top | Article view | comp.lang.forth
csiph-web