diff --git a/12/mylib.c b/12/mylib.c index 87fbf66..bc495eb 100644 --- a/12/mylib.c +++ b/12/mylib.c @@ -89,3 +89,10 @@ long strslen(char **strs) { count++; return count; } + +char **strsdup(char **strs) { + char **new_strs = calloc(strslen(strs) + 1, sizeof(char*)); + for (int i = 0; strs[i] != NULL; i++) + new_strs[i] = strdup(strs[i]); + return new_strs; +} diff --git a/12/part2.c b/12/part2.c index 86b73fb..c237ae4 100644 --- a/12/part2.c +++ b/12/part2.c @@ -41,7 +41,7 @@ int test(int ***already, int ***sides_lines, int check, int *sides, int y, int x (*sides_lines)[y][x] = 0; for (; i >= 0; i--) - (*sides_lines)[y + i][x] = 0; + (*sides_lines)[y + (i * abs_x)][x + (i * abs_y)] = 0; i = 0; break; } @@ -51,24 +51,28 @@ int test(int ***already, int ***sides_lines, int check, int *sides, int y, int x int top = 0, bottom = 0, left = 0, right = 0; for (int j = 0; j < i; j++) { top = top ? 1 : (*already)[y - 1 + (j * abs_x)][x + (j * abs_y)] == check; - if (top && add_y != 1) { - test(already, sides_lines, check, sides, y + 1, x, h, w, 0, 1); - test(already, sides_lines, check, sides, y + 1, x, h, w, 0, -1); + if (top && add_y != 0) { + for (int w = 0; ((*already)[y + w][x + 1] == check + ||(*already)[y + w][x - 1] == check) + && y + w < h + && (*already)[y + w][x] != check + ; w++) + (*sides_lines)[y + w][x] = *sides + 1; } bottom = bottom ? 1 : (*already)[y + 1 + (j * abs_x)][x + (j * abs_y)] == check; - if (bottom && add_y != -1) { - test(already, sides_lines, check, sides, y - 1, x, h, w, 0, 1); - test(already, sides_lines, check, sides, y - 1, x, h, w, 0, -1); + if (bottom && add_y != 0) { + for (int w = 0; ((*already)[y + 1][x - w] == check + ||(*already)[y - 1][x - w] == check) + && y + w < h + && (*already)[y][x - w] != check + ; w++) + (*sides_lines)[y - w][x] = *sides + 1; } right = right ? 1 : (*already)[y + (j * abs_x)][x + 1 + (j * abs_y)] == check; if (right && add_x != 1) { - test(already, sides_lines, check, sides, y, x, h, w, 1, 0); - test(already, sides_lines, check, sides, y, x, h, w, -1, 0); } left = left ? 1 : (*already)[y + (j * abs_x)][x - 1 + (j * abs_y)] == check; if (left && add_x != -1) { - test(already, sides_lines, check, sides, y, x, h, w, 1, 0); - test(already, sides_lines, check, sides, y, x, h, w, -1, 0); } } *sides += (top + bottom + left + right); @@ -104,10 +108,14 @@ int get_side(int ***already, int check, int h, int w) { } } - test(already, &sides_lines, check, &sides, y, x, h, w, 1, 0); - test(already, &sides_lines, check, &sides, y, x, h, w, -1, 0); - test(already, &sides_lines, check, &sides, y, x, h, w, 0, 1); - test(already, &sides_lines, check, &sides, y, x, h, w, 0, -1); + if (test(already, &sides_lines, check, &sides, y, x, h, w, 1, 0)) + continue; + if (test(already, &sides_lines, check, &sides, y, x, h, w, -1, 0)) + continue; + if (test(already, &sides_lines, check, &sides, y, x, h, w, 0, 1)) + continue; + if (test(already, &sides_lines, check, &sides, y, x, h, w, 0, -1)) + continue; } } diff --git a/12/test6.txt b/12/test6.txt index e094b50..0260c21 100644 --- a/12/test6.txt +++ b/12/test6.txt @@ -1,7 +1,5 @@ -CCCJFFF -VCJJCFE -VCCJJEE -IICJJEE -IIIJJEE -ISIJEEE -ISSJEEE +VIVCC +VIIIC +IIIII +IIISI +MMISS diff --git a/13/Makefile b/13/Makefile new file mode 100755 index 0000000..1ad3e1c --- /dev/null +++ b/13/Makefile @@ -0,0 +1,41 @@ +CC := gcc +LD := $(CC) +LIBS := -lm +LDFLAGS := +CFLAGS := -Wall -Wextra -Wno-override-init -std=c2x -include_.h +SRC := part1.c mylib.c +ifeq ($(PART),2) + SRC := part2.c mylib.c +endif +OBJ_DIR := build +OBJ := $(addprefix $(OBJ_DIR)/, $(patsubst %.c,%.o,$(SRC))) +DIR := . +RAW_NAME:= a.out +NAME := $(RAW_NAME) + +ifeq ($(RELEASE),1) + CFLAGS += -O3 + LDFLAGS += -O3 -s +else + CFLAGS += -O0 -g3 + LDFLAGS += -O0 -g +endif + +all: $(NAME) + +$(NAME): $(OBJ) + $(LD) $(LDFLAGS) -o $(DIR)/$(NAME) $(OBJ) $(LIBS) + +$(OBJ_DIR)/%.o: %.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) -c -o $@ $< + +clean: + @rm -rf $(OBJ_DIR) + @rm -rf $(RAW_NAME) + +re: + @make --no-print clean + @make --no-print all + +.PHONY: all clean re diff --git a/13/_.h b/13/_.h new file mode 100644 index 0000000..c0a4ec4 --- /dev/null +++ b/13/_.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) +#define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) +#define ABS(X) ((X) >= 0 ? (X) : -(X)) + +char** str_split(char* a_str, const char a_delim); + +int str_index(char *str, char c); + +int number_of_element(char *str, char c); + +long gmc(long a, long b); +long lmc(long a, long b); +long lmcs(int array[], int n); + +long strslen(char **strs); diff --git a/13/main.txt b/13/main.txt new file mode 100644 index 0000000..cfe5db1 --- /dev/null +++ b/13/main.txt @@ -0,0 +1,1279 @@ +23 97 +93 12 +6993 2877 + +69 13 +16 78 +16314 9324 + +16 43 +40 12 +17664 2838 + +73 29 +24 94 +1335 1375 + +97 37 +32 54 +6457 3675 + +33 97 +89 71 +6726 8334 + +58 34 +13 43 +9979 1021 + +16 51 +66 37 +19072 5135 + +18 70 +54 53 +1980 5816 + +97 26 +49 59 +9823 5018 + +57 15 +12 71 +2807 17918 + +71 69 +11 70 +6976 12236 + +65 71 +54 13 +8680 7182 + +47 91 +27 16 +2812 4066 + +44 19 +24 55 +17644 14291 + +35 17 +15 32 +9210 16679 + +30 78 +87 20 +6375 7296 + +20 49 +85 25 +6480 3415 + +77 56 +30 72 +2785 2176 + +75 24 +13 41 +7774 17595 + +92 31 +29 90 +1617 946 + +67 22 +32 49 +2424 3067 + +45 17 +35 76 +1770 2552 + +59 30 +42 85 +3884 2675 + +16 80 +98 43 +10772 10054 + +44 16 +51 75 +2188 2828 + +44 20 +36 62 +9480 9028 + +61 25 +27 57 +12743 7217 + +56 25 +17 49 +7578 19690 + +80 94 +75 14 +9665 5204 + +67 83 +81 18 +9957 8547 + +46 11 +15 76 +4545 8108 + +91 28 +41 94 +6589 3004 + +76 21 +19 73 +10171 557 + +47 77 +56 28 +10029 10311 + +18 72 +95 17 +9330 6828 + +73 46 +11 27 +7962 2209 + +40 23 +20 52 +16860 16258 + +66 84 +94 24 +7066 4020 + +85 13 +63 95 +9169 5073 + +22 41 +48 13 +19334 16827 + +88 46 +13 82 +3391 5608 + +26 36 +90 33 +8592 3468 + +29 69 +85 52 +3490 4698 + +24 11 +14 44 +990 5512 + +30 55 +54 16 +14540 985 + +27 35 +82 33 +1877 1407 + +81 81 +14 63 +4187 4383 + +37 19 +14 47 +2399 2903 + +15 83 +58 64 +3905 4907 + +14 63 +54 15 +5384 2984 + +11 47 +71 36 +13234 17421 + +55 11 +32 71 +12525 11037 + +17 80 +63 45 +2242 2755 + +18 69 +72 27 +12266 16259 + +97 31 +76 84 +4037 1947 + +12 44 +41 37 +2697 3429 + +19 88 +83 34 +5511 8354 + +17 22 +83 17 +9145 3336 + +24 85 +72 38 +1032 1051 + +18 40 +48 16 +12434 6744 + +47 13 +26 74 +4399 11701 + +19 91 +51 37 +4876 8016 + +68 37 +24 46 +3276 3199 + +13 29 +57 39 +5788 5544 + +24 53 +68 39 +18740 14361 + +51 18 +23 72 +17447 17126 + +39 19 +30 60 +3491 10211 + +85 24 +23 94 +2812 8582 + +29 69 +58 21 +10443 4862 + +27 44 +95 31 +894 714 + +87 54 +48 99 +8262 5751 + +23 70 +44 12 +4080 5956 + +12 52 +82 23 +15086 14567 + +37 12 +16 43 +14856 930 + +11 77 +69 16 +13006 5385 + +23 51 +41 11 +8141 11813 + +56 12 +37 84 +5392 10244 + +41 12 +21 97 +2070 4240 + +55 97 +77 31 +11418 10286 + +11 52 +64 14 +1788 18898 + +64 13 +18 98 +4300 2949 + +31 70 +68 38 +917 1724 + +12 22 +96 38 +10188 5706 + +49 11 +12 62 +15408 11956 + +71 56 +25 91 +1469 2513 + +15 47 +66 12 +2153 10113 + +13 62 +79 85 +6430 9367 + +18 77 +44 12 +10844 2702 + +93 35 +26 58 +8896 6048 + +39 38 +55 12 +3970 3078 + +74 74 +91 21 +11192 6852 + +60 39 +32 65 +4848 4212 + +85 64 +11 40 +5294 6016 + +50 91 +65 14 +10540 10213 + +76 22 +11 66 +7809 3840 + +21 41 +40 18 +14542 14586 + +92 71 +24 85 +3776 6238 + +56 87 +86 23 +7110 3414 + +92 42 +19 81 +701 537 + +26 59 +56 21 +2004 3633 + +77 11 +12 57 +15477 3321 + +41 16 +23 68 +1951 9676 + +51 89 +89 29 +2824 1644 + +15 47 +41 13 +16130 3046 + +83 19 +94 92 +7904 5122 + +31 91 +51 14 +2361 5845 + +50 46 +15 55 +2960 2888 + +21 58 +68 35 +2525 8683 + +33 18 +19 50 +11199 13498 + +65 27 +32 70 +305 4371 + +63 17 +12 63 +12848 11817 + +64 21 +15 38 +15433 14539 + +23 38 +95 34 +5009 4710 + +21 43 +48 22 +5945 5653 + +36 66 +45 19 +9548 6616 + +11 88 +18 11 +2567 7502 + +63 15 +18 79 +9071 2005 + +96 20 +21 34 +8250 3200 + +16 53 +63 49 +3317 4121 + +14 44 +62 39 +2814 3389 + +27 11 +25 66 +9498 760 + +49 18 +19 47 +13964 7779 + +63 38 +17 50 +3851 3078 + +13 73 +58 21 +3753 6754 + +62 62 +12 89 +1748 8986 + +58 30 +18 52 +7412 10326 + +51 15 +33 79 +2351 18625 + +41 12 +14 63 +6251 9782 + +71 41 +11 98 +4898 8144 + +25 11 +37 68 +13265 13700 + +16 87 +34 23 +1622 1859 + +45 14 +21 65 +6593 8788 + +12 34 +56 20 +14292 10894 + +97 71 +32 74 +7508 9390 + +91 94 +99 26 +10533 6762 + +91 79 +77 14 +13720 8053 + +97 65 +35 73 +10273 8519 + +52 56 +12 60 +3076 5384 + +24 78 +87 80 +1914 5004 + +25 64 +86 40 +7861 6432 + +76 18 +11 67 +4187 6341 + +16 54 +73 11 +11779 14913 + +61 11 +71 61 +6710 4150 + +13 23 +45 18 +10234 5208 + +33 14 +37 70 +9190 4372 + +55 84 +91 30 +8397 3888 + +54 27 +40 69 +13734 4685 + +56 42 +38 96 +3582 4374 + +68 28 +62 94 +5090 5314 + +79 42 +33 87 +1238 936 + +13 73 +76 53 +2245 2141 + +98 43 +50 80 +10578 9983 + +83 29 +20 49 +8704 5982 + +17 83 +75 13 +10144 13144 + +43 12 +33 71 +6221 8450 + +61 27 +23 44 +2473 3834 + +19 77 +68 14 +8635 14655 + +35 97 +80 47 +6060 9981 + +92 28 +48 86 +12368 10118 + +17 63 +94 41 +3401 6764 + +13 28 +57 21 +10116 2580 + +54 16 +19 65 +17693 18057 + +36 18 +18 56 +818 10166 + +30 11 +48 68 +680 18576 + +53 63 +58 14 +6464 2464 + +43 19 +33 59 +6935 3385 + +78 42 +18 50 +6188 19540 + +17 65 +91 27 +2552 2376 + +15 15 +53 12 +4378 2082 + +95 57 +31 71 +3543 4903 + +11 39 +36 11 +16328 10583 + +20 96 +33 34 +658 2412 + +16 36 +57 34 +2414 10800 + +17 96 +58 19 +2396 4583 + +54 19 +15 33 +830 13495 + +67 21 +11 36 +15009 7019 + +60 13 +97 94 +5471 2864 + +30 53 +32 16 +7992 5652 + +16 48 +58 11 +3442 9359 + +31 65 +92 17 +5690 4015 + +15 42 +61 41 +5312 11057 + +30 12 +40 69 +13180 10529 + +36 88 +52 15 +3644 2293 + +22 41 +48 27 +14570 13331 + +17 75 +25 26 +2776 7358 + +12 69 +55 14 +14183 12248 + +25 14 +23 51 +14705 18449 + +47 35 +32 79 +3796 3213 + +49 22 +26 63 +14674 2732 + +17 81 +70 12 +11287 5867 + +25 65 +75 57 +3550 3848 + +63 16 +59 85 +5698 5368 + +39 67 +71 19 +2629 2457 + +49 24 +12 51 +8580 13931 + +30 63 +70 15 +3420 3618 + +21 58 +63 33 +14774 8692 + +63 32 +15 76 +3012 2624 + +39 17 +43 89 +3593 2339 + +17 37 +75 47 +13809 19685 + +26 59 +63 20 +5513 3780 + +16 80 +21 18 +1089 1530 + +15 50 +53 26 +1032 7684 + +25 46 +54 22 +13051 15284 + +58 49 +20 81 +1126 3259 + +16 43 +32 17 +9872 14960 + +72 18 +49 95 +4374 5562 + +96 24 +40 70 +8040 5430 + +25 51 +56 15 +4219 1263 + +40 98 +88 43 +4064 3398 + +16 22 +82 27 +6482 2653 + +88 14 +40 60 +5880 2330 + +30 74 +55 20 +2405 16892 + +18 47 +62 12 +19226 2795 + +50 18 +38 58 +4712 6084 + +14 39 +63 35 +14746 8492 + +59 13 +35 85 +595 9525 + +42 22 +36 62 +2822 9926 + +45 55 +94 22 +6660 3960 + +41 90 +50 32 +5513 6270 + +84 74 +12 37 +4500 5735 + +31 49 +48 13 +3595 4425 + +99 18 +31 73 +4116 2163 + +56 31 +29 53 +4032 16493 + +45 77 +50 18 +18500 2116 + +81 17 +48 65 +12237 7951 + +48 57 +98 16 +10492 6236 + +70 12 +14 78 +17210 9854 + +53 86 +45 13 +18553 8777 + +15 34 +72 46 +17951 17142 + +26 43 +77 26 +4778 4659 + +12 66 +59 44 +3031 5170 + +26 14 +20 58 +1516 4028 + +60 13 +13 51 +15963 14692 + +67 16 +11 25 +680 319 + +56 20 +15 66 +7292 19232 + +13 96 +80 48 +1498 6720 + +35 44 +11 91 +2406 5417 + +59 23 +23 47 +3805 10093 + +17 65 +99 97 +5914 9662 + +41 83 +47 12 +3330 1503 + +46 11 +22 51 +12508 3726 + +62 21 +18 43 +6706 5563 + +41 55 +51 20 +3715 1885 + +14 41 +64 29 +18418 19077 + +37 16 +33 47 +17950 4251 + +24 68 +91 66 +6172 7512 + +53 96 +62 15 +10393 10749 + +44 27 +20 97 +2676 7573 + +14 37 +97 44 +4964 2926 + +20 55 +40 17 +13460 13556 + +63 33 +34 63 +6045 644 + +48 82 +60 33 +4152 3896 + +18 87 +95 24 +3820 7149 + +90 47 +18 41 +5688 5530 + +94 34 +18 72 +5798 6092 + +37 11 +36 68 +1009 9527 + +82 53 +13 36 +6514 8211 + +37 12 +24 49 +19416 15591 + +70 60 +17 50 +7214 8380 + +67 11 +12 16 +5442 1146 + +47 99 +77 46 +1351 1800 + +74 33 +46 90 +5668 5724 + +51 81 +61 25 +5878 6676 + +29 93 +97 25 +10685 6517 + +83 89 +67 17 +4108 3692 + +18 46 +66 18 +17690 9366 + +75 90 +12 91 +7860 15560 + +21 72 +72 17 +18143 1514 + +33 15 +34 50 +11081 12875 + +40 19 +15 39 +7060 11866 + +56 41 +17 39 +12452 429 + +67 81 +13 79 +3428 8764 + +20 51 +67 23 +13378 19419 + +61 42 +12 38 +6443 2700 + +13 41 +66 29 +16250 275 + +47 12 +25 70 +3405 3650 + +95 60 +23 79 +4259 6107 + +52 18 +19 59 +3656 3428 + +33 24 +30 78 +3399 7416 + +27 19 +14 34 +5847 1191 + +93 17 +66 64 +10617 3343 + +17 62 +27 12 +4316 8096 + +13 50 +62 29 +19495 19244 + +26 56 +93 60 +647 692 + +91 50 +34 90 +9264 8870 + +15 34 +97 59 +4151 3296 + +81 71 +13 78 +1450 4135 + +16 45 +60 39 +5084 4856 + +48 82 +90 37 +11112 10110 + +28 72 +87 40 +6010 4064 + +94 12 +30 88 +1876 4448 + +11 86 +97 84 +1455 8678 + +14 51 +69 29 +14379 14593 + +21 79 +94 71 +1611 2669 + +75 46 +12 26 +5360 5142 + +76 43 +30 76 +8082 9708 + +32 99 +28 14 +1068 2360 + +23 63 +49 22 +19299 13706 + +87 24 +46 98 +11245 8306 + +96 50 +23 61 +9190 8414 + +22 77 +74 12 +13870 16135 + +87 52 +33 98 +5268 6358 + +28 79 +48 37 +2100 4547 + +44 83 +57 15 +9033 8805 + +32 76 +42 21 +4042 4481 + +73 11 +78 68 +12004 7096 + +59 19 +12 56 +15540 13528 + +46 28 +12 44 +19412 3044 + +14 24 +46 21 +16360 995 + +29 50 +23 13 +15789 7136 + +12 48 +81 40 +9497 8424 + +70 16 +11 46 +9728 16688 + +64 39 +18 42 +5064 3210 + +12 42 +95 67 +6954 6816 + +71 26 +58 78 +6368 3978 + +34 21 +25 48 +8873 2960 + +13 44 +82 46 +8218 14754 + +23 52 +43 13 +4439 7621 + +57 22 +30 63 +18083 10440 diff --git a/13/mylib.c b/13/mylib.c new file mode 100644 index 0000000..87fbf66 --- /dev/null +++ b/13/mylib.c @@ -0,0 +1,91 @@ +#include "_.h" + +// NOT MY CODE +// https://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c +char** str_split(char* str, const char a_delim) +{ + char *a_str = strdup(str); + char** result = 0; + size_t count = 0; + char* tmp = a_str; + char* last_comma = 0; + char delim[2]; + delim[0] = a_delim; + delim[1] = 0; + + while (*tmp) + { + if (a_delim == *tmp) + { + count++; + last_comma = tmp; + } + tmp++; + } + + count += last_comma < (a_str + strlen(a_str) - 1); + + count++; + + result = malloc(sizeof(char*) * count); + + if (result) + { + size_t idx = 0; + char* token = strtok(a_str, delim); + + while (token) + { + //assert(idx < count); + *(result + idx++) = strdup(token); + token = strtok(0, delim); + } + //assert(idx == count - 1); + *(result + idx) = 0; + } + + free(a_str); + return result; +} + +int str_index(char *str, char c) { + + int i = 0; + while (str[i]) + if (str[i++] == c) + return i; + + return -1; +} + +int number_of_element(char *str, char c) { + int nbr = 0; + for (int i = 0; str[i] != '\0'; i++) + if (str[i] == c) + nbr++; + return nbr; +} + +long gmc(long a, long b) { + if (b == 0) + return a; + return gmc(b, a % b); +} + +long lmc(long a, long b) { + return (a / gmc(a, b)) * b; +} + +long lmcs(int array[], int n) { + long result = array[0]; + for (int i = 1; i < n; i++) + result = lmc(result, array[i]); + return result; +} + +long strslen(char **strs) { + long count = 0; + while (strs[count]) + count++; + return count; +} diff --git a/13/part1.c b/13/part1.c new file mode 100644 index 0000000..984a9c1 --- /dev/null +++ b/13/part1.c @@ -0,0 +1,44 @@ +#include "_.h" + +int get_number_input_to_wint(int A[], int B[], int prize[]) { + int i = 0, j = 0; + int min = 1000; + for (; i < 1000; i++) { + j = 0; + for (; j < 1000; j++) { + if ((A[0] * i) + (B[0] * j) == prize[0] + && (A[1] * i) + (B[1] * j) == prize[1]) + min = MIN(i * 3 + j, min); + } + } + //printf("tokens: %d\n\n", min); + return min; +} + +int main(int argc, char **argv) { + + if (argc != 2) + return 1; + + char *input = argv[1]; + char **inputs = str_split(strdup(input), '\n'); + + int token_spent = 0; + for (int i = 0; inputs[i] != NULL; i+=3) { + char **button_A = str_split(strdup(inputs[i]), ' '); + int A[2] = {atoi(button_A[0]), atoi(button_A[1])}; + + char **button_B = str_split(strdup(inputs[i + 1]), ' '); + int B[2] = {atoi(button_B[0]), atoi(button_B[1])}; + + char **prizes = str_split(strdup(inputs[i + 2]), ' '); + int prize[2] = {atoi(prizes[0]), atoi(prizes[1])}; + + int number = get_number_input_to_wint(A, B, prize); + token_spent += number == 1000 ? 0 : number; + } + + printf("token_spent: %d\n", token_spent); + + return 0; +} diff --git a/13/part2.c b/13/part2.c new file mode 100644 index 0000000..60bf0e9 --- /dev/null +++ b/13/part2.c @@ -0,0 +1,34 @@ +#include "_.h" + +long long solve(long long A[], long long B[], long long prize[]) { + + return 0; +} + + +int main(int argc, char **argv) { + + if (argc != 2) + return 1; + + char *input = argv[1]; + char **inputs = str_split(strdup(input), '\n'); + + long long token_spent = 0; + for (long long i = 0; inputs[i] != NULL; i+=3) { + char **button_A = str_split(strdup(inputs[i]), ' '); + long long A[2] = {atoi(button_A[0]), atoi(button_A[1])}; + + char **button_B = str_split(strdup(inputs[i + 1]), ' '); + long long B[2] = {atoi(button_B[0]), atoi(button_B[1])}; + + char **prizes = str_split(strdup(inputs[i + 2]), ' '); + long long prize[2] = {atoi(prizes[0]), atoi(prizes[1])}; + + solve(A, B, prize); + } + + printf("token_spent: %lld\n", token_spent); + + return 0; +} diff --git a/13/test.txt b/13/test.txt new file mode 100644 index 0000000..f0f8d0e --- /dev/null +++ b/13/test.txt @@ -0,0 +1,15 @@ +94 34 +22 67 +8400 5400 + +26 66 +67 21 +12748 12176 + +17 86 +84 37 +7870 6450 + +69 23 +27 71 +18641 10279