2015-10-22 09:43:54 -04:00
filePrefix = ' https://s3.amazonaws.com/ace-of-coders-simulation-results/ '
files = [
' 1445213331501451880.json '
' 1445213333962624756.json '
' 1445213336952262072.json '
' 1445213340108350108.json '
' 1445213343518140279.json '
' 1445213347272483737.json '
' 1445213351108262273.json '
' 1445213354532639917.json '
' 1445213357911513320.json '
' 1445213361197631052.json '
' 1445213364294940845.json '
' 1445213368224989716.json '
' 1445213372340479451.json '
' 1445213375994169440.json '
' 1445213379655103566.json '
' 1445213383878314932.json '
' 1445213387576330718.json '
' 1445213391319951764.json '
' 1445213395297284000.json '
' 1445213398793484459.json '
' 1445213403418993676.json '
' 1445213407644707083.json '
' 1445213410735647885.json '
' 1445213414261150207.json '
' 1445213417601033684.json '
' 1445213421225330915.json '
' 1445213425505538665.json '
' 1445213429189103401.json '
' 1445213433364370512.json '
' 1445213436961513794.json '
' 1445213439998252285.json '
' 1445213445045520520.json '
' 1445213449514608844.json '
' 1445213453116282525.json '
' 1445213457095637020.json '
' 1445213460704753277.json '
' 1445213464286547013.json '
' 1445213468520080180.json '
' 1445213472106072387.json '
' 1445213475820365779.json '
' 1445213480580483030.json '
' 1445213483578157536.json '
' 1445213487510887752.json '
' 1445213491558872807.json '
' 1445213499351461770.json '
' 1445213502056807146.json '
' 1445213505127336236.json '
' 1445213508557502702.json '
' 1445213511896396212.json '
' 1445213515853887904.json '
' 1445213519294758676.json '
' 1445213523374005620.json '
' 1445213527496735584.json '
' 1445213531143063123.json '
' 1445213535511651949.json '
' 1445213539690176930.json '
' 1445213543065367025.json '
' 1445213546810986010.json '
' 1445213550501273173.json '
' 1445213554189924874.json '
' 1445213565085119935.json '
' 1445213568793830161.json '
' 1445213572104047422.json '
' 1445213577145506271.json '
' 1445213581528093563.json '
' 1445213584895451031.json '
' 1445213588650931726.json '
' 1445213592177781823.json '
' 1445213594397225133.json '
' 1445221277361358834.json '
' 1445221279698497496.json '
' 1445221282315153388.json '
' 1445221285394137604.json '
' 1445221288550371312.json '
' 1445221291830712255.json '
' 1445221295617755173.json '
' 1445221299055851329.json '
' 1445221302667030249.json '
' 1445221306924823599.json '
' 1445221310544601607.json '
' 1445221314153960734.json '
' 1445221317487106931.json '
' 1445221320530978932.json '
' 1445221324301371325.json '
' 1445221327649700997.json '
' 1445221331374603621.json '
' 1445221335264382014.json '
' 1445221338855628920.json '
' 1445221342321774765.json '
' 1445221346170926762.json '
' 1445221349294564500.json '
' 1445221352675532474.json '
' 1445221356123574608.json '
' 1445221359799314313.json '
' 1445221363414713316.json '
' 1445221367642102253.json '
' 1445221371845170779.json '
' 1445221375641841704.json '
' 1445221379533766000.json '
' 1445221383130035077.json '
' 1445221386448295330.json '
' 1445221390256020947.json '
' 1445221393909487800.json '
' 1445221397412673003.json '
' 1445221401217854685.json '
' 1445221404679522730.json '
' 1445221408191448392.json '
' 1445221411888158269.json '
' 1445221415264332233.json '
' 1445221419271950364.json '
' 1445221423107421701.json '
' 1445221454202101214.json '
' 1445221474185597968.json '
' 1445230073430754517.json '
' 1445230075829988193.json '
' 1445230078380093476.json '
' 1445230080916882830.json '
' 1445230084070294552.json '
' 1445230087655859195.json '
' 1445230091230254125.json '
' 1445230094958575254.json '
' 1445230102042734819.json '
' 1445230105583567102.json '
' 1445230110098843063.json '
' 1445230113969801967.json '
' 1445230117841812597.json '
' 1445230122016639650.json '
' 1445230126024689010.json '
' 1445230129401404124.json '
' 1445230132995295000.json '
' 1445230136363195000.json '
' 1445230139829326559.json '
' 1445230143133819179.json '
' 1445230146494641982.json '
' 1445230149891696294.json '
' 1445230153496417929.json '
' 1445230157420298551.json '
' 1445230161146744249.json '
' 1445230164540033734.json '
' 1445230168998013060.json '
' 1445230172276532046.json '
' 1445230175968137164.json '
' 1445230179403344385.json '
' 1445230182841026516.json '
' 1445230186681159479.json '
' 1445230190432845401.json '
' 1445230194900203984.json '
' 1445230198345037383.json '
' 1445230202459027705.json '
' 1445230205900628657.json '
' 1445230209224723942.json '
' 1445230213367015311.json '
' 1445230220444856604.json '
' 1445230223646143199.json '
' 1445230227051947244.json '
' 1445230230605632712.json '
' 1445230234132435840.json '
' 1445230237966858392.json '
' 1445230241997606689.json '
' 1445230245378549461.json '
' 1445230248791558064.json '
' 1445230252242695234.json '
' 1445230255924413167.json '
' 1445230259930682818.json '
' 1445230263564875800.json '
' 1445230267601339066.json '
' 1445230271397215053.json '
' 1445230275230599755.json '
' 1445230278557392386.json '
' 1445230282300585592.json '
' 1445230285806493395.json '
' 1445230289296758798.json '
' 1445230292932839638.json '
' 1445230296834477367.json '
' 1445230300429749446.json '
' 1445230304505276137.json '
' 1445230307932189005.json '
' 1445230311810878110.json '
' 1445230315521992848.json '
' 1445230318874365773.json '
' 1445230322501494654.json '
' 1445230326357408114.json '
' 1445230330375479959.json '
' 1445230334162974388.json '
' 1445230337876792548.json '
' 1445230341199978481.json '
' 1445230344790949698.json '
' 1445230348202193367.json '
' 1445230351464998190.json '
' 1445230355501490291.json '
' 1445230359281495971.json '
' 1445230363228852324.json '
' 1445230366952366378.json '
' 1445230370639190487.json '
' 1445230374325745381.json '
' 1445230377345716000.json '
' 1445230380547954192.json '
' 1445230384009635808.json '
' 1445230387619920999.json '
' 1445230391249215619.json '
' 1445230395050707005.json '
' 1445230398729998271.json '
' 1445230402574142636.json '
' 1445230406134099482.json '
' 1445230409763088472.json '
' 1445230413980744826.json '
' 1445230427755574837.json '
' 1445230430530442943.json '
' 1445230433698560888.json '
' 1445230437098330832.json '
' 1445230440508211654.json '
' 1445230444603413823.json '
' 1445230448464331046.json '
' 1445230451905017875.json '
' 1445230455330580775.json '
' 1445230459159341642.json '
' 1445230463274827425.json '
' 1445230467631616726.json '
' 1445230471380124991.json '
' 1445230475001827687.json '
' 1445230478421377779.json '
' 1445230482501165731.json '
' 1445230489169162067.json '
' 1445230492655384286.json '
' 1445230496133865127.json '
' 1445230499740257000.json '
' 1445230503651978021.json '
' 1445230507713678144.json '
' 1445230511095700007.json '
' 1445230513519495119.json '
' 1445268620016907631.json '
' 1445268622122827559.json '
' 1445268624140776755.json '
' 1445268626246517429.json '
' 1445268628577795578.json '
' 1445268630768718013.json '
' 1445268632895287713.json '
' 1445268635070637388.json '
' 1445268637363693700.json '
' 1445268639421901763.json '
' 1445268641731929243.json '
' 1445268644190182245.json '
' 1445268646249862525.json '
' 1445268648428272556.json '
' 1445268650914877177.json '
' 1445268653098586788.json '
' 1445268655348101903.json '
' 1445268657510578000.json '
' 1445268659754499998.json '
' 1445268662045588316.json '
' 1445268664277727860.json '
' 1445268666452725794.json '
' 1445268668805764606.json '
' 1445268670997451288.json '
' 1445268673114680160.json '
' 1445268675329202192.json '
' 1445268677513490711.json '
' 1445268679783287172.json '
' 1445268682036031414.json '
' 1445268684129371531.json '
' 1445268686425970598.json '
' 1445268688720167258.json '
' 1445268691192558105.json '
' 1445268693591401980.json '
' 1445268695781357250.json '
' 1445268698045096075.json '
' 1445268700150717503.json '
' 1445268702398420842.json '
' 1445268704720775279.json '
' 1445268707063564355.json '
' 1445268709338713945.json '
' 1445268711632755548.json '
' 1445268713768604227.json '
' 1445268716174246278.json '
' 1445268718396569875.json '
' 1445268720560126457.json '
' 1445268722729210983.json '
' 1445268724924585705.json '
' 1445268727102603087.json '
' 1445268729116745670.json '
' 1445268731363535604.json '
' 1445268733669265741.json '
' 1445268735955645041.json '
' 1445268738219628792.json '
' 1445268740422156492.json '
' 1445268742575678088.json '
' 1445268744783311234.json '
' 1445268746965546913.json '
' 1445268749160417454.json '
' 1445268751560320842.json '
' 1445268753823934772.json '
' 1445268756018962812.json '
' 1445268758417436266.json '
' 1445268760592037000.json '
' 1445268762650074634.json '
' 1445268764724292438.json '
' 1445268766920232465.json '
' 1445268769106959357.json '
' 1445268771359267849.json '
' 1445268773629836795.json '
' 1445268775790855329.json '
' 1445268777998775005.json '
' 1445268780377269826.json '
' 1445268782636835024.json '
' 1445268785105088940.json '
' 1445268787394903774.json '
' 1445268789625324163.json '
' 1445268791928562868.json '
' 1445268794097570133.json '
' 1445268796336624399.json '
' 1445268798631516823.json '
' 1445268801543146203.json '
' 1445268803720916221.json '
' 1445268806117659719.json '
' 1445268808328143702.json '
' 1445268810583045236.json '
' 1445268812868210294.json '
' 1445268815044910115.json '
' 1445268817371573566.json '
' 1445268819837082598.json '
' 1445268822186030265.json '
' 1445268824529238254.json '
' 1445268826698333397.json '
' 1445268829048336564.json '
' 1445268831119849897.json '
' 1445268833179695745.json '
' 1445268835355203152.json '
' 1445268837405461490.json '
' 1445268839507117921.json '
' 1445268841769599236.json '
' 1445268843884382755.json '
' 1445268846071503011.json '
' 1445268848349572818.json '
' 1445268850524364412.json '
' 1445268852776213937.json '
' 1445268854920734373.json '
' 1445268857126237087.json '
' 1445268859310201176.json '
' 1445268861561857965.json '
' 1445268864105148024.json '
' 1445268866197882910.json '
' 1445268868353326182.json '
' 1445268870516655449.json '
' 1445268872673508915.json '
' 1445268874762479150.json '
' 1445268877164751364.json '
' 1445268879286935114.json '
' 1445268881328685986.json '
' 1445268883445195315.json '
' 1445268885647373744.json '
' 1445268887906137602.json '
' 1445268890210873534.json '
' 1445268892285821181.json '
' 1445268894477987144.json '
' 1445268896586339497.json '
' 1445268898783556149.json '
' 1445268901026137511.json '
' 1445268903288629511.json '
' 1445268905632999958.json '
' 1445268907769137075.json '
' 1445268910210199749.json '
' 1445268912487917439.json '
' 1445268914699519986.json '
' 1445268916872093395.json '
' 1445268919162358705.json '
' 1445268921364723116.json '
' 1445268923529045633.json '
' 1445268925634767250.json '
' 1445268927773354402.json '
' 1445268930024845244.json '
' 1445268932347541598.json '
' 1445268934554593819.json '
' 1445268936774699728.json '
' 1445268939055730840.json '
' 1445268941103213627.json '
' 1445268943288510342.json '
' 1445268945472849529.json '
' 1445268947571262875.json '
' 1445268949842113619.json '
' 1445268953053002587.json '
' 1445268955705618031.json '
' 1445268957931907119.json '
' 1445268960079462662.json '
' 1445268962482269944.json '
' 1445268964595501883.json '
' 1445268966774301554.json '
' 1445268969043544169.json '
' 1445268971228990112.json '
' 1445268973718788263.json '
' 1445268975915972005.json '
' 1445268978092369714.json '
' 1445268980221048405.json '
' 1445268982462277288.json '
' 1445268984704104467.json '
' 1445268986851463154.json '
' 1445268988870702929.json '
' 1445268991174718359.json '
' 1445268993166842169.json '
' 1445268995482530004.json '
' 1445268997698069030.json '
' 1445268999856627198.json '
' 1445269001963981298.json '
' 1445269005128881832.json '
' 1445269007631174328.json '
' 1445269010567701718.json '
' 1445269012840178714.json '
' 1445269015063741658.json '
' 1445269017242828233.json '
' 1445269019421232891.json '
' 1445269021824220288.json '
' 1445269023938605981.json '
' 1445269026409208695.json '
' 1445269028509058790.json '
' 1445269030524896000.json '
' 1445269032756824238.json '
' 1445269035159289304.json '
' 1445269037366243450.json '
' 1445269039465047380.json '
' 1445269041701586560.json '
' 1445269043788403673.json '
' 1445269046045728613.json '
' 1445269048151202850.json '
' 1445269050459992316.json '
' 1445269053004557688.json '
' 1445269055349225134.json '
' 1445269057525643140.json '
' 1445269059934835285.json '
' 1445269062110045209.json '
' 1445269064274679000.json '
' 1445269066451272607.json '
' 1445269068728772237.json '
' 1445269070877790585.json '
' 1445269073109715995.json '
' 1445269075306781702.json '
' 1445269077338016409.json '
' 1445269079599082477.json '
' 1445269081901931619.json '
' 1445269083937350893.json '
' 1445269086606168066.json '
' 1445269089749719526.json '
' 1445269092912378322.json '
' 1445269095068300466.json '
' 1445269097105610715.json '
' 1445269099340915790.json '
' 1445269101634711008.json '
' 1445269103883171321.json '
' 1445269105915454000.json '
' 1445269108167686595.json '
' 1445269110361203248.json '
' 1445269112791210489.json '
' 1445269119000963903.json '
' 1445269122719487762.json '
' 1445269125411006548.json '
' 1445269127762964020.json '
' 1445269129836155861.json '
' 1445269132111575135.json '
' 1445269134217570416.json '
' 1445269136543021559.json '
' 1445269138695139898.json '
' 1445269140914567682.json '
' 1445269142942098025.json '
' 1445269145044930788.json '
' 1445269147248686797.json '
' 1445269149522984507.json '
' 1445269152161285087.json '
' 1445269155322986789.json '
' 1445269157818898906.json '
' 1445269160044484047.json '
' 1445269162266085471.json '
' 1445269164442888373.json '
' 1445269166529441082.json '
' 1445269168855231051.json '
' 1445269171132400258.json '
' 1445269173209510973.json '
' 1445269175360974881.json '
' 1445269177391806404.json '
' 1445269179564059457.json '
' 1445269181918334941.json '
' 1445269184183064047.json '
' 1445269186482660799.json '
' 1445269188582405643.json '
' 1445269190635432324.json '
' 1445269192856263789.json '
' 1445269195038404565.json '
' 1445269197102021853.json '
' 1445269199482726135.json '
' 1445269201660257229.json '
' 1445269203942103478.json '
' 1445269206237893322.json '
' 1445269208456870810.json '
' 1445269210788885279.json '
' 1445269213239724034.json '
' 1445269215451086036.json '
' 1445269217647945453.json '
' 1445269220046288284.json '
' 1445269222236265440.json '
' 1445269224505994866.json '
' 1445269226825172010.json '
' 1445269229116949026.json '
' 1445269231489543733.json '
' 1445269233755357471.json '
' 1445269235911648747.json '
' 1445269237999553699.json '
' 1445269240508365024.json '
' 1445269242722009927.json '
' 1445269244934195076.json '
' 1445269247162195032.json '
' 1445269249236953713.json '
' 1445269251458578943.json '
' 1445269253487689604.json '
' 1445269255696323064.json '
' 1445269257949099645.json '
' 1445269260191632330.json '
' 1445269262355329886.json '
' 1445269264566769605.json '
' 1445269266964329940.json '
' 1445269269227593807.json '
' 1445269271514201936.json '
' 1445269273612398920.json '
' 1445269275884684268.json '
' 1445269278076892764.json '
' 1445269280310865878.json '
' 1445269282424623299.json '
' 1445269284715336825.json '
' 1445269286688556553.json '
' 1445269288887242319.json '
' 1445269291073998385.json '
' 1445269293108399667.json '
' 1445269295212448901.json '
' 1445269297426394018.json '
' 1445269299599447234.json '
' 1445269301729933144.json '
' 1445269303996496226.json '
' 1445269306270930877.json '
' 1445269308476918049.json '
' 1445269310582680614.json '
' 1445269312690229962.json '
' 1445269314892409324.json '
' 1445269316980608523.json '
' 1445269319006449029.json '
' 1445269321185755416.json '
' 1445269323341804973.json '
' 1445269325664755068.json '
' 1445269327834759470.json '
' 1445269330069526259.json '
' 1445269332287771312.json '
' 1445269334385516439.json '
' 1445269336657750533.json '
' 1445269338838256481.json '
' 1445269340977045479.json '
' 1445269343278893069.json '
' 1445269345423148790.json '
' 1445269347428235854.json '
' 1445269349635316570.json '
' 1445269351688263000.json '
' 1445269354011647956.json '
' 1445269356113719565.json '
' 1445269358229515145.json '
' 1445269360612105490.json '
' 1445269362922818774.json '
' 1445269365222636184.json '
' 1445269367513280151.json '
' 1445269370028699953.json '
' 1445269372414990361.json '
' 1445269374641788750.json '
' 1445269377029996590.json '
' 1445269379312073874.json '
' 1445269381603113183.json '
' 1445269383813588267.json '
' 1445269386078574000.json '
' 1445269388353640395.json '
' 1445269390574915000.json '
' 1445269392800924652.json '
' 1445269395085481942.json '
' 1445269397341246657.json '
' 1445269399473830151.json '
' 1445269401846739679.json '
' 1445269404175824085.json '
' 1445269406294316012.json '
' 1445269408513123706.json '
' 1445269410750656000.json '
' 1445269413028587778.json '
' 1445269415145683723.json '
' 1445269417477899634.json '
' 1445269419689952826.json '
' 1445269421916883311.json '
' 1445269424069113886.json '
' 1445269426389494628.json '
' 1445269427373333034.json '
' 1445269898973248759.json '
' 1445269901101787379.json '
' 1445269902613155311.json '
]
request = require ' ../../node_modules/request '
allSessionIDs = { }
usernamesBySessionID = { }
2015-10-26 16:30:49 -04:00
userIDsBySessionID = { }
codeLanguagesByUserID = { }
2015-10-22 09:43:54 -04:00
teamNames = [ ' humans ' , ' ogres ' ]
matchesByTeam = { humans: { } , ogres: { } }
# Each object's first keys are first team session IDs, second are alternate teams' session IDs.
# values are 1 for win, 0 for loss for first team.
# We do this so that if there are duplicates in the results, we don't double-count them.
done = 0
getFile = (file) ->
request filePrefix + file , (err, resp, body) ->
if err
console . log ' \n Got err downloading ' , file , err , ' -- retrying... '
return getFile file
else
process . stdout . write " #{ resp . statusCode } : downloaded #{ file } , #{ done + 1 } / #{ files . length } \r "
try
matches = JSON . parse body
catch err
console . log ' \n Got err parsing ' , file , err , ' -- retrying... '
return getFile file
for match in matches
for team in teamNames
session = match [ { humans: ' HumansSession ' , ogres: ' OgresSession ' } [ team ] ]
otherSession = match [ { humans: ' OgresSession ' , ogres: ' HumansSession ' } [ team ] ]
allSessionIDs [ session ] = session
allSessionIDs [ otherSession ] = otherSession
matchesByTeam [ team ] [ session ] ? = { }
matchesByTeam [ team ] [ session ] [ otherSession ] = if match . Winner is session then 1 else 0
if ++ done is files . length
console . log " "
getNames ( )
for file in files
getFile file
[ sessionsDone , needed ] = [ 0 , 0 ]
getName = (sessionID) ->
++ needed
2015-10-26 16:30:49 -04:00
request " http://localhost:3000/db/level.session/ #{ sessionID } ?project=creatorName,creator,submittedCodeLanguage " , (err, resp, body) ->
2015-10-22 09:43:54 -04:00
if err
console . log ' \n Got err fetching session ' , sessionID , err , ' -- retrying... '
- - needed
return getName sessionID
else
process . stdout . write " #{ resp . statusCode } : fetched session #{ sessionID } , #{ sessionsDone + 1 } / #{ needed } \r "
try
session = JSON . parse ( body )
catch err
console . log ' \n Got err parsing ' , session , err , ' -- retrying... '
return getName sessionID
usernamesBySessionID [ sessionID ] = session . creatorName or session . creator
2015-10-26 16:30:49 -04:00
userIDsBySessionID [ sessionID ] = session . creator
codeLanguagesByUserID [ session . creator ] = session . submittedCodeLanguage
2015-10-22 09:43:54 -04:00
if ++ sessionsDone is needed
console . log " "
finish ( )
getNames = ->
for sessionID of allSessionIDs
getName sessionID
finish = ->
findLosses = [ ' 55df8c9207d920b7e4262f33 ' , ' 55e1d23686c019bc47b640fe ' , ' 55fa69c0d1754b86056db36e ' , ' 55fa68056e01178605aff259 ' , ' 55f9d3ffd1754b86056d5faa ' , ' 55f9d40066d6808505035c4a ' ]
teamRankings = { }
for team in teamNames
teamRankings [ team ] = { }
for session , matches of matchesByTeam [ team ]
for otherSession , result of matches
sessionCreatorName = usernamesBySessionID [ session ]
otherSessionCreatorName = usernamesBySessionID [ otherSession ]
continue if sessionCreatorName is otherSessionCreatorName
2015-10-26 16:30:49 -04:00
teamRankings [ team ] [ sessionCreatorName ] ? = { wins: 0 , losses: 0 , sessionID: session }
2015-10-22 09:43:54 -04:00
if result is 1
++ teamRankings [ team ] [ sessionCreatorName ] . wins
else
if session in findLosses
sessionOne = if team is ' humans ' then session else otherSession
sessionTwo = if team is ' humans ' then otherSession else session
console . log " #{ sessionCreatorName } #{ team } lost to #{ otherSessionCreatorName } : http://codecombat.com/play/spectate/ace-of-coders?session-one= #{ sessionOne } &session-two= #{ sessionTwo } "
++ teamRankings [ team ] [ sessionCreatorName ] . losses
#console.log teamRankings
fs = require ' fs '
topPlayers = [ ]
playersSeenOnlyOnce = { }
for team , players of teamRankings
for playerName , teamScore of players
player = playersSeenOnlyOnce [ playerName ]
if player
2015-10-26 16:30:49 -04:00
player . wins += teamScore . wins
player . losses += teamScore . losses
2015-10-22 09:43:54 -04:00
delete playersSeenOnlyOnce [ playerName ]
else
2015-10-26 16:30:49 -04:00
userID = userIDsBySessionID [ teamScore . sessionID ]
topPlayers . push { name: playerName , userID: userID , sessionID: teamScore . sessionID , wins: teamScore . wins , losses: teamScore . losses , codeLanguage: codeLanguagesByUserID [ userID ] , team: team }
2015-10-22 09:43:54 -04:00
playersSeenOnlyOnce [ playerName ] = topPlayers [ topPlayers . length - 1 ]
2015-10-26 16:30:49 -04:00
teamCounts = humans: Object . keys ( teamRankings . humans ) . length , ogres: Object . keys ( teamRankings . ogres ) . length
console . log ' \n Players per team: ' , teamCounts . humans , ' humans, ' , teamCounts . ogres , ' ogres '
topPlayers . sort (a, b) ->
aScore = 1000 * a . wins - a . losses
bScore = 1000 * b . wins - b . losses
aScore *= 0.999 + ( if a . team is ' ogres ' then ( teamCounts . ogres / teamCounts . humans ) else ( teamCounts . humans / teamCounts . ogres ) ) if a . name of playersSeenOnlyOnce
bScore *= 0.999 + ( if b . team is ' ogres ' then ( teamCounts . ogres / teamCounts . humans ) else ( teamCounts . humans / teamCounts . ogres ) ) if b . name of playersSeenOnlyOnce
return bScore - aScore
topPlayers = ( JSON . stringify ( p , null , 0 ) for p in topPlayers )
2015-10-22 09:43:54 -04:00
#console.log "Players seen only once:", playersSeenOnlyOnce
fs . writeFile ' tournament_results.tsv ' , topPlayers . join ( ' \n ' ) + ' \n ' , { flags: ' w ' } , (err) ->
console . log ' Error writing tournament results: ' , err if err
console . log ' \n Wrote tournament results! ' unless err
process . exit ( )