Rozpoznawanie fałd modów

18

Zadanie

Zdefiniuj mod-krotnie jako funkcję postaci f (x) = x% a 1  % a 2  %…% a k , gdzie a i są liczbami całkowitymi dodatnimi i k ≥ 0 . (Tutaj % jest operatorem modulo asocjacyjnym z lewej strony).

Biorąc pod uwagę listę n liczb całkowitych y 0 ,…, y n − 1 , określ, czy istnieje mod-krotnie f , aby każde y i  = f (i) .

Możesz wybrać i naprawić dowolne dwa wyjścia Y i N dla swojej funkcji / programu. Jeśli istnieje takie f , zawsze musisz zwrócić / wydrukować dokładnie Y ; Jeśli nie, należy zawsze powrócić / wydrukować dokładnie N . (Mogą to być true/ false, 1/ / 0, lub false/ true, itp.) Wspomnij o nich w swojej odpowiedzi.

Najkrótsze przesłanie w bajtach wygrywa.

Przykład

Zdefiniuj f (x) = x% 7% 3 . Jego wartości zaczynają się:

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

Zatem 0 1 2 0 1 2 0 0 1 2jako dane wejściowe do naszego rozwiązania wypisujemy Y , ponieważ f generuje tę sekwencję. Jednak 0 1 0 1 2jako dane wejściowe wypisujemy N , ponieważ żadne f nie generuje tej sekwencji.

Przypadki testowe

Wzory podane, gdy dane wyjściowe to Y, służą wyłącznie jako odniesienie; nie wolno ich w żadnym momencie drukować.

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)
Lynn
źródło
Czy są jakieś limity czasu lub pamięci?
Dennis
2
Czy zamiast tego mogę wyprowadzać prawdziwe wartości i wartości falsey?
Leaky Nun
2
@Leaky Wolałbym, żebyś nie. Nie jestem wielkim fanem prawdy-falsey; Wyraźnie próbuję to jako bardziej obiektywną alternatywę, która wciąż daje ci wolność.
Lynn
@ Lynn, czy to tylko ja, czy nadal tego nie naprawiłeś?
Leaky Nun
Odnośnie ograniczeń pamięci / czasu: nie sądzę, żebym dodał coś do samego wyzwania, ale mógłbym otrzymać nagrodę za najkrótszą odpowiedź w bajtach, która może odpowiedzieć na każdy z moich przypadków testowych w rozsądnym czasie.
Lynn

Odpowiedzi:

7

Pyth, 14 bajtów

}Qm%M+RdUQy_Sl

Powraca True/False. Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

}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 bajtów

q%M.e+k_tx0

Na podstawie pomysłu @ ferrsum . Właściwie myślałem o użyciu wskaźników zerowych do generowania podzbiorów, ale nie zdawałem sobie sprawy, że wszystkie wskaźniki zerowe muszą już być rozwiązaniem.

Jakube
źródło
4

Python 3, 239 218 bajtów

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)]

Anonimowa funkcja, która pobiera dane z listy zi zwraca TruelubFalse dla Yi N.

Używa to metody podobnej do @Jakube odpowiedź , a mimo to jest w istocie brute force, biegnie bardzo szybko.

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

Wypróbuj na Ideone

TheBikingViking
źródło
4

Python 2, 69 bajtów

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)

Wykorzystuje True/False .

Odpowiedź na to, co charakteryzuje serię składaną za pomocą modów, okazuje się mniej interesująca, niż się początkowo wydaje. Jest to szereg postaci 0, 1, ..., M - 1, 0, 1, ... x 1 , 0, 1, ..., x 2 , ... taki, że dla wszystkich i, 0 <= x i <M. Taka sekwencja może być wygenerowana przez łańcuch modów wszystkich (opartych na 0) indeksów zer w tablicy, z wyłączeniem pierwszego.

feersum
źródło
3

Galaretka , 19 15 14 bajtów

LṗLUZ’1¦%/sLe@

Zwraca 1 za prawdę, 0 za fałsz. Wypróbuj online!

Algorytmem jest O (n n ) , gdzie n jest długością listy, co powoduje, że jest ona zbyt wolna i wymaga dużej ilości pamięci dla większości przypadków testowych.

Zmodyfikowanej wersji - która zastępuje drugą Lliterą a 5- można użyć do weryfikacji wszystkich przypadków testowych . Pamiętaj, że ta zmodyfikowana wersja nie będzie działać na dowolnie długich listach.

Jak to działa

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.
Dennis
źródło
Czy możesz dodać wyjaśnienie? Jako ktoś, kto nie używał jeszcze Galaretki (jeszcze), nie mam pojęcia, jak to działa.
Steven H.,
Dodam jeden, jak tylko skończę grać w golfa. Jest jeszcze kilka rzeczy, które najpierw chcę wypróbować.
Dennis
(Zrezygnowałem i) dodałem wyjaśnienie.
Dennis
3

JavaScript (ES6), 98 bajtów

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

Zaoszczędzono 48 bajtów, przechodząc na odkrycie @ Feersum. Każda podana wartość nw tablicy jest równa zero, w którym to przypadku następna prognoza pwynosi 1, lub jest równa kolejnej prognozie, w którym pto przypadku jest zwiększana. Mierzymy również długość lsekwencji początkowej, porównując pdo i, ponieważ nzawsze musi być ona mniejsza niż lzawsze.

Neil
źródło
2

Python 2, 103 99 bajtów

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))

Drukuje 1 dla prawdy i 0 dla fałszu. Przetestuj na Ideone .

Dennis
źródło