summaryrefslogtreecommitdiff
path: root/bio/1/1.c
diff options
context:
space:
mode:
authorthing1 <thing1@seacrossedlovers.xyz>2025-01-30 12:49:01 +0000
committerthing1 <thing1@seacrossedlovers.xyz>2025-01-30 12:49:01 +0000
commit02653ab40d93fb7e6d07edb747fe0e07c5d60c74 (patch)
tree12e62d9e66737597e2d7ddc71eefa8a08264cffa /bio/1/1.c
parent87c1e35223b0fd9002a6efca2a208fb8ae1993e2 (diff)
did many new things
Diffstat (limited to 'bio/1/1.c')
-rw-r--r--bio/1/1.c179
1 files changed, 179 insertions, 0 deletions
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 <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+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;
+ }
+}