Google Code Jam 2011 Language Usage
bearophile
bearophileHUGS at lycos.com
Sun May 8 15:01:16 PDT 2011
Andrew Wiley:
> The main thing that frustrated me was that getting input in D wasn't
> anywhere near as straightforward as it is in Java. For the first problem,
I have tried to implement a D solution to the first problem, because its input is a bit more complex. I have used C++ code written the winner as starting point. After several failed D versions (this is BAD for D2/Phobos), I've written a Python prototype and then I have translated it to D2:
import std.stdio, std.math, std.conv, std.string, std.array, std.algorithm;
auto next(R)(ref R range) {
auto result = range.front();
range.popFront();
return result;
}
void main() {
auto fin = File("input.txt");
auto fout = File("output.txt", "w");
foreach (i; 0 .. to!int(fin.readln().strip())) {
int[2] lastP = 1;
int[2] lastT = 0;
int t = 0;
auto parts = splitter(fin.readln().strip(), " ");
foreach (_; 0 .. to!int(next(parts))) {
string s = next(parts);
int q = to!int(next(parts));
int id = cast(int)(s == "B");
t = max(t, abs(q - lastP[id]) + lastT[id]) + 1;
lastP[id] = q;
lastT[id] = t;
}
fout.writefln("Case #%d: %d", i, t);
}
}
Three problems I've found in translating the prototype:
- A next() function/method is missing, but I needed it, so I have had to define it, to keep code from becoming hairy and quite less readable.
to!int expects a stripped string. In my code I am never sure to have a stripped string coming from input, so I have to always add a strip(), this is dumb:
foreach (i; 0 .. to!int(fin.readln().strip())) {
==>
foreach (i; 0 .. to!int(fin.readln())) {
std.algorithm.splitter() doesn't default to splitting on whitespace as std.string.split() does. This is bad because in this program I need to add a strip() and in general it's bad because if there are two spaces, or a newline, it causes a mess, so I'd like a new overload of splitter() that acts as split():
auto parts = splitter(fin.readln().strip(), " ");
==>
auto parts = splitter(fin.readln());
Bye,
bearophile
More information about the Digitalmars-d
mailing list