亡命マップの組み合わせのパス


10

この質問には、このゲームのゲーム「Path Of Exile」のメカニックが登場します。MAPSと呼ばれるものがあります。これらは、高レベルのエリアを開くために使用できるアイテムです。それらの3つを組み合わせて、アップグレードされたものを取得することもできます。この挑戦の課題。アップグレードの組み合わせは次のとおりです。

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

これらの行はこのスキームに従います:

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

奈落の底とコロッセオのマップは最高レベルであるため、組み合わせて高レベルのマップにしないでください。

入力:
入力は、マップシンボルに対応するシンボルの文字列になります。例:AAAEEは、3 xクリプトマップと2 xダンジョンマップを意味します。

出力:
出力は、入力マップの可能な限り最高の組み合わせを表す一連のシンボルになります。すべてのマップを備えている限り、出力の任意の組み合わせが許可されます。

例:

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


スコアリング:あなたのスコアはこの式で計算されます。これは実際にゲームでダメージ軽減を計算するためにも使用されます:

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

ボーナスポイント:

  1. 入力と出力の両方にrunlenghtエンコーディングを追加する場合は、ポイントに1.2を掛けます(例:AAAではなく3A入力)。回答がこれをサポートする場合は、標準入力を省略できます。

  2. あなたのプログラムが1.5で、その後乗算入力/出力としてあなたのポイントを、実際のマップ名を許可する場合の入力例「ように、あなたはマップ名の「マップ」の部分をOMMITできる暗号地下室地下室」と出力「下水道は」okです。この方法を使用する場合、スクリプトは標準入力を理解する必要もありません。この方法では、入力と出力の両方の名前の間にスペースも必要です。

  3. 出力文字列が最低レベルのマップから最高レベルに移動する場合は、ポイントに1.08を掛けます。同じレベルのマップを特定の方法でソートする必要はありません。

3つのボーナスポイントをすべて組み合わせることができます。

最も勝ち点で答える!


入力では、同じタイプのマップが隣り合っていると想定できますか?たとえば、テストケース3では、次のようなことを処理する必要はありませんAEIAEIAEI
2015

入力は常にランダムではありません。私はそれについて考えた今、その部分のボーナスポイントを増やします
Vajura

1
内陸に自分の道を見つけて、流刑に!:^ P
FryAmTheEggman 2015

入力がランダムな場合、ランレングスボーナスはどのように機能しますか?2AEAforのような入力を取得できますAAEAか?それともそう3AEですか?
15

ええ、私はそれを取得しません。
OverCoder

回答:


5

Haskell、306バイト、ポイント= 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

誰かが私を倒した場合は、さらに数バイトを絞ることができますが、今のところはそのままにしておきます。

Haskell、284バイト、ポイント= 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)

私は関係なく、さらに数バイトを絞り出しました。

Haskell、248バイト、ポイント= 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 >»")

また、他の人が使用できるように作成したいくつかのテーブルを残します。

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

     >»

一度に2文字ずつ上から下に読みます(または奇数列を無視します)。3つのAはSを作成し、3つのS-esはWを作成します。終了するチェーンは、単に次の行の最初の列に回り込みます。3つのマップが>を作ることはありません。

繰り返しなしで作成できる一連のマップを次に示します。

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

4

C#、 364 361バイト、ポイント= 734.754 x 1.08 = 793.534

大きなボールでボールを転がすこともできます...

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

見かけ上ランダムにエンコードされた文字を相対的な価値にマッピングする賢い方法をまだ考えていないので、今のところブルートフォースメソッドを使用しています。

これは、グループ化の方法のおかげでボーナス機能3を実装します。

編集:出力ループをjoin / zipに書き直しました


2

SWI-Prolog、354バイト、ポイント= 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).

入力をコード文字列として期待しa(`AAAEEEIII`,Z).ますZ = "SRH"。たとえば、出力します。

他の2つのボーナスについて何ができるか見ていきます...


2

Javascript、432バイト、ポイント= 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バイト、ポイント= 705.72 * 1.08 * 1.2 = 914.61

オンラインミニファイアバージョンなし:(最後のバージョンはミニファイアを通過しました)

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

バベルで実行


次の入力でテストされます。

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

一般的な解決策

基本的に可能な限り正規表現を使用する

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

ここでは特別なことはせず、それぞれの出力の一致を置き換えるだけです。

1.2ボーナスの場合

数字と次の文字を正規表現すると、読み取り可能なコードは次のようになります。

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

ご覧のとおりs.match(y) - 0、一致した文字列は0で減算されます。これは、実際にを呼び出さなくても、intの解析を強制するためparseInt()です。

また、Array(p).join(s.match(z)[1])基本的にはp 空の要素の配列を、一致した文字で結合します。これは、文字を(たとえば、Ep何度も印刷する簡単な方法です。

1.08ボーナスの場合

並べ替えアルゴリズム:

s.split('').sort(function(a,b) {
    return m.indexOf(a) - m.indexOf(b);
}).join('');

432バイトで999.999の基本スコアを取得できる方法がわかりません。与えられた式で698.324を取得します。
15

私の悪いことに、私は式を間違って入力したに違いありません、私はそれを修正します
クリストファーフランシスコ

2

JavaScript(ES6)、389バイト、ポイント= 719.942 * 1.08 * 1.2 = 933.045

リードでは、少なくとも今のところ...

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}

ここで試してください:

1.2のボーナスは、フォーマット設定がややトリッキーです。通常の番号を入力する場合は、その1前にa を付けます。

基本的には、(すべてを除くアップグレード持つすべての文字を通じて、このスキャンµとは»)、この文字の3のすべてのセットを検出し、アップグレードした文字に置き換えます。それぞれの後の並べ替え.replaceは、これが常に適切に機能することを確認するための最良の方法でしたので、それは自動ボーナスでした。1.2のボーナスは少し難しいですが、45バイトに分類されました。1.5のボーナスは、それ以上のエンコーディングを必要とし、長さが少なくとも2倍になるため、まったく価値がありません。

いつものように、提案は大歓迎です!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.