Wprowadzenie
Masz za zadanie napisać program, który dzieli prostokątną tablicę liczb całkowitych równomiernie na pół (z dowolnego powodu). To zadanie wymaga intensywnych obliczeń, ale na szczęście masz maszynę dwurdzeniową do wykonywania obliczeń. Aby zmaksymalizować korzyści z równoległości, decydujesz się podzielić program równomiernie na pół i pozwolić, aby każdy rdzeń uruchamiał jedną z części niezależnie od drugiej.
Wejście i wyjście
Twoje dane wejściowe to prostokątna tablica 2D nieujemnych liczb całkowitych o wielkości co najmniej 1 × 1 , wykonana w dowolnym rozsądnym formacie. Rozszczepienie takiej tablicy otrzymuje się przez podział każdego poziomego rzędu do prefiksu i sufiksu (z których każdy może być pusta). Aby podział był ważny, dwa sąsiednie wiersze muszą być podzielone na ten sam indeks lub sąsiednie indeksy. Rozważmy na przykład tablicę
2 4 5 5 6 3
9 7 1 7 7 0
0 0 3 6 7 8
1 2 4 7 6 1
6 6 8 2 0 0
To jest prawidłowy podział:
2;4 5 5 6 3
;9 7 1 7 7 0
;0 0 3 6 7 8
1;2 4 7 6 1
6 6;8 2 0 0
Jest to również prawidłowy podział:
2 4 5 5 6 3;
9 7 1 7 7;0
0 0 3 6 7;8
1 2 4 7;6 1
6 6 8;2 0 0
To nie jest prawidłowy podział:
2 4;5 5 6 3
9 7 1;7 7 0
0;0 3 6 7 8
1 2;4 7 6 1
6 6;8 2 0 0
Twój wynik powinien wynosić minimum
abs(sum_of_prefixes - sum_of_suffixes)
nad wszystkimi prawidłowymi podziałami danych wejściowych.
Zasady i punktacja
Powinieneś napisać dwa programy (pełne programy lub funkcje) w tym samym języku, w którym nie może istnieć żaden wspólny kod. Nazwijmy je P1 i P2 . Program P1 bierze tablicę wejściową i coś wyprowadza . Program P2 przyjmuje to jako dane wejściowe i wysyła odpowiedź z powyższego zadania dla tablicy wejściowej.
Twój wynik to maksymalna liczba bajtów P1 i P2 , przy czym niższy wynik jest lepszy.
Kilka wyjaśnień:
- Możesz napisać dwie pełne prorgamy, jedną funkcję i jeden pełny program lub dwie funkcje.
- W przypadku dwóch pełnych programów całe wyjście P1 jest podawane do P2 jako dane wejściowe, tak jak w potoku Unix
P1 | P2
. Programy muszą działać poprawnie, jeśli zostaną skompilowane / zinterpretowane z dwóch oddzielnych plików źródłowych. - Jeśli którykolwiek z programów jest funkcją, jest on konwertowany na pełny program poprzez dodanie niezbędnego kodu płyty kotłowej i stosuje się do niego powyższą zasadę. W szczególności dwie funkcje nie mogą korzystać ze wspólnych funkcji pomocniczych, wspólnych instrukcji importu lub wspólnych zmiennych globalnych.
Przypadki testowe
[[1]] -> 1
[[4,5],[8,3]] -> 4
[[8],[11],[8],[10],[4]] -> 1
[[5,7,0,9,11,2,1]] -> 7
[[146,194,71,49],[233,163,172,21],[121,173,14,302],[259,169,26,5],[164,30,108,37],[88,55,15,2]] -> 3
[[138,2,37,2],[168,382,33,77],[31,199,7,15],[192,113,129,15],[172,88,78,169],[28,6,97,197]] -> 7
[[34,173,9,39,91],[169,23,56,74,5],[40,153,80,60,28],[8,34,102,60,32],[103,88,277,4,2]] -> 0
[[65,124,184,141],[71,235,82,51],[78,1,151,201],[12,24,32,278],[38,13,10,128],[9,174,237,113]] -> 2
[[164,187,17,0,277],[108,96,121,263,211],[166,6,57,49,73],[90,186,26,82,138],[173,60,171,265,96]] -> 8
Odpowiedzi:
Haskell, 102 bajty
Funkcja 1 (102 bajty):
Funkcja 2 (90 bajtów):
Brakuje bojlera dla F1, aby uczynić go pełnym programem, łącznie z zakodowaną tablicą liczb całkowitych do sprawdzenia:
i dla F2:
Teraz możesz zadzwonić,
runhaskell f1.hs | runhaskell f2.hs
które wyjścia8
.Jak to działa:
f
pobiera listę liczb całkowitych.Teraz mamy listę wszystkich możliwych podziałów, na przykład pierwszy i losowy od środka
Funkcja
g
przyjmuje taką listę iUwaga: drugą funkcję można nieco zagrać w golfa, ale nie zmienia to wyniku.
źródło