Demiryolu rayları oluşturun ve hükümeti kandırın


30

Trenlerin popüler hale geldiği 19. yüzyıl ABD'sinde bir demiryolu girişimcisisiniz, çünkü bunlar büyük hacimli malzemeleri kara yoluyla taşımanın en etkili yoludur. Batıda yakın zamanda sömürgeleştirilmiş arazilerde doğu kıyılarından gelen demiryolu raylarına ulusal bir ihtiyaç vardır.

Bu ihtiyacı karşılamak için, ABD hükümeti demiryollarını sübvanse etmek için vergi toplayacak. Her yol için attığınız her mil için demiryolu şirketinize para ödeme sözü verdiler. Engebeli ve dağlık bölgelerdeki rayların döşenmesi, düz topraklardaki rayların döşenmesinden daha pahalı olduğundan, buna göre verdikleri miktarı ayarlar. Yani, hükümet ödeyecek

  • Düz arazide her bir mil için 5.000 ABD Doları
  • Engebeli arazide her bir yol için 12.500 $
  • Dağlarda her bir kilometrede 20.000 dolar yatırıldı.

Tabii ki bu plan, iz bırakmanın gerçekte ne kadara mal olduğunu tam olarak yansıtmıyor.

Yüksekliği analiz etmek için iz bırakacağınız bölgelerin kabartma haritalarını çizmek için bazı haritacılar kiraladınız. İşte böyle bir harita:

S12321
121234
348E96

Her hane bir mil karelik bir alanı temsil eder. Sbaşlangıç ​​noktası, Ebitiş noktasıdır. Her sayı, o bölgedeki yükseklik değişimlerinin yoğunluğunu gösterir.

  • 1-3 numaralı arsalar düz arsaları oluşturmaktadır.
  • 4-6 numaralı arsalar engebeli arazileri oluşturur.
  • 7-9 sayılı arsalar bir dağ silsilesidir.

Demiryolları inşaatında yılların tecrübesiyle, pist inşa maliyetinin (dolar cinsinden) bu formüle uygun olduğunu değerlendirdiniz:

Cost_Per_Mile = 5000 + (1500 * (Elevation_Rating - 1))

Bu, belirli yükseliş derecelerinde inşa etmenin size devletin verdiğinden daha fazla paraya mal olacağı, bazen karlı olacağı ve bazen de sadece kıracağınız anlamına gelir.

Örneğin, 3'lük bir yükseklik eğimindeki bir mil yolunun yapımı 8000 ABD Dolarıdır, ancak bunun için yalnızca 5.000 ABD Doları alırsınız, bu nedenle 3000 ABD Doları kaybedersiniz. Buna karşılık, 7'lik bir yükseklik eğiminde bir mil izi oluşturmak 14.000 dolar tutuyor, ancak bunun için 20.000 dolar alıyorsunuz: 6.000 dolar kar!

Örnek bir haritanın yanı sıra iki farklı yolu da burada bulabilirsiniz.

S29    S#9    S##
134    1#4    1##
28E    2#E    2#E

İlk parkurun yapımı 30.000 dolar tutuyor, ama hükümet sana 30 bin dolar ödüyor. Bu parçadan hiç kar elde etmiyorsunuz.

Öte yandan, ikincisi inşa etmek için 56,500 dolar, ancak bunun için 62,500 dolar alıyorsunuz. Bu parçadan 6.000 dolar kazanıyorsun.

Amacınız: bir rahatlama haritası verilirse, baştan sona en karlı (veya belki de sadece en ucuz) yolu bulun. Birden çok yol birbirine bağlanırsa, bunlardan herhangi biri kabul edilebilir bir çözümdür.

Program Detayları

Dikdörtgen bir sayılar haritası ve bir başlangıç ​​ve bitiş noktası ile ayrılmış metin girişi verilir. Her sayı, 1 ile 9 arasında tamamen bir tam sayı olacaktır. Bunun dışında girdi, gerekçeyle istediğiniz şekilde sağlanabilir.

