Chemin des combinaisons de cartes d'exil

10

Cette question mettra en vedette un mécanicien du jeu "Path Of Exile" dans ce jeu, il y a des choses appelées MAPS ce sont des objets que vous pouvez utiliser pour ouvrir des zones de haut niveau, vous pouvez également combiner 3 d'entre eux pour en obtenir un amélioré qui sera la tâche de ce défi. Les combinaisons de mise à niveau sont les suivantes:

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

Ces lignes suivent ce schéma:

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

Notez que la carte des abysses et du Colisée ne se combine pas en cartes de niveau supérieur car elles sont le niveau le plus élevé.

ENTRÉE:
Votre entrée sera une chaîne de symboles qui correspond aux symboles de la carte, par exemple AAAEE qui signifierait 3 x carte de crypte et 2 x carte de donjon.

SORTIE:
La sortie sera à nouveau une chaîne de symboles qui représenterait la combinaison la plus élevée possible des cartes d'entrée. Toute combinaison de sortie est autorisée tant qu'elle présente chaque carte.

EXEMPLES:

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: »»»»»

SCORING:
Votre score sera calculé à l'aide de cette formule, qui est également utilisée dans le jeu pour calculer la réduction des dégâts:

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

POINTS BONUS:

  1. Si vous ajoutez un encodage à la fois à l'entrée et à la sortie, multipliez vos points par 1,2, exemple 3A au lieu de AAA. Vous pouvez omettre l'entrée standard si votre réponse le soutient.

  2. Si votre programme autorise les noms de carte réels en entrée / sortie, puis multipliez vos points par 1,5, vous pouvez ignorer la partie "carte" du nom de la carte afin qu'un exemple d'entrée " crypt crypt crypt " et de sortie " égout " soit correct. Votre script n'a également plus besoin de comprendre l'entrée standard si vous utilisez cette méthode. Cette méthode nécessite également un espace entre les noms à la fois en entrée et en sortie.

  3. Si votre chaîne de sortie passe de la carte de niveau le plus bas à la plus élevée, multipliez vos points par 1,08, les cartes de même niveau n'ont pas besoin d'être triées d'une manière particulière.

Vous pouvez combiner les 3 points bonus.

RÉPONSE AVEC LE PLUS DE POINTS GAGNE!

Vajura
la source
Pouvons-nous supposer que, dans l'entrée, le même type de carte sera côte à côte? Par exemple, dans le cas de test 3, nous n'avons pas à faire face à quelque chose comme AEIAEIAEI?
Sok
Non, l'entrée sera toujours aléatoire, je vais augmenter les points bonus pour cette partie maintenant que
j'y
1
Trouvez votre propre chemin à l'intérieur des terres, exil! : ^ P
FryAmTheEggman
Si l'entrée est aléatoire, comment fonctionne le bonus de durée d'exécution? Pouvons-nous obtenir des entrées comme 2AEApour AAEA? Ou sera-ce 3AE?
Fatalize
Huh, je ne comprends pas ._.
OverCoder

Réponses:

5

Haskell, 306 octets, 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

Je pourrais extraire quelques octets de plus si quelqu'un me battait, mais pour l'instant je vais le laisser tel quel.

Haskell, 284 octets, 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)

J'ai quand même pressé quelques octets de plus.

Haskell, 248 octets, 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 >»")

Je vais également laisser quelques tableaux que j'ai faits pour que d'autres puissent les utiliser:

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   µ  µ  »

     >»

Vous le lisez de haut en bas, deux lettres à la fois (ou ignorez les colonnes impaires). Trois A font un S, Trois S font un W et ainsi de suite. Les chaînes qui se terminent s'enroulent simplement dans la première colonne de la ligne suivante. Pas trois cartes font un>.

Voici les chaînes de cartes que vous pouvez créer sans répétition:

ASWKÉÄŸ50)|‡_©µ
EHFJÁË16?-=§~€µ
IRGXÍÏ27!/*[{<»
ULPZ܌490
TCBÓÖÑŸ
NMVK
>»
BlackCap
la source
4

C #, 364 361 octets, points = 734,754 x 1,08 = 793,534

Autant faire bouger le ballon avec un gros ...

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)));}

Je n'ai pas encore pensé à un moyen intelligent de mapper les caractères encodés apparemment aléatoires à leur valeur relative, j'ai donc utilisé une méthode de force brute pour l'instant.

Cela implémente la fonction bonus 3 grâce à la méthode de regroupement, qui me rapporte 58 points intéressants.

Edit: Réécriture de la boucle de sortie dans join / zip

Sok
la source
2

SWI-Prolog, 354 octets, 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).

Attend les entrées sous forme de chaînes de codes, par exemple a(`AAAEEEIII`,Z).sortira Z = "SRH".

Je vais voir ce que je peux faire pour les deux autres bonus ...

Fatalize
la source
2

Javascript, 432 octets, points = 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 octets, points = 705,72 * 1,08 * 1,2 = 914,61

Pas de version de minifieur en ligne: (la dernière version a été transmise via un minifieur )

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('');};

Courir avec Babel


Testé avec les entrées suivantes:

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

Solution générale

Fondamentalement, utiliser l'expression régulière autant que possible

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])));
}

Rien d'extraordinaire ici, il suffit de remplacer une correspondance pour la sortie respective.

Pour le bonus 1.2

Regexing les chiffres et la lettre suivante, le code lisible va comme ceci:

// 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]));
}

Comme vous pouvez le voir, s.match(y) - 0la chaîne correspondante est soustraite de 0, c'est-à-dire pour forcer une analyse syntaxique sans réellement appeler parseInt().

Array(p).join(s.match(z)[1])Joint également fondamentalement un tableau d' éléments p vides , avec le caractère trouvé dans la correspondance, c'est un moyen facile d'imprimer une lettre (disons E) un pnombre de fois.

Pour le bonus 1.08

Algorithme de tri:

s.split('').sort(function(a,b) {
    return m.indexOf(a) - m.indexOf(b);
}).join('');
Christopher Francisco
la source
Je ne vois pas comment vous pouvez éventuellement obtenir un score de base de 999,999 avec 432 octets. J'obtiens 698.324 avec la formule donnée.
Fatalize
Mon mauvais, j'ai dû mal taper la formule, je vais la réparer
Christopher Francisco
2

Javascript (ES6), 389 octets, points = 719.942 * 1.08 * 1.2 = 933.045

En tête, du moins pour l'instant ...

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}

Essayez-le ici:

Le bonus 1.2 est quelque peu délicat dans sa mise en forme. Si vous souhaitez saisir un nombre normal, placez-le 1devant.

Fondamentalement, cela analyse tous les personnages qui ont une mise à niveau (tous sauf µet »), puis trouve tous les ensembles de trois de ce personnage et les remplace par le caractère amélioré. Le tri après chacun .replaceétait le meilleur moyen de s'assurer que cela fonctionne toujours correctement, donc c'était un bonus automatique. Le bonus 1.2 était un peu plus difficile, mais je l'ai réglé en 45 octets. Le bonus de 1,5 n'en vaut tout simplement pas la peine, car il nécessite une tonne de plus d'encodage et doublerait au moins la longueur.

Comme toujours, les suggestions sont les bienvenues!

ETHproductions
la source