Ante el rumor de que Codegolf tendrá un torneo Rock-Paper-Scissors , investigará el tema de las palabras sin cuadrados . Una palabra hecha de las cartas R
, P
, S
es cuadrada libre si no contiene una secuencia que se repite dos veces. Es decir, la palabra no se puede escribir como
a x x b
donde a
y b
son palabras de cualquier longitud y x
es una palabra de longitud al menos uno, todos hechos de las letras R
, P
, S
.
Tarea
Escribir un programa que genera los libre de cuadrados palabras de las letras R
, P
, S
de la longitud n
donde el número 1 <= n <= 10
se toma como entrada.
Ejemplo
Por ejemplo, las palabras sin cuadrados de longitud 3 son
RPR
, RSR
, RPS
, RSP
, SPS
, SRS
, SRP
, SPR
, PRP
, PSP
, PSR
,PRS
y los de longitud 4 son
RPRS
, RPSR
, RPSP
, RSRP
, RSPR
, RSPS
, PRPS
, PRSR
, PRSP
, PSRP
, PSRS
, PSPR
, SRPR
, SRPS
, SRSP
, SPRP
, SPRS
,SPSR
y tenga en cuenta que, por ejemplo, SPSP
o PRPR
no están libres de cuadrados
Reglas
- Esto es codegolf, el programa más corto gana, las lagunas estándar están cerradas.
- Puede imprimir las palabras o crearlas en la memoria.
- Su programa puede escribirse como una función.
Referencias
Entrada de Wikipedia sobre palabras sin cuadrados
El número de palabras ternarias sin cuadrados de longitud dada se encuentra en https://oeis.org/A006156
Relacionado: palabras arbitrarias ternarias cuadradas libres
n>3
sería una buena idea, porque ha habido cierta confusión sobre los caracteres repetidos frente a las secuencias repetidas.Respuestas:
Ruby, 39 bytes
Esta función hilarantemente ineficiente genera todas las cadenas de longitud N que se encuentran alfabéticamente entre N Ps y N Ss, luego filtra la gran mayoría que contiene caracteres que no son RPS. El cheque squarefree real sólo utiliza una referencia inversa Regexp:
(.+)\1
.65 bytes más idiomáticos que terminan en una cantidad de tiempo razonable para N = 10:
Editar: guardado un byte gracias a G B.
fuente
Jalea ,
1514 bytesPruébalo en línea!
Cómo funciona
fuente
Retina , 28 bytes
Pruébalo en línea!
Toma entrada en unario .
Explicación
Esto genera todas las cadenas compuestas
RPS
de longitudn
. La forma en que hacemos esto es que reemplazamos repetidamente el primero1
en cada línea. Pensemos en la línea como<1>
, donde<
está todo delante del partido y>
es todo después del partido (están$`
y$'
respectivamente en sintaxis de sustitución de expresiones regulares, pero parecen menos intuitivas). Reemplazamos1
conR>¶<P>¶<S
, donde¶
están los avances de línea. Así, el resultado completo de esta sustitución es en realidad<R>¶<P>¶<S>
, que es tres copias de la línea, con la1
sustitución conR
,P
,S
, respectivamente, en cada una de las tres copias. Este proceso se detiene una vez que todos los1
s hayan sido sustituidos.Finalmente, simplemente descartamos todas las líneas que contienen una repetición.
fuente
1(.*)
con,$1R¶$1P¶$1S
pero el conteo de bytes es el mismo.Casco ,
1514 bytes-1 byte gracias a Zgarb!
Pruébalo en línea!
Construye todas las secuencias posibles de la longitud correcta y mantiene solo aquellas cuyas subcadenas (excepto la vacía) están compuestas por dos mitades diferentes.
Maldición, realmente quería vencer a Jelly aquí.
fuente
Mathematica, 61 bytes
Pruébalo en línea!
fuente
Java 8,
285277 bytesAunque Java es casi siempre detallado, en este caso definitivamente no es el lenguaje adecuado para un desafío como este. Generar permutaciones con subcadenas es malo para el rendimiento e ineficiente.
Sin embargo, definitivamente se puede jugar un poco más.
-8 bytes gracias a @Jakob .
Explicación:
Pruébalo aquí (El rendimiento es demasiado malo para los casos de prueba superiores a 3, pero funciona localmente ..)
fuente
n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
. También, por qué no refactorizarfor(;i<1;p(...));
awhile(i<l)p(...);
?for(;...;)
el codegolfing-habbit para ser honesto. En el peor de los casos, es el mismo recuento de bytes quewhile(...)
, en el mejor de los casos, se puede colocar algo dentro del ciclo for para guardar bytes. Así que trato de no usarwhile
nada en codegolfing, porque de todos modos nunca beneficia al conteo de bytes. Lo aumenta o permanece igual, por lo que personalmente no me molesto con la mejor legibilidad. ;)PRS
secuencias, mientras que su ciclo original generó una con 2 ^ ( n -2) secuencias.n
veces "PRS" es correcto. El mío generaba más porque ahorraba bytes (y disminuía el rendimiento, pero a quién le importa eso con codegolf). ;)Python 3 ,
9796 bytesDevuelve un conjunto de cadenas.
Pruébalo en línea!
fuente
Julia 0.6 , 65 bytes
Pruébalo en línea!
fuente
Perl 5 , 37 bytes
Pruébalo en línea!
La función devuelve una matriz de cadenas libres cuadradas.
Explicado:
El
glob
genera todas las combinaciones de R, S y P con una longitud igual a la entrada. Lagrep
declaración filtra los que no están libres de cuadrados.fuente
R , 97 bytes
Pruébalo en línea!
combn(rep(c('p','r','s'),n),n,paste,collapse='')
computa todas lasn
cadenas con -characterp
,r
,s
, pero por desgracia duplica muchos (*), por lo que uniquify, y tomamos los que coinciden con la expresión regular(.+)\1
, mediante la comparación de estilo Perl, entonces imprimir la lista resultante.(*) técnicamente, genera todas las combinaciones de las
3n
letrasp,r,s
repetidas 3 vecesn
por vez, luego se aplicapaste(..., collapse='')
a cada combinación en lugar de calcular las3^n
cadenas directamente, pero esto es más golf que unexpand.grid
(el verdadero producto cartesiano).fuente
JavaScript (Firefox 30-57), 69 bytes
Como todas las subcadenas de palabras sin cuadrados también son sin cuadrados, la verificación se puede hacer de forma recursiva.
fuente
Haskell ,
10198 bytesPruébalo en línea!
fuente
JavaScript (ES6), 93 bytes
Convierte todos los enteros de 0 a 3ⁿ a (base invertida) 3 usando
RPS
como dígitos y los filtra por palabras sin cuadrados.fuente
Julia, 88
Nada sofisticado.
fuente
C # / LINQ, 169
Tiene que haber una mejor manera de hacer esto :)
fuente
F #, 143
fuente
k, 56 bytes
La falta de expresiones regulares nativas pone a k muy por detrás de la curva por una vez. Fui con una solución recursiva, ya que los caracteres para implementarlo se guardaron con un simple cheque sin cuadrados.
es el operador ternario de k, aquí hacemos cosas interesantes para longitudes distintas de cero, y devolvemos una sola cadena vacía si se solicitan palabras de longitud cero.
toma el producto cartesiano de "RPS" y todas las palabras n-1 de longitud cuadrada libre. , /: \: une cada elemento de la derecha a la izquierda, dando una longitud de 3 matrices de longitud n matrices. , / aplana esto en una matriz de longitud 3n.
toma las primeras n letras de cada cadena y la compara con la segunda n, luego reduce la matriz a solo donde no coinciden. Debido a que sabemos que el resultado anterior no tiene cuadrados, solo las subcadenas que comienzan en el primer carácter deben coincidir; simplificando la comprobación aquí valió la pena los caracteres gastados en implementar la recursión. Finalmente,
aplica la lambda al conjunto de resultados inicial a su izquierda, iterando sobre cada longitud de subcadena de 1 a (longitud de palabra) -1. ! x genera una lista de 0 a x-1, luego 1_ elimina el primer elemento (ya que las subcadenas de longitud 0 siempre coincidirán)
Sacrificando algunos caracteres, podemos usar .zs para auto-referenciar en lugar de confiar en el nombre de la función, y en lugar de verificar las subcadenas de hasta n-1, solo verifique el rendimiento (n / 2). Encuentra todas las palabras de longitud 49 (de las cuales hay 5207706) en aproximadamente 120 segundos en un 7700k, por encima de eso me encuentro con el límite de 4 GB de k libre de 32 bits.
fuente
Python 2 , 99 bytes
Pruébalo en línea!
fuente