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)

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.


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


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.


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.

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.


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.