망명지도 조합의 경로


10

이 질문에는 게임 "Path Of Exile"의 정비공이 있습니다. 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

이 라인은이 sheme을 따릅니다.

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 인코딩을 입력과 출력 모두에 추가하는 경우 AAA 대신 3A 입력과 같은 1.2를 포인트에 곱하십시오. 답변에서 지원할 경우 표준 입력을 생략 할 수 있습니다.

  2. 프로그램에서 실제 맵 이름을 입력 / 출력으로 허용하고 포인트에 1.5를 곱하면 맵 이름의 "map"부분을 생략하여 입력 " crypt crypt crypt "및 출력 " sewer "가 괜찮을 수 있습니다. 이 방법을 사용하면 스크립트는 더 이상 표준 입력을 이해할 필요가 없습니다. 이 방법은 또한 입력과 출력 모두에서 이름 사이에 공백이 필요합니다.

  3. 출력 문자열이 최저 레벨 맵에서 최고 레벨로 이동 한 다음 포인트에 1.08을 곱하면 동일한 레벨의 맵을 특정 방식으로 정렬 할 필요가 없습니다.

3 개의 보너스 포인트를 모두 결합 할 수 있습니다.

가장 많은 포인트를 가진 답이 있습니다!


입력에서 같은 유형의지도가 나란히 있다고 가정 할 수 있습니까? 예를 들어, 테스트 사례 3에서는 AEIAEIAEI? 와 같은 것을 처리 할 필요가 없습니다 .
Sok

입력이 항상 랜덤하지 않습니다. 제가 생각하는 부분에 대한 보너스 포인트를
늘릴

1
내륙의 길을 찾아 망명하십시오! : ^ P
FryAmTheEggman

입력이 무작위라면 실행 길이 보너스는 어떻게 작동합니까? 우리는 입력과 같은받을 수 2AEA에 대한 AAEA? 아니면 그럴까요 3AE?
Fatalize

허, 나는 그것을 얻지 못한다 ._.
OverCoder

답변:


5

하스켈, 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

누군가 나를 이길 경우 몇 바이트를 더 짜낼 수는 있지만 지금은 그대로 두겠습니다.

하스켈, 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)

나는 몇 바이트를 더 짜내었다.

하스켈, 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를 만들고 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 포인트를 얻습니다.

편집 : 출력 루프를 join / zip으로 다시 작성


2

SWI- 프롤로그, 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).output) Z = "SRH".

다른 두 보너스에 대해 내가 할 수있는 일을 볼 것입니다 ...


2

자바 스크립트, 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 있는 빈 요소 배열을 조인합니다. 이는 문자 (말하자 E) 를 인쇄하는 쉬운 방법 p입니다.

1.08 보너스

정렬 알고리즘 :

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

432 바이트로 기본 점수 999.999를 얻는 방법을 모르겠습니다. 주어진 수식으로 698.324를 얻습니다.
Fatalize

나의 나쁜, 나는 공식을 잘못 입력했을 것이다, 나는 그것을 고칠 것이다
Christopher Francisco

2

자바 스크립트 (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앞에 숫자를 넣으 십시오.

기본적으로 업그레이드가있는 모든 문자 ( µ및 모두 제외 »)를 스캔 한 다음이 문자의 세 세트를 모두 찾아 업그레이드 된 문자로 바꿉니다. 각 후 정렬.replace 을 하는 것이 이것이 항상 제대로 작동하는지 확인하는 가장 좋은 방법이므로 자동 보너스였습니다. 1.2 보너스는 조금 더 어려웠지만 45 바이트로 정렬되었습니다. 1.5 보너스는 전혀 가치가 없으며, 더 많은 인코딩이 필요하고 길이가 최소 두 배가 될 것입니다.

언제나 그렇듯이 제안은 매우 환영합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.