Çıktı, giriş ile aynı formatta olmalı, parçanın yapıldığı sayılar bir karma ( #) ile değiştirilmelidir. Bazı kaprisli politikacıların uyguladığı keyfi düzenlemeler nedeniyle, izler yalnızca yatay veya dikey yollarda ilerleyebilir. Başka bir deyişle, geriye doğru gidemez veya çapraz gidemezsiniz.

Program 6 sıra ve 6 sütuna kadar haritalar için makul bir sürede (yani <10 dakika) çözebilmelidir.

Bu bir kod golf mücadelesidir, bu yüzden en kısa program kazanır.

Bir var (non-golfed) uygulaması örneği .

Örnek G / Ç

S12321
121234
348E96

S12321
######
3##E##



S73891
121234
348453
231654
97856E

S#3###
1###3#
3#####
######
#####E

Çıktı belirsiz ise, nedir?
FUZxxl

2
Çıktı belirsiz olabilir, ancak nasıl izleyeceğinize bakılmaksızın kârın aynı olduğu bir şekilde belirsiz olabilir.
Peter Olson

Bence küçük bir hata var. Meli 4içinde 134örnek haritasında da yer 6?
JiminP

@JiminP Evet, bu rakam bir yerde değil başka bir yerde değiştirirken yapılan bir hataydı. Şimdi düzeltilmeli.
Peter Olson

3
Üç yıl sonra, hükümet etrafa bakar ve neden tüm * tepelerin ve dağların demiryolu rayları ile kaplı olduğunu merak etmeye başlar. Ancak yerel transit kullanıcıları, güzel bir roller coaster / tour ride --- bedava --- hükümet tarafından finanse edildi, insanları mutlu etti, öyleyse neden umurunda? (* bazı 6. sınıf tepeler hariç)
John Dvorak

Yanıtlar:


5

Python, 307 karakter

import os
I=os.read(0,99)
n=I.find('\n')+1
I='\0'*n+I+'\0'*n
def P(p):
 S=[]
 for d in(-n,-1,1,n):
  y=p[-1]+d
  if'E'==I[y]:S+=[(sum((int(I[v])-1)/3*75-15*int(I[v])+15for v in p[1:]),p)]
  if'0'<I[y]<':'and y not in p:S+=P(p+[y])
 return S
for i in max(P([I.find('S')]))[1][1:]:I=I[:i]+'#'+I[i+1:]
print I,

Pkısmi bir yol izler pve ulaşmak için uzatmanın tüm yollarını döndürür E. Her döndürülen yol, skoruyla eşleştirilir, böylece maxen iyisini bulabilirsin.

6x6 haritada yaklaşık 80 saniye sürer.


1
İkinci karakter girintisini 3 karakter kaydetmek için sekmelerle değiştirebilirsiniz
gnibbler

4

Python: 529 482 460 bayt

Benim çözümüm hiçbir ödül kazanmayacak. Ancak, yayınlanan sadece iki çözüm olduğundan ve sorunu ilginç bulduğum için, cevabımı yine de göndermeye karar verdim.

Düzenleme: Önerileri için Howard'a teşekkürler. Puanımı çok traş etmeyi başardım!

import sys
N=len
def S(m,c,p=0):
 if m[c]=='E':return m,p
 if m[c]<'S':
    b=list(m);b[c]='#';m=''.join(b)
 b=[],-float('inf')
 for z in(1,-1,w,-w):
    n=c+z
    if 0<=n<N(m)and m[n]not in('S','#')and(-2<z<2)^(n/w!=c/w):
     r=S(m,n,p+(0if m[n]=='E'else(int(m[n])-1)/3*5-int(m[n])+1))
     if b[1]<r[1]:b=r
 return b
m=''
while 1:
 l=sys.stdin.readline().strip()
 if l=='':break
 w=N(l);m+=l
b,_=S(m,m.index('S'))
for i in range(0,N(b),w):print b[i:i+w]

İşte böyle başlar. :)
Jonathan Van Matre

1
Bazı küçük iyileştirmeler: Pve Mher biri sadece bir kez kullanılır, bu nedenle satır içi için iyi bir fikirdir (tek bir çağrı için hemen hemen her durumda iki kez çalışır). m[c]!='S'için kısaltılabilir m[c]<'S'da abs(z)==1hiç abs(z)<2ya da -2<z<2.
Howard

"Küçük geliştirmeleriniz" beni 47 bayt kurtarıyor. Cevabımı düzenliyorum.
sadakatsu

3

Ruby, 233 karakter

R=->s{o=s=~/S/m
s=~/E/m?(q=[-1,1,-N,N].map{|t|s[f=o+t]>'0'?(n=s*1
n[o]='#'
n[f]='S'
a=R[n]
a&&[a[0]-(e=s[f].to_i-1)/3*5+e,a[1]]):nil}-[nil]
q.sort!&&q[0]):[0,(n=s*1;n[o]='E'
n[$_=~/S/m]='S'
n)]}
N=1+(gets(nil)=~/$/)
$><<R[$_+$/*N][1]

6x6'lık bir tahtanın zaman kısıtlamaları içinde iyi çalışan bir Ruby kaba kuvvet yaklaşımı. Giriş STDIN'de verilmelidir.

Örnekler:

S12321
121234
348E96

S#2321
1#####
3##E##    
--    
S73891
121234
348453
231654
97856E

S#####
1212##
#####3
#3####
#####E

@PeterOlson Mücadelenize en azından biraz dikkat etmeye çalıştım ;-)
Howard
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.