/* Top rank per group (Rosetta code) in Picat. http://rosettacode.org/wiki/Top_rank_per_group """ Find the top N salaries in each department, where N is provided as a parameter. Use this data as a formatted internal data structure (adapt it to your language-native idioms, rather than parse at runtime), or identify your external data source: Employee Name,Employee ID,Salary,Department Tyler Bennett,E10297,32000,D101 John Rappl,E21437,47000,D050 George Woltman,E00127,53500,D101 Adam Smith,E63535,18000,D202 Claire Buckman,E39876,27800,D202 David McClellan,E04242,41500,D101 Rich Holcomb,E01234,49500,D202 Nathan Adams,E41298,21900,D050 Richard Potter,E43128,15900,D101 David Motsinger,E27002,19250,D202 Tim Sampair,E03033,27000,D101 Kim Arlich,E10001,57000,D190 Timothy Grove,E16398,29900,D190 """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. go => Emp = [ % Employee Name,Employee ID,Salary,Department ["Tyler Bennett","E10297","32000","D101"], ["John Rappl","E21437","47000","D050"], ["George Woltman","E00127","53500","D101"], ["Adam Smith","E63535","18000","D202"], ["Claire Buckman","E39876","27800","D202"], ["David McClellan","E04242","41500","D101"], ["Rich Holcomb","E01234","49500","D202"], ["Nathan Adams","E41298","21900","D050"], ["Richard Potter","E43128","15900","D101"], ["David Motsinger","E27002","19250","D202"], ["Tim Sampair","E03033","27000","D101"], ["Kim Arlich","E10001","57000","D190"], ["Timothy Grove","E16398","29900","D190"] ], print_top_ranks(Emp,3), nl. % % reading the emp data from file top_rank_per_group.txt % go2 => File = "top_rank_per_group.txt", Emp1 = read_file_lines(File), % skip header and split the lines Emp = [split(Emp1[I],",") : I in 2..Emp1.length], print_top_ranks(Emp,3), nl. % as facts, also testing report of ties go3 => Emp = findall([Name,ID,Salary,Dept],emp(Name,ID,Salary,Dept)), print_top_ranks(Emp,5), nl. print_top_ranks(Emp,N) => printf("Top %d ranks per department:\n", N), foreach(Dept in [Dept : [_,_,_,Dept] in Emp].sort_remove_dups()) printf("Department %s\n", Dept), Emp2 = sort_down([[Salary,Name] : [Name,_,Salary,D] in Emp, D = Dept]), foreach({[Salary,Name],E} in zip(Emp2,1..Emp2.length), E <= N) Tie = cond( (E > 1, Emp2[E,1] == Emp2[E-1,1]), "(tie)", ""), printf("%-20s %-10s %s\n", Name, Salary,Tie) end, nl end. index (-,-,-,-) emp("Tyler Bennett","E10297","32000","D101"). emp("John Rappl","E21437","47000","D050"). emp("George Woltman","E00127","53500","D101"). emp("Adam Smith","E63535","18000","D202"). emp("Claire Buckman","E39876","27800","D202"). emp("David McClellan","E04242","41500","D101"). emp("Rich Holcomb","E01234","49500","D202"). emp("Nathan Adams","E41298","21900","D050"). emp("Richard Potter","E43128","15900","D101"). emp("David Motsinger","E27002","19250","D202"). emp("Tim Sampair","E03033","27000","D101"). emp("Kim Arlich","E10001","57000","D190"). emp("Timothy Grove","E16398","29900","D190"). % testing ties emp("Timothy Grove2","E16399","29900","D190"). emp("Timothy Grove3","E163910","29900","D190").