@@ -9,10 +9,10 @@ use std::collections::HashSet;
9
9
use std:: thread;
10
10
use std:: sync:: mpsc:: { Sender , Receiver } ;
11
11
use std:: sync:: mpsc;
12
+ use std:: sync:: Arc ;
12
13
13
14
14
15
fn get_new_molecules ( init_molecule : & str , from : & str , to : & str ) ->Vec < String > {
15
- println ! ( "{:?}" , init_molecule) ;
16
16
let splited_molecule: Vec < & str > = init_molecule. split ( from) . collect ( ) ;
17
17
let molecule_len = splited_molecule. len ( ) ;
18
18
( 0 ..molecule_len -1 ) . map ( |i| splited_molecule. iter ( )
@@ -31,8 +31,8 @@ fn get_new_molecules(init_molecule: &str, from: &str, to: &str) -> Vec<String> {
31
31
32
32
}
33
33
34
- fn apply_all_replacements ( init_molecule : & str , replacements : Vec < ( & str , & str ) > ) ->HashSet < String > {
35
- replacements. iter ( ) . map ( |& ( from , to ) |get_new_molecules ( init_molecule, from , to ) ) . flat_map ( |molecula| molecula) . collect ( )
34
+ fn apply_all_replacements ( init_molecule : & str , replacements : & [ ( String , String ) ] ) ->HashSet < String > {
35
+ replacements. iter ( ) . map ( |repl |get_new_molecules ( init_molecule, & repl . 0 , & repl . 1 ) ) . flat_map ( |molecula| molecula) . collect ( )
36
36
}
37
37
38
38
fn main ( ) {
@@ -58,44 +58,38 @@ fn main() {
58
58
} ;
59
59
let lines: Vec < & str > = content. trim ( ) . split ( "\n " ) . collect ( ) ;
60
60
let replacements_len = lines. len ( ) -2 ;
61
- let molecule = lines[ replacements_len +1 ] ;
62
- let replacements: Vec < ( & str , & str ) > = lines. iter ( )
61
+ let molecule = lines[ replacements_len +1 ] . to_string ( ) ;
62
+ let replacements: Vec < ( String , String ) > = lines. iter ( )
63
63
. take ( replacements_len)
64
64
. map ( |& line|{
65
65
let parts: Vec < & str > = line. split ( " => " ) . collect ( ) ;
66
- ( parts[ 0 ] , parts[ 1 ] ) } )
66
+ ( parts[ 0 ] . to_string ( ) , parts[ 1 ] . to_string ( ) ) } )
67
67
. collect ( ) ;
68
68
69
- //let (tx, rx): (Sender<HashSet<String>>, Receiver<HashSet<String>>) = mpsc::channel();
69
+ let ( tx, rx) : ( Sender < HashSet < String > > , Receiver < HashSet < String > > ) = mpsc:: channel ( ) ;
70
+ let shared_repl =Arc :: new ( replacements. clone ( ) ) ;
71
+ let replacements_chunks = replacements_len / threads_count;
70
72
for idin 0 ..threads_count{
71
- //let thread_tx = tx.clone();
72
- let repl: Vec < ( & str , & str ) > = replacements. clone ( ) . iter ( ) . map ( |& x| x) . collect ( ) ; //.skip(0).take(5).collect();
73
+ let thread_tx = tx. clone ( ) ;
74
+ let repl = shared_repl. clone ( ) ;
75
+ let mol = molecule. clone ( ) ;
76
+
73
77
thread:: spawn ( move ||{
74
- let molecules =apply_all_replacements ( molecule , repl) ;
75
- // thread_tx.send(molecules).unwrap();
76
- println ! ( "thread {} finished" , 34 ) ;
78
+ let molecules =apply_all_replacements ( & mol , & repl[ .. ] ) ;
79
+ thread_tx. send ( molecules) . unwrap ( ) ;
80
+ println ! ( "thread {} finished" , id ) ;
77
81
} ) ;
78
82
}
79
- println ! ( "{:?}" , & replacements[ 1 ..threads_count] ) ;
80
- println ! ( "{:?}" , molecule) ;
81
83
82
84
let replaced_molecule =get_new_molecules ( "HOHOH" , "H" , "OO" ) ;
83
85
84
- //let handle = thread::spawn(|| {
85
- // get_new_molecules("HOHOHHHHOHHHHHHHHHHOOOOOOOOOOOHHHHHHHHHHOOOOOOOOOO", "H", "OO")
86
- //});
87
-
88
- //println!("{:?}", handle.join().unwrap());
89
- //thread::sleep(Duration::from_millis(50));
90
- //
91
- /*
92
- let mut result_molecules: HashSet<String>;
86
+ let mut result_molecules: HashSet < String > =HashSet :: new ( ) ;
93
87
for _in 0 ..threads_count{
94
- // The `recv` method picks a message from the channel
95
- // `recv` will block the current thread if there no messages available
96
- rx.recv().unwrap ();
88
+ let molecules = rx . recv ( ) . unwrap ( ) ;
89
+ //println!("{:?}", molecules);
90
+ result_molecules = result_molecules . union ( & molecules ) . cloned ( ) . collect ( ) ;
97
91
}
98
- */
99
- /* println!("{:?}", result_molecules);
100
- println!("{:?}", result_molecules.len());*/
92
+
93
+ // println!("{:?}", result_molecules);
94
+ println ! ( "{:?}" , result_molecules. len( ) ) ;
101
95
}