3912 - PermPrimeVec

De la Universitas MediaWiki

Cerința

Se dă o mulțime cu n elemente, numere naturale. Afișați în ordine lexicografică toate permutările mulțimii date în care nu există două elemente prime alăturate.

Date de intrare

Programul citește de la tastatură numărul n și apoi n numere naturale, reprezentând elementele mulțimii.

Date de ieșire

Programul va afișa pe ecran permutările cerute, câte una pe fiecare rând și având elementele separate prin câte un spaţiu.

Restricții și precizări

  • 1 < n ≤ 11
  • numărul valorilor prime din șir va fi aproximativ egal cu cel al valorilor neprime

Exemplu 1

Intrare

5
9 7 1 2 3

Iesire

2 1 3 9 7
2 1 7 9 3
2 9 3 1 7
2 9 7 1 3
3 1 2 9 7
3 1 7 9 2
3 9 2 1 7
3 9 7 1 2
7 1 2 9 3
7 1 3 9 2
7 9 2 1 3
7 9 3 1 2

Rezolvare

import itertools


def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True


def read_input():
    n = int(input().strip())
    elements = list(map(int, input().strip().split()))
    return n, elements


def write_output(permutations):
    for perm in permutations:
        print(" ".join(map(str, perm)))


def has_no_consecutive_primes(perm):
    for i in range(len(perm) - 1):
        if is_prime(perm[i]) and is_prime(perm[i + 1]):
            return False
    return True


def generate_permutations(n, elements):
    all_permutations = sorted(itertools.permutations(elements))
    valid_permutations = [perm for perm in all_permutations if has_no_consecutive_primes(perm)]
    return valid_permutations


def main():
    n, elements = read_input()

    if not (1 < n <= 11):
        raise ValueError("n trebuie să fie între 1 și 11")

    if len(elements) != n:
        raise ValueError("Numărul de elemente trebuie să fie egal cu n.")

    permutations = generate_permutations(n, elements)
    write_output(permutations)


if __name__ == '__main__':
    main()