Biorąc pod uwagę kwadrat dodatnich liczb naturalnych, napisz program, znajdź ścieżkę poziomą i pionową, a suma liczb wzdłuż nich będzie maksymalna. Pozioma ścieżka przechodzi od pierwszej do ostatniej kolumny i musi zwiększyć swoją pozycję kolumny jednym w każdym kroku. Pionowa ścieżka przechodzi od pierwszego do ostatniego wiersza i musi zwiększyć swoją pozycję wiersza jednym w każdym kroku. Ponadto pozycja rzędu na ścieżce poziomej może pozostać niezmieniona lub zmieniać się o jedną w obu kierunkach, podobnie w przypadku ścieżek pionowych.
Aby to zilustrować, poprawna ścieżka może być następująca:
Następująca ścieżka byłaby nieprawidłowa, ponieważ prowadzi do tyłu (i pozostaje w tym samym rzędzie w niektórych miejscach):
Następująca ścieżka byłaby równie nieprawidłowa, ponieważ zmienia pozycję wiersza o więcej niż jeden w jednym kroku:
Uwaga: Rozwiązanie powinno działać w akceptowalnym czasie.
Wejście
n standardowych linii wejściowych z n dodatnimi liczbami całkowitymi oddzielonymi spacją. 2 ≤ n ≤ 40. Każda linia kończy się przerwaniem linii. Liczby są na tyle małe, że maksymalna suma mieści się w 32-bitowej liczbie całkowitej ze znakiem.
Wynik
Maksymalne sumy poziomych i pionowych ścieżek (w tej kolejności) oddzielone pojedynczym odstępem.
Przykładowe dane wejściowe 1
1 2
1 2
Próbka wyjściowa 1
3 4
Przykładowe wejście 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 4 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 4 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Próbka wyjściowa 2
37 35
Przykładowe dane wejściowe 3
683 671 420 311 800 936
815 816 123 142 19 831
715 588 622 491 95 166
885 126 262 900 393 898
701 618 956 865 199 537
226 116 313 822 661 214
Próbka wyjściowa 3
4650 4799
Dla Twojej wygody przygotowaliśmy kilka przypadków testowych w bash (dzięki Ventero ) i PowerShell, przez które możesz uruchomić swój program. Wywołanie to:, <test> <command line>
więc coś w stylu ./test python paths.py
lub ./test.ps1 paths.exe
. Baw się dobrze :-)
bash
skrypt testowy! Chciałbym, żeby wszystkie gry w golfa były takie.Odpowiedzi:
GolfScript - 49 ulepszonych postaci Nabb
51 znaków50 ściśle i absolutnie niezbędnych znaków + 3 luzaków, którzy wykonali tylko 156 przeważnie zbędnych znaków51 rozwiązanie:
53 rozwiązanie:
Metoda działa na dwóch liniach naraz, jedna zawiera maksymalne sumy osiągnięte w każdym punkcie, a druga zawiera następną linię.
a / 14: Powtórz dwa razy, raz dla każdego wyniku.
8: Weź pierwszą linię z wejścia i przełącz ją za tablicę wejściową, teraz jest to pierwszy zestaw maksymalnych sum.
b / 13: Iteruj po każdej pozostałej linii w tablicy.
9: Wpisz 0 na początku maksymalnych kwot.
c / 12: Iteruj po każdym elemencie linii.
10: Zrób kopię maksymalnych kwot z usuniętym pierwszym elementem.
11: Weź pierwsze 3 elementy maksymalnych sum, posortuj je i dodaj największe do bieżącego elementu linii.
56 rozwiązanie:
1: Od wprowadzania do tablicy tablic składających się z 9 znaków, właściwie można to zrobić za pomocą tylko 1, ale złamałem ten klucz, więc trzeba będzie to zrobić.
2: 4 znaki tylko do wykonania transponowanej kopii.
3: Tablica 99 0 na 5 znaków, prawdopodobnie można to zrobić w sposób mądrzejszy, ale palę zbyt dużo trawki, aby wymyślić, jak to zrobić.
4: Zbyt skomplikowana podwójna pętla, która iteruje każdy element wejściowy i robi logikę rozmytą lub coś w tym rodzaju, aby uzyskać wynik. Nabb prawdopodobnie stworzy coś równoważnego u około 3½ znaków.
5: Do tej pory wynik znajduje się wewnątrz tablicy, czyli ten głupiutki fragment kodu jest po prostu, aby go wydostać (i usunąć resztki resztek (i zamienić wynik na miejsce)).
6: To polecenie jest tak proste, że jego liczba znaków prawdopodobnie byłaby ujemna w optymalnym rozwiązaniu. 7: W tym momencie program jest naprawdę gotowy, ale z powodu niechlujstwa w poprzednim kodzie wyjście jest w niewłaściwej kolejności i nie ma spacji, więc tutaj idzie jeszcze kilka bitów.
źródło
{}*
zamiast(\{}%
.J, 91
95Odmawiam zrobienia IO, dramatycznie obniżając swój wynik.Przekazuje wszystkie testy w wiązce testowej (chociaż działa to tylko wtedy, gdy wejście kończy się zakończeniem linii, jak w wiązce testowej).Usunąłem obsługę zakończeń linii Windows, ponieważ Chris zasugerował, że nie jest to konieczne. Wersja wieloplatformowa miałaby
a=:".;._2 toJ(1!:1)3
jako pierwszą linię.Wyjaśnienie:
f
daje parę rozwiązania, wywołując p normalnie i transponując dane wejściowe (|:
).p
pobiera maksimum (>./
) sumy wierszy z zastosowaniac
między każdym wierszem (c/
)c
zajmuje dwa rzędy (x i y). Dodaje x do każdego z y, y przesunął w górę o 1 komórkę (1|.!.0 y
), a y przesunął w dół o 1 komórkę (_1|.!.0 y
). Następnie bierze maksimum z trzech alternatyw dla każdego rzędu. (>./
). Reszta to ranga [sic] - nie jestem pewien, czy robię to dobrze.źródło
Haskell: 314 niezbędnych znaków
Uwaga: wymaga to modułu Data.Vector . Nie jestem pewien, czy jest uwzględniony na platformie Haskell, czy nie.
Wersja bez golfa:
To rozwiązanie wykorzystuje lenistwo, w połączeniu z Data.Vector , do zapamiętywania. Dla każdego punktu obliczane jest rozwiązanie dla maksymalnej ścieżki od niego do końca, a następnie przechowywane w komórce Vector
m
i ponownie wykorzystywane w razie potrzeby.źródło
Ruby 1.9, 155 znaków
Proste rozwiązanie, które przechodzi wszystkie przypadki testowe.
źródło
Haskell, 154 znaków
źródło
zipWith3
skróci kod?foldl1 max
, które dodaje znaki, ale pozwala ci rozłożyć foldl1 i max, co powinno uratować znaki.maximum.foldl1
,max
Imax
--vs--f=foldl1;m=max;
,f m.f
,m
, im
. - lub 20 vs. 22. Więc nie, to nie oszczędza.m=max
. Co z zipWith3?J, 109 + 10 = 119 znaków
Uruchom z
tr
:Jak zwykle w J, większość kodu dotyczy wejścia / wyjścia. „Rzeczywisty” kod ma 65 znaków:
Przechodzi wszystkie przypadki testowe
źródło
#!/usr/bin/env jconsole
na wierzchu pliku i ustaw flagę pliku wykonywalnego.Python, 149
Gdybym miał obliczyć tylko najkrótszą pionową lub poziomą ścieżkę,
można to zrobić na miejscu, oszczędzając około jednej trzeciej bajtów.
źródło
Python, 204 znaki
źródło