diff options
| author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-12-25 15:03:47 +0100 | 
|---|---|---|
| committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-12-25 15:03:47 +0100 | 
| commit | 4ca4d2f3bc6a01a84cd6719bcdc1ead5ed808a7e (patch) | |
| tree | 58135307f90ad61c474ce847a1a512f29af231bf | |
Add day 1
| -rw-r--r-- | 01/a.c | 80 | ||||
| -rw-r--r-- | 01/b.c | 127 | ||||
| -rw-r--r-- | 01/input.txt | 199 | 
3 files changed, 406 insertions, 0 deletions
@@ -0,0 +1,80 @@ +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <unistd.h> + +#define BUF_SIZE 2000 + +char buf[BUF_SIZE]; +int input[200]; +int length; + +void read_input() { +    int fd = open("input.txt", O_RDONLY); +    ssize_t bytes_read = read(fd, buf, BUF_SIZE-1); +    if (bytes_read <= 0) { +        printf("Error reading input\n"); +        exit(1); +    } +    buf[bytes_read] = '\0'; +} + +void parse_input() { +    int offset = 0; +    int done = 0; +    int buf_offset = 0; +    int i = 0; +    char current[10]; + +    while (!done) { +        int current_offset = 0; +        while (buf[buf_offset] != '\n' && buf[buf_offset] != '\0') { +            current[current_offset++] = buf[buf_offset++]; +        } +        if (buf[buf_offset] == '\0') { +            done = 1; +        } else { +            buf_offset++; +            current[current_offset] = '\0'; +            input[i++] = atoi(current); +            length = i; +        } +    } +} + +int int_less(const void *a, const void *b) { +    return *(int *)a - *(int *)b; +} + +void sort_input() { +    qsort(input, length, sizeof(int), int_less); +} + +int search_2020() { +    int small_pointer = 0; +    int large_pointer = length - 1; +    int sum = input[small_pointer] + input[large_pointer]; +    while (sum != 2020 && small_pointer != large_pointer) { +        if (sum > 2020) { +            large_pointer--; +        } else { +            small_pointer++; +        } +        sum = input[small_pointer] + input[large_pointer]; +    } +    return input[small_pointer] * input[large_pointer]; +} + +void print_input() { +    for (int i = 0; i < length; i++) { +        printf("%d\n", input[i]); +    } +} + +int main() { +    read_input(); +    parse_input();  +    sort_input(); +    printf("%d\n", search_2020()); +} @@ -0,0 +1,127 @@ +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <unistd.h> + +#define BUF_SIZE 2000 + +char buf[BUF_SIZE]; +int input[200]; +int length; + +void read_input() { +    int fd = open("input.txt", O_RDONLY); +    ssize_t bytes_read = read(fd, buf, BUF_SIZE-1); +    if (bytes_read <= 0) { +        printf("Error reading input\n"); +        exit(1); +    } +    buf[bytes_read] = '\0'; +} + +void parse_input() { +    int offset = 0; +    int done = 0; +    int buf_offset = 0; +    int i = 0; +    char current[10]; + +    while (!done) { +        int current_offset = 0; +        while (buf[buf_offset] != '\n' && buf[buf_offset] != '\0') { +            current[current_offset++] = buf[buf_offset++]; +        } +        if (buf[buf_offset] == '\0') { +            done = 1; +        } else { +            buf_offset++; +            current[current_offset] = '\0'; +            input[i++] = atoi(current); +            length = i; +        } +    } +} + +int int_less(const void *a, const void *b) { +    return *(int *)a - *(int *)b; +} + +void sort_input() { +    qsort(input, length, sizeof(int), int_less); +} + +int bin_search(int small_pointer, int large_pointer) { +    int small = input[small_pointer]; +    int big = input[large_pointer]; +    int mid = (large_pointer + small_pointer) / 2; +    int sum = small + big + input[mid]; +    while (sum != 2020 && small_pointer < large_pointer) { +        if (sum > 2020) { +            large_pointer = mid - 1; +            mid = (large_pointer + small_pointer) / 2; +        } else { +            small_pointer = mid + 1; +            mid = (large_pointer + small_pointer) / 2; +        } +        sum = small + big + input[mid]; +    } + +    if (sum == 2020) { +        return mid; +    } else { +        return -1; +    } +} + +int search_2020() { +    int small_pointer = 0; +    int large_pointer = length - 1; +    int sum_small = input[small_pointer] + input[small_pointer + 1] + input[large_pointer]; +    int sum_large = input[small_pointer] + input[large_pointer] + input[large_pointer - 1]; +    int done = 0; +    int mid; +    while (sum_large != 2020 && sum_small != 2020 && small_pointer + 1 != large_pointer && !done) { +        if (sum_small > 2020) { +            large_pointer--; +        } else if (sum_large < 2020) { +            small_pointer++; +        } else { +            mid = bin_search(small_pointer, large_pointer); +            if (mid > 0) { +                done = 1; +            } else { +                mid = bin_search(small_pointer + 1, large_pointer); +                if (mid > 0) { +                    done = 1; +                } else { +                    mid = bin_search(small_pointer, large_pointer - 1); +                    if (mid > 0) { +                        done = 1; +                    } else { +                        small_pointer++; +                        large_pointer--; +                    } +                } +            } +        } + +        sum_small = input[small_pointer] + input[small_pointer + 1] + input[large_pointer]; +        sum_large = input[small_pointer] + input[large_pointer] + input[large_pointer - 1]; +    } +    return input[small_pointer] * input[large_pointer] * input[mid]; +} + +void print_input() { +    for (int i = 0; i < length; i++) { +        printf("%d\n", input[i]); +    } +} + +int main() { +    read_input(); +    parse_input();  +    sort_input(); +    printf("%d\n", search_2020()); +} + diff --git a/01/input.txt b/01/input.txt new file mode 100644 index 0000000..cebd722 --- /dev/null +++ b/01/input.txt @@ -0,0 +1,199 @@ +1732
 +1660
 +1658
 +1878
 +367
 +2010
 +1989
 +431
 +1946
 +1614
 +2003
 +945
 +1856
 +1934
 +1937
 +1781
 +1947
 +1991
 +1917
 +1604
 +1707
 +1966
 +1959
 +1182
 +1828
 +1880
 +1908
 +1942
 +1687
 +1611
 +1922
 +1913
 +1803
 +1976
 +1718
 +1885
 +1971
 +2000
 +1912
 +1981
 +1776
 +1901
 +1941
 +1935
 +1977
 +1907
 +1893
 +1898
 +1975
 +2001
 +1833
 +1951
 +1939
 +1988
 +1870
 +1985
 +1932
 +1930
 +1938
 +1926
 +1931
 +1982
 +76
 +1979
 +657
 +1872
 +1933
 +1961
 +1987
 +1998
 +1994
 +418
 +1914
 +1929
 +1810
 +2009
 +1712
 +830
 +1990
 +1900
 +1876
 +1753
 +1859
 +1965
 +1963
 +1905
 +1921
 +1685
 +1694
 +697
 +1899
 +1997
 +1964
 +1927
 +1952
 +1894
 +1960
 +1986
 +1883
 +1616
 +1993
 +1892
 +1943
 +2005
 +1995
 +1915
 +1663
 +1954
 +1902
 +1191
 +1948
 +1875
 +1850
 +1955
 +1962
 +1984
 +1957
 +1969
 +1887
 +1953
 +1786
 +1638
 +1909
 +1881
 +603
 +1973
 +1784
 +1869
 +1925
 +1968
 +1737
 +1807
 +1950
 +1992
 +1936
 +1918
 +1891
 +1897
 +1940
 +1919
 +1910
 +1862
 +1958
 +1832
 +1904
 +1791
 +1920
 +1874
 +1729
 +1643
 +2007
 +1871
 +1999
 +1584
 +1890
 +1924
 +1974
 +1701
 +1906
 +143
 +1725
 +1945
 +1783
 +1873
 +1903
 +167
 +1855
 +1633
 +1956
 +1996
 +1808
 +1884
 +1916
 +829
 +2002
 +1852
 +1835
 +1889
 +1983
 +1949
 +1970
 +1774
 +1764
 +1609
 +1882
 +1857
 +2004
 +1911
 +1896
 +1980
 +2006
 +1967
 +2008
 +1972
 +1648
 +1923
 +1978
 +1675
 +1831
  |