fcn group(scores){ // group like scores into one list --> list of lists sink:=List(); scores.reduce('wrap(ps,sn,buf){ if(sn[0]!=ps){ sink.append(buf.copy()); buf.clear(); } buf+sn; sn[0]; },scores[0][0],buf:=List()); sink.append(buf); } fcn print(list,rank){ list.apply2('wrap(sn){ "%2s: %s (%d)".fmt(rank,sn[1],sn[0]):println(_); }); } fcn rankViaStandard(scores){ rank:=1; foreach group in (group(scores)){ print(group,rank); rank+=group.len(); } } fcn rankViaModified(scores){ rank:=0; foreach group in (group(scores)){ rank+=group.len(); print(group,rank); } } fcn rankViaDense(scores){ rank:=1; foreach group in (group(scores)){ print(group,rank); rank+=1; } } fcn rankViaOrdinal(scores){ scores.apply2('wrap(sn,rr){ "%2s: %s (%d)".fmt(rr.inc(),sn[1],sn[0]):println(_); },Ref(1)); } fcn rankViaFractional(scores){ rank:=1; foreach group in (group(scores)){ n:=group.len(); r:=rank.reduce(n,'+,0.0)/n; rank+=n; print(group,"%5.2f".fmt(r)); } }