jvm/classes/p/AdventOfCodeDay2.java

101 lines
2.5 KiB
Java

package p;
class AdventOfCodeDay2 {
static float parse_digit(char c) {
switch (c) {
case '0': return 0.0f;
case '1': return 1.0f;
case '2': return 2.0f;
case '3': return 3.0f;
case '4': return 4.0f;
case '5': return 5.0f;
case '6': return 6.0f;
case '7': return 7.0f;
case '8': return 8.0f;
case '9': return 9.0f;
default: return -1.0f;
}
}
static float fabs(float f)
{
if (f < 0)
return -f;
else
return f;
}
static float fsign(float f)
{
if (f < 0)
return -1;
else
return 1;
}
static boolean report_safe(float[] line, int length)
{
float last = line[0];
float last_sign = 0.0f;
for (int i = 1; i < length; i++) {
float cur = line[i];
float rate = last - cur;
if (fabs(rate) < 1 || fabs(rate) > 3)
return false; // unsafe
float sign = fsign(rate);
if (last_sign != 0.0f && sign != last_sign)
return false; // unsafe
last_sign = sign;
last = cur;
}
return true; // safe
}
static float solve(char[] input) {
float[] line = new float[100];
int line_ix = 0;
int input_ix = 0;
float num = 0.0f;
float safe_count = 0.0f;
while (input_ix < input.length) {
if (input[input_ix] == ' ' || input[input_ix] == '\n') {
line[line_ix] = num;
line_ix += 1;
num = 0.0f;
}
if (input[input_ix] == '\n') {
if (report_safe(line, line_ix)) {
safe_count += 1.0f;
}
line_ix = 0;
}
float digit = parse_digit(input[input_ix]);
if (!(digit < 0.0f)) {
num *= 10.0f;
num += digit;
}
input_ix += 1;
}
return safe_count;
}
public static void main() {
char[] input = {
'7', ' ', '6', ' ', '4', ' ', '2', ' ', '1', '\n',
'1', ' ', '2', ' ', '7', ' ', '8', ' ', '9', '\n',
'9', ' ', '7', ' ', '6', ' ', '2', ' ', '1', '\n',
'1', ' ', '3', ' ', '2', ' ', '4', ' ', '5', '\n',
'8', ' ', '6', ' ', '4', ' ', '4', ' ', '1', '\n',
'1', ' ', '3', ' ', '6', ' ', '7', ' ', '9', '\n',
};
solve(input);
}
}