Распознать мод-фолды


18

задача

Определите mod-fold как функцию вида f (x) = x% a 1  % a 2  %…% a k , где a a i - положительные целые числа, а k ≥ 0 . (Здесь % - левоассоциативный оператор по модулю.)

Учитывая список из n целых чисел y 0 ,…, y n − 1 , определите, существует ли мод-фолд f так, чтобы каждый y i  = f (i) .

Вы можете выбрать и исправить любые два выхода Y и N для вашей функции / программы. Если существует такое f , вы всегда должны возвращать / печатать точно Y ; если нет, то вы всегда должны вернуться / печатать точно N . (Это могут быть true/ false, или 1/ 0или false/ trueи т. Д.) Упомяните это в своем ответе.

Самая короткая подача в байтах побеждает.

пример

Определить f (x) = x% 7% 3 . Его значения начинаются:

|   x  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ...
| f(x) | 0 | 1 | 2 | 0 | 1 | 2 | 0 | 0 | 1 | 2 | ...

Таким образом, в 0 1 2 0 1 2 0 0 1 2качестве входных данных для нашего решения мы напечатали бы Y , так как этот f генерирует эту последовательность. Однако, учитывая в 0 1 0 1 2качестве входных данных, мы напечатали бы N , так как никакой f не генерирует эту последовательность.

Контрольные примеры

Формулы, заданные, когда вывод Y , просто для справки; Вы не должны ни в коем случае печатать их.

0 1 2 3 4 5              Y    (x)
1                        N
0 0 0                    Y    (x%1)
0 1 2 0 1 2 0 0 1 2      Y    (x%7%3)
0 0 1                    N
0 1 2 3 4 5 6 0 0 1 2    Y    (x%8%7)
0 1 2 0 1 2 0 1 2 3      N
0 2 1 0 2 1 0 2 1        N
0 1 0 0 0 1 0 0 0 0 1    Y    (x%9%4%3%2)

Есть ли ограничения по времени или памяти?
Деннис

2
Могу ли я вместо этого выводить истинные значения и ложные значения?
Утренняя монахиня

2
@ Лики, я бы предпочел, чтобы ты не Я не большой поклонник правды-фальси; Я явно пробую это как более объективную альтернативу, которая все еще дает вам свободу.
Линн

@ Линн, это только я или ты все еще не исправил это?
Дрянная Монахиня

Что касается ограничений памяти / времени: я не думаю, что добавлю что-либо к самому вызову, но я мог бы запустить вознаграждение за самый короткий ответ в байтах, который может ответить на каждый из моих тестовых случаев в течение некоторого разумного промежутка времени.
Линн

Ответы:


7

Pyth, 14 байт

}Qm%M+RdUQy_Sl

Возвращает True/False. Попробуйте онлайн: демонстрация или тестовый набор

Объяснение:

}Qm%M+RdUQy_SlQ   implicit Q (=input) at the end
             lQ   length of input list
            S     create the list [1, 2, ..., len]
           _      reverse => [len, ..., 2, 1]
          y       generate all subsets (these are all possible mod-folds)
  m               map each subset d to:
        UQ           take the range [0, 1, ..., len-1]
     +Rd             transform each number into a list by prepending it to d
                     e.g. if mod-fold = [7,3], than it creates:
                        [[0,7,3], [1,7,3], [2,7,3], [3,7,3], ...]
   %M                fold each list by the modulo operator
                  this gives all possible truthy sequences of length len
}Q                so checking if Q appears in the list returns True or False

Pyth, 11 байт

q%M.e+k_tx0

Основано на идее @ ferrsum . Я действительно думал об использовании нулевых индексов для генерации подмножества, но не понимал, что все нулевые индексы уже должны быть решением.


4

Python 3, 239 218 байт

from itertools import*
lambda z:z in[[eval(''.join([str(l)]+['%'+str(i[::-1][k])for k in range(len(i))]))for l in range(len(z))]for i in(i for j in(combinations(range(1,len(z)+1),i+1)for i in range(len(z)))for i in j)]

Анонимная функция, которая принимает ввод списка zи возвращает Trueили Falseдля Yи N.

