107 lines
3.0 KiB
Factor
107 lines
3.0 KiB
Factor
! Copyright (C) 2009 Doug Coleman.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors arrays assocs combinators
|
|
concurrency.mailboxes fry io kernel make math math.parser
|
|
math.text.english sequences threads ;
|
|
IN: benchmark.chameneos-redux
|
|
|
|
SYMBOLS: red yellow blue ;
|
|
|
|
ERROR: bad-color-pair pair ;
|
|
|
|
TUPLE: creature n color count self-count mailbox ;
|
|
|
|
TUPLE: meeting-place count mailbox ;
|
|
|
|
: <meeting-place> ( count -- meeting-place )
|
|
meeting-place new
|
|
swap >>count
|
|
<mailbox> >>mailbox ;
|
|
|
|
: <creature> ( n color -- creature )
|
|
creature new
|
|
swap >>color
|
|
swap >>n
|
|
0 >>count
|
|
0 >>self-count
|
|
<mailbox> >>mailbox ;
|
|
|
|
: make-creatures ( colors -- seq )
|
|
[ length iota ] [ ] bi [ <creature> ] 2map ;
|
|
|
|
: complement-color ( color1 color2 -- color3 )
|
|
2dup = [ drop ] [
|
|
2array {
|
|
{ { red yellow } [ blue ] }
|
|
{ { red blue } [ yellow ] }
|
|
{ { yellow red } [ blue ] }
|
|
{ { yellow blue } [ red ] }
|
|
{ { blue red } [ yellow ] }
|
|
{ { blue yellow } [ red ] }
|
|
[ bad-color-pair ]
|
|
} case
|
|
] if ;
|
|
|
|
: color-string ( color1 color2 -- string )
|
|
[
|
|
[ [ name>> ] bi@ " + " glue % " -> " % ]
|
|
[ complement-color name>> % ] 2bi
|
|
] "" make ;
|
|
|
|
: print-color-table ( -- )
|
|
{ blue red yellow } dup
|
|
'[ _ '[ color-string print ] with each ] each ;
|
|
|
|
: try-meet ( meeting-place creature -- )
|
|
over count>> 0 < [
|
|
2drop
|
|
] [
|
|
[ swap mailbox>> mailbox-put ]
|
|
[ nip mailbox>> mailbox-get drop ]
|
|
[ try-meet ] 2tri
|
|
] if ;
|
|
|
|
: creature-meeting ( seq -- )
|
|
first2 {
|
|
[ [ [ 1 + ] change-count ] bi@ 2drop ]
|
|
[ 2dup = [ [ 1 + ] change-self-count ] when 2drop ]
|
|
[ [ [ color>> ] bi@ complement-color ] [ [ (>>color) ] bi-curry@ bi ] 2bi ]
|
|
[ [ mailbox>> f swap mailbox-put ] bi@ ]
|
|
} 2cleave ;
|
|
|
|
: run-meeting-place ( meeting-place -- )
|
|
[ 1 - ] change-count
|
|
dup count>> 0 < [
|
|
mailbox>> mailbox-get-all
|
|
[ f swap mailbox>> mailbox-put ] each
|
|
] [
|
|
[ mailbox>> 2 swap '[ _ mailbox-get ] replicate creature-meeting ]
|
|
[ run-meeting-place ] bi
|
|
] if ;
|
|
|
|
: number>chameneos-string ( n -- string )
|
|
number>string string>digits [ number>text ] { } map-as " " join ;
|
|
|
|
: chameneos-redux ( n colors -- )
|
|
[ <meeting-place> ] [ make-creatures ] bi*
|
|
{
|
|
[ nip nl bl [ bl ] [ color>> name>> write ] interleave nl ]
|
|
[ [ '[ _ _ try-meet ] in-thread ] with each ]
|
|
[ drop run-meeting-place ]
|
|
|
|
[ nip [ [ count>> number>string write bl ] [ self-count>> number>text write nl ] bi ] each ]
|
|
[ nip 0 [ count>> + ] reduce bl number>chameneos-string print ]
|
|
} 2cleave ;
|
|
|
|
! 6000000 for shootout, too slow right now
|
|
|
|
: chameneos-redux-main ( -- )
|
|
print-color-table
|
|
60000 [
|
|
{ blue red yellow } chameneos-redux
|
|
] [
|
|
{ blue red yellow red yellow blue red yellow red blue } chameneos-redux
|
|
] bi ;
|
|
|
|
MAIN: chameneos-redux-main
|