-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathREADME.txt
132 lines (107 loc) · 4.63 KB
/
README.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
If you want to reproduce my solution from Google Code Jam, follow these
instructions (example follows; if you instead want to use this library to code your
own solutions, head to the QUICK START section):
0. Definitions:
<gcj-dir>: the root directory of the archive (the directory usually
named "gcj").
<input-file-name>: name of file which contains the small or large (or whatever) input to solve
<output-file-name>: name of file to which write solution
I also expect these instructions will be followed on a UNIX system. I do not
have the time to test on Windows, even though I tend to write multiplatform code.
1. Determine whether I used C++ or Python
* look at problems/<year>/<round>/<problem>.<"py" or "cpp">. I use latin letters
for the <problem> part.
2a. If I used Python (tested with 2.6.1):
2a1. Run <gcj-dir>/bin/solve.sh <year>.<round> <problem> <input-file-name> > <output-file-name>
where the ">" sign between input and output file is shell's output redirection
2b. If I used C++ (tested on g++ 4.2.1):
2b1. compile the source code: g++ -I<gcj-dir>/include -o <problem> <gcj-dir>/<year>/<round>/<problem>.cpp
2b2. run the binary: ./<problem> <input-file-name> <output-file-name>
EXAMPLE:
========
You want to evaluate problem "C. Welcome to Code Jame" from Round 1A in year 2009.
So <year>=2009, <problem>=C
Python:
-------
cd <gcj-dir>
ls problems/2009 # you find out that "Round 1A" is represented by directory "round1A"
ls problems/2009/round1A # you find that only file there starting with "C" is "C.py"
bin/solve.sh 2009.round1A C C-large.in.txt > C-large.out.txt
C++:
----
cd <gcj-dir>
ls problems/2009 # you find out that "Round 1A" is represented by directory "round1A"
ls problems/2009/round1A # you find that only file there starting with "C" is "C.cpp"
g++ -I./include -O2 -o C problems/2009/round1A/C.cpp
./C C-large.in.txt C-large.out.txt
QUICK START:
The demo files and demo input is in directory problems/demo.
a. If you are using Python
==========================
1. write your solution in the appropriate subdirectory of "problems" directory
- in that solution .py file, import gcj and inherit Solver from gcj.Solver;
override _solve_one(self) method which parses one case and returns string
with solution
2. run bin/solve.sh <path/to/solution/file> <solution file name without .py> <input file>
NOTE: don't worry about the "Solving case <case_number>" messages,
they are sent to stderr, if you redirect output to a file (that you will be submitting),
the messages will still be shown to you and not written to the file
EXAMPLE:
a solver which outputs true/false based on whether input is even
problems/2009/round0/C.py:
import gcj
class Solver(gcj.Solver):
def _solve_one(self):
i = self._getintline()
return str(i % 2 == 0).lower()
from anywhere run with:
/path/to/bin/solve.sh 2009.round0 C C-large.in.txt > C-large.out.txt
b. If you are using C++
=======================
1. write your solution anywhere into a .cpp file.
- implement Solver and Case interfaces, typically by implementing
StandardSolver from <gcj/Solvers.hpp> and SingleLineCase from <gcj/Cases.hpp>
- in your main, create your Solver class and return gcj::main(argc, argv, <the_solver_you_created>
2. compile
- if you want parallel execution and have Intel's TBB installed
g++ -Wall -O2 -DGCJ_PARALLELIZE -I<path/to/gcj/root>/include -o C C.cpp -ltbb
- otherwise omit the "-DGCJ_PARALLELIZE" and "-ltbb":
g++ -Wall -O2 -I<path/to/gcj/root>/include -o C C.cpp
3. run
- ./C <input file> <output file>
- or to send output to stdout, omit <output file>: ./C <input file>
EXAMPLE:
a solver which outputs true/false based on whether input is even
1. problems/demo/C.cpp:
#include <ios>
#include <gcj/Solvers.hpp>
#include <gcj/Cases.hpp>
#include <gcj/main.hpp>
class Case : public gcj::SingleLineCase {
int m_number;
bool m_result;
public:
explicit Case(int number) : m_number(number) {}
virtual void solve()
{ m_result = ((m_number % 2) == 0); }
virtual void output_only_solution_line(std::ostream& output)
{ output << std::boolalpha << m_result; }
};
class Solver : public gcj::StandardSolver {
public:
virtual bool parallelize() const
{ return true; } // or return false if you are not thread-safe
virtual gcj::Case *parse_one_case(std::istream& input) {
int number;
input >> number;
return new Case(number);
}
};
int main(int argc, char **argv) {
Solver solver;
return gcj::main(argc, argv, solver);
}
2. then compile:
g++ -Wall -O2 -DGCJ_PARALLELIZE -I$HOME/Documents/gcj/include -o C C.cpp -ltbb
3. then run:
./C C-large-in.txt C-large-out.txt