สร้างรางรถไฟและโกงรัฐบาล


30

คุณเป็นผู้ประกอบการทางรถไฟในสหรัฐอเมริกาในศตวรรษที่ 19 เมื่อรถไฟกลายเป็นที่นิยมเพราะเป็นวิธีที่มีประสิทธิภาพมากที่สุดในการขนส่งวัสดุจำนวนมากทางบก มีความต้องการระดับชาติสำหรับเส้นทางรถไฟจากชายฝั่งตะวันออกผ่านดินแดนอาณานิคมที่เพิ่งเกิดขึ้นทางทิศตะวันตก

เพื่อรองรับความต้องการนี้รัฐบาลสหรัฐฯกำลังจะเรียกเก็บภาษีเพื่ออุดหนุนทางรถไฟ พวกเขาสัญญาว่าจะจ่ายเงินให้กับ บริษัท รถไฟของคุณสำหรับการติดตามแต่ละไมล์ เนื่องจากการวางรางในพื้นที่ที่เป็นภูเขาและภูเขามีราคาแพงกว่าการวางรางในพื้นที่ราบพวกเขาจึงปรับจำนวนที่ให้ นั่นคือรัฐบาลจะจ่าย

  • $ 5,000 ต่อไมล์ของแทร็กที่ถูกวางในพื้นราบ
  • $ 12,500 ต่อไมล์ของแทร็คที่วางในดินแดนที่เป็นภูเขา
  • $ 20,000 ต่อไมล์ของเส้นทางที่วางในภูเขา

แน่นอนว่าแผนนี้ไม่ได้สะท้อนถึงค่าใช้จ่ายจริง ๆ ในการวางรางรถไฟ

คุณได้จ้างนักทำแผนที่เพื่อวาดแผนที่โล่งอกของภูมิภาคที่คุณกำลังวางแผนเพื่อวิเคราะห์ระดับความสูง นี่คือแผนที่หนึ่งแผนที่:

S12321
121234
348E96

แต่ละหลักหมายถึงหนึ่งตารางไมล์ของที่ดิน Sเป็นจุดเริ่มต้นEคือจุดสิ้นสุด แต่ละหมายเลขแสดงถึงความเข้มของการเปลี่ยนแปลงระดับความสูงในภูมิภาคนั้น

  • ที่ดินเลขที่ 1-3 ถือเป็นที่ราบ
  • เลข 4-6 ถือเป็นดินแดนที่เป็นภูเขา
  • ที่ดินเลขที่ 7-9 ถือเป็นเทือกเขา

คุณมีประสบการณ์หลายปีในการสร้างรางรถไฟประเมินว่าค่าใช้จ่ายในการสร้างราง (เป็นดอลลาร์) เป็นไปตามสูตรนี้:

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

นั่นหมายถึงการสร้างการไล่ระดับความสูงบางอย่างจะทำให้คุณเสียเงินมากกว่าที่รัฐบาลให้บางครั้งมันก็จะทำกำไรได้และบางครั้งคุณก็จะพังทลาย

ตัวอย่างเช่นหนึ่งไมล์ของแทร็กในการไล่ระดับความสูง 3 ค่าใช้จ่าย $ 8,000 ในการสร้าง แต่คุณจะได้รับเงินเพียง $ 5,000 เท่านั้นดังนั้นคุณจึงเสีย $ 3,000 ในทางตรงกันข้ามการสร้างหนึ่งไมล์บนทางลาดในระดับความสูง 7 มีค่าใช้จ่าย $ 14,000 แต่คุณจะได้รับเงิน 20,000 เหรียญ: กำไร 6,000 เหรียญ!

นี่คือแผนที่ตัวอย่างเช่นเดียวกับเส้นทางสองเส้นทางที่แตกต่างกัน

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

เส้นทางแรกราคา 30,000 ดอลลาร์เพื่อสร้าง แต่รัฐบาลจ่ายเงินให้คุณ $ 30,000 คุณไม่ทำกำไรจากแทร็กนี้

ในทางกลับกันราคาที่สองมีมูลค่า $ 56,500 สำหรับการสร้าง แต่คุณจะได้รับรายได้ $ 62,500 คุณได้กำไร $ 6,000 จากการติดตามนี้

เป้าหมายของคุณ:ให้แผนที่บรรเทาค้นหาเส้นทางที่ทำกำไรได้มากที่สุด (หรืออาจเป็นเพียงเส้นทางที่ราคาถูกที่สุด) ตั้งแต่ต้นจนจบ หากหลายเส้นทางเชื่อมโยงกันหนึ่งในนั้นคือทางออกที่ยอมรับได้

