Путь изгнания комбинации карт


10

В этом вопросе будет рассказано о механике из игры «Путь изгнания». В этой игре есть такие вещи, как 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 карты крипт и 2 карты подземелий.

ВЫХОД: на
выходе снова будет строка символов, которая будет представлять максимально возможную комбинацию входных карт. Разрешается любая комбинация выходных данных, если она содержит каждую карту.

ПРИМЕРЫ:

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. Если вы добавляете кодирование длины хода к входу и выходу, умножьте свои точки на 1,2, например, на вход 3A вместо AAA. Вы можете опустить стандартный ввод, если ваш ответ поддержит это.

  2. Если ваша программа будет использовать фактические имена карт в качестве входных / выходных данных, то умножьте свои точки на 1,5, вы можете опустить часть «карты» в имени карты, чтобы в качестве примера ввести « crypt crypt crypt » и вывести « sewer ». Вашему сценарию также не нужно больше понимать стандартный ввод, если вы используете этот метод. Этот метод также требует пробела между именами как на входе, так и на выходе.

  3. Если ваша выходная строка переходит от карты самого низкого уровня к самому высокому, то умножьте свои очки на 1,08, карты с тем же уровнем не нужно сортировать каким-либо конкретным способом.

Вы можете объединить все 3 бонусных балла.

ОТВЕТЬТЕ С НАИБОЛЕЕ ТОЧКАМИ ВЫИГРЫВАЕТ!


Можем ли мы предположить, что на входе карта одного типа будет рядом друг с другом? Например, в тестовом примере 3 нам не нужно иметь дело с чем-то вроде AEIAEIAEI?
Сок

Нет, входные данные всегда будут случайными, я собираю бонусные баллы для этой части сейчас, когда я думаю об этом
Ваджура

1
Найдите свой собственный путь внутрь страны, изгнание! : ^ P
FryAmTheEggman

Если входной сигнал является случайным, то как работает бонус длины пробега? Можем ли мы получить входные данные, как 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   µ  µ  »

     >»

Вы читаете его сверху вниз, по две буквы за раз (или игнорируете нечетные столбцы). Три А делают S, Три S делают Э и так далее. Цепочки, которые заканчиваются, просто переходят к первому столбцу на следующей строке. Нет трех карт делает>.

Вот цепочки карт, которые вы можете сделать без повторов:

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

4

C #, 364 361 байт, точки = 734,754 х 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 очков.

Изменить: Переписать выходной цикл в соединение / 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('');};

Беги с Бабелем


Протестировано со следующими входами:

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

Я не понимаю, как вы можете получить базовую оценку 999,999 с 432 байтами. Я получаю 698,324 с данной формулой.
Роковая

Мое плохое, я, должно быть, набрал формулу неправильно, я исправлю это
Кристофер Франциско

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перед ним.

В основном, это просматривает каждого персонажа, который имеет улучшение (все кроме µи »), затем находит все наборы из трех этого персонажа и заменяет их улучшенным символом. Сортировка после каждого .replaceбыла лучшим способом убедиться, что это всегда работает должным образом, так что это был автоматический бонус. Бонус 1.2 был немного сложнее, но я разобрался в 45 байтах. Бонус 1,5 просто не стоит, так как требует гораздо больше кодирования и, по крайней мере, удвоит длину.

Как всегда, предложения очень приветствуются!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.