summaryrefslogtreecommitdiff
path: root/20.c
diff options
context:
space:
mode:
Diffstat (limited to '20.c')
-rw-r--r--20.c91
1 files changed, 69 insertions, 22 deletions
diff --git a/20.c b/20.c
index e738d9c..e427217 100644
--- a/20.c
+++ b/20.c
@@ -2,11 +2,12 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <unistd.h>
struct num {
- int val;
- int ord;
+ long val;
+ long ord;
};
@@ -17,11 +18,54 @@ struct num {
int
-main()
+main(int argc, char ** argv)
{
+ long key = 1, rounds = 1;
char buf[BUFSIZ];
struct num * nums = NULL;
- int nnums = 0, numsize = 0, i, pos;
+ int nnums = 0, numsize = 0, r, i, pos;
+
+ // Parse options
+ while ((i = getopt(argc, argv, "p:k:r:")) != -1) {
+ switch (i) {
+ case 'p':
+ switch (atoi(optarg)) {
+ case 1:
+ key = 1;
+ rounds = 1;
+ break;
+
+ case 2:
+ key = 811589153;
+ rounds = 10;
+ break;
+
+ default:
+ fprintf(stderr, "Invalid part %s\n", optarg);
+ return -1;
+ }
+ break;
+
+ case 'k':
+ key = atoi(optarg);
+ if (!key) {
+ fprintf(stderr, "Invalid key %s\n", optarg);
+ return -1;
+ }
+ break;
+
+ case 'r':
+ rounds = atoi(optarg);
+ if (rounds < 0) {
+ fprintf(stderr, "Invalid rounds %s\n", optarg);
+ return -1;
+ }
+ break;
+
+ default:
+ return -1;
+ }
+ }
// Read file.
while (fgets(buf, sizeof(buf), stdin)) {
@@ -46,33 +90,36 @@ main()
free(nums);
return -1;
}
+ nums[nnums].val *= key;
nums[nnums].ord = nnums;
++nnums;
}
// Mix file.
- for (i = 0, pos = 0; i < nnums; ++i) {
- int newpos;
- struct num tmp;
+ for (r = 0; r < rounds; ++r) {
+ for (i = 0, pos = 0; i < nnums; ++i) {
+ int newpos;
+ struct num tmp;
- // Look for the num whose ordinal is i, starting from the
- // position of the last num we looked at.
- while (nums[pos].ord != i)
- pos = modulo(pos + 1, nnums);
+ // Look for the num whose ordinal is i, starting from the
+ // position of the last num we looked at.
+ while (nums[pos].ord != i)
+ pos = modulo(pos + 1, nnums);
- if (nums[pos].val == 0)
- continue;
+ if (nums[pos].val == 0)
+ continue;
- // Move this.
- tmp = nums[pos];
+ // Move this.
+ tmp = nums[pos];
- newpos = modulo(pos + nums[pos].val, nnums - 1); // Buffer of nums does not include moving num
- if (newpos > pos)
- memmove(nums + pos, nums + pos + 1, (newpos - pos) * sizeof(struct num));
- else
- memmove(nums + newpos + 1, nums + newpos, (pos - newpos) * sizeof(struct num));
+ newpos = modulo(pos + nums[pos].val, nnums - 1); // Buffer of nums does not include moving num
+ if (newpos > pos)
+ memmove(nums + pos, nums + pos + 1, (newpos - pos) * sizeof(struct num));
+ else
+ memmove(nums + newpos + 1, nums + newpos, (pos - newpos) * sizeof(struct num));
- nums[newpos] = tmp;
+ nums[newpos] = tmp;
+ }
}
// Find zero.
@@ -85,7 +132,7 @@ main()
return -1;
}
- printf("Coords: %d,%d,%d; sum %d\n",
+ printf("Coords: %ld,%ld,%ld; sum %ld\n",
nums[modulo(i + 1000, nnums)].val,
nums[modulo(i + 2000, nnums)].val,
nums[modulo(i + 3000, nnums)].val,