Znajdź maksymalnie zyskowną sekwencję wymian, biorąc pod uwagę tabelę kursów walut.
Jako przykład pod waluty riary (to waluta domowy), B AHT, C, EDI, a D Enar gdzie wskaźnik z jednego do drugiego (po każdej szybkość transakcja została pobrana) jest określona przez (wiersz, kolumna) wpisie tabela kursów walut poniżej:
TO
A B C D
A 0.9999 1.719828 4.509549 0.709929
F B 0.579942 0.9999 2.619738 0.409959
R
O C 0.219978 0.379962 0.9999 0.149985
M
D 1.39986 2.429757 6.409359 0.9999
Oczywiście wymiana A na A nie jest świetnym pomysłem, ponieważ to biurko z przyjemnością obciąży cię za nic nie robienie.
Mniej oczywiste, ale prawdziwe w przypadku tej tabeli, wymiana A na dowolną inną walutę, a następnie ponowna wymiana przynosi straty:
via B: 1.719828 × 0.579942 = 0.997400489976
via C: 4.509549 × 0.219978 = 0.992001569922
via D: 0.709929 × 1.39986 = 0.99380120994
Jednak zamiana A na D, a następnie D na B, a następnie B z powrotem na A przynosi zysk (biorąc pod uwagę wystarczający kapitał, aby nie ulec zaokrągleniu):
0.709929 × 2.429757 × 0.579942 = 1.0003738278192194
Ten „darmowy lunch” można było wielokrotnie spożywać, gdy istnieje taka możliwość.
Ale istnieje jeszcze bardziej kuszący łańcuch, a mianowicie od A do D, następnie od D do C, a następnie od C do B, a na koniec B z powrotem do A :
0.709929 × 6.409359 × 0.379962 × 0.579942 = 1.0026612752037345
Szczegóły wyzwania
Biorąc pod uwagę tabelę kursów walut w dowolnym rozsądnym formacie, który ustala znaczenie waluty macierzystej (np. Pierwszy wiersz i pierwsza kolumna są zawsze walutą macierzystą)
(lub mając taką tabelę i indeks waluty krajowej)
znajdź * maksymalna sekwencja arbitrażowa wymian rozpoczynających się i kończących na walucie macierzystej jako indeksach do listy walut bez powtarzania użycia jakiejkolwiek wymiany (tj. wymiana Y-> X może następować po wymianie X-> Y, ale X-> Y może nie wykonaj X-> Y).
Jeśli nie ma takiej rentownej okazji, uzyskaj pustą listę lub inny wynik, którego nie można pomylić z zidentyfikowaną szansą.
- np. dla powyższego przykładu ( A-> D, D-> C, C-> B, B-> A ):
- używając indeksowania 0 można zwrócić
[[0,3],[3,2],[2,1],[1,0]]
lub[0,3,2,1,0]
- przy użyciu indeksowania 1 można zwrócić
[[1,4],[4,3],[3,2],[2,1]]
lub[1,4,3,2,1]
Inne formaty są w porządku, o ile nie ma dwuznaczności.
- Jedną rzeczą, na którą należy zwrócić uwagę, jest to, że najlepszą okazją jest bycie pojedynczą transakcją z domu-> domu (głupie biurko). Jeśli zdecydujesz się na wykluczenie indeksu waluty krajowej z obu końców płaskiej opcji powyżej (tj. [3,2,1]
Lub [4,3,2]
) i pustej listy „brak możliwości”, upewnij się, że dom-> dom nie jest również pustą listą.
* Jeśli zdarzy się wiele równie dochodowych ważnych szans, zwróć dowolną z nich, niektóre z nich lub wszystkie.
Algorytm Bellmana-Forda jest jednym ze sposobów podejścia do tego, ale prawdopodobnie nie najlepiej nadaje się do golfa.
Przypadki testowe
Pokazane dane wejściowe są zgodne z układem zastosowanym w tym przykładzie, a pokazane wyniki wykorzystują indeksowanie 0, aby wyświetlić listę indeksów walutowych (gdy istnieje możliwość, waluta macierzysta znajduje się tylko na końcu; żadna okazja nie jest pustą listą).
[[0.999900, 1.719828, 4.509549, 0.709929],
[0.579942, 0.999900, 2.619738, 0.409959],
[0.219978, 0.379962, 0.999900, 0.149985],
[1.399860, 2.429757, 6.409359, 0.999900]] -> [3, 2, 1, 0]
[[0.9999, 1.5645, 0.9048, 1.0929],
[0.6382, 0.9999, 0.5790, 0.6998],
[1.1051, 1.7269, 0.9999, 1.2087],
[0.9131, 1.4288, 0.8262, 0.9999]] -> [1, 2, 0]
[[0.9999, 1.4288, 0.8262, 0.9131],
[0.6998, 0.9999, 0.5790, 0.6382],
[1.2087, 1.7269, 0.9999, 1.1051],
[1.0929, 1.5645, 0.9048, 0.9999]] -> [1, 2, 3, 1, 0]
[[1.002662, 1.719828, 4.509549, 0.709929],
[0.579942, 0.999900, 2.619738, 0.409959],
[0.219978, 0.379962, 0.999900, 0.149985],
[1.399860, 2.429757, 6.409359, 0.999900]] -> [3, 2, 1, 0, 0]
[[1.002662, 1.719828, 4.509549, 0.709929],
[0.579942, 1.002604, 2.619738, 0.409959],
[0.219978, 0.379962, 1.003000, 0.149985],
[1.399860, 2.429757, 6.409359, 1.002244]] -> [3, 3, 2, 2, 1, 1, 0, 0]
[[0.9999, 1.4288, 0.8262, 0.9131],
[0.6998, 0.9999, 0.5790, 0.6382],
[1.2087, 1.7269, 1.0001, 1.1051],
[1.0929, 1.4974, 0.9048, 0.9999]] -> [1, 2, 2, 0]
[[0.9999, 1.3262, 0.7262, 0.9131],
[0.6998, 0.9999, 0.5490, 0.6382],
[1.2087, 1.7269, 0.9999, 1.2051],
[1.0929, 1.5645, 0.9048, 0.9999]] -> [3, 2, 3, 1, 0]
[[0.9999, 1.5645, 0.9048, 0.5790],
[0.6382, 0.9999, 0.5790, 0.3585],
[1.1051, 1.7269, 0.9999, 0.6391],
[1.7271, 2.6992, 1.5645, 0.9999]] -> [1, 2, 0] and/or [3, 2, 0]
[[0.9999, 1.2645, 0.7048, 0.3790],
[0.4382, 0.9999, 0.3790, 0.1585],
[1.0001, 1.5269, 1.0001, 0.4391],
[1.5271, 2.4992, 1.3645, 0.9999]] -> []
[[0.9999, 1.2645, 0.7048, 0.3790],
[0.4382, 0.9999, 0.3790, 0.1585],
[0.9999, 1.5269, 1.4190, 0.4391],
[1.5271, 2.4992, 1.3645, 0.9999]] -> [2, 2, 0]
Jest to gra w golfa kodowego, więc wygrywa najkrótsze rozwiązanie w bajtach, ale konkurencja powinna być również oparta na języku, więc nie pozwól, aby języki gry w golfa zniechęciły cię do złożenia ulubionego!
źródło