Đường dẫn kết hợp bản đồ lưu vong


10

Câu hỏi này sẽ có một thợ máy từ trò chơi "Path Of Exile" trong trò chơi này, có những thứ gọi là MAPS, chúng là những vật phẩm mà bạn có thể sử dụng để mở các khu vực cấp cao, bạn cũng có thể kết hợp 3 trong số chúng để được nâng cấp. nhiệm vụ của thử thách này. Các kết hợp nâng cấp như sau:

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

Những dòng này theo sheme này:

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

Lưu ý rằng bản đồ vực thẳm và colosseum không kết hợp thành cấp độ cao hơn vì chúng là cấp độ cao nhất.

INPUT:
Đầu vào của bạn sẽ là một chuỗi các Biểu tượng tương ứng với các biểu tượng bản đồ, ví dụ AAAEE có nghĩa là 3 x bản đồ mật mã và 2 x bản đồ dungeon.

OUTPUT:
Đầu ra sẽ lại là một chuỗi các ký hiệu đại diện cho sự kết hợp cao nhất có thể của các bản đồ đầu vào. Bất kỳ sự kết hợp đầu ra nào cũng được cho phép miễn là nó có tính năng trên mọi bản đồ.

VÍ DỤ:

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:
Điểm của bạn sẽ được tính thông qua công thức này, đây cũng là điểm thực tế được sử dụng trong trò chơi để tính toán giảm sát thương:

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

ĐIỂM THƯỞNG:

  1. Nếu bạn thêm mã hóa runlenght cho cả đầu vào và đầu ra thì nhân số điểm của bạn với 1,2, ví dụ đầu vào 3A thay vì AAA. Bạn có thể bỏ qua đầu vào tiêu chuẩn nếu câu trả lời của bạn sẽ hỗ trợ điều này.

  2. Nếu chương trình của bạn sẽ cho phép tên bản đồ thực tế là đầu vào / đầu ra sau đó nhân số điểm của bạn với 1,5, bạn có thể sử dụng phần "bản đồ" của tên bản đồ để ví dụ nhập " mật mã mật mã " và đầu ra " cống " là ok. Kịch bản của bạn cũng không cần phải hiểu đầu vào tiêu chuẩn nữa nếu bạn sử dụng phương pháp này. Phương pháp này cũng yêu cầu một khoảng trắng giữa các tên trong cả đầu vào và đầu ra.

  3. Nếu chuỗi đầu ra của bạn đi từ bản đồ cấp thấp nhất đến cao nhất thì nhân số điểm của bạn với 1,08, các bản đồ có cùng cấp độ không cần phải được sắp xếp theo bất kỳ cách cụ thể nào.

Bạn có thể kết hợp cả 3 điểm thưởng.

TRẢ LỜI VỚI NHỮNG ĐIỂM HẤP DẪN NHẤT!


Chúng ta có thể giả sử rằng, trong đầu vào, cùng loại bản đồ sẽ nằm cạnh nhau không? Ví dụ, trong trường hợp thử nghiệm 3, chúng ta không phải đối phó với một cái gì đó như thế AEIAEIAEInào?
Sok

Không có đầu vào nào sẽ luôn là ngẫu nhiên, tôi sẽ tăng số điểm thưởng cho phần đó ngay bây giờ khi tôi nghĩ về nó
Vajura 16/07/2015

1
Tìm đường đi riêng, lưu vong! : ^ P
FryAmTheEggman

Nếu đầu vào là ngẫu nhiên thì phần thưởng runlength hoạt động như thế nào? Chúng ta có thể có được đầu vào như 2AEAcho AAEA? Hay nó sẽ là 3AE?
Gây tử vong

Huh, tôi không hiểu ._.
OverCoder

Câu trả lời:


5

Haskell, 306 byte, điểm = 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

Tôi có thể vắt kiệt thêm một vài byte nếu ai đó đánh bại tôi, nhưng bây giờ tôi sẽ để nó như vậy.

Haskell, 284 byte, điểm = 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)

Tôi đã vắt ra một vài byte bất kể.

Haskell, 248 byte, điểm = 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 >»")

