3912 - PermPrimeVec

From Bitnami MediaWiki

Cerința[edit | edit source]

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[edit | edit source]

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

Date de ieșire[edit | edit source]

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[edit | edit source]

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

Exemplu 1[edit | edit source]

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[edit | edit source]

<syntaxhighlight lang="python" line> 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()

</syntaxhighlight>