Continue work.
[pintos-anon] / ta-advice / check-duplicates
1 #! /usr/bin/perl -w
2
3 use strict;
4
5 usage () if !@ARGV;
6 (print "$ARGV[0]: chdir: $!\n"), usage () if !chdir ($ARGV[0]);
7
8 sub usage {
9     print <<EOF;
10 check-duplicates
11
12 Checks submission directories for duplicate and otherwise suspicious
13 submissions.
14
15 usage: check-duplicates HWDIR
16 where HWDIR is a directory whose subdirectories contain grade.txt files
17 in the format produced by the submit script.
18
19 Only subdirectories whose names are entirely alphanumeric are checked,
20 so you can use other names for temporary directories or known
21 duplicate submissions.
22 EOF
23     exit 1;
24 }
25
26 my (%stu2grp);
27 my ($group_cnt) = 0;
28 for my $group (grep (/^[[:alnum:]]+$/, glob ('*'))) {
29     my ($grade) = "$group/grade.txt";
30     my (@students);
31     open (GRADE, '<', $grade) or (print "$grade: open: $!\n"), next;
32     while (<GRADE>) {
33         last if /^\s*$/;
34         my ($student) = /\(([[:alnum:]]+)\@stanford.edu\)/ or next;
35         push (@students, $student);
36     }
37     close (GRADE);
38
39     print "warning: no students in group $group\n"
40       if @students == 0;
41     print "warning: ", scalar (@students), " students in group $group\n"
42       if @students > 3;
43
44     @students = sort @students;
45     for (my $i = 0; $i <= $#students; ) {
46         push (@{$stu2grp{$students[$i]}}, $group);
47
48         my $j;
49         for ($j = $i + 1; $j <= $#students; $j++) {
50             last if $students[$i] ne $students[$j];
51         }
52
53         my ($reps) = $j - $i;
54         print "warning: $students[$i] appears $reps times in group $group\n"
55             if $reps > 1;
56
57         $i = $j;
58     }
59
60     print "warning: no student named $group in group $group\n"
61       if !grep ($_ eq $group, @students);
62
63     $group_cnt++;
64 }
65
66 for my $student (keys %stu2grp) {
67     my (@groups) = @{$stu2grp{$student}};
68     next if @groups == 1;
69     print "warning: $student appears in groups ", join (', ', @groups), "\n";
70 }
71 print "Scanned ", scalar (keys (%stu2grp)),
72   " unique students in $group_cnt groups.\n";