Risk by email stats

What

Jump to *Stats.

Log

Copy/pasted from gamesbyemail.com's game log. The page does fetch malformated json to populate the log, but the objects are dense. The presented log seems easier to parse. The interesting bits to extract are "Attacks", "Defends", "XXX defeated", and "END OF TURN".

Extract

"Quick" perl code to extract

  use strict;
  use experimental 'switch';
  open my $fh, "<", "txt/risk_log.txt" or die "no file";
  my @players=qw/Andrew Josh Will Ben Jim/;
  my $turn=0;
  my @res=();
  my $init = {};
  my $adjust= 0;
  my %player_contries=(); # track ownership
  my @keys = qw/turn a.player d.player a.country a.n d.country d.n a.lost d.lost status/;
  while($_=<$fh>){
    # we could only set player when they change turns
    # but easier to do each new line
    my $playeridx = ($turn-$adjust)%($#players+1);
    my $player = $players[$playeridx];
    given ($_) {
     when (/Deployed.*to ([A-Z].+) \(/) {
      # initialze who owns what. misses anything never reinforced (abandoned first assingments)
      #print STDERR "on $turn: $1 was ", $player_contries{$1}||"unknown", ", now $player\n";
      $player_contries{$1}=$player; 
     } when (/([A-Z].+) \((\d+)\) attacks ([A-Z].+) \((\d+)\) /) {
      # starts like "XXX (nx) attacks YYYY (ny) "
      # rolls include losses

      # dont update if switch from "until defeted" to "with x"
      if(! %$init                      || # no init
	 $init->{"turn"}      != $turn || # different round
	 $init->{"a.country"} != $1    || # different attack
	 $init->{"d.country"} != $3       # different defend
      ){ 
        if(%$init){
	    print STDERR "gave up and attacked someone new!? @{$init}{@keys} -> $_";
	    push @res, $init;
	}
	my $adv = $player_contries{$init->{"d.country"}}||"NA";
	$init = {"turn"=>$turn,
	         "a.player"=>$player, "d.player"=>$adv,
		 "a.country"=>$1, "a.n"=> $2,
		 "d.country"=>$3, "d.n" => $4, 
		 "a.lost" => 0, "d.lost" => 0,
		 "status"=>"kept"};
        print STDERR "ERROR: already $init->{'d.country'}=> $player ($adv): @{$init}{@keys}\n" if $adv == $player;
      } else {
        print STDERR "until def to 1/2 attackes @{$init}{@keys} -> $_"
      }
     } when (/^Attacker lost (\d+)/) {
      $init->{"a.lost"}+=$1;
     } when (/^Defender lost (\d+)/) {
      $init->{"d.lost"}+=$1;
     } when (/captured/){
      # event ends with a capture.
      # if kept we dont get a new message. but log starts new event

      # if captured, update to say so (otherwise keep "kept" status)
      $init->{status} = $&;
      $player_contries{$init->{"d.country"}} = $player;
      print STDERR "changed owernship $init->{'d.country'} => $player_contries{$init->{'d.country'}}: @{$init}{@keys}\n";
      push @res, $init if %$init; 
      $init = {};
    } when(/^(\S+) defeated/) {
      # compensate for defeated person
      my $defeated=$1;
      @players = grep {!/$defeated/x} @players;
      # how many rounds have played -- remove that from the total turn count
      # so we can pretend the defeated never existed
      $adjust = $turn-$playeridx+1;
    } when(/END OF TURN/) {
      # finally turns are finished
      push @res, $init if %$init; 
      print STDERR "no ownership change: @{$init}{@keys}\n";
      $init = {};
      $turn++;
    }
  }
  }

  # add header
  my %keys = (); $keys{$_}=$_ for (@keys);
  unshift @res, \%keys;
  # make it into a table
  join "\n", map {join("\t", @{$_}{@keys})} @res;
turna.playerd.playera.countrya.nd.countryd.na.lostd.loststatus
6JoshNAVenezuela5Central America101captured
6JoshNAEastern United States9Quebec303captured
6JoshNAEastern United States6Western United States333captured
7WillNAEastern Australia11New Guinea111captured
7WillNANew Guinea3Indonesia120kept
8BenNAIrkutsk4Kamchatka130kept
9JimNAArgentina21Peru111captured
9JimNAPeru19Venezuela212captured
9JimNAVenezuela17Brazil222captured
10AndrewNAEgypt11East Africa101captured
10AndrewNAEast Africa3Congo111captured
11JoshNAOntario5Alberta440kept
12WillNAEastern Australia5Western Australia141captured
12WillNANew Guinea2Western Australia111captured
13BenNAIrkutsk4Kamchatka101captured
13BenNAAlberta4Ontario101captured
14JimNAVenezuela13Central America868captured
14JimNABrazil7North Africa121captured
15AndrewNAEgypt12North Africa101captured
15AndrewNAEgypt9Middle East101captured
16JoshNAQuebec8Ontario212captured
16JoshNAOntario3Alberta254kept
17WillNAIndonesia5Western Australia101captured
18BenNAAlberta5Ontario101captured
18BenNAOntario3Quebec101captured
19JimNACentral America6Western United States101captured
19JimNAWestern United States3Eastern United States121captured
20AndrewNAEgypt8Southern Europe343captured
20AndrewNAJapan3Mongolia101captured
21JoshNAIndia4China101captured
21JoshNAChina3Afghanistan120kept
22WillNAAfghanistan5India101captured
22WillNAIndia4China101captured
22WillNAChina3Ural121captured
23BenNAAlberta5Northwest Territory101captured
24JimNABrazil16North Africa8108captured
25AndrewNACongo15North Africa101captured
25AndrewNANorth Africa14Brazil555captured
26WillNAWestern Europe5Southern Europe101captured
26WillNAGreat Britain6Scandinavia111captured
27BenNANorthwest Territory7Alaska343captured
27BenNAAlberta9Western United States101captured
28JimNAVenezuela10Brazil101captured
28JimNABrazil9North Africa862kept
30WillNAGreat Britain16Iceland111512captured
31BenNAIceland4Scandinavia101captured
31BenNAWestern United States8Central America202captured
31BenNAWestern United States5Eastern United States101captured
32JimNABrazil8North Africa919captured
33AndrewNAMongolia5Irkutsk111captured
33AndrewNAIrkutsk3Siberia101captured
33AndrewNASiberia2Ural110kept
34WillNAGreat Britain8Iceland303captured
34WillNAUkraine3Scandinavia101captured
34WillNAIceland3Greenland101captured
35BenNAQuebec5Greenland111captured
36JimNANorth Africa8Western Europe202captured
37AndrewNASiberia4Yakutsk101captured
38WillNAIceland6Greenland434captured
38WillNAIceland3Greenland320kept
40JimNANorth Africa17Egypt101captured
40JimNANorth Africa14Western Europe313captured
40JimNANorth Africa10Congo111captured
40JimNANorth Africa8Congo130kept
41AndrewNASiberia16Ural101captured
41AndrewNAUral3Afghanistan101captured
41AndrewNAAfghanistan2Ukraine110kept
42WillNAIceland12Greenland11128captured
43BenNAGreenland14Iceland494captured
44JimNANorth Africa12Western Europe242captured
44JimNANorth Africa5Congo101captured
45AndrewNAUral4Ukraine101captured
45AndrewNAUkraine3Scandinavia120kept
46WillNAGreat Britain7Iceland101captured
46WillNAIceland6Greenland414captured
47BenNANorthwest Territory5Greenland101captured
48JimNAWestern Europe6Southern Europe101captured
48JimNASouthern Europe3Middle East120kept
49AndrewNAMiddle East4Southern Europe101captured
50WillNAIceland8Greenland4104captured
51BenNAGreenland10Iceland121captured
52JimNAVenezuela24Central America656captured
52JimNACentral America18Eastern United States333captured
52JimNAEastern United States3Western United States202captured
52JimNANorth Africa6Southern Europe220kept
53AndrewNASouthern Europe3Egypt101captured
53AndrewNAUral13Afghanistan111captured
53AndrewNAAfghanistan3China121captured
54WillNAGreat Britain9Western Europe101captured
54WillNAGreat Britain6Iceland101captured
55BenNAQuebec5Eastern United States101captured
56JimNANorth Africa9Egypt101captured
56JimNANorth Africa8Western Europe323captured
56JimNAWestern United States2Eastern United States410kept
57AndrewNASouth Africa15Congo101captured
57AndrewNASouth Africa12East Africa101captured
57AndrewNAEast Africa3Egypt101captured
57AndrewNACongo3North Africa303captured
57AndrewNASouth Africa9Madagascar616captured
58WillNANorthern Europe7Southern Europe121captured
58WillNASouthern Europe4Egypt212captured
58WillNAScandinavia3Ukraine111captured
59BenNAAlberta17Western United States101captured
59BenNAWestern United States16Central America101captured
60JimNAWestern Europe18North Africa222captured
60JimNANorth Africa13Egypt220kept
61AndrewNAEast Africa10North Africa353captured
62WillNAIceland9Greenland786captured
63BenNAKamchatka5Yakutsk101captured
64JimNAVenezuela17Central America1857captured
65AndrewNAIrkutsk5Yakutsk101captured
65AndrewNAUral9Afghanistan111captured
66WillNAIceland18Greenland686captured
67BenNAOntario15Greenland323captured
67BenNAGreenland12Iceland595captured
68JimNAWestern Europe5Southern Europe111captured
68JimNAVenezuela19Central America1573kept
69AndrewNAYakutsk11Kamchatka424captured
69AndrewNAKamchatka8Alaska414captured
69AndrewNAAlaska6Northwest Territory101captured
69AndrewNANorthwest Territory5Alberta111captured
69AndrewNAUral9China111captured
70WillNAEgypt7East Africa101captured
71BenNAOntario4Northwest Territory121captured
71BenNAOntario2Northwest Territory110kept
72JimNASouthern Europe18Ukraine454captured
72JimNASouthern Europe12Middle East202captured
72JimNAMiddle East3Egypt434captured
73AndrewNAAfghanistan6Middle East141captured
73AndrewNAChina11India111captured
73AndrewNAAlberta3Ontario101captured
73AndrewNAOntario2Quebec101captured
74WillNAEast Africa9Middle East111captured
74WillNAMiddle East5India937captured
75BenNAEastern United States4Quebec101captured
76JimNAVenezuela14Central America1246captured
76JimNAEast Africa3Congo101captured
76JimNACongo2South Africa110kept
77AndrewNAIndia8Afghanistan101captured
78WillNAMiddle East5Southern Europe111captured
79BenNAQuebec6Ontario101captured
80JimNACongo6South Africa101captured
80JimNASouth Africa5Madagascar111captured
80JimNAVenezuela14Central America922kept
81AndrewNAAfghanistan15Middle East101captured
81AndrewNAMiddle East14Egypt101captured
81AndrewNAEgypt13North Africa606captured
81AndrewNANorth Africa12Congo111captured
81AndrewNACongo10East Africa101captured
81AndrewNAEast Africa9Madagascar333captured
81AndrewNAMadagascar5South Africa121captured
82WillNASouthern Europe7Middle East111captured
82WillNAMiddle East3Egypt111captured
83BenNAOntario6Alberta101captured
83BenNAAlberta5Northwest Territory101captured
83BenNANorthwest Territory4Alaska101captured
84JimNAVenezuela14Central America831captured
84JimNANorth Africa7Egypt101captured
84JimNAEgypt3East Africa121captured
85AndrewNAIndia13Middle East202captured
86WillNAGreat Britain7Iceland111captured
86WillNAIceland5Greenland202captured
87BenNAQuebec12Greenland202captured
88JimNAUkraine4Ural101captured
88JimNAVenezuela14Central America822kept
89AndrewNAMiddle East23Southern Europe212captured
89AndrewNASouthern Europe21Northern Europe333captured
89AndrewNANorthern Europe3Ukraine141captured
90WillNAGreat Britain11Scandinavia101captured
91BenNACentral America15Venezuela1233kept
92JimNAVenezuela14Central America12912captured
93AndrewNAAfghanistan3Ukraine101captured
94WillNAScandinavia21Ukraine232captured
94WillNAScandinavia15Northern Europe111captured
95BenNAAlaska9Kamchatka101captured
95BenNAGreenland10Iceland323captured
96JimNAEgypt18East Africa111captured
96JimNAEast Africa16South Africa101captured
96JimNAEast Africa15Madagascar202captured
96JimNAEast Africa13Middle East101captured
97AndrewNASouthern Europe16Ukraine323captured
98WillNANorthern Europe8Southern Europe101captured
99BenNAEastern United States7Central America353captured
100JimNANorth Africa21Western Europe212captured
100JimNAWestern Europe14Great Britain101010captured
101AndrewNAUkraine20Northern Europe414captured
101AndrewNANorthern Europe18Scandinavia343captured
102WillNASouthern Europe9Egypt101captured
102WillNAEgypt8East Africa101captured
103BenNACentral America9Venezuela662captured
104JimNAWestern Europe3Great Britain111captured
104JimNANorth Africa11Egypt464kept
105AndrewNAScandinavia13Iceland101captured
105AndrewNAIceland12Greenland5114kept
106WillNAEast Africa19Madagascar212captured
106WillNAMadagascar14South Africa111captured
107BenNAKamchatka3Yakutsk101captured
108JimNAMiddle East3Southern Europe101captured
108JimNASouthern Europe2Egypt292captured
108JimNAEgypt3East Africa421kept
109AndrewNAMongolia10Kamchatka101captured
110WillNASouth Africa16Congo101captured
111BenNAYakutsk2Siberia111captured
112JimNAUral4Ukraine111captured
112JimNAVenezuela12Central America1244kept
113AndrewNAScandinavia13Ukraine111captured
114WillNAEast Africa17Egypt131captured
114WillNAEgypt11North Africa101captured
115BenNAIceland3Great Britain101captured
115BenNAGreat Britain2Western Europe101captured
116JimNABrazil16North Africa717captured
117AndrewNAUkraine11Ural262captured
118WillNAEgypt7Middle East101captured
119BenNAIceland6Scandinavia121captured
119BenNAGreat Britain4Northern Europe131captured
119BenNAScandinavia3Northern Europe120kept
120JimNAVenezuela21Central America15915captured
120JimNACentral America11Eastern United States130kept
121AndrewNAIndia4Middle East101captured
121AndrewNAChina3Siam2620kept
122WillNAEgypt9Southern Europe111captured
123BenNAEastern United States5Central America161captured
124JimNACentral America6Eastern United States101captured
124JimNACentral America5Western United States101captured
125AndrewNAMiddle East3Southern Europe101captured
126WillNACongo17North Africa101captured
126WillNANorth Africa15Western Europe101captured
127BenNAAlberta14Western United States101captured
127BenNAWestern United States13Eastern United States101captured
127BenNAEastern United States12Central America444captured
128JimNAVenezuela13Central America757captured
128JimNACentral America3Eastern United States120kept
129AndrewNANorthern Europe4Great Britain153captured
130WillNAWestern Europe5Great Britain111captured
131BenNAEastern United States14Central America101captured
131BenNACentral America13Venezuela525captured
131BenNAVenezuela4Peru101captured
131BenNAPeru3Argentina120kept
132JimNABrazil17Peru101captured
132JimNABrazil16Venezuela131captured
132JimNABrazil12North Africa17717captured
133AndrewNASiberia4Yakutsk111captured
134WillNACongo7North Africa101captured
135BenNACentral America15Venezuela111captured
135BenNAVenezuela13Peru101captured
135BenNAPeru12Argentina111captured
135BenNAArgentina10Brazil414captured
136BenNASouthern Europe4Western Europe140kept
137AndrewNANorth Africa18Brazil10410captured
137AndrewNABrazil12Argentina101captured
137AndrewNAArgentina11Peru101captured
137AndrewNAPeru10Venezuela101captured
137AndrewNAVenezuela9Central America141captured
138WillNAEastern United States18Central America333captured
138WillNACentral America14Venezuela222captured
138WillNAVenezuela11Peru101captured
138WillNAPeru10Argentina101captured
138WillNAArgentina9Brazil101captured
138WillNAIceland10Great Britain555captured
138WillNAGreat Britain4Western Europe101captured
138WillNABrazil8North Africa343captured
139BenNAUkraine6Scandinavia111captured
140AndrewNAEgypt11North Africa111captured
140AndrewNANorth Africa9Brazil560kept
141WillNAAlaska11Kamchatka101captured
142BenNAScandinavia7Iceland202captured
142BenNAIceland6Great Britain232captured
143AndrewNANorth Africa17Brazil101010captured
143AndrewNABrazil6Venezuela101captured
143AndrewNAVenezuela3Central America120kept
144WillNACentral America10Venezuela212captured
144WillNAVenezuela8Brazil212captured
144WillNAWestern Europe2North Africa101captured
145BenNAGreat Britain4Western Europe143captured
146AndrewNAEast Africa12North Africa101captured
146AndrewNANorth Africa11Brazil616captured
146AndrewNABrazil9Venezuela101captured
146AndrewNAVenezuela8Central America101captured
147WillNAGreenland8Iceland121captured
147WillNAEastern United States4Central America431kept
148BenNAMiddle East4East Africa101captured
148BenNAEast Africa3North Africa101captured
148BenNANorth Africa2Congo110kept
149AndrewNABrazil7Argentina111captured
149AndrewNAArgentina3Peru101captured
150WillNAEastern United States14Central America545captured
151BenNANorth Africa7Congo101captured
151BenNACongo6South Africa232captured
151BenNASouth Africa2Madagascar110kept
152AndrewNAEgypt4North Africa111captured
153WillNAWestern Europe9North Africa212captured
153WillNANorth Africa7Brazil212captured
153WillNABrazil5Argentina101captured
153WillNAArgentina4Peru202captured
154BenNAEast Africa5Egypt101captured
154BenNAEgypt3North Africa111captured
154BenNAEast Africa2Madagascar110kept
155AndrewNAVenezuela21Peru313captured
155AndrewNAPeru19Argentina101captured
155AndrewNAArgentina18Brazil101captured
156WillNACentral America17Venezuela14814captured
157BenNAEast Africa3Madagascar111captured
157BenNAGreat Britain6Western Europe101captured
158AndrewNASiam48India323captured
158AndrewNAIndia45Afghanistan131captured
158AndrewNAAfghanistan41Ukraine101captured
158AndrewNAUkraine40Scandinavia3123captured
158AndrewNAScandinavia27Iceland111captured
158AndrewNAIceland25Greenland515captured
158AndrewNAGreenland23Northwest Territory111captured
158AndrewNANorthwest Territory21Alaska828captured
158AndrewNAAlaska18Alberta101captured
158AndrewNAAlberta17Ontario101captured
158AndrewNAOntario16Quebec121captured
158AndrewNAQuebec13Eastern United States101captured
158AndrewNAEastern United States12Western United States101captured
158AndrewNAWestern United States11Central America111captured
158AndrewNABrazil4Venezuela848captured
159AndrewNAMiddle East11India111captured
159AndrewNAIndia9Siam101captured
159AndrewNASiam8Indonesia414captured
159AndrewNAIndonesia6New Guinea111captured
159AndrewNANew Guinea4Eastern Australia101captured
159AndrewNAEastern Australia3Western Australia101captured
159AndrewNAChina45Afghanistan131captured
159AndrewNAAfghanistan41Ukraine101captured
159AndrewNAUkraine40Scandinavia131captured
159AndrewNAScandinavia36Iceland101captured
159AndrewNAIceland35Greenland101captured
159AndrewNAGreenland34Northwest Territory111captured
159AndrewNANorthwest Territory32Alaska101captured
159AndrewNAAlaska31Alberta101captured
159AndrewNAAlberta30Ontario101captured
159AndrewNAOntario29Quebec101captured
159AndrewNAQuebec28Eastern United States101captured
159AndrewNAEastern United States27Western United States101captured
159AndrewNAWestern United States26Central America353captured
159AndrewNACentral America20Venezuela111captured
159AndrewNAVenezuela18Brazil525captured
159AndrewNABrazil15Peru101captured
159AndrewNAPeru14Argentina101captured

Stats

using attack information parsed from the logs. We can compute attacking stats.

N.B. The defending player is not currently tracked. Statitics are only for aggression.

  library(dplyr)
  top_attack <-
    d %>%
    group_by(a.player, d.player) %>% tally() %>%
    group_by(a.player) %>% mutate(r=rank(n)) %>%
    filter(r<2) %>% summarize(most.attacked=paste(d.player,collapse=","))

   x <-
    d %>% 
    group_by(a.player) %>%
    summarise(attacks=n(),
    	    losses=sum(a.lost),
    	    kills=sum(d.lost),
    	    win.ratio=length(which(status=='captured'))/n(),
    	    avg.attack.disparity=mean(a.n - d.n)) %>%
    mutate_at(.funs=function(x) round(x,2), vars(win.ratio, avg.attack.disparity)) %>%
    #inner_join(top_attack) %>%
    arrange(attacks)
a.playerattackslosseskillswin.ratioavg.attack.disparity
Josh815140.623.25
Ben6994960.875.23
Jim701691950.796.69
Will721281500.966.32
Andrew1221602170.9411.61

Colophon/Appendix

  • Perl::Critic + flycheck were helpful in debuging perl code.
  • perldb: perl -d -e 0 was useful, but without tangling to a file, less than idea.
  • must explicity name #+Name: results-codeblock above generated #+RESULTS: codeblock for next org-babel block to read in

..