factor/extra/24-game/24-game.factor

75 lines
1.7 KiB
Factor
Raw Normal View History

2008-07-22 04:29:48 -04:00
! Copyright © 2008 Reginald Keith Ford II
! 24, the Factor game!
USING: accessors backtrack combinators continuations formatting fry io
kernel math prettyprint quotations random sequences shuffle ;
2008-07-22 04:43:27 -04:00
IN: 24-game
2012-06-20 02:09:56 -04:00
: nop ( -- ) ;
2012-06-20 02:09:56 -04:00
2012-06-20 20:55:11 -04:00
: ?/ ( a b -- c ) [ drop 1/0. ] [ / ] if-zero ;
2012-06-20 02:09:56 -04:00
: do-operation ( a b -- c )
2012-06-20 20:55:11 -04:00
{ + - * ?/ } amb-execute ;
2012-06-20 02:09:56 -04:00
: permute-2 ( a b -- a b )
{ nop swap } amb-execute ;
: permute-3 ( a b c -- a b c )
2008-07-22 04:29:48 -04:00
{ nop rot -rot swap spin swapd } amb-execute ;
2012-06-20 02:09:56 -04:00
2008-08-07 02:58:50 -04:00
: makes-24? ( a b c d -- ? )
2012-06-20 02:09:56 -04:00
[
permute-3 do-operation
permute-3 do-operation
permute-2 do-operation
24 =
] [ 4drop ] if-amb ;
: random-4 ( -- array )
4 [ 10 random ] replicate ;
: make-24 ( -- array )
f [ dup first4 makes-24? ] [ drop random-4 ] do until ;
2008-07-22 04:29:48 -04:00
: q ( -- obj ) "quit" ;
2012-06-20 02:09:56 -04:00
CONSTANT: (operators) { + - * / rot swap q }
: operators ( array -- operators )
length 3 < [ \ rot (operators) remove ] [ (operators) ] if ;
: find-operator ( operators string -- word/f )
'[ name>> _ = ] find nip ;
2012-06-20 02:09:56 -04:00
: get-operator ( operators -- word )
dup "Operators: %u\n" printf flush
dup readln find-operator [ ] [
"Operator not found..." print get-operator
] ?if ;
2012-06-20 02:09:56 -04:00
: try-operator ( array -- array )
[ pprint nl ]
[ dup operators get-operator 1quotation with-datastack ]
bi ;
: end-game ( array -- )
first dup 24 = [
2016-04-18 23:48:20 -04:00
drop "You WON!"
] [
"%d is not 24... You lose." sprintf
2016-04-18 23:48:20 -04:00
] if print ;
: quit-game ( array -- )
drop "you're a quitter" print ;
: play-24 ( array -- )
{
{ [ dup length 1 = ] [ end-game ] }
{ [ dup last "quit" = ] [ quit-game ] }
[ try-operator play-24 ]
} cond ;
: 24-game ( -- ) make-24 play-24 ;
2012-06-20 02:09:56 -04:00
MAIN: 24-game