Llamemos a una lista de cadenas no vacía una mesa si se cumplen las siguientes condiciones:
- Cada cadena de la lista no está vacía y usa solo caracteres que aparecen en la primera cadena.
- Cada cadena sucesiva tiene exactamente un carácter más largo que la cadena anterior.
- Ninguna cadena en la lista es una subsecuencia de cualquier otra cadena en la lista.
El término "mesa" es de visualización como esta (donde los x
s deben ser varios caracteres):
xx..x
xx..xx
xx..xxx
.
.
.
xx..xxx..x
NB: Es un hecho matemático que solo finitamente muchas mesas comienzan con una cadena dada. Tenga en cuenta la distinción entre subsecuencia versus subcadena ; por ejemplo, 'anna' es una subsecuencia (pero no una subcadena) de 'banana'.
Desafío:
- Escriba el programa más corto que tome una cadena de entrada alfanumérica no vacía arbitraria y genere el número de mesas que comienzan con esa cadena.
Entrada (stdin):
- Cualquier cadena alfanumérica no vacía.
Salida (stdout):
- El número de mesas que comienzan con la cadena de entrada.
Puntuación:
- El ganador es el programa con el menor número de bytes.
Mesas de ejemplo
Solo una mesa comienza con a
:
a
Solo una mesa comienza con aa
:
aa
Muchas mesas comienzan con ab
:
ab ab ab ab (and so on)
baa aaa bbb
bbba bbaa
baaaa
aaaaaa
ab
,bbb
como una mesa con sólo detenerse en el segundo período. ¿Es eso válido? ¿O siempre tienen que hacerse el mayor tiempo posible? Además, si hay varias posibles reordenamientos delnth
plazo (tales comobaa
,aba
,aab
), es lo que todos cuentan como mesas separadas, así (siempre, por supuesto, todos siguen las reglas)?ab
,ab/baa
,ab/bbb
,ab/bbb/bbaa
,ab/bbb/bbaa/baaaa
,ab/bbb/bbaa/baaaa/aaaaaa
son diferentes mesas.Respuestas:
GolfScript (
106103 caracteres)En algún lugar del corazón, por supuesto, hay algún código de ¿Es la cadena X una subsecuencia de la cadena Y?
fuente
Ruby, 142 caracteres.
Este algoritmo es constructivo, es decir, construye todas las mesas posibles para la cadena de entrada y las cuenta. Hace que el programa sea realmente lento, pero bueno, es codegolf.
Ejecuciones de ejemplo:
fuente
aab
) sean de longitud factible, pero no estoy seguro: su programa ha estado ejecutándose aproximadamente una hora para ese ejemplo. NB: No habrá salida factible para ninguna entrada que involucre más de dos letras distintas; por ejemplo, algunas de las mesas que comienzanabc
tienen una longitud mayor que el número 7000 de Ackermann .300,000
entradas conaab
, todavía veía que los primeros 10 términos eran idénticos. Así que creo que podría no ser factible para algo más grande que dos caracteres. Al menos, no sin cierta inteligencia y cálculos heurísticos.