เส้นทางของแผนที่ที่ถูกเนรเทศ


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

โปรดทราบว่าแผนที่ Abyss และ Colosseum ไม่ได้รวมอยู่ในเลเวลที่สูงกว่าเนื่องจากเป็นระดับสูงสุด

อินพุต:
อินพุตของคุณจะเป็นสตริงของสัญลักษณ์ที่สอดคล้องกับสัญลักษณ์แผนที่เช่น AAAEE ซึ่งหมายถึงแผนที่ 3 x crypt และแผนที่ 2 x dungeon


เอาท์พุท:เอาท์พุทจะเป็นสตริงของสัญลักษณ์อีกครั้งซึ่งจะเป็นตัวแทนของการรวมกันที่เป็นไปได้สูงสุดของการป้อนข้อมูลแผนที่ การรวมเอาท์พุทใด ๆ ที่ได้รับอนุญาตตราบใดที่มันมีทุกแผนที่

ตัวอย่าง:

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 คุณสามารถลบส่วน "map" ของชื่อแผนที่เพื่อเป็นตัวอย่างอินพุต " crypt crypt crypt " และเอาท์พุท " sewer " ได้ สคริปต์ของคุณไม่จำเป็นต้องเข้าใจอินพุตมาตรฐานอีกต่อไปหากคุณใช้วิธีนี้ วิธีนี้ยังต้องการช่องว่างระหว่างชื่อในทั้งอินพุตและเอาต์พุต

  3. หากสตริงออกของคุณไปจากแผนที่ระดับต่ำสุดไปสูงสุดแล้วคูณคะแนนของคุณด้วย 1.08 แผนที่ที่มีระดับเดียวกันก็ไม่จำเป็นต้องเรียงในลักษณะใด ๆ

คุณสามารถรวมคะแนนโบนัสทั้ง 3

ตอบด้วยคะแนนมากที่สุดชนะ!


เราสามารถสันนิษฐานได้ว่าในแผนที่อินพุตแผนที่ประเภทเดียวกันจะอยู่ติดกัน? ตัวอย่างเช่นในกรณีทดสอบ 3 เราไม่ต้องจัดการกับอะไรอย่างนั้นAEIAEIAEIเหรอ?
Sok

ไม่มีการป้อนข้อมูลจะถูกสุ่มเสมอไปฉันจะทำคะแนนโบนัสให้ส่วนนั้นตอนนี้ที่ฉันคิดเกี่ยวกับมัน
Vajura

1
ค้นหาเส้นทางของคุณในประเทศพลัดถิ่น! : ^ P
FryAmTheEggman

หากอินพุตเป็นแบบสุ่มโบนัส runlength จะทำงานอย่างไร เราจะได้รับปัจจัยการผลิตเช่น2AEAสำหรับAAEA? หรือมันจะเป็น3AEอย่างไร
ทำให้เสียชีวิต

ฉันไม่เข้าใจเลย.
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   µ  µ  »

     >»

คุณอ่านจากบนลงล่าง, ตัวอักษรสองตัวในเวลาเดียวกัน (หรือละเว้นคอลัมน์คี่) Three A's a a S, Three S-es ทำ W และอื่น ๆ เชนที่สิ้นสุดเพียงแค่ล้อมรอบไปยังคอลัมน์แรกในบรรทัดถัดไป ไม่มีสามแผนที่ที่สร้าง>

นี่คือเชนของแผนที่ที่คุณสามารถทำได้โดยไม่ต้องทำซ้ำ:

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

4

ค#, 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 โดยอาศัยวิธีการจัดกลุ่มซึ่งทำให้ฉันมีคะแนน 58ish ที่ยอดเยี่ยม

แก้ไข: เขียนซ้ำลูปเอาท์พุทเป็นการเข้าร่วม / 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. »»»»»

วิธีแก้ปัญหาทั่วไป

โดยทั่วไปใช้ regex ทุกครั้งที่ทำได้

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 โบนัส

Regexing ตัวเลขและตัวอักษรต่อไปนี้รหัสที่อ่านได้จะเป็นดังนี้:

// 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 ว่างเปล่าเข้าด้วยกันโดยที่อักขระที่พบในการแข่งขันเป็นวิธีที่ง่ายในการพิมพ์ตัวอักษร (สมมติว่าE) pจำนวนครั้ง

สำหรับโบนัส 1.08

อัลกอริทึมการเรียงลำดับ:

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

ฉันไม่เห็นวิธีที่คุณจะได้รับคะแนนฐาน 999.999 ด้วย 432 ไบต์ ฉันได้รับ 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 นั้นไม่คุ้มเลยเพราะมันต้องมีการเข้ารหัสมากกว่านี้และจะเพิ่มความยาวเป็นสองเท่าเป็นอย่างน้อย

เช่นเคยข้อเสนอแนะยินดีต้อนรับมาก!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.