Some nice presentation
This commit is contained in:
		
							parent
							
								
									2a164d5e72
								
							
						
					
					
						commit
						881bece87b
					
				
							
								
								
									
										102
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								src/lib.rs
									
									
									
									
									
								
							| @ -7,7 +7,7 @@ use std::io::Read; | ||||
| 
 | ||||
| #[derive(Serialize, Deserialize)] | ||||
| /// The data contained from the json file generated by python.
 | ||||
| pub struct Data { | ||||
| pub struct JsonData { | ||||
|     /// The names of the IAs.
 | ||||
|     pub ias: Vec<String>, | ||||
| 
 | ||||
| @ -15,9 +15,9 @@ pub struct Data { | ||||
|     pub battles: HashMap<String, f64>, | ||||
| } | ||||
| 
 | ||||
| impl Data { | ||||
| impl JsonData { | ||||
|     /// Creates some test data.
 | ||||
|     pub fn test() -> Data { | ||||
|     pub fn test() -> JsonData { | ||||
| 
 | ||||
|         // Open the file
 | ||||
|         let mut file = File::open("./assets/test.json") | ||||
| @ -30,15 +30,95 @@ impl Data { | ||||
|         serde_json::from_str(&content) | ||||
|             .expect("Couldn't parse json") | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|     /// Returns the result for a certain battle.
 | ||||
|     pub fn get(&self, ia1: &str, ia2: &str) -> Option<f64> { | ||||
|         if let Some(value) = self.battles.get(&format!("{}/{}", ia1, ia2)) { | ||||
|             Some(*value) | ||||
|         } else if let Some(value) = self.battles.get(&format!("{}/{}", ia2, ia1)) { | ||||
|             Some(1.0 - *value) | ||||
|         } else { | ||||
|             None | ||||
| #[derive(Serialize, Deserialize, Clone)] | ||||
| /// An IA.
 | ||||
| pub struct Ia { | ||||
|     /// The name of the ia.
 | ||||
|     pub name: String, | ||||
| 
 | ||||
|     /// The number of battles won by the ia.
 | ||||
|     pub victory_count: usize, | ||||
| 
 | ||||
|     /// The number of battles lost by the ia.
 | ||||
|     pub defeat_count: usize, | ||||
| } | ||||
| 
 | ||||
| #[derive(Serialize, Deserialize)] | ||||
| pub struct Data { | ||||
|     /// The IAs
 | ||||
|     pub ias: Vec<Ia>, | ||||
| 
 | ||||
|     /// The battles.
 | ||||
|     ///
 | ||||
|     /// This hashmap is symmetric.
 | ||||
|     pub battles: HashMap<String, f64>, | ||||
| 
 | ||||
|     /// The ias sorted by victory count.
 | ||||
|     pub sorted_ias: Vec<Ia>, | ||||
| } | ||||
| 
 | ||||
| impl Data { | ||||
|     /// Creates some test data.
 | ||||
|     pub fn test() -> Data { | ||||
|         JsonData::test().into() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<JsonData> for Data { | ||||
|     fn from(d: JsonData) -> Data { | ||||
|         let mut ias = vec![]; | ||||
| 
 | ||||
|         for ia in d.ias { | ||||
|             ias.push(Ia { | ||||
|                 name: ia, | ||||
|                 victory_count: 0, | ||||
|                 defeat_count: 0, | ||||
|             }) | ||||
|         } | ||||
| 
 | ||||
|         let mut battles = HashMap::new(); | ||||
| 
 | ||||
|         for (key, val) in d.battles { | ||||
| 
 | ||||
|             let playing_ias = key.split("/") | ||||
|                 .collect::<Vec<_>>(); | ||||
| 
 | ||||
|             let key1 = format!("{}/{}", playing_ias[0], playing_ias[1]); | ||||
|             let key2 = format!("{}/{}", playing_ias[1], playing_ias[0]); | ||||
| 
 | ||||
|             battles.insert(key1, val); | ||||
|             battles.insert(key2, val); | ||||
| 
 | ||||
|             if val != 0.5 { | ||||
|                 let (winner, loser) = if val > 0.5 { | ||||
|                     (playing_ias[0], playing_ias[1]) | ||||
|                 } else { | ||||
|                     (playing_ias[1], playing_ias[0]) | ||||
|                 }; | ||||
| 
 | ||||
|                 for ia in &mut ias { | ||||
|                     if ia.name == winner { | ||||
|                         ia.victory_count += 1; | ||||
|                     } | ||||
| 
 | ||||
|                     if ia.name == loser { | ||||
|                         ia.defeat_count += 1; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let mut sorted_ias = ias.clone(); | ||||
|         sorted_ias.sort_by_key(|ia| { | ||||
|             (std::usize::MAX - ia.victory_count, ia.defeat_count) | ||||
|         }); | ||||
| 
 | ||||
|         Data { | ||||
|             ias, | ||||
|             sorted_ias, | ||||
|             battles, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -29,7 +29,7 @@ | ||||
|                 </div> | ||||
|             </div> | ||||
|         </nav> | ||||
|         {% block content %}{% endblock content %} | ||||
|         {% block content %}{% endblock %} | ||||
|         <script> | ||||
|             document.addEventListener('DOMContentLoaded', () => { | ||||
|               const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0); | ||||
| @ -45,5 +45,6 @@ | ||||
|               } | ||||
|             }); | ||||
|         </script> | ||||
|         {% block extrajs %}{% endblock %} | ||||
|     </body> | ||||
| </html> | ||||
|  | ||||
| @ -2,10 +2,55 @@ | ||||
| {% block content %} | ||||
| <section class="section"> | ||||
|     <div class="container"> | ||||
|         <h1 class="title is-1">Welcome to Pytron</h1> | ||||
|         {% for ia in ias %} | ||||
|             <h5>{{ ia }}</h5> | ||||
|         {% endfor %} | ||||
|         <div class="columns is-centered"> | ||||
|             <div class="column is-narrow is-desktop"> | ||||
|                 <table class="table is-bordered is-striped is-narrow is-hoverable"> | ||||
|                     <tr> | ||||
|                         <th></th> | ||||
|                         {% for ia in ias %} | ||||
|                             <th class="has-text-centered">{{ ia.name }}</th> | ||||
|                         {% endfor %} | ||||
|                         <th class="has-text-success has-text-centered">✓</th> | ||||
|                         <th class="has-text-danger has-text-centered">✗</th> | ||||
|                     </tr> | ||||
| 
 | ||||
|                     {% for ia1 in ias %} | ||||
|                         <tr> | ||||
|                             <th class="has-text-centered">{{ ia1.name }}</th> | ||||
|                             {% for ia2 in ias %} | ||||
|                                 {% if ia1.name == ia2.name %} | ||||
|                                     <td></td> | ||||
|                                 {% else %} | ||||
|                                     {% set key = ia1.name ~ "/" ~ ia2.name %} | ||||
|                                     {% set value = battles | get(key=key) %} | ||||
|                                     {% if value > 0.5 %} | ||||
|                                         <td class="has-text-success">{{ value }}</td> | ||||
|                                     {% elif value < 0.5 %} | ||||
|                                         <td class="has-text-danger">{{ value }}</td> | ||||
|                                     {% else %} | ||||
|                                         <td>{{ value }}</td> | ||||
|                                     {% endif %} | ||||
|                                     {% endif %} | ||||
|                             {% endfor %} | ||||
|                             <td class="has-text-centered"><strong>{{ ia1.victory_count }}</strong></td> | ||||
|                             <td class="has-text-centered"><strong>{{ ia1.defeat_count }}</strong></td> | ||||
|                         </tr> | ||||
|                     {% endfor %} | ||||
|                 </table> | ||||
|              </div> | ||||
|             <div class="column is-narrow"> | ||||
|                 <table class="table is-bordered is-striped is-narrow is-hoverable"> | ||||
|                     <tr><th class="has-text-centered">AI</th><th>Score</th></tr> | ||||
|                     {% for ia in sorted_ias %} | ||||
|                         <tr> | ||||
|                             <td class="has-text-centered"><strong>{{ ia.name }}</strong></td> | ||||
|                             <td class="has-text-centered">{{ ia.victory_count - ia.defeat_count }}</td> | ||||
|                         </tr> | ||||
|                     {% endfor %} | ||||
|                 </table> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </section> | ||||
| {% endblock %} | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user