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

72 lines
1.6 KiB
Factor
Raw Normal View History

2008-07-22 04:29:48 -04:00
! Copyright © 2008 Reginald Keith Ford II
! 24, the Factor game!
2012-06-20 02:09:56 -04:00
USING: accessors backtrack continuations io kernel math
math.parser prettyprint quotations random sequences shuffle ;
2008-07-22 04:29:48 -04:00
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
: do-operation ( a b -- c )
{ + - * } amb-execute ;
: 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 ( string operators -- word/f )
[ name>> = ] with find nip ;
: get-operator ( operators -- word )
2012-06-20 02:11:10 -04:00
"Operators: " write dup pprint nl flush
2012-06-20 02:09:56 -04:00
readln over find-operator dup
[ "Command not found..." print get-operator ] unless nip ;
: try-operator ( array -- array )
[ pprint nl ]
[ dup operators get-operator 1quotation with-datastack ]
bi ;
: end-game ( array -- )
dup { 24 } =
[ drop "You WON!" ]
[ first number>string " is not 24... You lose." append ]
2008-08-07 02:58:50 -04:00
if print ;
2012-06-20 02:09:56 -04:00
: (24-game) ( array -- )
dup length 1 =
[ end-game ] [
dup last "quit" =
[ drop "you're a quitter" print ]
[ try-operator (24-game) ]
if
] if ;
: 24-game ( -- ) make-24 (24-game) ;
MAIN: 24-game