Tôi cũng sẽ để lại một vài bảng tôi đã tạo cho người khác sử dụng:

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

     >»

Bạn đọc nó từ trên xuống dưới, hai chữ cái cùng một lúc (hoặc bỏ qua các cột lẻ). Three A là một S, Three S-es tạo thành W và cứ thế. Chuỗi kết thúc chỉ đơn giản là quấn quanh cột đầu tiên trên dòng tiếp theo. Không có ba bản đồ làm cho một>.

Dưới đây là chuỗi bản đồ bạn có thể thực hiện mà không lặp lại:

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

4

C #, 364 361 byte, điểm = 734.754 x 1.08 = 793.534

Cũng có thể có được quả bóng lăn với một ...

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

Tôi vẫn chưa nghĩ ra một cách thông minh để ánh xạ các ký tự được mã hóa dường như ngẫu nhiên thành giá trị tương đối của chúng, vì vậy tôi đã sử dụng một phương pháp vũ phu cho đến bây giờ.

Điều này thực hiện tính năng phần thưởng 3 nhờ vào phương pháp phân nhóm, tạo cho tôi 58 điểm tuyệt vời.

Chỉnh sửa: Viết lại vòng lặp đầu ra vào tham gia / zip


2

SWI-Prolog, 354 byte, điểm = 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).

Yêu cầu đầu vào dưới dạng chuỗi mã, ví dụ a(`AAAEEEIII`,Z).sẽ xuất Z = "SRH".

Tôi sẽ xem những gì tôi có thể làm về hai phần thưởng khác ...


2

Javascript, 432 byte, điểm = 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 byte, điểm = 705.72 * 1.08 * 1.2 = 914.61

Không có phiên bản minifier trực tuyến: (phiên bản cuối cùng đã được thông qua thông qua một 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('');};

Chạy với Babel


Đã thử nghiệm với các đầu vào sau:

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

Giải pháp chung

Về cơ bản sử dụng regex bất cứ khi nào có thể

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

Không có gì lạ mắt ở đây, chỉ cần thay thế một trận đấu cho đầu ra tương ứng.

Đối với phần thưởng 1,2

Lấy lại các số và chữ cái sau đây, mã có thể đọc được như sau:

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

Như bạn có thể thấy, s.match(y) - 0chuỗi khớp được trừ đi 0, đó là để buộc một parse int mà không thực sự gọi parseInt().

Array(p).join(s.match(z)[1])Về cơ bản cũng tham gia một loạt các yếu tố p trống , với ký tự được tìm thấy trong trận đấu, đó là một cách dễ dàng để in một chữ cái (giả sử E) psố lần.

Đối với Tiền thưởng 1,08

Thuật toán sắp xếp:

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

Tôi không thấy làm thế nào bạn có thể có được điểm cơ bản 999.999 với 432 byte. Tôi nhận được 698.324 với công thức đã cho.
Gây tử vong

Thật tệ, tôi đã gõ sai công thức, tôi sẽ sửa nó
Christopher Francisco

2

Javascript (ES6), 389 byte, điểm = 719.942 * 1.08 * 1.2 = 933.045

Trong đầu, ít nhất là bây giờ ...

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}

Hãy thử nó ở đây:

Phần thưởng 1,2 có phần khó khăn trong định dạng của nó. Nếu bạn muốn nhập một số thông thường, đặt một số 1trước nó.

Về cơ bản, điều này quét qua mọi nhân vật có bản nâng cấp (tất cả ngoại trừ µ»), sau đó tìm tất cả các bộ ba nhân vật này và thay thế chúng bằng char nâng cấp. Sắp xếp sau mỗi .replacecách là cách tốt nhất để đảm bảo rằng điều này luôn hoạt động đúng, vì vậy đó là phần thưởng tự động. Phần thưởng 1,2 khó hơn một chút, nhưng tôi đã nhận được nó được sắp xếp theo 45 byte. Phần thưởng 1,5 hoàn toàn không xứng đáng, vì nó đòi hỏi nhiều mã hóa hơn và ít nhất sẽ gấp đôi chiều dài.

Như mọi khi, đề xuất rất được hoan nghênh!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.