Формируйте список, используя простые числа

10

Вам подарили N кучек монет. Вы решили разделить каждую из этих куч B 1 , B 2 , ..., B N на отдельные группы людей. Количество людей, получающих монеты, должно быть простым числом, а сумма денег, предоставляемая каждому человеку, должна быть разной в каждой стопке.

Ввод: N, B 1 , B 2 , ..., B N (количество монет в каждой отдельной стопке).

Вывод: NP 1 , NP 2 , ..., NP N, где NP - количество людей (простое число), получающих монеты. Если это невозможно , то выход какой - то недостижимый результат (например 0, -1, None, []или "impossible") или вызвать ошибку.

Пример:

3
7 8 9

Вывод: 7 2 3

Поскольку 7 - единственное простое число, которое может делить 7 равномерно, то же самое для 8 и 2 и 9 и 3. Также обратите внимание, что (7/7 = 1) ≠ (8/2 = 4) ≠ (9/3 = 3 ).

McLinux
источник
2
Nявляется избыточным входом, можем ли мы отказаться от него?
Джонатан Аллан
Можем ли мы дать какой-то другой недостижимый результат (например 0, пустой список, строку типа «невозможно» или вызвать ошибку) для невозможных случаев? (На самом деле я бы рекомендовал только допустимый ввод или разрешать неопределенное поведение в таких случаях, но это зависит от вас.)
Джонатан Аллан
2
Вы можете отказаться от ввода N. И да ко второму вопросу.
McLinux
Итак, самый низкий простой делитель каждого числа?
полностью человек
@totallyhuman не совсем - если на входе было сказать , [7,8,8]что было бы невозможно (с использованием 2обоих 8результатов в двух 4с.) Кроме того, если на входе было сказать [7,30,30]тогда [7,2,2]будет недействительным , но [7,2,3]и [7,3,2]среди других будет работать.
Джонатан Аллан

Ответы:

5

05AB1E , 13 байтов

Ò.»â€˜ʒ÷DÙQ}θ

Попробуйте онлайн!

Порт моего Pyth ответа.

  • Òполучает простой факт ö RS каждые.
  • складывает двоичную команду, â(C â rtesi â п продукта) между каждыми двумя элементами в списке справа налево с противоположными вправо / влево операндов.
  • €˜выравнивает ач.
  • ʒ...}FiLt ʒ RS те , которые удовлетворяют следующему условию:
    • ÷ парное целочисленное деление со входом.
    • D D дубликат (помещает две копии предмета в стопку).
    • Ùудаляет повторяющиеся элементы, сохраняя ˙U niq ˙U е вхождение каждого элемента.
    • Qпроверяет й Q uality.
  • θ получает последний элемент.
Мистер Xcoder
источник
4

Желе ,  15  14 байт

³:ŒQẠ
ÆfŒpÇÐfṪ

Полная программа, которая принимает один аргумент, список чисел и печатает представление другого списка чисел, или 0если задача невозможна.

Попробуйте онлайн!

Как?

³:ŒQẠ - Link 1, unique after division?: list of primes, Ps   e.g. [7,2,2]  or  [7,3,3]
³     - program's first input                                e.g. [7,8,8]  or  [7,9,30]
 :    - integer division by Ps                                    [1,4,4]      [1,3,10]
  ŒQ  - distinct sieve                                            [1,1,0]      [1,1,1]
    Ạ - all truthy?                                               0            1

ÆfŒpÇÐfṪ - Main link: list of coin stack sizes, Bs   e.g. [7,8,12]
Æf       - prime factorisation (vectorises)               [[7],[2,2,2],[2,2,3]]
  Œp     - Cartesian product                              [[7,2,2],[7,2,2],[7,2,3],[7,2,2],[7,2,2],[7,2,3],[7,2,2],[7,2,2],[7,2,3]]
     Ðf  - filter keep if:
    Ç    -   call last link (1) as a monad                 1       1       0       1       1       0       1       1       0
         -                                                [[7,2,2],[7,2,2],[7,2,2],[7,2,2],[7,2,2],[7,2,2]]
       Ṫ - tail (note: tailing an empty list yields 0)    [7,2,2]
         - implicit print
Джонатан Аллан
источник
+1 Ха-ха, я думаю, µ⁼Qэто подойдет в качестве альтернативы необычному, но отличному сито!
г-н Xcoder
2

Pyth , 15 байт

ef{I/VQT.nM*FPM

Попробуй это здесь!

Как?

ef {I / VQT.nM * FPM | Полная программа, которая отказывается от размера.
                |
             PM | Первичная факторизация каждого целого числа.
           * F | Сложите декартово произведение над списком простых чисел.
        .nM | Свести каждого.
 f | Фильтр.
  {I / VQT | Условие фильтра (использует переменную T).
    / V | Векторизованное целочисленное деление ...
      QT | За вход и текущий элемент.
  {Я | Является ли инвариант над дедупликацией (удаление дубликатов)?
е | Возьмите последний элемент.
                | Выведите результат неявно.
Мистер Xcoder
источник