Gironzolando per il sito di SC2Ranks ho trovato una simpatica feature, le custom divisions.
Con un po' di buona volontà ho preso la lista degli utenti registrati nel topic toppato ed ho creato una custom division per tgm.
Ecco il link:
TGM Ladder
Gironzolando per il sito di SC2Ranks ho trovato una simpatica feature, le custom divisions.
Con un po' di buona volontà ho preso la lista degli utenti registrati nel topic toppato ed ho creato una custom division per tgm.
Ecco il link:
TGM Ladder
Simpatica la ladder interna bel lavoro krallo!
Io non ci sono
6° su 30, non male
Bel lavoro kral
ecco uno script C# per .NET 3.5 che si può eseguire semplicemente su LinqPad
Codice:string url = @"http://sc2ranks.com/api/clist/1347/all/all/1/0.xml?appKey=clansdn.org"; XDocument document = XDocument.Load(url); var records = from record in document.Root.Elements() let member = record.Element("members").Element("member") select new { Losses = int.Parse(record.Element("losses").Value), Division = record.Element("division").Value, Ratio = double.Parse(record.Element("ratio").Value, System.Globalization.CultureInfo.InvariantCulture.NumberFormat), Points = int.Parse(record.Element("points").Value), Wins = int.Parse(record.Element("wins").Value), Player = new { Name = member.Element("name").Value, FavoriteRace = member.Element("fav-race").Value, CharacterCode = int.Parse(member.Element("character-code").Value), BattleNetID = int.Parse(member.Element("bnet-id").Value) } }; var ladder = from record in records orderby record.Points descending select new { Player = record.Player.Name, Points = record.Points, Wins = record.Wins, Losses = record.Losses, Ratio = record.Ratio }; ladder.Dump();Spoiler:
un saluto a tutti gli javisti e p(c)accapi-isti
Bellino il linq
Rilancio con la versione PHP che tiene anche conto della lega nell'ordinamento
Codice:$url = 'http://sc2ranks.com/api/clist/1347/all/all/1/0.xml?appKey=clansdn.org'; $xml = simplexml_load_file($url); $players = array(); foreach ( $xml->record as $division ) { $players[] = array( 'player' => (string)$division->members->member->name, 'league' => (string)$division->league, 'points' => (int)$division->points, 'wins' => (int)$division->wins, 'losses' => (int)$division->losses, 'ratio' => (float)$division->ratio, ); } usort($players, 'ladder_sort'); print_r($players); function ladder_sort($a, $b) { $leagues = array( 'bronze' => 0, 'silver' => 1, 'gold' => 2, 'platinum' => 3, 'diamond' => 4, ); if ( $leagues[$a['league']] == $leagues[$b['league']] ) { if ( $a['points'] == $b['points'] ) return 0; return $a['points'] > $b['points'] ? -1 : 1; } return $leagues[$a['league']] > $leagues[$b['league']] ? -1 : 1; }
lo faccio in meno!Rilancio con la versione PHP che tiene anche conto della lega nell'ordinamento
Codice:$url = 'http://sc2ranks.com/api/clist/1347/all/all/1/0.xml?appKey=clansdn.org'; $xml = simplexml_load_file($url); $players = array(); foreach ( $xml->record as $division ) { $players[] = array( 'player' => (string)$division->members->member->name, 'league' => (string)$division->league, 'points' => (int)$division->points, 'wins' => (int)$division->wins, 'losses' => (int)$division->losses, 'ratio' => (float)$division->ratio, ); } usort($players, 'ladder_sort'); print_r($players); function ladder_sort($a, $b) { $leagues = array( 'bronze' => 0, 'silver' => 1, 'gold' => 2, 'platinum' => 3, 'diamond' => 4, ); if ( $leagues[$a['league']] == $leagues[$b['league']] ) { if ( $a['points'] == $b['points'] ) return 0; return $a['points'] > $b['points'] ? -1 : 1; } return $leagues[$a['league']] > $leagues[$b['league']] ? -1 : 1; }
Codice:string url = @"http://sc2ranks.com/api/clist/1347/all/all/1/0.xml?appKey=clansdn.org"; XDocument document = XDocument.Load(url); Dictionary<string, int> leagues = new Dictionary<string,int> { {"bronze", 1}, {"silver", 2}, {"gold", 3}, {"platinum", 4}, {"diamond", 5} }; var records = from record in document.Root.Elements() let member = record.Element("members").Element("member") select new { Losses = int.Parse(record.Element("losses").Value), Division = record.Element("division").Value, Ratio = double.Parse(record.Element("ratio").Value, System.Globalization.CultureInfo.InvariantCulture.NumberFormat), Points = int.Parse(record.Element("points").Value), Wins = int.Parse(record.Element("wins").Value), League = leagues[record.Element("league").Value], Player = new { Name = member.Element("name").Value, FavoriteRace = member.Element("fav-race").Value, CharacterCode = int.Parse(member.Element("character-code").Value), BattleNetID = int.Parse(member.Element("bnet-id").Value) } }; var ladder = from record in records orderby record.League descending, record.Points descending select new { Player = record.Player.Name, Points = record.Points, Wins = record.Wins, Losses = record.Losses, Ratio = record.Ratio, League = record.League }; ladder.Dump();
Comunque suggerirei JSON (8.5kb) invece che XML (22kb).
Per Json devo sbattermi a scrivere le classi e passare il tutto al deserializzatore. Altrimenti, se volessi qualcosa tipo Linq to Xml per Json dovrei rivolgermi a questo progetto OS.Rilancio con la versione PHP che tiene anche conto della lega nell'ordinamento
Codice:$url = 'http://sc2ranks.com/api/clist/1347/all/all/1/0.xml?appKey=clansdn.org'; $xml = simplexml_load_file($url); $players = array(); foreach ( $xml->record as $division ) { $players[] = array( 'player' => (string)$division->members->member->name, 'league' => (string)$division->league, 'points' => (int)$division->points, 'wins' => (int)$division->wins, 'losses' => (int)$division->losses, 'ratio' => (float)$division->ratio, ); } usort($players, 'ladder_sort'); print_r($players); function ladder_sort($a, $b) { $leagues = array( 'bronze' => 0, 'silver' => 1, 'gold' => 2, 'platinum' => 3, 'diamond' => 4, ); if ( $leagues[$a['league']] == $leagues[$b['league']] ) { if ( $a['points'] == $b['points'] ) return 0; return $a['points'] > $b['points'] ? -1 : 1; } return $leagues[$a['league']] > $leagues[$b['league']] ? -1 : 1; }
Ad ogni modo, in genere preferisco lavorare: se i dati vengono importati sul server, preferisco usare xml. se è una richiesta dal client, meglio json.
Un po' per i tool, un po' perchè xml è migliore nella comunicazione B2B (business-to-business) per via degli schema e dei namespace che permettono di avere un po' di gioco con i problemi di versioning.
Sisi mi riferivo al caso in questione non in genere, e credevo che linq supportasse nativamente json, quindi bon (stiamo esagerando )
linq supporta tutto e niente. nel senso che di base linq non è che un set di operazioni costruite intorno ad un'interfaccia ( IEnumerable<T> ). Tutto ciò che implementa questa interfaccia è buona da mandare in pasto a Linq.
Ma nel frattempo non abbiamo ancora nulla. Ed in questo viene in aiuto un'altra interfaccia ( IQueryable<T> ) che, per dirla in breve, permette di trasformare una query linq in qualcosa di totalmetne diverso (ad es. LinqToSql e LinqToEntities trasformano una query linq in una query sql).
Spoiler:
cmq ecco qui la versione json
ho aggiunto anche delle enum, altrimenti il codice è di difficile lettura
come vedi ho dovuto creare delle classi che mi permettessero di istruire il serializzatore sul come leggere la stringa json. Laborioso ma efficace e type-safe... quelle cose che noi architetti amiamo insomma =)
Codice:void Main() { string url = @"http://sc2ranks.com/api/clist/1347/all/all/1/0.json?appKey=clansdn.org"; WebClient wc = new WebClient(); byte[] json = wc.DownloadData(url); DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Record[])); MemoryStream ms = new MemoryStream(json); var records = (Record[])serializer.ReadObject(ms); var ladder = from record in records orderby record.League descending, record.Points descending select record; ladder.Dump(); } // Define other methods and classes here [DataContract(Name = "record")] public class Record { [DataMember(Name = "losses")] public int Losses { get; set; } [DataMember(Name = "is_random")] public bool IsRandom { get; set; } [DataMember(Name = "division")] public string Division { get; set; } [DataMember(Name = "ratio")] public double Ratio { get; set; } [DataMember(Name = "division_id")] public int DivisionID { get; set; } [DataMember(Name = "bracket")] public int Bracket { get; set; } [DataMember(Name = "league")] protected string LeagueRaw { get; set; } [DataMember(Name = "points")] public int Points { get; set; } [DataMember(Name = "division_rank")] public int DivisionRank { get; set; } [DataMember(Name = "wins")] public int Wins { get; set; } [DataMember(Name = "members")] public Member[] Members { get; set; } public League League { get { return (League)leagues[LeagueRaw]; } } static Dictionary<string, League> leagues = new Dictionary<string, League> { {"bronze", League.Bronze }, {"silver", League.Silver }, {"gold", League.Gold }, {"platinum", League.Platinum }, {"diamond", League.Diamond } }; } [DataContract(Name = "member")] public class Member { [DataMember(Name = "fav_race")] protected string FavoriteRaceRaw { get; set; } public Race FavoriteRace { get { return races[FavoriteRaceRaw]; } } [DataMember(Name = "region")] protected string RegionRaw { get; set; } public Region Region { get { return regions[RegionRaw]; } } [DataMember(Name = "character_code")] public int CharacterCode { get; set; } [DataMember(Name = "name")] public string Name { get; set; } [DataMember(Name = "bnet_id")] public int BattleNetID { get; set; } static Dictionary<string, Region> regions = new Dictionary<string, Region> { {"eu", Region.EU } }; static Dictionary<string, Race> races = new Dictionary<string, Race> { { "protoss", Race.Protoss }, { "terran" , Race.Terran }, { "zerg", Race.Zerg }, { "random", Race.Random } }; } [DataContract] public enum League : short { [EnumMember(Value = "bronze")] Bronze = 1, [EnumMember(Value = "silver")] Silver = 2, [EnumMember(Value = "gold")] Gold = 3, [EnumMember(Value = "platinum")] Platinum = 4, [EnumMember(Value = "diamond")] Diamond = 5 } [DataContract(Name = "race")] public enum Race : short { [EnumMember(Value = "terran")] Terran = 1, [EnumMember(Value = "protoss")] Protoss = 2, [EnumMember(Value = "zerg")] Zerg = 3, [EnumMember(Value = "random")] Random = 0 } [DataContract(Name = "region")] public enum Region : short { [EnumMember(Value = "eu")] EU = 1 }
osignore fermatevi
cmq bravo renato, carina come idea
Voi programmatori siete gente strana.
Per fortuna ho fatto il sistemist... oh wait
ma complimenti al darth che sfiora i 1500 e sopratutto mantiene un ottimo 60% winrate in piena mid diamond complimenti.
già già il 60 è una % della madonna
Io per tenere il 50 scarso in platinum sto davvero faticando
io non sto capendo il sistema, fa fare 5 partite vs platinum / low diamond poi mi sbatte 5 volte contro gente a 1700 e poi torna ai platinum etc etc, continuo a vincere 6 perdere 4 vincere 6 perdere 4
poi odio i cheese, ci perdo un sacco di partite e mi incazzo.
bellissima