diff --git a/2020/01/balancear.c b/2020/01/balancear.c index b4bfe8d..3838a02 100644 --- a/2020/01/balancear.c +++ b/2020/01/balancear.c @@ -1,21 +1,67 @@ #include +#include +#include + +typedef struct { + int no; + float juice, alcohool; +} Barrel; + +bool readInput(Barrel * line[2], Barrel * reservoir) { + int i; + float f; + + for (i = 0; i < 4; i++) { + if (!scanf(" %f", &f) || f <= 0) + return false; + if (i % 2 == 0) { + line[i / 2]->no = i / 2 + 1; + line[i / 2]->juice = f; + } + else { + if (f > 1) + return false; + line[i / 2]->alcohool = f * line[i / 2]->juice; + line[i / 2]->juice -= line[i / 2]->alcohool; + } + reservoir->juice = line[0]->juice + line[1]->juice; + reservoir->alcohool = line[0]->alcohool + line[1]->alcohool; + } + return true; +} + +Barrel * sortLine(Barrel * line) { + if (line[0].juice + line[0].alcohool > line[1].juice + line[1].alcohool) + return line; + + Barrel * sortedLine[2]; + *sortedLine[0] = *line[1]; + *sortedLine[1] = *line[0]; + return sortedLine; +} + +int loadBarrel (Barrel * reservoir, Barrel barrel) { + float capacity = barrel.juice + barrel.alcohool; + if (reservoir->juice - capacity * 0.86 >= 0 && + reservoir->alcohool - capacity * 0.14 >= 0) { + reservoir->juice -= capacity * 0.86; + reservoir->alcohool -= capacity * 0.14; + return barrel.no; + } + return 0; +} int balancear() { - int i, barrels[4], sortedBarrels[4], reservoir[2], isBigger; + int i, result; + Barrel line[2], reservoir; - for (i = 0; i < 4; i++) - if (!scanf(" %f", barrels[i]) || barrels[i] <= 0) - return -1; + if (!readInput(&line, &reservoir)) + return EOF; - for (i = 0; i < 1; i++) - reservoir[0] = barrels[0] + barrels[2]; + line = sortLine(line); - reservoir[1] = barrels[1] + barrels[3]; + for (i = 0; i < 2; i++) + result += loadBarrel(&reservoir, line[i]); - sortedBarrels = sortBarrels(barrels) - isBigger = (barrels[1] == sortedBarrels[1]) ? 1 : 2; - - for (i = 0; i < 4; i += 2) { - - } + return result; }