diff --git a/2020/01/balance.c b/2020/01/balance.c new file mode 100644 index 0000000..58a379d --- /dev/null +++ b/2020/01/balance.c @@ -0,0 +1,69 @@ +#include +#include +#include + +#define EPSILON 0.000001 + +typedef struct { + int no; + float juice, alcohool; +} Barrel; + +bool readInput(Barrel * line, 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; +} + +void sortLine(Barrel * line) { + Barrel aux; + if (line[0].juice + line[0].alcohool > line[1].juice + line[1].alcohool) + return; + aux = line[0]; + line[0] = line[1]; + line[1] = aux; +} + +int loadBarrel (Barrel * reservoir, Barrel b) { + float capacity = b.juice + b.alcohool; + + if (reservoir->juice - capacity * 0.86 >= -EPSILON + && reservoir->alcohool - capacity * 0.14 >= -EPSILON) { + reservoir->juice -= capacity * 0.86; + reservoir->alcohool -= capacity * 0.14; + return b.no; + } + return 0; +} + +int balance() { + int i, result = 0; + Barrel line[2], reservoir; + + if (!readInput(line, &reservoir)) + return EOF; + + sortLine(line); + + for (i = 0; i < 2; i++) + result += loadBarrel(&reservoir, line[i]); + + return result; +} diff --git a/2020/01/balancear b/2020/01/balancear index 0b5daec..a377c9e 100755 Binary files a/2020/01/balancear and b/2020/01/balancear differ diff --git a/2020/01/balancear.c b/2020/01/balancear.c deleted file mode 100644 index 0f5cb69..0000000 --- a/2020/01/balancear.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -typedef struct { - int no; - float juice, alcohool; -} Barrel; - -int balancear() { - int i, result = 0; - float f, capacity; - Barrel line[2], sortedLine[2], * finalLine, reservoir; - - /* Read Input */ - for (i = 0; i < 4; i++) { - if (!(scanf(" %f", &f)) || f <= 0) - return EOF; - if (i % 2 == 0) { - line[i / 2].no = i / 2 + 1; - line[i / 2].juice = f; - } - else { - if (f > 1) - return EOF; - 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; - } - - /* Sort Line */ - if (line[0].juice + line[0].alcohool < line[1].juice + line[1].alcohool) { - sortedLine[0] = line[1]; - sortedLine[1] = line[0]; - finalLine = sortedLine; - } - else - finalLine = line; - - /* Load Barrels */ - for (i = 0; i < 2; i++) { - capacity = finalLine[i].juice + finalLine[i].alcohool; - if (reservoir.juice - capacity * 0.86 >= 0 && - reservoir.alcohool - capacity * 0.14 >= 0) { - reservoir.juice -= capacity * 0.86; - reservoir.alcohool -= capacity * 0.14; - result += finalLine[i].no; - } - } - printf("%d\n", result); - - return result; -} diff --git a/2020/01/main.c b/2020/01/main.c index ffc8de7..1bef1ca 100644 --- a/2020/01/main.c +++ b/2020/01/main.c @@ -1,5 +1,5 @@ #include -#include "./balancear.c" +#include "./balance.c" int main () { int i, n; @@ -12,7 +12,7 @@ int main () { for (i = 0; i < n; i++) { printf("\nDigite os valores de volume e concentração para ambos o barris do %dº par, respectivamente:\n", i + 1); - switch (balancear()) { + switch (balance()) { case EOF: printf("Valores inválidos\n"); return 1;