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?