Ścieżka kombinacji mapy wygnania

10

W tym pytaniu znajdzie się mechanika z gry „Path of Exile”. W tej grze są rzeczy zwane MAPS. Są to przedmioty, których możesz użyć do otwarcia obszarów wysokiego poziomu, możesz też połączyć 3 z nich, aby uzyskać ulepszony, który będzie zadanie tego wyzwania. Kombinacje ulepszeń są następujące:

A Crypt Map 68 -> Sewer Map
E Dungeon Map 68 -> Channel Map
I Grotto Map 68 -> Thicket Map
O Dunes Map 68 -> Mountain Ledge Map
U Pit Map 68 -> Cemetery Map
T Tropical Island Map 68 -> Arcade Map
N Desert Map 68 -> Wharf Map
S Sewer Map 69 -> Ghetto Map
H Channel Map 69 -> Spider Lair Map
R Thicket Map 69 -> Vaal Pyramid Map
D Mountain Ledge Map 69 -> Reef Map
L Cemetery Map 69 -> Quarry Map
C Arcade Map 69 -> Mud Geyser Map
M Wharf Map 69 -> Museum Map
W Ghetto Map 70 -> Arena Map
F Spider Lair Map 70 -> Overgrown Shrine Map
G Vaal Pyramid Map 70 -> Tunnel Map 
Y Reef Map 70 -> Shore Map
P Quarry Map 70 -> Spider Forest Map
B Mud Geyser Map 70 -> Promenade Map
V Museum Map 70 -> Arena Map
K Arena Map 71 -> Underground Sea Map 
J Overgrown Shrine Map 71 -> Pier Map
X Tunnel Map 71 -> Bog Map
Q Shore Map 71 -> Graveyard Map
Z Spider Forest Map 71 -> Coves Map
Ó Promenade Map 71 -> Villa Map 
É Underground Sea Map 72 -> Temple Map
Á Pier Map 72 -> Arachnid Nest Map
Í Bog Map 72 -> Strand Map
Ú Graveyard Map 72 -> Dry Woods Map
Ü Coves Map 72 -> Colonnade Map
Ö Villa Map 72 -> Catacomb Map
Ä Temple Map 73 -> Torture Chamber Map
Ë Arachnid Nest Map 73 -> Waste Pool Map
Ï Strand Map 73 -> Mine Map
Æ Dry Woods Map 73 -> Jungle Valley Map
Œ Colonnade Map 73 -> Labyrinth Map
Ñ Catacomb Map 73 -> Torture Chamber Map
Ÿ Torture Chamber Map 74 -> Cells Map
1 Waste Pool Map 74 -> Canyon Map
2 Mine Map 74 -> Dark Forest
3 Jungle Valley Map 74 -> Dry Peninsula Map
4 Labyrinth Map 74 -> Orchard Map
5 Cells Map 75 -> Underground River Map
6 Canyon Map 75 -> Arid Lake Map
7 Dark Forest Map 75 -> Gorge Map
8 Dry Peninsula Map 75 -> Residence Map
9 Orchard Map 75 -> Underground River Map
0 Underground River Map 76 -> Necropolis Map
? Arid Lake Map 76 -> Plateau Map
! Gorge Map 76 -> Bazaar Map
( Residence Map 76 -> Volcano Map
) Necropolis Map 77 -> Crematorium Map
- Plateau Map 77 -> Precinct Map
/ Bazaar Map 77 -> Academy Map
\ Volcano Map 77 -> Springs Map
| Crematorium Map 78 -> Shipyard Map
= Precinct Map 78 -> Overgrown Ruin Map
* Academy Map 78 -> Village Ruin Map
† Springs Map 78 -> Arsenal Map
‡ Shipyard Map 79 -> Wasteland Map
§ Overgrown Ruin Map 79 -> Courtyard Map
[ Village Ruin Map 79 -> Excavation Map
] Arsenal Map 79 -> Waterways Map
_ Wasteland Map 80 -> Palace Map
~ Courtyard Map 80 -> Shrine Map
{ Excavation Map 80 -> Maze Map
} Waterways Map 80 -> Palace Map
© Palace Map 81 -> Abyss Map
€ Shrine Map 81 -> Abyss Map
< Maze Map 81 -> Colosseum Map 
> Vaal Temple Map 81 -> Colosseum Map
µ Abyss Map 82
» Colosseum Map 82

