m | Y bR | ain es We | iRd. F (o) RT (h) E La | sT fi (v) e YE | ars O | R s | o, (I) ha | ve C (u) T wO | rds en h (a) lf wh | En (I) s (e) e Th | em. Wh | EN Empecé Haciéndolo, es | oK un meN | TaL esfuerzo - B (u) TI casi podría (l) no N (o) T d | o it. N (o) w, lo hice en la parte de atrás de mi cabeza, a (n) d casi no lo | evito. Sin embargo, pensé que esto sería un gran desafío.
Definiciones
Para este desafío, a cada letra se le asigna un puntaje, basado en mi juicio de su ancho en una fuente sans-serif. Utilizará este ancho para cortar una palabra en dos mitades del mismo ancho. Los caracteres que utilizará este desafío son el alfabeto en minúsculas y mayúsculas, el apóstrofe y el guión.
Width Characters
1 i l I '
2 f j r t -
3 a b c d e g h k n o p q s u v x y z
4 m w A B C D E F G H J K L N O P Q R S T U V X Y Z
5 M W
Para mis explicaciones y casos de prueba, |
denota la ubicación en la que una palabra se puede dividir limpiamente por la mitad. (
y )
a cada lado de una letra indica que esa letra se dividirá por la mitad para crear una división limpia.
Entrada
La entrada consistirá en una sola "palabra" (que no se requiere que esté en el diccionario). Puede tomar esta palabra en cualquier entrada de texto que desee (String, char array, etc.). Esta palabra solo contendrá letras '
, y -
(ver tabla anterior). Debido a lo que harás con esta palabra (ver más abajo), el caso de entrada queda a discreción del desarrollador. Nuevas líneas finales permitidas si es necesario.
La tarea
Permuta a través de todas las formas de la entrada (todas las letras en todas las posiciones mayúsculas o minúsculas posibles). Por ejemplo, para la entrada it's
, a continuación se muestran todas las permutaciones:
it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S
Para dividir una permutación de una palabra por la mitad, los puntos en un lado de la palabra deben ser los mismos que los puntos del otro lado de la palabra. Sin embargo, si una letra está atrapada entre dos secciones pares, también puede cortar una letra limpiamente por la mitad.
Tenga en cuenta que "mitad" no significa que se haya movido hasta la mitad de la cadena. "Medio" significa que los puntos en ambos lados son iguales.
Ejemplos:
W
Son 5 puntos. i
es 1 punto Dividir la permutación Wiiiii
a la mitad dará como resultado W | iiiii
, con 5 puntos a cada lado de la |
.
T
Son 3 puntos. Dividir la permutación TTTT
a la mitad dará como resultado TT | TT
, con 6 puntos a cada lado de la |
.
w
Son 4 puntos. a es de 3 puntos. Dividir la permutación waw
a la mitad dará como resultado w (a) w
, con 5.5 puntos en cada lado. Los puntos de a
se distribuyen a ambos lados, como a
se divide por la mitad.
Salida
Su salida es un número entero de la cantidad de permutaciones únicas de la entrada que se pueden dividir limpiamente por la mitad. Nuevas líneas finales permitidas si es necesario.
Casos de prueba
Voy a generar todas las permutaciones válidas de la entrada para los casos de prueba. Recuerde que eso no es parte de las especificaciones para usted.
En mi salida intermedia, los números indican el valor en puntos de la letra sobre ellos, por lo que la salida es un poco más fácil de visualizar.
Input: a
( a )
3
( A )
4
Output: 2
Input: in
Output: 0
Input: ab
A | B
4 4
a | b
3 3
Output: 2
Input: abc
A ( B ) C
4 4 4
A ( b ) C
4 3 4
a ( B ) c
3 4 3
a ( b ) c
3 3 3
Output: 4
Input: will
W ( I ) L l
5 1 4 1
W ( I ) l L
5 1 1 4
W ( i ) L l
5 1 4 1
W ( i ) l L
5 1 1 4
w I | L l
4 1 4 1
w I | l L
4 1 1 4
w i | L l
4 1 4 1
w i | l L
4 1 1 4
Output: 8
Input: stephen
S T E ( P ) H E N
4 4 4 4 4 4 4
S T E ( p ) H E N
4 4 4 3 4 4 4
S T E | p h e n
4 4 4 3 3 3 3
S T e ( P ) H E n
4 4 3 4 4 4 3
S T e ( P ) H e N
4 4 3 4 4 3 4
S T e ( P ) h E N
4 4 3 4 3 4 4
S T e ( p ) H E n
4 4 3 3 4 4 3
S T e ( p ) H e N
4 4 3 3 4 3 4
S T e ( p ) h E N
4 4 3 3 3 4 4
S t E ( P ) H e n
4 2 4 4 4 3 3
S t E ( P ) h E n
4 2 4 4 3 4 3
S t E ( P ) h e N
4 2 4 4 3 3 4
S t E ( p ) H e n
4 2 4 3 4 3 3
S t E ( p ) h E n
4 2 4 3 3 4 3
S t E ( p ) h e N
4 2 4 3 3 3 4
S t e ( P ) h e n
4 2 3 4 3 3 3
S t e p | H E N
4 2 3 3 4 4 4
S t e ( p ) h e n
4 2 3 3 3 3 3
s T E ( P ) H E n
3 4 4 4 4 4 3
s T E ( P ) H e N
3 4 4 4 4 3 4
s T E ( P ) h E N
3 4 4 4 3 4 4
s T E ( p ) H E n
3 4 4 3 4 4 3
s T E ( p ) H e N
3 4 4 3 4 3 4
s T E ( p ) h E N
3 4 4 3 3 4 4
s T e ( P ) H e n
3 4 3 4 4 3 3
s T e ( P ) h E n
3 4 3 4 3 4 3
s T e ( P ) h e N
3 4 3 4 3 3 4
s T e ( p ) H e n
3 4 3 3 4 3 3
s T e ( p ) h E n
3 4 3 3 3 4 3
s T e ( p ) h e N
3 4 3 3 3 3 4
s t E ( P ) h e n
3 2 4 4 3 3 3
s t E p | H E N
3 2 4 3 4 4 4
s t E ( p ) h e n
3 2 4 3 3 3 3
s t e P | H E N
3 2 3 4 4 4 4
s t e p | H E n
3 2 3 3 4 4 3
s t e p | H e N
3 2 3 3 4 3 4
s t e p | h E N
3 2 3 3 3 4 4
Output: 37
Input: splitwords
S P L I T | W O r d s
4 4 4 1 4 5 4 2 3 3
<snip>
s p l i t w | o R d S
3 3 1 1 2 4 3 4 3 4
Output: 228
Input: 'a-r
' a ( - ) R
1 3 2 4
' a | - r
1 3 2 2
Output: 2
Input: '''''-
' ' ' ( ' ) ' -
1 1 1 1 1 2
Output: 1
Victoria
Este es el código de golf , por lo que la respuesta más corta en bytes gana. Debe poder generar todos los casos de prueba (por lo tanto, todas las entradas de hasta 10 caracteres) en un período de tiempo razonable. No limite artificialmente su aporte.
Generosidad
No sé si esto está en el ámbito de la posibilidad. Sin embargo, ustedes son golfistas, harán cualquier cosa por representante. Estoy ofreciendo una recompensa de 200 repeticiones (comenzaré una vez que se cumpla esta condición de recompensa, ya que me parece básicamente imposible) para un programa que genera la salida correcta antidisestablishmentarianism
en menos de 15 segundos en una computadora promedio (también conocida como mía). Tenga en cuenta que este caso de prueba no debe estar codificado de ninguna manera.
@DigitalTrauma aplastó mi recompensa, llegando en menos de dos segundos. Mira su respuesta aquí .
antidisestablishmentarianism
(no golfista) es83307040
(y coincide con todos los casos de prueba) pero tarda ~ 37 segundos en mi computadora portátil (tenga en cuenta que es Python). ¿Alguien también tiene una cuenta para ello?Respuestas:
Pyth ,
75747370 bytesPruébalo en línea!
Por el amor de Dios, ni siquiera lo intentes
antidisestablishmentarianism
en el intérprete. Lo estrellarás.Explicación
Desglosemos este código en X partes.
La primera parte: generar versiones encapsuladas y mapeo a los valores
Seamos claros aquí. En ninguna parte del proceso las letras están en mayúscula. Solo necesitamos asignar una letra a dos valores (y los signos de puntuación a un valor), sin la necesidad de ponerlos en mayúscula. Decidiremos para qué personajes necesitaremos dos valores y para qué personajes necesitaremos uno:
Como puede ver, incluso la primera parte es demasiado larga.
El primer valor es para la versión en minúscula, que incluye
'
y-
. El segundo valor es para la versión en mayúscula, con'
y-
no tomará.El primer valor:
La primera cadena contiene
"mw"
en el índice 0. Tiene un valor de 4, lo que explica la necesidad de la lógica o. Tenga en cuenta que Pyth usa indexación 0. Además, el espacio antes del4
es separarlo de1
.El segundo valor (mayúscula):
Si
d
es así"i"
, da1
en el primer paso. De lo contrario, continúa. Sid
es"m"
o"w"
, entonces el tercer paso da1
, que se agrega4
a dar5
. Sid
no es"m"
o"w"
, entonces el tercer paso da0
, que se agrega4
a dar4
.La segunda parte: hacer el trabajo
Esto se antepone a la primera parte, que técnicamente no está separada de la segunda parte (sigue siendo un comando). Entonces, el valor de la primera parte se pasa a la derecha.
Resumen: en la primera parte, asignamos las letras a sus posibles valores (minúsculas y mayúsculas para las letras, solo un valor para los dos signos de puntuación). Para la entrada
"ab"
, uno obtendría[[3,4],[3,4]]
.Para generar las diferentes versiones encapsuladas (lo que debería haberse hecho en la primera parte, pero que se desbordaría), usamos el producto cartesiano repetidamente y luego aplanamos el resultado. Los problemas surgen cuando solo hay una letra (primer caso de prueba), porque el producto cartesiano no nos daría una matriz, y el comando de aplanar (
.n
) se desborda para dar resultados extraños a los números. Veremos cómo eludí este problema.Si es una división en el medio por
|
, entonces el prefijo tendría la suma duplicada siendo la suma del total.Si se divide por
()
, entonces la suma del prefijo duplicado menos el valor entre paréntesis sería la suma del total.fuente
c, 378 bytes; aproximadamente 0.6s para
antidisestablishmentarianism
Respuesta actualizada . @ Leí el comentario de JonathanAllan sobre
i
s, y al principio no entendía esta optimización, pero ahora veo que, dado que tantoi
yI
tener una anchura de 1, entonces podemos contar las permutaciones asociadas dos veces con tener sólo una vez para validar. Anteriormente, mi solución usaba múltiples subprocesos para distribuir la carga en múltiples CPU y con eso pude pasar por las 2 28 posibilidades en mi máquina. Ahora con lai
optimización no hay necesidad de meterse con hilos: un solo hilo hace el trabajo fácilmente dentro de la restricción de tiempo.Sin más preámbulos, la función c golfizada:
La función recursiva
f
toma 3 parámetros: un puntero a la cadena de entrada, la longitud de la cadena y el desplazamiento en la cadena para comenzar el procesamiento (debe ser 0 para la llamada de nivel superior). La función devuelve el número de permutaciones.Pruébalo en línea . TIO parece correr típicamente a través de todos los casos de prueba (incluso
antidisestablishmentarianism
en menos de 2 segundos.Tenga en cuenta que hay algunos no imprimibles en la cadena en la que se
bcopy()
editam[]
. El TIO parece manejar esto correctamente.Sin golf:
Tengo una MacBook Pro de mediados de 2015 con MacOS 10.12.4. El compilador es el clang predeterminado de MacOS. Estoy compilando con:
Ejecutar todos los casos de prueba, incluyendo
antidisestablishmentarianism
da:Esto de ninguna manera es óptimo. El algoritmo simplemente se abre paso por todas las posibilidades (módulo
i
- vea los comentarios anteriores), y cuenta las palabras que pueden dividirse de acuerdo con los criterios.fuente
i
,-
,'
,l
,mw
,fjrt
, yabcdeghknopqsuvxyz
, pero se necesitaría una aplicación de la Pólya enumeración teorema (o un método de enumeración combinatoria equivalente), en el que no estoy bien versado.JavaScript (ES6),
199169167 bytesEspera la cadena de entrada en minúsculas. Demasiado lento para la recompensa.
Casos de prueba
Mostrar fragmento de código
fuente
C,
403394 bytes,Gracias Kevin!
Pruébalo en línea
Código sin golf:
fuente
f(char* w, int l){
->f(char*w,int l){