Sześciu głównych obsad amerykańskiego serialu Friends wszyscy zgodzili się, że otrzymają taką samą pensję przez cały czas trwania serii (przynajmniej po sezonie 2). Ale to nie znaczy, że wszyscy mieli taką samą ilość czasu antenowego lub że wszyscy współdziałali na ekranie w tej samej ilości.
W tym wyzwaniu napiszesz program, który pomoże ustalić, którzy znajomi byli naprawdę najlepsi.
Ustawiać
Rozważ obejrzenie odcinka lub sceny Znajomych i zanotowanie, kto dokładnie jest na ekranie podczas każdego ujęcia z kamery i na jak długo.
Skrócimy imię każdej postaci:
C
jest dla ChandleraJ
jest dla JoeyaM
jest dla MonikiP
jest dla PhoebeR
jest dla RachelS
jest dla Rossa
Następnie dla każdego ujęcia z kamery (lub za każdym razem, gdy postać wchodzi / wychodzi z ujęcia), wymienimy, kto był na ekranie. Na przykład:
504 CRS
200 J
345 MP
980
2000 CJMPRS
To znaczy, że:
- Przez 504 ms Chandler, Rachel i Ross byli na ekranie.
- Potem przez 200 ms był Joey.
- Potem przez 345ms Monica i Phoebe były.
- Następnie przez 980 ms żaden z 6 głównych bohaterów nie był na ekranie.
- Potem przez 2 sekundy wszyscy byli.
(To nie jest z prawdziwego klipu, wymyśliłem.)
Pamiętaj, że następujące będą równoważne:
504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS
Aby przeanalizować, które kombinacje znaków miały najwięcej czasu na ekranie, sprawdzamy wszystkie 64 możliwe podzbiory 6 znaków i łączny czas ekranu, jaki mieli. Jeśli wszyscy w podzbiorze pojawiają się na ekranie podczas ujęcia z kamery, nawet jeśli jest więcej znaków niż tylko te w tym podzbiorze , czas dla tego ujęcia z kamery jest dodawany do całkowitego czasu ekranu tego podzestawu.
Istnieje wyjątek dla pustego podzbioru - liczone są tylko sceny bez żadnej z 6 głównych postaci.
Zatem analiza powyższego przykładu byłaby następująca:
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
Widzimy, że J
(tylko Joey) miał 2200 ms czasu na ekranie, ponieważ miał 200 dla siebie i 2000 dla wszystkich.
Wyzwanie
Napisz program, który pobiera ciąg lub plik tekstowy, taki jak
504 CRS
200 J
345 MP
980
2000 CJMPRS
gdzie każda linia ma formę [time in ms] [characters on screen]
i wyświetla całkowity czas, który każdy z 64 podzbiorów 6 znaków spędził na ekranie, gdzie każda linia ma formę [total time in ms for subset] [characters in subset]
(tak jak powyżej).
Dane wejściowe można traktować jako ciąg do standardowego wejścia, wiersza poleceń lub funkcji, albo może to być nazwa pliku tekstowego zawierającego dane.
- Liczby w milisekundach zawsze będą dodatnimi liczbami całkowitymi.
- Litery znaków będą zawsze w kolejności
CJMPRS
(alfabetycznie). - Możesz opcjonalnie założyć, że istnieje spacja końcowa, gdy w scenie nie ma żadnych znaków (np
980
.). - Możesz opcjonalnie założyć, że istnieje nowa linia końcowa.
- Dane wejściowe będą miały co najmniej 1 linię i mogą mieć dowolnie wiele.
Dane wyjściowe powinny zostać wydrukowane, zwrócone lub zapisane w innym pliku tekstowym jako ciąg 64 wierszy.
- Linie mogą być w dowolnej kolejności.
- Litery znaków nie muszą być w
CJMPRS
kolejności. - Podzbiory z 0ms łącznym czasie nie muszą być wymienione.
- Opcjonalnie może występować spacja po pustej sumie podzbioru.
- Opcjonalnie może występować końcowy znak nowej linii.
(Ten problem można oczywiście uogólnić na więcej postaci, ale pozostaniemy przy 6 postaciach CJMPRS
Przyjaciół ).
Najkrótszy kod w bajtach wygrywa.
Zauważ, że tak naprawdę lubię Przyjaciół i nie sądzę, że niektóre postacie są ważniejsze od innych. Statystyki byłyby jednak interesujące. ;)
źródło
Odpowiedzi:
Pyth, 37 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
cM
korzysta z.*
rozszerzenia mapy. Być może należy zrobić wyjątek,c
ponieważ nie wyobrażam sobie, żeby ktoś chciał użyć go w ten sposób na mapieHaskell, 187 bajtów
f
to funkcja, która pobiera dane wejściowe jako pojedynczy ciąg wielu linii i zwraca dane wyjściowe wielu linii jako pojedynczy ciąg znaków. Prawdopodobnie zostało tu wiele do gry w golfa.źródło
SWI-Prolog, 381 bajtów
Oczekuje się, że zostanie uruchomiony jako:
Należy pamiętać, że może trzeba zastąpić każdy
`
się"
i każdy"
się'
jeśli masz starą wersję SWI-Prologu.Mógłbym ogolić ponad 100 bajtów, gdybym nie musiał używać ciągu jako danych wejściowych.
źródło
Haskell,
150136 bajtówPrzykład użycia:
Inne podejście niż odpowiedź @ MtnViewMark : Dla wszystkich kombinacji
c
znaków znajdź wiersze ciągu wejściowego, w których różnicac
i lista z wierszyy
jest pusta (zwróć uwagę na szczególny przypadek, w którym na ekranie nie ma żadnego znaku (np.980
) ->c
nie może być pusty lubc == y
). Wyodrębnij liczbę i sumę.źródło
CJam,
6758 bajtówWypróbuj online w interpretatorze CJam .
źródło
Perl 5 (5.10+), 128 bajtów
2 bajty na linię wyjściową.
use feature "say"
nie uwzględnione w liczbie bajtów.Bez golfa:
źródło
K, 95
Ma ciąg jak
"504 CRS\n200 J\n345 MP\n980 \n2000 CJMPRS"
źródło