Los seis principales miembros del reparto de la American comedia Amigos todos estuvieron de acuerdo en que se les pagaría el mismo sueldo a través del funcionamiento de la serie (después de la temporada 2, por lo menos). Pero eso no significa que todos hayan tenido la misma cantidad de tiempo en el aire o que todos hayan interactuado en la pantalla la misma cantidad.
En este desafío, escribirás un programa que podría ayudar a determinar qué Amigos amigos eran realmente los mejores.
Preparar
Considere ver un episodio o escena de Friends y anote exactamente quién está en la pantalla durante cada captura de cámara y durante cuánto tiempo.
Abreviaremos el nombre de cada personaje:
Luego, por cada toma de la cámara (o cada vez que un personaje ingresa / sale de la toma), enumeraremos quién estaba en la pantalla. Por ejemplo:
504 CRS
200 J
345 MP
980
2000 CJMPRS
Esto está diciendo que:
- Durante 504 ms, Chandler, Rachel y Ross estuvieron en la pantalla.
- Luego, durante 200 ms, Joey fue.
- Luego, durante 345 ms, Mónica y Phoebe fueron.
- Luego, durante 980 ms, ninguno de los 6 personajes principales estaba en la pantalla.
- Luego, durante 2 segundos, todos fueron.
(Esto no es de un clip real, lo inventé).
Tenga en cuenta que lo siguiente sería equivalente:
504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS
Para analizar qué combinaciones de caracteres tuvieron el mayor tiempo de pantalla, observamos los 64 subconjuntos posibles de los 6 caracteres y sumamos el tiempo de pantalla que tenían. Si todos los integrantes de un subconjunto aparecen en la pantalla durante una captura de cámara, incluso si hay más caracteres que solo los del subconjunto , el tiempo para esa captura de cámara se agrega al tiempo de pantalla total de ese subconjunto.
Hay una excepción para el subconjunto vacío: solo se cuentan las escenas con ninguno de los 6 personajes principales.
Entonces el análisis del ejemplo anterior sería:
980
2504 C
2200 J
2345 M
2345 P
2504 R
2504 S
2000 CJ
2000 CM
2000 CP
2504 CR
2504 CS
2000 JM
2000 JP
2000 JR
2000 JS
2345 MP
2000 MR
2000 MS
2000 PR
2000 PS
2504 RS
2000 CJM
2000 CJP
2000 CJR
2000 CJS
2000 CMP
2000 CMR
2000 CMS
2000 CPR
2000 CPS
2504 CRS
2000 JMP
2000 JMR
2000 JMS
2000 JPR
2000 JPS
2000 JRS
2000 MPR
2000 MPS
2000 MRS
2000 PRS
2000 CJMP
2000 CJMR
2000 CJMS
2000 CJPR
2000 CJPS
2000 CJRS
2000 CMPR
2000 CMPS
2000 CMRS
2000 CPRS
2000 JMPR
2000 JMPS
2000 JMRS
2000 JPRS
2000 MPRS
2000 CJMPR
2000 CJMPS
2000 CJMRS
2000 CJPRS
2000 CMPRS
2000 JMPRS
2000 CJMPRS
Podemos ver que J
(solo Joey) tenía 2200 ms de tiempo en pantalla porque tenía 200 solo y 2000 con todos.
Reto
Escriba un programa que tome una cadena o un archivo de texto como
504 CRS
200 J
345 MP
980
2000 CJMPRS
donde cada línea tiene la forma [time in ms] [characters on screen]
, y genera la cantidad total de tiempo que cada uno de los 64 subconjuntos de los 6 caracteres pasaron en la pantalla, donde cada línea tiene la forma [total time in ms for subset] [characters in subset]
(tal como arriba).
La entrada puede tomarse como una cadena para stdin, la línea de comando o una función, o puede ser el nombre de un archivo de texto que contiene los datos.
- Los números de milisegundos siempre serán enteros positivos.
- Las letras de los caracteres siempre estarán en el orden
CJMPRS
(alfabético). - Opcionalmente, puede suponer que hay un espacio final cuando no hay caracteres en la escena (por ejemplo
980
). - Opcionalmente, puede suponer que hay una nueva línea final.
- La entrada tendrá al menos 1 línea y puede tener arbitrariamente muchas.
El resultado debe imprimirse o devolverse o escribirse en otro archivo de texto como una cadena de 64 líneas.
- Las líneas pueden estar en cualquier orden.
- Las letras de los caracteres no necesitan estar en el
CJMPRS
orden. - Subconjuntos con 0 ms tiempo total no ha de estar registrado.
- Opcionalmente, puede haber un espacio final después del total del subconjunto vacío.
- Opcionalmente, puede haber una nueva línea final.
(Por supuesto, este problema puede generalizarse a más personajes, pero nos quedaremos con los 6 personajes de CJMPRS
Friends ).
El código más corto en bytes gana.
Tenga en cuenta que realmente disfruto de Friends y no creo que algunos personajes sean más importantes que otros. Sin embargo, las estadísticas serían interesantes. ;)
fuente
Respuestas:
Pyth, 37 bytes
Pruébelo en línea: demostración
Explicación:
fuente
cM
use la.*
expansión del mapa. Tal vez debería hacerse una excepciónc
ya que no puedo imaginar a alguien que quiera usarlo así en un mapaHaskell, 187 bytes
f
es una función que toma la entrada, como una sola cadena de varias líneas, y devuelve la salida de varias líneas como una sola cadena. Probablemente queda mucho para jugar golf aquí.fuente
SWI-Prolog, 381 bytes
Esto espera ejecutarse como:
Tenga en cuenta que puede que tenga que reemplazar cada
`
a"
y cada"
to'
si tiene una versión anterior de SWI-Prolog.Podría ahorrar más de 100 bytes si no tuviera que usar una cadena como entrada.
fuente
Haskell,
150136 bytesEjemplo de uso:
Enfoque diferente a la respuesta de @ MtnViewMark : para todas las combinaciones
c
de los caracteres, encuentre las líneas de la cadena de entrada donde la diferenciac
y la lista de las líneasy
está vacía (tenga en cuenta el caso especial donde no hay caracteres en la pantalla (por ejemplo980
) ->c
no debe estar vacío oc == y
). Extrae el número y la suma.fuente
CJam,
6758 bytesPruébelo en línea en el intérprete de CJam .
fuente
Perl 5 (5.10+), 128 bytes
2 bytes por línea de salida.
use feature "say"
no incluido en el recuento de bytes.Sin golf:
fuente
K, 95
Toma una cuerda como
"504 CRS\n200 J\n345 MP\n980 \n2000 CJMPRS"
fuente