From 02653ab40d93fb7e6d07edb747fe0e07c5d60c74 Mon Sep 17 00:00:00 2001 From: thing1 Date: Thu, 30 Jan 2025 12:49:01 +0000 Subject: did many new things --- bio/1/1.c | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 bio/1/1.c (limited to 'bio/1/1.c') diff --git a/bio/1/1.c b/bio/1/1.c new file mode 100644 index 0000000..d086119 --- /dev/null +++ b/bio/1/1.c @@ -0,0 +1,179 @@ +#include +#include +#include +#include +#include + +char *reverse(char *s){ + char *rev = malloc(strlen(s)); + int j = 0; + for (int i = strlen(s)-1; i >= 0; i--){ + rev[j] = s[i]; + j++; + } + rev[j] = 0; + + return rev; +} + +bool ispal(int n){ + char *strnum = malloc(128); + snprintf(strnum, 128, "%d", n); + char *rev = reverse(strnum); + + if (strcmp(rev, strnum) == 0) { // is the same both ways round + free(strnum); + free(rev); + return true; + } + free(strnum); + free(rev); + return false; +} + +int findhighestsumof2(int sums[][2], int sumcount){ + int highest = sums[0][0]; + int highestIndex = 0; + + for (int i = 0; i < sumcount; i++) { + if (sums[i][0] > highest) { + highest= sums[i][0]; + highestIndex = i; + } + if (sums[i][1] > highest) { + highest = sums[i][1]; + highestIndex = i; + } + } + + return highestIndex; +} + +int findlowesetsumof2(int sums[][2], int sumcount){ + if (sumcount == 0) return -1; // no sums + int lowest = sums[0][0]; + int lowestIndex = 0; + bool needscheck = false; + + for (int i = 0; i < sumcount; i++) { + if (sums[i][0] < lowest) { + lowest = sums[i][0]; + lowestIndex = i; + needscheck = false; + } + if (sums[i][1] < lowest) { + lowest = sums[i][1]; + lowestIndex = i; + needscheck = false; + } + if (sums[i][0] == lowest || sums[i][1] == lowest) needscheck == true; + } + if (needscheck) return findhighestsumof2(sums, sumcount); + return lowestIndex; +} + +int findhighestsumof3(int sums[][3], int sumcount){ + int highest = sums[0][0]; + int highestIndex = 0; + + for (int i = 0; i < sumcount; i++) { + if (sums[i][0] > highest) { + highest= sums[i][0]; + highestIndex = i; + } + if (sums[i][1] > highest) { + highest = sums[i][1]; + highestIndex = i; + } + if (sums[i][2] > highest) { + highest = sums[i][2]; + highestIndex = i; + } + } + return highestIndex; +} + +int findlowesetsumof3(int sums[][3], int sumcount){ + if (sumcount == 0) return -1; // no sums + // + int lowest = sums[0][0]; + int lowestIndex = 0; + bool needscheck = false; + + for (int i = 0; i < sumcount; i++) { + if (sums[i][0] < lowest) { + lowest = sums[i][0]; + lowestIndex = i; + needscheck = false; + } + if (sums[i][1] < lowest) { + lowest = sums[i][1]; + lowestIndex = i; + needscheck = false; + } + if (sums[i][2] < lowest) { + lowest = sums[i][2]; + lowestIndex = i; + needscheck = false; + } + if (sums[i][0] == lowest || sums[i][1] == lowest || sums[i][0] == lowest) needscheck == true; + } + if (needscheck) return findhighestsumof3(sums, sumcount); + return lowestIndex; +} + + +int main(int argc, char **argv){ + int input; + if (argc == 1) { + assert(scanf("%d", &input) != 0); + } else input = atoi(argv[1]); + + if (ispal(input)) { // if 1 number is enough + printf("%d\n", input); + return 1; + } + + int sums[input*2][2]; + int sumcount = 0; + for (int i = 1; i < input/2+1; i++){ // if 2 is enough + for (int j = input; j > (input/2) - 1; j--){ + if ((i + j) == input) { + if (ispal(i) & ispal(j)){ + sums[sumcount][0] = i; + sums[sumcount][1] = j; + sumcount++; + } + } + } + } + + int index = findlowesetsumof2(sums, sumcount); + if (index != -1) { + printf("%d %d\n", sums[index][0], sums[index][1]); + return 2; + } + + int triples[input*3][3]; + int triplecount = 0; + for (int i = 0; i < input; i++){ // if 3 is enough + for (int j = 0; j < input; j++){ + for (int k = 0; k < input; k++){ + if ((i + j + k) == input) { + if (ispal(i) & ispal(j) & ispal(k)){ + triples[triplecount][0] = i; + triples[triplecount][1] = j; + triples[triplecount][2] = k; + triplecount++; + } + } + } + } + } + + index = findlowesetsumof3(triples, triplecount); + if (index != -1) { + printf("%d %d %d\n", triples[index][0], triples[index][1], triples[index][2]); + return 3; + } +} -- cgit v1.2.3