철도 트랙을 만들고 정부를 속이는


30

기차가 대중화 될 때 19 세기 미국의 철도 기업가는 육상으로 대량의 자재를 운송하는 가장 효율적인 수단이기 때문입니다. 동해안에서 서쪽으로 최근 식민지가 된 땅을 통과하는 철도 트랙이 전국적으로 필요합니다.

이러한 요구를 충족시키기 위해 미국 정부는 철도 보조금을 부과하는 세금을 부과 할 예정입니다. 그들은 선로 1 마일마다 철도 회사에 돈을 지불하겠다고 약속했습니다. 언덕이 많은 산악 지역에 트랙을 놓는 것이 평평한 땅에 트랙을 놓는 것보다 비싸기 때문에 그에 따라 줄 양을 조정합니다. 즉, 정부는

  • 평지에 놓인 트랙 1 마일 당 $ 5,000
  • 언덕이 많은 땅에 놓인 트랙 1 마일 당 12,500 달러
  • 산에 놓인 선로의 마일 당 $ 20,000.

물론이 계획은 실제로 트랙을 세우는 데 드는 비용을 정확하게 반영하지는 않습니다.

고도를 분석하기 위해 트랙을 놓을 지역의 구호 맵을 그리기 위해 일부지도 제작자를 고용했습니다. 다음은 그러한지도 중 하나입니다.

S12321
121234
348E96

각 숫자는 1 평방 마일의 땅을 나타냅니다. S시작점이고 E끝점입니다. 각 숫자는 해당 지역의 고도 변화의 강도를 나타냅니다.

  • 1-3 번의 토지는 평지입니다.
  • 4-6 번의 땅은 구릉지이다.
  • 7-9 번의 땅은 산맥을 구성합니다.

수년간의 철도 선로 건설 경험을 통해 선로 건설 비용 (달러)이 다음 공식을 충족한다고 평가했습니다.

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

즉, 특정 고도 경사로를 건설하면 정부가 제공하는 것보다 더 많은 비용이 들며 때로는 수익을 내고 때로는 부서 질 수도 있습니다.

예를 들어, 3의 고도 변화에 대한 1 마일의 트랙은 8,000 달러의 비용이 들지만 $ 5,000 만 지불하면 3000 달러를 잃게됩니다. 대조적으로, 7의 고도 기울기에서 1 마일의 트랙을 구축하는 데는 14,000 달러가 들지만, 20,000 달러를 지불하면 6000 달러의 수익이 발생합니다!

다음은 두 가지 가능한 경로뿐만 아니라 예제 맵입니다.

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

첫 번째 트랙은 건설하는데 3 만 달러가 들지만 정부는 3 만 달러를 지불합니다. 이 트랙에서 이익을 얻지 못합니다.

반면에, 두 번째 비용은 $ 56,500이 들지만 $ 62,500가 지불됩니다. 이 트랙에서 6,000 달러의 수익이 발생합니다.

당신의 목표 : 구호지도가 주어지면 처음부터 끝까지 가장 수익성이 높거나 가장 저렴한 경로를 찾으십시오. 여러 경로가 묶여 있으면 그 중 하나가 허용되는 솔루션입니다.

프로그램 세부 사항

직사각형의 숫자 ​​맵과 하나의 시작 및 끝 지점으로 구분 된 텍스트 입력이 제공됩니다. 각 숫자는 1과 9 사이의 정수입니다. 그 이외의 이유로 입력은 이유에 따라 원하는대로 제공 될 수 있습니다.

출력은 트랙과 내장 된 숫자가 해시 ( #) 로 대체 된 입력과 동일한 형식이어야합니다 . 일부 변덕스러운 정치인들이 강요하는 임의의 규제로 인해 트랙은 수평 또는 수직 경로로만 이동할 수 있습니다. 다시 말해, 역 추적하거나 대각선으로 갈 수 없습니다.

프로그램은 최대 6 행 6 열의 맵에 대해 합리적인 시간 (예 : <10 분) 내에 해결할 수 있어야합니다.

이것은 코드 골프 도전이므로 가장 짧은 프로그램이 승리합니다.

골퍼가 아닌 구현 예제 가 있습니다 .

샘플 I / O

S12321
121234
348E96

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



S73891
121234
348453
231654
97856E

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

출력이 모호한 경우 무엇입니까?
FUZxxl

2
결과는 모호 할 수 있지만 추적 방법에 관계없이 이익이 동일한 방식으로 모호 할 수 있습니다.
피터 올슨

작은 실수가 있다고 생각합니다. 해야 4134예제 맵의 수 6?
JiminP

@JiminP 네, 한 곳에서 숫자를 바꾸는 것이 실수 였지만 다른 곳에서는 그렇지 않았습니다. 지금 수정해야합니다.
피터 올슨

3
3 년 후, 정부는 주변을 둘러보고 왜 언덕과 산이 모두 철로로 덮여 있는지 궁금해하기 시작합니다. 그러나 현지 대중 교통 사용자는 정부가 자금을 지원하는 멋진 롤러 코스터 / 투어 라이드를 제공하여 사람들을 더 행복하게 만들었습니다. (* 일부 6 학년 언덕 제외)
John Dvorak

답변:


5

파이썬, 307 자

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,

P부분 경로 p를 사용하여 도달하도록 확장하는 모든 방법을 반환합니다 E. 반환 된 각 경로는 해당 점수와 쌍을 이루므로 max가장 좋은 경로 를 찾을 수 있습니다.

6x6 맵에서 약 80 초가 걸립니다.


1
들여 쓰기의 두 번째 레벨을 탭으로
바꾸어

4

파이썬 : 529 482 460 바이트

내 솔루션은 상을받지 않습니다. 그러나 두 가지 솔루션 만 게시되어 문제가 흥미로운 것을 발견했기 때문에 어쨌든 내 답변을 게시하기로 결정했습니다.

편집 : 그의 추천에 감사합니다. 나는 내 점수를 많이 깎았 다!

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]

그렇게 시작됩니다. :)
Jonathan Van Matre

1
약간의 개선 : P그리고 M그것을 그렇게 각 (가끔이 거의 모든 경우에 작동하는 단일 호출에 대한) 다음 인라인 좋은 아이디어되면에만 사용됩니다. m[c]!='S'에 단축 할 수 m[c]<'S'abs(z)==1abs(z)<2또는 -2<z<2.
Howard

"사소한 개선"으로 47 바이트가 절약됩니다. 답변을 수정하고 있습니다.
sadakatsu

3

루비, 233 자

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 보드의 시간 제약 조건 내에서 잘 실행되는 Ruby 무차별 접근 방식입니다. 입력은 STDIN에 제공되어야합니다.

예 :

S12321
121234
348E96

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

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

@PeterOlson 나는 당신의 도전에 적어도 약간의주의를 기울이려고 노력했다 ;-)
Howard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.