Te wiersze są następujące:

Symbol of the map | Name of the map | Level of the map | Map received from combining

Zauważ, że mapa otchłani i Koloseum nie łączą się z mapami wyższego poziomu, ponieważ są one na najwyższym poziomie.

WEJŚCIE:
Wprowadzony tekst będzie ciągiem symboli, które odpowiadają symbolom mapy, na przykład AAAEE, co oznaczałoby 3 x mapę krypt i 2 x mapę lochów.

WYJŚCIE:
Wyjście będzie ponownie ciągiem symboli, które reprezentują najwyższą możliwą kombinację map wejściowych. Dowolna kombinacja wyników jest dozwolona, ​​o ile zawiera każdą mapę.

PRZYKŁADY:

INPUT: A
OUTPUT: A

INPUT: AAA
OUTPUT: S

INPUT: AAAEEEIII
OUTPUT: SHR or HRS or RHS or SRH 

INPUT: AAAAAAAAAE
OUTPUT: WE or EW

INPUT: »»»»»
OUTPUT: »»»»»

PUNKTACJA:
Twój wynik zostanie obliczony na podstawie tej formuły, która jest również używana w grze do obliczania redukcji obrażeń:

POINTS = 1000 - (ByteCount / (ByteCount + 1000) * 1000);

PUNKTY BONUSOWE:

  1. Jeśli dodasz kodowanie wybiegu zarówno do wejścia, jak i wyjścia, pomnóż swoje punkty przez 1,2, np. Wejście 3A zamiast AAA. Możesz pominąć standardowe wejście, jeśli twoja odpowiedź na to poprze.

  2. Jeśli twój program zezwoli na faktyczne nazwy map jako dane wejściowe / wyjściowe, a następnie pomnóż swoje punkty przez 1,5, możesz pominąć część „mapy” w nazwie mapy, tak aby przykładowe hasło „ crypt crypt crypt ” i wyjście „ kanalizacja ” było w porządku. Twój skrypt nie musi już rozumieć standardowego wejścia, jeśli używasz tej metody. Ta metoda wymaga również spacji między nazwami na wejściu i wyjściu.

  3. Jeśli ciąg wyjściowy przechodzi od mapy najniższego poziomu do najwyższego, a następnie pomnóż swoje punkty przez 1,08, mapy z tym samym poziomem nie muszą być sortowane w żaden szczególny sposób.

Możesz połączyć wszystkie 3 punkty bonusowe.

ODPOWIEDŹ NA NAJBARDZIEJ PUNKTY WYGRYWA!

Wadżura
źródło
Czy możemy założyć, że na wejściu ten sam typ mapy będzie obok siebie? Na przykład w przypadku testowym 3 nie mamy do czynienia z czymś takim AEIAEIAEI?
Sok
Nie, dane wejściowe zawsze będą losowe, teraz, gdy o tym myślę,
zwiększę liczbę
1
Znajdź własną drogę w głąb lądu, wygnanie! : ^ P
FryAmTheEggman
Jeśli dane wejściowe są losowe, jak działa premia za wydłużenie biegu? Czy możemy uzyskać dane wejściowe jak 2AEAdla AAEA? Czy to będzie 3AE?
Fatalize
Huh, nie rozumiem.
OverCoder,

Odpowiedzi:

5

Haskell, 306 bajtów, punkty = 766 * 1,2 * 1,08 = 992,343