При этом используется метод , аналогичный @Jakube «s ответ , и , хотя это, по существу , грубая сила, работает очень быстро.

from itertools import*               Import everything from the Python module for
                                     iterable generation
lambda z                             Anonymous function with input list z
combinations(range(1,len(z)+1),i+1)  Yield all sorted i+1 length subsets of the range
                                     [1,len(z)]...
...for i in range(len(z))            ...for all possible subset lengths
(i for j in(...)for i in j)          Flatten, yielding an iterator containing all possible
                                     mod-fold values as separate lists
...for i in...                       For all possible mod-fold values...
...for k in range(len(i))            ...for all mod-fold values indices k...
...for l in range(len(z))            ...for all function domain values in [0,len(z)-1]...
[str(l)]+['%'+str(i[::-1][k])...]    ...create a list containing each character of the
                                     expression representing the function defined by the
                                     mod-fold values (reversed such that the divisors
                                     decrease in magnitude) applied to the domain value...
 eval(''.join(...))                  ...concatenate to string and evaluate...
 [...]                               ...and pack all the values for that particular
                                     function as a list
 [...]                               Pack all lists representing all functions into a list
 ...:z in...                         If z is in this list, it must be a valid mod-fold, so
                                     return True. Else, return False

Попробуйте это на Ideone


4

Python 2, 69 байт

f=lambda a,i=0:i/len(a)or a[i]in[a[i-1]+1,i,0][i<=max(a)::2]*f(a,i+1)

Использует True/ False.

Ответ на то, что характеризует серию складных модов, оказывается менее интересным, чем кажется на первый взгляд. Это серия вида 0, 1, ..., M - 1, 0, 1, ... x 1 , 0, 1, ..., x 2 , ... такая, что для всех i, 0 <= x i <M. Такая последовательность может быть получена цепочкой мод всех индексов (основанных на 0) нулей в массиве, за исключением первого.


3

Желе , 19 15 14 байт

LṗLUZ’1¦%/sLe@

Возвращает 1 для правдивых, 0 для ложных. Попробуйте онлайн!

Алгоритм O (n n ) , где n - длина списка, что делает его слишком медленным и требующим большого объема памяти для большинства тестовых случаев.

Модифицированная версия, которая заменяет вторую Lна 5-, может использоваться для проверки всех тестовых случаев . Обратите внимание, что эта измененная версия не будет работать для произвольно длинных списков.

Как это устроено

LṗLUZ’1¦%/sLe@  Main link. Argument: A (array of integers)

L L             Yield the length l of A.
 ṗ              Take the l-th Cartesian power of [1, ..., l], i.e., construct
                all arrays of length l that consist of elements of [1, ..., l].
   U            Upend/reverse each array. This way, the first l arrays start
                with [1, ..., l], as do the next l arrays, etc.
    Z           Zip/transpose the array of arrays.
     ’1¦        Decrement the first array to map [1, ..., l] to [0, ..., l - 1].
        %/      Reduce the array's columns by modulus/residue.
          sL    Split the result into chunks of length l.
            e@  Verify if A belongs to the resulting array.

Можете ли вы добавить объяснение? Как человек, который еще не использовал Jelly (я), я понятия не имею, как это работает.
Стивен Х.

Я добавлю один, как только я закончу играть в гольф. Есть еще несколько вещей, которые я хочу попробовать в первую очередь.
Деннис

Я (сдался и) добавил объяснение.
Деннис

3

JavaScript (ES6), 98 байт

a=>a.every((n,i)=>n?n<(l+=p==i)&&n==p++:p=1,l=p=1)

Сэкономили 48 байт, переключившись на открытие @ Feersum. Любое заданное значение nв массиве либо равно нулю, в этом случае следующий прогноз pравен 1, либо равно следующему прогнозу, и в этом случае pувеличивается. Мы также измеряем длину lисходной последовательности, сравнивая pс i, поскольку nвсегда должно быть меньше, чем lза все время.


2

Python 2, 103 99 байт

f=lambda l,r:r==x or l and f(l-1,[t%l for t in r])|f(l-1,r)
x=input();l=len(x);print+f(l,range(l))

Отпечатки 1 для правдивых и 0 для ложных. Проверьте это на Ideone .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.