@@ -7,8 +7,8 @@ use std::{thread, time};
77
88use crate :: models:: * ;
99use crate :: parse:: { read_puzzle, read_task} ;
10- use crate :: puzzle:: solve_pazzle ;
11- use crate :: solve:: solve_small ;
10+ use crate :: puzzle:: solve_puzzle ;
11+ use crate :: solve:: solve_small_while ;
1212
1313#[ derive( Debug , Serialize , Deserialize ) ]
1414pub struct BlockChainInfo {
@@ -58,36 +58,89 @@ impl Client {
5858 Client { api : client }
5959 }
6060
61- pub fn solve ( & self , block : usize , puzzle : & str , task : & str ) {
62- let mut rand = thread_rng ( ) ;
63- let puzzle = read_puzzle ( puzzle) ;
64- eprintln ! ( "{:?}" , puzzle) ;
65- let task = read_task ( task) ;
66- //let commands = solve_small(task);
67-
68- let puzzle_answer = solve_pazzle ( puzzle) ;
69- println ! ( "{:?}" , puzzle_answer) ;
61+ pub fn latest_block ( & mut self ) -> Option < usize > {
62+ match self . api . getmininginfo ( ) . call ( ) {
63+ Ok ( m) => Some ( m. block ) ,
64+ Err ( e) => {
65+ eprintln ! ( "{}" , e) ;
66+ None
67+ }
68+ }
7069 }
7170
72- pub fn execute ( & mut self ) {
73- loop {
74- match self . api . getmininginfo ( ) . call ( ) {
75- Ok ( x ) => {
76- for b in 0 ..x . block {
77- let b = self . api . getblockinfo ( b ) . call ( ) . unwrap ( ) ;
78- let puzzle = read_puzzle ( & b . puzzle ) ;
79- let puzzle_answer = solve_pazzle ( puzzle ) ;
80- println ! ( "{:?} " , puzzle_answer ) ;
81- }
82- self . solve ( x . block , & x . puzzle , & x . task ) ;
83- }
84- Err ( e ) => {
85- println ! ( "{}" , e) ;
71+ pub fn submit_latest ( & mut self ) {
72+ if let Some ( block ) = self . latest_block ( ) {
73+ if self . generate_solution ( block ) {
74+ match self
75+ . api
76+ . submit (
77+ block ,
78+ & format ! ( "./mining/{}-task.sol" , block ) ,
79+ & format ! ( "./mining/{}-puzzle.desc " , block ) ,
80+ )
81+ . call ( )
82+ {
83+ Ok ( value ) => eprintln ! ( "{:?}" , value ) ,
84+ Err ( e ) => eprintln ! ( "{}" , e) ,
8685 }
8786 }
87+ }
88+ }
89+
90+ pub fn generate_solution ( & mut self , block : usize ) -> bool {
91+ let blockinfo = match self . api . getblockinfo ( block) . call ( ) {
92+ Ok ( m) => m,
93+ Err ( e) => {
94+ eprintln ! ( "{}" , e) ;
95+ return false ;
96+ }
97+ } ;
98+
99+ let puzzle = read_puzzle ( & blockinfo. puzzle ) ;
100+ let task = read_task ( & blockinfo. task ) ;
101+ let task_answer = solve_small_while ( task, std:: time:: Duration :: from_secs ( 180 ) ) ;
102+ let puzzle_answer = solve_puzzle ( puzzle) ;
103+
104+ self . dump_task_answer ( block, task_answer) ;
105+ if let Some ( puzzle_answer) = puzzle_answer {
106+ self . dump_puzzle_answer ( block, puzzle_answer) ;
107+ true
108+ } else {
109+ false
110+ }
111+ }
88112
89- let one_sec = time:: Duration :: from_secs ( 60 ) ;
90- thread:: sleep ( one_sec) ;
113+ fn dump_task_answer ( & self , block : usize , answer : Vec < Command > ) {
114+ let mut content = String :: new ( ) ;
115+ for b in answer {
116+ content. push_str ( & format ! ( "{}" , b) ) ;
117+ }
118+ match self . dump_file ( & format ! ( "./mining/{}-task.sol" , block) , & content) {
119+ Ok ( ( ) ) => { }
120+ Err ( e) => {
121+ eprintln ! ( "{}" , e) ;
122+ }
123+ }
124+ }
125+
126+ fn dump_puzzle_answer ( & self , block : usize , answer : Task ) {
127+ let content = format ! ( "{}" , answer) ;
128+ match self . dump_file ( & format ! ( "./mining/{}-puzzle.desc" , block) , & content) {
129+ Ok ( ( ) ) => { }
130+ Err ( e) => {
131+ eprintln ! ( "{}" , e) ;
132+ }
133+ }
134+ }
135+
136+ fn dump_file ( & self , path : & str , content : & str ) -> std:: io:: Result < ( ) > {
137+ std:: fs:: write ( path, content)
138+ }
139+
140+ pub fn execute ( & mut self ) {
141+ loop {
142+ self . submit_latest ( ) ;
143+ thread:: sleep ( time:: Duration :: from_secs ( 60 ) ) ;
91144 }
92145 }
93146}
0 commit comments