import Control.Arrow;main=print=<<(\x->unwords.map(\(x,y)->show x++[y]).filter((>0).fst).g=<<(read***head)<$>(lex=<<words x))<$>getLine;g z@(x,y)|x<3=[z]|1<2=maybe[z](\w->(x`mod`3,y):g(x`div`3,w)).lookup y$words"ASWKÉÄŸ50)|‡_©µ EHFJÁË16?-=§~€µ IRGXÍÏ27!/*[{<» ULPZÜŒ490 TCBÓÖÑŸ NMVK >»">>= \x->zip x$tail x

Mógłbym wycisnąć jeszcze kilka bajtów, gdyby ktoś mnie pobił, ale na razie zostawię to tak, jak jest.

Haskell, 284 bajty, punkty = 779 * 1,2 * 1,08 = 1009,346

import Control.Arrow;main=interact$show.(\x->unwords[show a++[b]|(a,b)<-g=<<second head<$>(reads=<<words x),a>0]);g z@(x,y)|x<3=[z]|1<2=maybe[z](\w->(x`mod`3,y):g(x`div`3,w)).lookup y$words"ASWKÉÄŸ50)|‡_©µ EHFJÁË16?-=§~€µ IRGXÍÏ27!/*[{<» ULPZÜŒ490 TCBÓÖÑŸ NMVK >»">>=(flip zip=<<tail)

Mimo to wycisnąłem jeszcze kilka bajtów.

Haskell, 248 bajtów, punkty = 801 * 1,2 * 1,08 = 1038,462

main=interact$ \x->unwords[show a++b|(a,b)<-(reads=<<words x)>>=g,a>0];g z@(x,y)|x<3=[z]|1<2=maybe[z](\w->(x`mod`3,y):g(x`div`3,w))$pure<$>lookup(head y)(zip<*>tail=<<words"ASWKÉÄŸ50)|‡_©µ EHFJÁË16?-=§~€µ IRGXÍÏ27!/*[{<» ULPZÜŒ490 TCBÓÖÑŸ NMVK >»")

Zostawię też kilka stolików, które przygotowałem dla innych:

