Sürgün haritası kombinasyonları yolu


10

Bu soru oyunun bir mekaniği "Sürgün Yolu" dan bu oyunda MAPS denilen şeyler vardır onlar yüksek düzey alanları açmak için kullanabileceğiniz öğeler, ayrıca 3 yükseltilmiş bir almak için birleştirebilirsiniz bu zorluğun görevi. Yükseltme kombinasyonları aşağıdaki gibidir:

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

Bu çizgiler bu şemayı takip eder:

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

Uçurum ve colosseum haritasının en üst seviye olduğu için daha yüksek seviyelerde birleştirilmediğini unutmayın.

GİRİŞ:
Girişiniz, harita sembollerine karşılık gelen bir Semboller dizisi olacaktır, örneğin AAAEE, 3 x kript haritası ve 2 x zindan haritası anlamına gelir.

ÇIKTI:
Çıkış, yine giriş haritalarının mümkün olan en yüksek kombinasyonunu temsil eden bir sembol dizisi olacaktır. Her haritaya sahip olduğu sürece herhangi bir çıktı kombinasyonuna izin verilir.

ÖRNEKLER:

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

PUANLAMA:
Puanınız, oyunda hasar azaltmayı hesaplamak için de kullanılan bu formülle hesaplanacaktır:

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

BONUS PUANLAR:

  1. Hem giriş hem de çıkışa çalışma uzunluğu kodlaması eklerseniz, puanlarınızı AAA yerine 1.2, örnek 3A girişi ile çarpın. Cevabınız bunu destekleyecekse standart girişi atlayabilirsiniz.

  2. Programınız gerçek harita adlarına giriş / çıkış olarak izin verirse, puanlarınızı 1,5 ile çarparsa, örnek giriş " crypt crypt crypt " ve " kanalizasyon " çıktısı olarak harita adının "map" kısmını ommitleyebilirsiniz . Bu yöntemi kullanırsanız betiğinizin artık standart girdiyi anlaması gerekmez. Bu yöntem aynı zamanda hem girdi hem de çıktıdaki adlar arasında boşluk olmasını gerektirir.

  3. Çıktı dizeniz en düşük seviye haritasından en yükseğe çıkarsa, puanlarınızı 1.08 ile çarpın, aynı seviyedeki haritaların herhangi bir şekilde sıralanması gerekmez.

3 bonus puanının hepsini birleştirebilirsiniz.

CEVAPLARLA CEVAP KAZANIR!


Girişte aynı tür haritanın yan yana olacağını varsayabilir miyiz? Örneğin, test durumu 3'te AEIAEIAEI?
Sok

Hayır giriş her zaman rastgele olacak, ben şimdi bunu düşünüyorum o bölüm için bonus puan kadar
bumb

1
Kendi yolunu bul, sürgün! : ^ P
FryAmTheEggman

Giriş rastgele ise, çalışma süresi bonusu nasıl çalışır? Biz girişler gibi alabilir miyim 2AEAiçin AAEA? Yoksa olacak 3AEmı?
53'te ölümcül

Ha, anlamıyorum ._.
OverCoder

Yanıtlar:


5

Haskell, 306 bayt, puan = 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

Biri beni döverse birkaç bayt daha çıkarabilirdim, ama şimdilik olduğu gibi bırakacağım.

Haskell, 284 bayt, puan = 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)

Ne olursa olsun birkaç bayt daha sıktım.

Haskell, 248 bayt, puan = 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 >»")

Ayrıca başkalarının kullanması için yaptığım birkaç tablodan da ayrılacağım:

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

     >»

Her seferinde iki harf yukarıdan aşağıya okursunuz (veya tek sütunları yoksayabilirsiniz). Üç A bir S yapar, Üç S-es bir W yapar vb. Biten zincirler, bir sonraki satırdaki ilk sütuna sarılır. Hiçbir üç harita bir> yapmaz.

Tekrar etmeden yapabileceğiniz harita zincirleri:

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

4

C #, 364 361 bayt, puan = 734.754 x 1.08 = 793.534

Topun büyük bir topla yuvarlanması da mümkün ...

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

Görünüşte rastgele kodlanmış karakterleri göreceli değerlerine eşlemenin akıllı bir yolunu henüz düşünmedim, bu yüzden şimdilik kaba kuvvet yöntemi kullandım.

Bu, gruplandırma yöntemi sayesinde bonus özelliği 3'ü uygular, bu da bana 58ish puan kazandırır.

Düzenleme: Çıktı döngüsünü birleştirme / zip olarak yeniden yaz


2

SWI-Prolog, 354 bayt, puan = 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).

Girdileri kod dizesi olarak bekler, örneğin a(`AAAEEEIII`,Z).çıktı alır Z = "SRH".

Diğer iki bonus hakkında neler yapabileceğimi göreceğim ...


2

Javascript, 432 bayt, puan = 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 bayt, puan = 705,72 * 1,08 * 1,2 = 914,61

Çevrimiçi küçültücü sürümü yok: (son sürüm bir küçültücüden geçirildi )

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 ile Koş


Aşağıdaki girişlerle test edilmiştir:

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

Genel çözüm

Temel olarak mümkün olduğunda normal ifadeyi kullanma

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

Burada süslü bir şey yok, sadece ilgili çıkış için bir eşleşmenin yerini alıyor.

1.2 Bonus için

Rakamları ve aşağıdaki mektubu düzenli olarak okuyarak okunabilir kod şu şekilde olur:

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

Gördüğünüz gibi s.match(y) - 0, eşleşen dize 0 ile çıkarılır, bu aslında çağırmadan bir ayrıştırma int'i zorlar parseInt().

Ayrıca, Array(p).join(s.match(z)[1])temelde p boş bir dizi öğeye katılır , maçta bulunan karakterle, bu, bir harfi (diyelim E) bir pmiktar yazdırmanın kolay bir yoludur .

1.08 Bonusu için

Sıralama algoritması:

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

432 bayt ile 999.999 temel puanı nasıl elde edebileceğinizi görmüyorum. Verilen formülle 698.324 elde ediyorum.
Fatalize

Benim hatam, formülü yanlış yazmış olmalıyım, düzeltirim
Christopher Francisco

2

Javascript (ES6), 389 bayt, puan = 719.942 * 1.08 * 1.2 = 933.045

Başta, en azından şimdilik ...

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}

Burada deneyin:

1.2 bonusu, biçimlendirilmesinde biraz zor. Normal bir sayı girmek istiyorsanız, 1önüne bir sayı koyun.

Temel olarak, bu yükseltme ( µve hariç ») tüm karakterleri tarar , sonra bu karakterin üç setini bulur ve bunları yükseltilmiş karakterle değiştirir. Her birinden sonra sıralama .replace, bunun her zaman düzgün çalıştığından emin olmanın en iyi yoluydu, bu da otomatik bir bonus oldu. 1.2 bonus biraz daha zordu, ama 45 bayt dizildi var. 1.5 bonus hiç değmez, çünkü bir ton daha fazla kodlama gerektirir ve en azından uzunluğu iki katına çıkarır.

Her zaman olduğu gibi, öneriler çok açıktır!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.