Розпізнайте складки мод


18

Завдання

Визначте мод-складку як функцію виду f (x) = x% a 1  % a 2  %…% a k , де 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
Чи можу я замість цього вивести триєдні значення та значення фальси?
Leaky Nun

2
@Laaky Я вважаю, що ти не хочеш. Я не великий фанат триут-фальси; Я явно намагаюся це зробити як більш об'єктивну альтернативу, яка все ще дає вам свободу.
Лінн

@Lynn це тільки я, або ти все ще не виправив це?
Leaky Nun

Щодо обмежень щодо пам’яті / часу: я не думаю, що я додаватиму жодний виклик самому виклику, але я можу заробити щедрістю за найкоротшу відповідь у байтах, яка може відповісти на кожен мій тестовий випадок у певний розумний проміжок часу.
Лінн

Відповіді:


7

Піт, 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, ..., М - 1, 0, 1, ... х 1 , 0, 1, ..., х 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 для falsy. Перевірте це на Ideone .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.