รายละเอียดโปรแกรม

คุณจะได้รับการป้อนข้อความแยกด้วยแผนที่รูปสี่เหลี่ยมของตัวเลขและจุดเริ่มต้นและจุดสิ้นสุดหนึ่งจุด แต่ละหมายเลขจะเป็นจำนวนเต็มรวมระหว่าง 1 ถึง 9 นอกเหนือจากนั้นอาจมีการป้อนข้อมูลตามที่คุณต้องการภายในเหตุผล

เอาต์พุตควรอยู่ในรูปแบบเดียวกับอินพุตพร้อมหมายเลขที่แทร็กถูกสร้างขึ้นแทนที่ด้วยแฮช ( #) เนื่องจากกฎเกณฑ์ที่กำหนดโดยนักการเมืองบางคนตามอำเภอใจแทร็กจึงสามารถไปในเส้นทางแนวนอนหรือแนวตั้งเท่านั้น กล่าวอีกนัยหนึ่งคือคุณไม่สามารถย้อนรอยหรือย้อนแนวทแยงมุมได้

โปรแกรมควรสามารถแก้ปัญหาได้ในเวลาที่เหมาะสม (เช่น <10 นาที) สำหรับแผนที่ที่มีขนาดไม่เกิน 6 แถวและ 6 คอลัมน์

นี่คือความท้าทายของรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดชนะ

ผมมีตัวอย่าง (ที่ไม่แข็งแรงเล่นกอล์ฟ) การดำเนินงาน

ตัวอย่าง I / O

S12321
121234
348E96

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



S73891
121234
348453
231654
97856E

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

ถ้าผลลัพธ์ไม่ชัดเจน
FUZxxl

2
เอาต์พุตสามารถคลุมเครือ แต่คลุมเครือในวิธีที่กำไรเหมือนกันไม่ว่าคุณจะติดตามมันอย่างไร
Peter Olson

ฉันคิดว่ามีข้อผิดพลาดเล็กน้อย ควร4อยู่134ในแผนที่ตัวอย่าง6หรือไม่
JiminP

@JiminP ใช่นั่นเป็นข้อผิดพลาดจากการเปลี่ยนตัวเลขในที่เดียว แต่ไม่ใช่อีกอัน มันควรได้รับการแก้ไขแล้ว
Peter Olson

3
สามปีต่อมารัฐบาลมองไปรอบ ๆ และเริ่มสงสัยว่าทำไม * ภูเขาและภูเขาจึงปกคลุมไปด้วยรางรถไฟ แต่เดี๋ยวก่อนผู้ใช้การขนส่งในท้องถิ่นได้รับรถไฟเหาะ / ทัวร์ชมฟรี --- ได้รับทุนสนับสนุนจากรัฐบาลทำให้ผู้คนมีความสุขมากขึ้นทำไมต้องสนใจ? (* ยกเว้นบางระดับ -6 ฮิลล์)
John Dvorak

คำตอบ:


5

Python, 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สามารถค้นหาเส้นทางที่ดีที่สุดได้

ใช้เวลาประมาณ 80 วินาทีบนแผนที่ 6x6


1
คุณสามารถแทนที่การเยื้องระดับที่สองด้วยแท็บเพื่อบันทึก 3 ตัวอักษร
gnibbler

4

งูหลาม: 529 482 460 ไบต์

ทางออกของฉันจะไม่ชนะรางวัลใด ๆ อย่างไรก็ตามเนื่องจากมีวิธีแก้ไขปัญหาเพียงสองโพสต์และฉันพบว่าปัญหาน่าสนใจฉันจึงตัดสินใจโพสต์คำตอบของฉัน

แก้ไข:ขอบคุณ Howard สำหรับคำแนะนำของเขา ฉันสามารถโกนคะแนนได้เยอะแล้ว!

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)==1ไปหรือแม้กระทั่งabs(z)<2 -2<z<2
Howard

"การปรับปรุงเล็กน้อย" ของคุณช่วยฉัน 47 ไบต์ ฉันกำลังแก้ไขคำตอบของฉัน
sadakatsu

3

Ruby, 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]

Ruby brute-force approach ซึ่งทำงานได้ดีภายในเวลา จำกัด บนกระดาน 6x6 อินพุตต้องถูกกำหนดบน STDIN

ตัวอย่าง:

S12321
121234
348E96

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

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

@PeterOlson ฉันพยายามที่จะให้อย่างน้อยนิด ๆ หน่อย ๆ ให้ความสนใจกับความท้าทายของคุณ ;-)
ฮาวเวิร์ด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.