流放地图组合的路径


10

这个问题的特点是游戏“流放之路”中的机械师。在这个游戏中,有一些叫做“ MAPS”的东西,您可以用来打开高级区域,也可以将其中的三个结合起来以获得升级的区域。这个挑战的任务。升级组合如下:

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,例如3A输入而不是AAA。如果您的答案支持这一点,则可以省略标准输入。

  2. 如果您的程序允许实际的地图名称作为输入/输出,然后将点数乘以1.5,则可以省略地图名称的“地图”部分,例如,输入“ crypt crypt crypt ”和输出“ sewer ”就可以了。如果使用此方法,您的脚本也不再需要了解标准输入。此方法还需要在输入和输出的名称之间留一个空格。

  3. 如果您的输出字符串从最低级别的地图变为最高级别的地图,然后将您的点乘以1.08,则无需以任何特定方式对具有相同级别的地图进行排序。

您可以合并所有3个奖励积分。

答案最多的答案!


我们是否可以假设在输入中相同类型的地图会彼此相邻?例如,在测试用例3中,我们不必处理类似AEIAEIAEI
2015年

没有输入将永远是随机的,现在我想一想,我会为此部分加分
Vajura

1
找到自己的内陆之路,流放!:^ P
FryAmTheEggman 2015年

如果输入是随机的,那么游程奖励如何工作?我们可以得到像这样2AEA的输入AAEA吗?还是会3AE
致命

,我不明白。
OverCoder

Answers:


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

     >»

您从上到下阅读它,一次读两个字母(或忽略奇数列)。三个A代表S,三个S代表W,依此类推。结束的链只需绕到下一行的第一列即可。没有三个地图使>。

以下是您无需重复即可制作的地图链:

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,这使我获得了58分的高分。

编辑:将输出循环重写为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

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

没有在线Minifier版本:(最新版本是通过Minifier传递的)

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

Babel一起跑步


使用以下输入进行了测试:

  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。
致命

糟糕,我一定输入了错误的公式,我会解决的
Christopher Francisco

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前面放置一个。

基本上,这会扫描具有升级功能的每个字符(µ和和除外»),然后找到此字符的所有三个字符的所有集合,并将它们替换为已升级的char。每次排序.replace都是确保始终正常运行的最佳方法,因此这是自动的奖励。1.2奖金要难一些,但是我把它整理成了45个字节。1.5奖金一点也不值得,因为它需要更多的编码,并且至少要加倍长度。

一如既往地欢迎您提出建议!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.