Riconosci le mod-fold


18

Compito

Definire una mod-fold in funzione della forma f (x) = x% a 1  % a 2  % ...% a k , dove a i sono numeri interi positivi e k ≥ 0 . (Qui % è l'operatore modulo associativo di sinistra.)

Dato un elenco di n numeri interi y 0 ,…, y n − 1 , determinare se esiste una mod-fold f in modo che ogni y i  = f (i) .

È possibile scegliere e correggere due uscite Y e N per la propria funzione / programma. Se esiste una tale f , devi sempre restituire / stampare esattamente Y ; in caso contrario, si deve sempre tornare / stampare esattamente N . (Questi potrebbero essere true/ false, o 1/ 0, o false/ true, ecc.) Menzionali nella tua risposta.

Vince l'invio più breve in byte.

Esempio

Definisci f (x) = x% 7% 3 . I suoi valori iniziano:

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

Quindi, dato 0 1 2 0 1 2 0 0 1 2come input per la nostra soluzione, stamperemmo Y , poiché questa f genera quella sequenza. Tuttavia, dato 0 1 0 1 2come input, stamperemmo N , poiché nessuna f genera quella sequenza.

Casi test

Le formule fornite quando l'output è Y sono solo per riferimento; non devi mai stamparli.

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)

Ci sono limiti di tempo o di memoria?
Dennis,

2
Posso invece generare valori di verità e valori di falsità?
Leaky Nun,

2
@Leaky Preferirei di no. Non sono un grande fan di verità-falsità; Sto provando esplicitamente questo come un'alternativa più obiettiva che ti dà ancora libertà.
Lynn,

@Lynn sono solo io o non l'hai ancora risolto?
Leaky Nun,

Per quanto riguarda i limiti di memoria / tempo: non credo che aggiungerò alcunché alla sfida stessa, ma potrei eseguire una taglia per la risposta più breve in byte che può rispondere a ciascuno dei miei casi di test in un periodo di tempo ragionevole.
Lynn,

Risposte:


7

Pyth, 14 byte

}Qm%M+RdUQy_Sl

Ritorni True/False. Provalo online: Dimostrazione o Test Suite

Spiegazione:

}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 byte

q%M.e+k_tx0

Basato sull'idea di @ ferrsum . In realtà ho pensato di utilizzare gli indici zero per la generazione del sottoinsieme, ma non ho realizzato che tutti gli indici zero devono essere già la soluzione.


4

Python 3, 239 218 byte

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

Una funzione anonima che accetta input di un elenco ze restituisce Trueo Falseper Ye N.

Questo utilizza un metodo simile a 's @Jakube risposta , e anche se è essenzialmente una forza bruta, corre molto rapidamente.

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

Provalo su Ideone


4

Python 2, 69 byte

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)

Usi True/ False.

La risposta a ciò che caratterizza una serie mod-pieghevole risulta essere meno interessante di quanto sembri inizialmente. È una serie del modulo 0, 1, ..., M - 1, 0, 1, ... x 1 , 0, 1, ..., x 2 , ... tale che per tutti i, 0 <= x i <M. Tale sequenza può essere prodotta dalla catena mod di tutti gli indici (basati su 0) degli zero nella matrice, escluso il primo.


3

Gelatina , 19 15 14 byte

LṗLUZ’1¦%/sLe@

Restituisce 1 per verità, 0 per falsa. Provalo online!

L'algoritmo è O (n n ) , dove n è la lunghezza dell'elenco, rendendolo troppo lento e dispendioso in termini di memoria per la maggior parte dei casi di test.

Una versione modificata, che sostituisce la seconda Lcon a 5, può essere utilizzata per verificare tutti i casi di test . Si noti che questa versione modificata non funzionerà per elenchi arbitrariamente lunghi.

Come funziona

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.

Puoi aggiungere una spiegazione? Come qualcuno che non ha ancora usato Jelly, non ho idea di come funzioni.
Steven H.

Ne aggiungerò uno non appena avrò finito di giocare a golf. Ci sono ancora alcune cose che voglio provare prima.
Dennis,

Ho (rinunciato e) aggiunto una spiegazione.
Dennis,

3

JavaScript (ES6), 98 byte

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

48 byte salvati passando alla scoperta di @ Feersum. Qualsiasi valore dato nnell'array è zero, nel qual caso la previsione successiva pè 1 oppure è uguale alla previsione successiva, nel qual caso pviene incrementata. Misuriamo anche la lunghezza ldella sequenza iniziale confrontandola pcon i, poiché ndeve essere sempre inferiore rispetto la sempre.


2

Python 2, 103 99 byte

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

Stampa 1 per verità e 0 per falsità. Provalo su Ideone .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.