68   AS EH IR OD UL TC NM
69   SW HF RG DY LP CB MV
70   WK FJ GX YQ PZ BÓ VK
71   KÉ JÁ XÍ QÚ ZÜ ÓÖ
72   ÉÄ ÁË ÍÏ ÚÆ ÜŒ ÖÑ
73   ÄŸ Ë1 Ï2 Æ3 Œ4 ÑŸ
74   Ÿ5 16 27 38 49
75   50 6? 7! 8( 90
76   0) ?- !/ (\
77   )| -= /* \†
78   |‡ =§ *[ †]
79   ‡_ §~ [{ ]}
80   _© ~€ {< }©
81   ©µ €µ <»
82   µ  µ  »

     >»

Czytasz to od góry do dołu, dwie litery na raz (lub ignorujesz nieparzyste kolumny). Trzy A tworzą S, trzy S tworzą W i tak dalej. Łańcuchy, które kończą się, po prostu owijają się do pierwszej kolumny w następnym wierszu. Żadne trzy mapy nie tworzą>.

Oto łańcuchy map, które możesz tworzyć bez powtórzeń:

ASWKÉÄŸ50)|‡_©µ
EHFJÁË16?-=§~€µ
IRGXÍÏ27!/*[{<»
ULPZ܌490
TCBÓÖÑŸ
NMVK
>»
Gajówka
źródło
4

DO#, 364 361 bajtów, punkty = 734,754 x 1,08 = 793,534

Równie dobrze może rzucić piłkę dużym ...

string F(string s){var m=@"AEIOUTNSHRDLCMWFGYPBVKJXQZÓÉÁÍÚÜÖÄËÏƌџ1234567890?!()-/\|=*†‡§[]_~{}©€<>µ»";var g=new int[75];foreach(int a in s.Select(c=>m.IndexOf(c)))g[a]++;int i=0;for(;i<73;){g[m.IndexOf(@"SHRDLCMWFGYPBVKJXQZÓKÉÁÍÚÜÖÄËÏƌџ1234Ÿ567890?!(0)-/\|=*†‡§[]_~{}©€<©µµ»»"[i])]+=g[i]/3;g[i++]%=3;}return string.Join("",g.Zip(m,(x,l)=>"".PadLeft(x,l)));}

Jeszcze nie wymyśliłem sprytnego sposobu odwzorowania pozornie przypadkowych zakodowanych postaci na ich względną wartość, więc na razie użyłem metody brutalnej siły.

To implementuje funkcję bonusową 3 dzięki metodzie grupowania, która daje mi fajne 58 punktów.

Edycja: Przepisuj pętlę wyjściową na łączenie / zip

Sok
źródło
2

SWI-Prolog, 354 bajty, punkty = 738,552 * 1,08 = 797,64

a(A,Z):-msort(A,S),b(S,[],B),(msort(B,S),string_codes(Z,S);a(B,Z)).
b(X,R,Z):-(X=[A,A,A|T],nth0(I,`AEIOUTNSHRDLCMWFGYPBVKJXQZÓÉÁÍÚÜÖÄËÏƌџ1234567890?!()-/\\|=*†‡§[]_~{}©€<>`,A),nth0(I,`SHRDLCMWFGYPBVKJXQZÓKÉÁÍÚÜÖÄËÏƌџ1234Ÿ567890?!(0)-/\\|=*†‡§[]_~{}©€<©µµ»»`,B),b(T,[B|R],Z);X=[A|T],b(T,[A|R],Z);Z=R).

Oczekuje, że dane wejściowe będą ciągami kodów, na przykład a(`AAAEEEIII`,Z).dane wyjściowe Z = "SRH".

Zobaczę, co mogę zrobić z pozostałymi dwoma bonusami ...

Fatalizować
źródło
2

JavaScript, 432 bajty, punkty = 698,32 * 1,08 * 1,2 = 905,02

function g(r){for(var n="AEIOUTNSHRDLCMWFGYPBVKJXQZÓÉÁÍÚÜÖÄËÏƌџ1234567890?!()-/|=*†‡§[]_~{}©€<>",t="SHRDLCMWFGYPBVKJXQZÓKÉÁÍÚÜÖÄËÏƌџ1234Ÿ567890?!(0)-/|=*†‡§[]_~{}©€<©µµ»»",a=/([^»µ])\1{2}/,c=/\d+/,e=/\d+(.)/,f=0;0!==(f=r.match(c)-0);)r=r.replace(c,Array(f).join(r.match(e)[1]));for(;null!==(f=r.match(a));)r=r.replace(a,t.charAt(n.search(f[1])));return r.split("").sort(function(r,t){return n.indexOf(r)-n.indexOf(t)}).join("")}

ECMAScript 6, 417 bajtów, punkty = 705,72 * 1,08 * 1,2 = 914,61

Brak wersji minifikatora online: (ostatnia wersja została przekazana przez minifikator )

let F=s=>{for(var m="AEIOUTNSHRDLCMWFGYPBVKJXQZÓÉÁÍÚÜÖÄËÏƌџ1234567890?!()-/\|=*†‡§[]_~{}©€<>",r="SHRDLCMWFGYPBVKJXQZÓKÉÁÍÚÜÖÄËÏƌџ1234Ÿ567890?!(0)-/\|=*†‡§[]_~{}©€<©µµ»»",x=/([^»µ])\1{2}/,y=/\d+/,z=/\d+(.)/,p=0;(p=s.match(y)-0)!==0;)s=s.replace(y,Array(p).join(s.match(z)[1]));for(;(p=s.match(x))!==null;)s=s.replace(x,r.charAt(m.search(p[1])));return s.split('').sort((a,b)=>m.indexOf(a)-m.indexOf(b)).join('');};

Biegnij z Babel


Testowany z następującymi danymi wejściowymi:

  1. AAA
  2. AAAEEEIII
  3. 3A3E3I
  4. »»»»»

Ogólne rozwiązanie

Zasadniczo za pomocą wyrażenia regularnego, jeśli to możliwe

var m = "AEIOUTNSHRDLCMWFGYPBVKJXQZÓÉÁÍÚÜÖÄËÏƌџ1234567890?!()-/\|=*†‡§[]_~{}©€<>";
var r = "SHRDLCMWFGYPBVKJXQZÓKÉÁÍÚÜÖÄËÏƌџ1234Ÿ567890?!(0)-/\|=*†‡§[]_~{}©€<©µµ»»";
var x = /([^»µ])\1{2}/;

while((p=s.match(x))!==null){
    s=s.replace(x,r.charAt(m.search(p[1])));
}

Nic szczególnego, po prostu zastępując dopasowanie dla odpowiedniego wyjścia.

Dla premii 1.2

Regeksując cyfry i następującą literę, czytelny kod wygląda następująco:

// variable 's' is the input string

var y = /\d+/;
var z = /\d+(.)/;

var p = 0;

while((p=s.match(y)-0) !== 0) {
    s=s.replace(y,Array(p).join(s.match(z)[1]));
}

Jak widać, s.match(y) - 0dopasowany ciąg jest odejmowany przez 0, co wymusza analizę składniową bez faktycznego wywołania parseInt().

Również Array(p).join(s.match(z)[1])w zasadzie łączy szereg p pustych elementów, z charakterem znalezionego w meczu, to łatwy sposób, aby wydrukować list (powiedzmy E) pilość razy.

Dla premii 1,08

Algorytm sortowania:

s.split('').sort(function(a,b) {
    return m.indexOf(a) - m.indexOf(b);
}).join('');
Christopher Francisco
źródło
Nie rozumiem, jak można uzyskać wynik podstawowy 999,999 z 432 bajtami. Otrzymuję 698,324 przy podanym wzorze.
Fatalize
Mój zły, musiałem źle wpisać formułę, naprawię to
Christopher Francisco
2

JavaScript (ES6), 389 bajtów, punkty = 719,942 * 1,08 * 1,2 = 933,045

Na czele, przynajmniej na razie ...

a=>{a=a.replace(/(\d)(.)/g,(m,A,B)=>B.repeat(A)),x='AEIOUTNSHRDLCMWFGYPBVKJXQZÓÉÁÍÚÜÖÄËÏƌџ1234567890?!()-/\\|=*†‡§[]_~{}©€<>',y='SHRDLCMWFGYPBVKJXQZÓKÉÁÍÚÜÖÄËÏƌџ1234Ÿ567890?!(0)-/\\|=*†‡§[]_~{}©€<©µµ»»',s=_=>(a=[...a].sort((a,b)=>x[I='indexOf'](a)-x[I](b)).join``);s();for(i=0;i<x.length;i++){a=a.replace(new RegExp(`[${('\\|'[I](h=x[i])<0?'':'\\')+h}]{3}`,'g'),y[i]);s()}return a}

Wypróbuj tutaj:

Bonus 1.2 jest nieco trudny w formatowaniu. Jeśli chcesz wprowadzić zwykły numer, umieść 1go przed nim.

Zasadniczo, skanuje każdą postać, która ma ulepszenie (wszystkie oprócz µi »), a następnie wyszukuje wszystkie zestawy trzech postaci i zastępuje je ulepszonym char. Sortowanie według każdego z nich .replacebyło najlepszym sposobem, aby upewnić się, że zawsze działa poprawnie, więc był to automatyczny bonus. Bonus 1.2 był trochę trudniejszy, ale udało mi się go rozdzielić na 45 bajtów. Premia 1,5 po prostu nie jest tego warta, ponieważ wymaga tony więcej kodowania i co najmniej podwoi długość.

Jak zawsze sugestie są bardzo mile widziane!

ETHprodukcje
źródło