Answer

JavaScript

const seriesTypes = {
    arithmetic: 'arithmetic',
    geometric: 'geometric'
}

/**
 * Get the type of series, either arithmetic or geometric
 * @param {number[]} sequence The sequence to find the type of
 * @returns {string|null} the type of series
 */
function getSeriesType(sequence) {
    if (sequence.length < 3) throw new Error("Sequence is not long enough, 3 items required. Found: " + sequence.length);

    const differences = new Set();
    const ratios = new Set();

    for (let i = 1; i < sequence.length; i++) {
        const difference = sequence[i] - sequence[i - 1]; // a arthimetic series will only have one difference between all numbers exp: 2, 4, 6, 8 (diff: 2)
        const ratio = sequence[i] / sequence[i - 1]; // For this, the ratio is the same, exp: 4, 16, 64 (ratio: 4)

        // store each value found then in set, a set can only have one unique value, so if there is anymore its not that series type
        differences.add(difference);
        ratios.add(ratio);
    }

    if (differences.size === 1) return seriesTypes.arithmetic;
    if (ratios.size === 1) return seriesTypes.geometric;

    return null;
}

/**
 * Find the nth term in a geometric or arithmetic sequence
 * @param {number[]} sequence The sequence to find the nth term in
 * @param {number} n The nth term to find
 * @returns {number|null} the nth term of the series
 */
function findNthTermInSequence(sequence, n) {
    const type = getSeriesType(sequence);
    if (type === seriesTypes.arithmetic) {
        const difference = sequence[1] - sequence[0];
        return sequence[sequence.length - 1] + difference * (n - sequence.length);
    } else if (type === seriesTypes.geometric) {
        const ratio = sequence[1] / sequence[0];
        return sequence[sequence.length - 1] * Math.pow(ratio, n - sequence.length);
    } else {
        throw new Error("Unsupported series type")
    }
}

Python Equivalent

from typing import List, Union

def get_series_type(sequence: List[int]) -> Union[str, None]:
    if len(sequence) < 3:
        raise ValueError("Sequence is not long enough, 3 items required. Found: " + str(len(sequence)))

    differences = set()
    ratios = set()

    for i in range(1, len(sequence)):
        difference = sequence[i] - sequence[i - 1]
        ratio = sequence[i] / sequence[i - 1]

        differences.add(difference)
        ratios.add(ratio)

    if len(differences) == 1:
        return "arithmetic"
    if len(ratios) == 1:
        return "geometric"

    return None

def find_nth_term_in_sequence(sequence: List[int], n: int) -> Union[int, None]:
    series_type = get_series_type(sequence)
    if series_type == "arithmetic":
        difference = sequence[1] - sequence[0]
        return sequence[-1] + difference * (n - len(sequence))
    elif series_type == "geometric":
        ratio = sequence[1] / sequence[0]
        return sequence[-1] * ratio ** (n - len(sequence))
    else:
        raise ValueError("Unsupported series type")

print(find_nth_term_in_sequence([3, 6, 9], 4))  # 12