]> iEval git - gruntmaster-page.git/blob - gruntmaster-problem
32e8e2b7d6ca9cbaf0d0e86d12c1b06d739cd47f
[gruntmaster-page.git] / gruntmaster-problem
1 #!/usr/bin/perl -w
2 use v5.14;
3
4 use Gruntmaster::Data qw/insert_problem remove_problem set_problem_meta problems/;
5
6 use IO::Prompter [ -style => 'bold', '-stdio', '-verbatim' ];
7 use File::Slurp qw/read_file/;
8 use Term::ANSIColor qw/RED RESET/;
9
10 ##################################################
11
12 sub cmd_help{
13 exec perldoc => $0
14 }
15
16 sub prompt_file{
17 my ($meta, $name, $prefix) = @_;
18 my $filename = prompt '$prefix filename', -complete => 'filenames';
19 $meta->{files}{$name}{content} = read_file $filename;
20 $meta->{files}{$name}{format} = prompt '$prefix format', -menu => [keys Gruntmaster::Page::Log::FORMAT_EXTENSION()];
21 $meta->{files}{$name}{name} = prompt "$prefix filename [$filename]", -default => $filename;
22
23 }
24
25 sub cmd_add{
26 my $id = shift;
27 my $contest = prompt 'Contest';
28 local $Gruntmaster::Data::contest = $contest if $contest;
29 my $name = prompt 'Problem name';
30 my $level = prompt 'Problem level';
31 my $statement = read_file prompt 'File with problem statement', -complete => 'filenames';
32 my %meta;
33 $meta{generator} = prompt 'Generator', -menu => "File\nRun\nUndef";
34 $meta{runner} = prompt 'Runner', -menu => "File\nVerifier\nInteractive";
35 $meta{judge} = prompt 'Judge', -menu => "Absolute\nPoints";
36 $meta{testcnt} = prompt 'Test count', '-i';
37
38 if ($meta{generator} eq 'File') {
39 my $prefix = prompt '[Generator::File] Input file prefix';
40 $meta{infile}[$_ - 1] = read_file "$prefix$_.in" for 1 .. $meta{testcnt};
41 }
42
43 prompt_file \%meta, gen => '[Generator::Run] Generator' if $meta{generator} eq 'Run';
44
45 if ($meta{runner} eq 'File') {
46 my $prefix = prompt '[Runner::File] Output file prefix';
47 $meta{okfile}[$_ - 1] = read_file "$prefix$_.ok" for 1 .. $meta{testcnt};
48 $meta{tests}[$_ - 1] = prompt "[Runner::File] Score for test ${_} [10]", '-i', -default => 10 for 1 .. $meta{testcnt};
49 }
50
51 prompt_file \%meta, ver => '[Runner::Verifier] Verifier' if $meta{runner} eq 'Verifier';
52
53 if ($meta{runner} eq 'Interactive') {
54 say RED, 'WARNING: Runner::Interactive is experimental', RESET;
55 prompt_file int => '[Runner::Interactive] Interactive verifier';
56 }
57
58 insert_problem $id => name => $name, level => $level, statement => $statement;
59 set_problem_meta $id => \%meta;
60 }
61
62 sub cmd_list{
63 my $contest = shift;
64 local $Gruntmaster::Data::contest = $contest if $contest;
65 print problems;
66 }
67
68 sub cmd_rm{
69 remove_problem shift
70 }
71
72 sub cmd_show{
73 local $_ = shift or goto &cmd_list;
74 }
75
76 ##################################################
77
78 no strict 'refs';
79 my $cmd = 'cmd_' . shift;
80 cmd_help unless exists $main::{$cmd};
81 $cmd->(@ARGV) if exists $main::{$cmd};
82
83 1;
84 __END__
85
86 =encoding utf-8
87
88 =head1 NAME
89
90 gruntmaster-problem - shell interface to Gruntmaster 6000 problems
91
92 =head1 SYNOPSIS
93
94 gruntmaster-problem add problem_id
95 gruntmaster-problem list
96 gruntmaster-problem rm problem_id
97 gruntmaster-problem show problem_id
98
99
100 =head1 DESCRIPTION
101
102
103
104 =cut
This page took 0.049744 seconds and 3 git commands to generate.