Finden Sie anhand einer Kurstabelle eine maximal rentable Abfolge von Börsen.
Betrachten Sie als Beispiel die Währungen A riary (Ihre Heimatwährung), B aht, C edi und D enar, bei denen der Wechselkurs (nachdem ein Transaktionskurs erhoben wurde) durch den Eintrag in (Zeile, Spalte) angegeben wird die Wechselkurstabelle unten:
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
Offensichtlich ist es keine gute Idee , A gegen A zu tauschen, da Sie an diesem Schreibtisch gerne dafür belastet werden, dass Sie nichts tun.
Weniger offensichtlich, aber bei dieser Tabelle stimmt es, wenn A gegen eine andere Währung getauscht und dann wieder zurückgetauscht wird:
via B: 1.719828 × 0.579942 = 0.997400489976
via C: 4.509549 × 0.219978 = 0.992001569922
via D: 0.709929 × 1.39986 = 0.99380120994
Ein Umtausch von A nach D, dann von D nach B und dann von B zurück nach A bringt jedoch Gewinn (vorausgesetzt, dass genügend Kapital vorhanden ist, um der Rundung nicht zu erliegen):
0.709929 × 2.429757 × 0.579942 = 1.0003738278192194
Man könnte dieses "kostenlose Mittagessen" wiederholt einnehmen, solange die Gelegenheit besteht.
Aber hier gibt es eine noch verlockendere Kette, nämlich von A nach D, dann von D nach C, dann von C nach B und schließlich von B nach A :
0.709929 × 6.409359 × 0.379962 × 0.579942 = 1.0026612752037345
Herausforderungsdetails
Wenn eine Wechselkurstabelle in einem angemessenen Format vorliegt, das die Bedeutung der Heimatwährung festlegt (z. B. sind die erste Zeile und die erste Spalte immer die Heimatwährung)
(oder wenn eine solche Tabelle und ein Heimatwährungsindex vorliegen)
, ist ein * zu finden. Maximale Arbitrage-Reihenfolge der Börsen , die mit der Heimatwährung als Index in der Währungsliste beginnen und enden, ohne die Verwendung einer beliebigen Börse zu wiederholen (dh eine Y-> X-Börse kann einer X-> Y-Börse folgen, eine X-> Y-Börse jedoch nicht) folge einem X-> Y).
Wenn keine solche profitable Gelegenheit besteht, geben Sie eine leere Liste oder ein anderes Ergebnis heraus, das nicht mit einer identifizierten Gelegenheit verwechselt werden kann.
- zB für das obige Beispiel ( A-> D, D-> C, C-> B, B-> A ):
- mit 0-Indexierung kann man
[[0,3],[3,2],[2,1],[1,0]]
oder zurückgeben[0,3,2,1,0]
- mit 1-Indexierung kann man
[[1,4],[4,3],[3,2],[2,1]]
oder zurückgeben[1,4,3,2,1]
Andere Formate sind in Ordnung, solange keine Mehrdeutigkeiten bestehen.
- Eine Sache, auf die Sie achten sollten, ist, dass es für die beste Gelegenheit möglich ist, eine einzelne Transaktion von zu Hause aus zu tätigen (ein dummer Schreibtisch). Wenn Sie sich dafür entscheiden, den Heimatwährungsindex von beiden Enden der obigen Flat-Option (dh [3,2,1]
oder [4,3,2]
) und eine leere Liste für "keine Chance" auszuschließen, stellen Sie sicher, dass die Heimat-> Heimat nicht auch eine leere Liste ist.
* Wenn mehrere, gleichermaßen profitable, gültige Opportunities vorhanden sind, geben Sie eine davon, einige davon oder alle zurück.
Der Bellman-Ford-Algorithmus ist eine Möglichkeit, dies zu erreichen, aber wahrscheinlich nicht die beste für Golf.
Testfälle
Die angezeigten Eingaben entsprechen der im Beispiel verwendeten Anordnung, und die angezeigten Ergebnisse verwenden die 0-Indizierung, um die Währungsindizes aufzulisten.
[[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]
Dies ist Code-Golf, daher gewinnt die kürzeste Lösung in Bytes, aber der Wettbewerb sollte auch in der Sprache stattfinden. Lassen Sie sich also nicht von Code-Golf-Sprachen davon abhalten, Ihre Lieblingslösung einzureichen!