Example #1
0
def main(verbose=False):
    data = [[int(entry) for entry in row.split(",")]
            for row in get_data(83).split("\n") if row]

    arranged_data = {}
    size = len(data)
    for i in range(size):
        for j in range(size):
            arranged_data[(i, j)] = data[i][j]

    MINIMUM = min(arranged_data.values())

    def heuristic(node):
        return (2 * size - 2 - sum(node)) * MINIMUM

    def adjacent(node):
        node_x, node_y = node
        return [(node_x + 1, node_y), (node_x - 1, node_y),
                (node_x, node_y + 1), (node_x, node_y - 1)]

    return astar(arranged_data,
                 (0, 0),
                 (size - 1, size - 1),
                 heuristic,
                 adjacent)
Example #2
0
def main(verbose=False):
    data = get_data(98)[1:-1].split('","')
    words = strings_by_length(data)

    max_len = int(sqrt(10)**max(words))
    squares = strings_by_length(
        [i**2 for i in range(1, int(sqrt(10)**max(words)))])

    max_val = 0
    for word_length in sorted(words.keys())[::-1]:
        total_words = len(words[word_length])
        for first in range(total_words - 1):
            for second in range(first + 1, total_words):
                first_word = words[word_length][first]
                second_word = words[word_length][second]
                # check anagrams
                if sorted(first_word) == sorted(second_word):
                    for square in squares[word_length]:
                        val, translation = same_signature(square, first_word)
                        if val:
                            translated = second_word
                            for letter, digit in translation:
                                translated = translated.replace(letter, digit)
                            new_number = int(translated)
                            if new_number in squares[word_length]:
                                to_add = max(square, new_number)
                                if to_add > max_val:
                                    max_val = to_add
        if max_val > 0:
            return max_val
    raise Exception("Program failed to find solution")
Example #3
0
def main(verbose=False):
    data = [get_points(line) for line in get_data(102).split("\n") if line]
    count = 0
    for points in data:
        if zero_in(points):
            count += 1
    return count
Example #4
0
def main(verbose=False):
    message = get_data(59).split(',')

    message = [int(char) for char in message]

    possible_keys = []
    for ascii1 in range(97, 123):
        for ascii2 in range(97, 123):
            for ascii3 in range(97, 123):
                possible_keys.append([ascii1, ascii2, ascii3])

    for key in possible_keys:
        curr = translate(message, key)
        if (curr.upper().find('THE') != -1
                and curr.upper().find('IS') != -1
                and curr.upper().find('AND') != -1
                and curr.upper().find('OF') != -1
                and curr.upper().find('ARE') != -1):
            break

    key_as_word = ''.join(chr(val) for val in key)
    result = '\n\nActual Message:\n%s\n\nThe key is: %s or %s.' % (
        curr, key_as_word, key)

    if verbose:
        return '%s%s' % (sum(ord(letter) for letter in curr), result)
    else:
        return sum(ord(letter) for letter in curr)
Example #5
0
def main(verbose=False):
    data = get_data(54)
    hands = [read_hand(row) for row in data.split("\n") if row]
    hands = [(top_cards(entry[0]), top_cards(entry[1])) for entry in hands]

    count = 0
    for hand in hands:
        if compare_hands(*hand) == 1:
            count += 1
    return count
Example #6
0
def num_triangle():
    # Assumes file is "A","ABILITIY","ABLE",...
    words = get_data(42).strip('"').split('","')
    vals = [word_to_value(word) for word in words]
    triangle_hash = {}
    count = 0
    for val in vals:
        if reverse_polygonal_number(3, val, triangle_hash) != -1:
            count += 1
    return count
Example #7
0
def main(verbose=False):
    data = [row.split(",") for row in get_data(99).split("\n") if row]

    max_val = -1
    winner = None
    for i, row in enumerate(data):
        log_val = int(row[1]) * log(int(row[0]))
        if log_val > max_val:
            max_val = log_val
            winner = i

    return winner + 1  # account for 0 vs. 1 initial index
