Palíndromos sin prefijo

8

Escriba un programa o función que tome N y S y genere el número de palíndromos de longitud S que puede construir utilizando un alfabeto de tamaño N de manera que cualquier prefijo de tamaño entre 2 y S-1 no sea un palíndromo.

Por ejemplo, si N fuera 2 y S fuera 5

Los palíndromos válidos serían

01110
10001

Y así la respuesta sería 2

Este es un por lo que las respuestas se puntuarán en bytes en función de su longitud, siendo mejores menos bytes.

usuario77149
fuente
2
Bienvenido a PPCG! A pesar de su formato lacónico, esto parece un desafío válido, siempre que no sea un engaño ni una pregunta elegida en otro lugar sin permiso. Como mínimo, deberá agregar un criterio objetivo primario ganador , como el código golf . Recomiendo agregar algunos ejemplos y casos de prueba también.
Arnauld
@Arnauld Es posible que cambiemos una pregunta fuera del tema a un desafío válido (ais523 lo hizo varias veces), pero en ese caso obviamente no es lo que quiere el OP. No dolerá de todos modos.
usuario202729
el resultado no es infinito? para N> = 2: 01111111111111111111111111..0es un palíndromo tal que cualquier prefijo no es un palíndromo
Nahuel Fouilleul
@NahuelFouilleul de longitud S.
usuario202729
1
@ user77149 Si lo pregunta aquí, obtendrá respuestas como "Jelly, 15 bytes: ¡ Pruébelo en línea! "
user202729

Respuestas:

1

Pyth , 16 bytes

lf!tit_IM._T2^SE

Pruébalo aquí!

Mi respuesta está de acuerdo con los resultados de Dennis , en lugar de las respuestas de Haskell y Python.

Cómo funciona

lf! tit_IM._T2 ^ SE | Programa completo

              SE | Tome la segunda entrada (E), haga un rango entero de 1 ... E.
             ^ | Y tome el Qth Cartesian Power, donde Q es la primera entrada.
 f | Filtre por una condición que use T como variable.
         ._T | Toma todos los prefijos de T ...
      _IM | Y para cada prefijo, verifique si son invariantes sobre la inversión.
     t | Toma la cola (quita el primer elemento).
    i 2 | Convierte de base 2 a entero.
  ! t | Decremento, negar. Tenga en cuenta que entre los enteros, solo 0 es falso.
l | Tome la longitud de la lista filtrada.
Sr. Xcoder
fuente
1

Casco , 19 bytes

Lf(=1ḋ↔mS=↔‼hU¡h)πŀ

¡Pruébelo en línea o vea las soluciones!

Explicación

Lf(=1ḋ↔mS=↔‼hU¡h)πŀ  -- takes two arguments N S, example: 2 4
                  ŀ  -- range [0..N-1]: [0,1]
                 π   -- all strings of length S: [[[0,0,0,0],[0,0,0,1],…,[1,1,1,1]]
 f(             )    -- filter with the following predicate (example with [0,1,1,0]):
              ¡h     --   infinitely times take the head & accumulate in list: [[0,1,1,0],[0,1,1],[0,1],[0],[],[],…
             U       --   only keep longest prefix with unique elements: [[0,1,1,0],[0,1,1],[0,1],[0],[]]
           ‼h        --   get rid of last two (apply twice head): [[0,1,1,0],[0,1,1],[0,1]]
       m             --   map the following
        S=           --     is itself equal to..
          ↔          --     .. itself reversed?
                     --   ↳ [1,0,0]
      ↔              --   reverse: [0,0,1]
     ḋ               --   convert from binary: 1
   =1                --   is it equal to 1: 1
                     -- ↳ [[1,0,0,1],[0,1,1,0]]
L                    -- length: 2
ბიმო
fuente
0

Limpio , 129 bytes

import StdEnv,StdLib
?l=l==reverse l
@n s=sum[1\\p<-iter s(\a=[[e:b]\\e<-[1..n],b<-a])[[]]|and[?p:[not(?q)\\q<-inits p%(2,s-1)]]]

Pruébalo en línea!

Οurous
fuente