Reconocer pliegues mod


18

Tarea

Defina un pliegue mod en función de la forma f (x) = x% a 1  % a 2  %…% a k , donde a i son enteros positivos yk ≥ 0 . (Aquí, % es el operador de módulo asociativo a la izquierda).

Dada una lista de n enteros y 0 , ..., y n − 1 , determine si existe un pliegue mod f para que cada y i  = f (i) .

Puede elegir y corregir dos salidas Y y N para su función / programa. Si existe tal f , siempre debe devolver / imprimir exactamente Y ; si no, siempre hay que volver / imprimir exactamente N . (Estos podrían ser true/ false, o 1/ 0, o false/ true, etc.) Mencione estos en su respuesta.

La presentación más corta en bytes gana.

Ejemplo

Definir f (x) = x% 7% 3 . Sus valores comienzan:

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

Por lo tanto, dado 0 1 2 0 1 2 0 0 1 2como entrada a nuestra solución, imprimiríamos Y , ya que esta f genera esa secuencia. Sin embargo, dado 0 1 0 1 2como entrada, imprimiríamos N , ya que no f genera esa secuencia.

Casos de prueba

Las fórmulas dadas cuando la salida es Y son solo para referencia; en ningún momento debe imprimirlos.

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)

¿Hay algún límite de tiempo o memoria?
Dennis

2
¿Puedo generar valores verdaderos y valores falsey en su lugar?
Leaky Nun

2
@Leaky Prefiero que no lo hagas. No soy un gran admirador de la verdad-falsey; Estoy intentando explícitamente esto como una alternativa más objetiva que aún te da libertad.
Lynn

@ Lynn, ¿soy yo o todavía no lo has solucionado?
Leaky Nun

Con respecto a las limitaciones de memoria / tiempo: no creo que agregue ninguna al desafío en sí, pero podría ejecutar una recompensa por la respuesta más corta en bytes que pueda responder a cada uno de mis casos de prueba en un período de tiempo razonable.
Lynn

Respuestas:


7

Pyth, 14 bytes

}Qm%M+RdUQy_Sl

Las devoluciones True/False. Pruébelo en línea: Demostración o conjunto de pruebas

Explicación:

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

q%M.e+k_tx0

Basado en la idea de @ ferrsum . De hecho, pensé en usar los índices cero para la generación de subconjuntos, pero no me di cuenta de que todos los índices cero ya deben ser la solución.


4

Python 3, 239 218 bytes

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 función anónima que toma la entrada de una lista zy devuelve Trueo Falsepara Yy N.

Esto utiliza un método similar a la respuesta de @Jakube y, aunque es esencialmente una fuerza bruta, se ejecuta muy rápidamente.

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

Pruébalo en Ideone


4

Python 2, 69 bytes

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)

Usos True/ False.

La respuesta a lo que caracteriza a una serie plegable mod resulta ser menos interesante de lo que parece al principio. Es una serie de la forma 0, 1, ..., M - 1, 0, 1, ... x 1 , 0, 1, ..., x 2 , ... de modo que para todo i, 0 <= x i <M. Dicha secuencia puede ser producida por la cadena de modulación de todos los índices (basados ​​en 0) de los ceros en la matriz, excluyendo el primero.


3

Jalea , 19 15 14 bytes

LṗLUZ’1¦%/sLe@

Devuelve 1 para la verdad, 0 para la falsedad. Pruébalo en línea!

El algoritmo es O (n n ) , donde n es la longitud de la lista, por lo que es demasiado lenta y requiere mucha memoria para la mayoría de los casos de prueba.

Se puede usar una versión modificada, que reemplaza la segunda Lcon a 5, para verificar todos los casos de prueba . Tenga en cuenta que esta versión modificada no funcionará para listas arbitrariamente largas.

Cómo funciona

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.

¿Puedes agregar una explicación? Como alguien que no ha usado Jelly (todavía), no tengo idea de cómo funciona.
Steven H.

Agregaré uno tan pronto como termine de jugar al golf. Todavía hay algunas cosas que quiero probar primero.
Dennis

He renunciado y he añadido una explicación.
Dennis

3

JavaScript (ES6), 98 bytes

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

Ahorró 48 bytes al cambiar al descubrimiento de @ Feersum. Cualquier valor dado nen la matriz es cero, en cuyo caso la próxima predicción pes 1, o es igual a la siguiente predicción, en cuyo caso pse incrementa. También medimos la longitud lde la secuencia inicial mediante la comparación pde i, como ndebe ser siempre menor que len todo momento.


2

Python 2, 103 99 bytes

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

Imprime 1 para la verdad y 0 para la falsedad. Pruébalo en Ideone .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.