Example #8
0
def main(verbose=False):
    data = [[int(dig) for dig in row] for row
            in get_data(79).split("\r\n") if row]

    all_values = list(set(reduce(operator.add, data)))
    for password in all_permutations(all_values):
        correct = True
        for left, middle, right in data:
            left_index = password.index(left)
            middle_index = password.index(middle)
            right_index = password.index(right)
            if not (left_index < middle_index < right_index):
                correct = False
                break
        if correct:
            break
    if not correct:
        raise Exception("No match found")
    return ''.join(str(key) for key in password)
Example #9
0
def main(verbose=False):
    data = [row.split(',') for row in get_data(107).split('\r\n') if row]

    adjacency = {}
    size = len(data)
    network_sum = 0
    # UNDIRECTED
    for node in range(size - 1):
        for dest in range(node + 1, size):
            if data[node][dest] != '-':
                value = int(data[node][dest])
                network_sum += value
                # sets value to [] if not set, returns value at key
                adjacency.setdefault(node, []).append((dest, value))
                adjacency.setdefault(dest, []).append((node, value))

    _, min_sum = prims_algo(adjacency)

    return network_sum - min_sum
Example #10
0
def main(verbose=False):
    DATA = get_data(11)
    DATA = [[int(entry) for entry in row.split()]
            for row in DATA.split("\n") if row]

    # UP/DOWN goes from DATA[x][y] to DATA[x+3][y] where 0 <= x, x+3, y <= 19
    vert = max(convert(make_path((x, y), (1, 0), 4), DATA) for x
               in range(0, 16 + 1) for y in range(19 + 1))

    # LEFT/RIGHT goes from DATA[x][y] to DATA[x][y+3] where 0 <= x, y, y+3 <= 19
    horiz = max(convert(make_path((x, y), (0, 1), 4), DATA) for x
                in range(0, 19 + 1) for y in range(16 + 1))

    # DIAGONAL L->R goes from DATA[x][y] to DATA[x+3][y+3] via +[1,1]
    diag_l_r = max(convert(make_path((x, y), (1, 1), 4), DATA) for x
                   in range(0, 16 + 1) for y in range(16 + 1))

    # DIAGONAL R->L goes from DATA[x][y] to DATA[x-3][y+3] via +[-1,1]
    diag_r_l = max(convert(make_path((x, y), (-1, 1), 4), DATA) for x
                   in range(3, 19 + 1) for y in range(16 + 1))

    return max(vert, horiz, diag_l_r, diag_r_l)
Example #11
0
def main(verbose=False):
    number = get_data(13)
    total = sum(int(line) for line in number.split("\n") if line)
    return str(total)[:10]
Example #12
0
def main(verbose=False):
    data = [[int(entry) for entry in row.split(",")]
            for row in get_data(82).split("\n") if row]

    return column_by_column(data)
Example #13
0
def main(verbose=False):
    triangle = get_data(18).strip()
    TRIANGLE_MAT = [[int(elt) for elt in line.split()]
                    for line in triangle.split("\n") if line]

    return max_sum(TRIANGLE_MAT)
Example #14
0
def main(verbose=False):
    data = [num for num in get_data(89).split("\n") if num]
    original_digits = len("".join(data))
    best = [to_roman(actual(numeral)) for numeral in data]
    return original_digits - len("".join(best))
Example #15
0
def main(verbose=False):
    puzzles = get_data(96).split("\n")
    puzzles = [reduce(operator.add, puzzles[10 * index + 1:10 * index + 10])
               for index in range(50)]
    return sum(corner_sum(puzzle) for puzzle in puzzles)
Example #16
0
def main(verbose=False):
    # The name file is a comma separated file with quotes
    names = sorted(get_data(22).strip('"').split('","'))
    return sum((i + 1)*name_score(name) for i, name in enumerate(names))
Example #17
0
def main(verbose=False):
    n = int("".join(line.strip() for line in get_data(8).split("\n")))

    return max(product_consec_digits(n, 5))