Path of exile map combinations
Haskell, 306 bytes, points = 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
I could squeeze out a few more bytes should anyone beat me, but for now I'm going to leave it as is.
Haskell, 284 bytes, points = 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)
I did squeeze out a few more bytes regardless.
Haskell, 248 bytes, points = 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 >»")
I am also going to leave a few tables I made for others to use:
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 µ µ »
>»
You read it from top to bottom, two letters at a time (or ignore odd columns). Three A's make a S, Three S-es makes a W and so on. Chains that end simply wrap around to the first column on the next line. No three maps makes a >.
Here are the chains of maps you can make with no repeats:
ASWKÉÄŸ50)|‡_©µ
EHFJÁË16?-=§~€µ
IRGXÍÏ27!/*[{<»
ULPZ܌490
TCBÓÖÑŸ
NMVK
>»
C#, 364 361 bytes, points = 734.754 x 1.08 = 793.534
Might as well get the ball rolling with a big one...
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)));}
I've yet to think of a clever way of mapping the seemingly random encoded characters to their relative worth, so I've used a brute force method for now.
This implements bonus feature 3 by virtue of the method of grouping, which nets me a cool 58ish points.
Edit: Rewrote output loop into join/zip
SWI-Prolog, 354 bytes, points = 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).
Expects inputs as codes strings, for example a(`AAAEEEIII`,Z).
will output Z = "SRH"
.
I'll see what I can do about the other two bonuses...