]> iEval git - gruntmaster-page.git/blame - gruntmaster-problem
Add gruntmaster-problem
[gruntmaster-page.git] / gruntmaster-problem
CommitLineData
4f3ef247
MG
1#!/usr/bin/perl -w
2use v5.14;
3
4use Gruntmaster::Data qw/insert_problem remove_problem set_problem_meta problems/;
5
6use IO::Prompter [ -style => 'bold', '-stdio', '-verbatim' ];
7use File::Slurp qw/read_file/;
8use Term::ANSIColor qw/RED RESET/;
9
10##################################################
11
12sub cmd_help{
13 exec perldoc => $0
14}
15
16sub 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
25sub 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
62sub cmd_list{
63 my $contest = shift;
64 local $Gruntmaster::Data::contest = $contest if $contest;
65 print problems;
66}
67
68sub cmd_rm{
69 remove_problem shift
70}
71
72sub cmd_show{
73 local $_ = shift or goto &cmd_list;
74}
75
76##################################################
77
78no strict 'refs';
79my $cmd = 'cmd_' . shift;
80cmd_help unless exists $main::{$cmd};
81$cmd->(@ARGV) if exists $main::{$cmd};
82
831;
84__END__
85
86=encoding utf-8
87
88=head1 NAME
89
90gruntmaster-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.027721 seconds and 4 git commands to generate.