산타가 선물을 배달하는 데 얼마나 걸립니까?


12

나는 얼마 전에이 도전을 올렸 는데, 산타가 얼마나 많은 엘프들이 선물을 전달 해야하는지에 관한 것이다 .

인구 증가로 인해 올해 산타는 조금 더 압박을 받고 있습니다. 과거에는 매우 비동기 적으로 작동했지만 점점 더 동기화되는 실험을 시작했습니다. 따라서 산타는 주어진 엘프 수를 가지고 각 지역에 선물을 전달하는 데 시간이 얼마나 걸리는지 알아야합니다.

석탄의 무게는 지난 2 년 동안 변하지 않았습니다. 여전히 선물보다 무겁기 때문에 산타는 집안에 나쁜 사람당 3 명의 엘프가 있고 집안에 좋은 사람당 2 명의 엘프가 필요합니다.

엘프는 일년 내내 크리스마스 교육을하므로 배달 사이에 휴식이 필요하지 않습니다. 그들은 한 번에 한 집에 선물을 전달할 수 있으며 다음 집에 가기 전에 산타의 썰매로 돌아가 다음 선물을 모아야합니다. 내가 공유 할 자유가없는 이유 때문에, 엘프는 산타의 썰매와 집 사이를 여행하는 데 시간을 소비하지 않으며 (산타의 썰매가 지붕에있을 때만 여행 할 수 있음) 그의 썰매가 집에서 집으로 이사하는 데 시간을 소비하지도 않습니다. (산타의 썰매 연료를 모으기 위해 집에서 집으로 이사해야하지만 이미 너무 많이 말하고 있습니다).

선물을 제공하고 있습니다 엘프 지출 할 필요가 4 초 * 각 지출 석탄 필요 제공되는 선물을 전달하고, 엘프 5 초 * 각 산타 항공 관리 규정에 따라 (을 제공, 그들에 석탄 먼지와 장갑은 즉시 소각해야 썰매를 타면 시간이 걸립니다). 또한지도는 왼쪽에서 오른쪽으로 순서대로 방문해야하며, 모든 선물이 현재있는 집으로 배달 될 때까지 엘프는 다른 집으로 선물을 배달 할 수 없습니다.

산타가이 지역에 충분한 엘프를 보유하고 있다고 가정한다면, 나쁜 사람들에게 선물을 전달하는 데 필요한 시간, 집당 5 초, 또는 모든 사람이 좋으면 집당 4 초가 걸리는 한 시간이 걸립니다.

그러나 이전 시즌과는 달리,이 오는 크리스마스 산타는 각 지역에 충분한 엘프를 가지고 있지 않을 수 있으므로 4 초는 절대 최소 시간입니다 * 0이없는 한 주어진 집에 선물을 배달하는 데 걸리는 시간 좋은 사람들과 0 명의 나쁜 사람들은 0 초가 걸립니다.

또한 주택 중 하나라도 나쁜 목록에 누군가가 있으면 산타는 적어도 3 명의 엘프가 필요합니다. 주택 중 적어도 하나에 멋진 명단에 사람이 있고 그 중 아무도 못된 명단에 사람이 없다면 산타는 적어도 두 명의 엘프가 필요합니다. 크리스마스 정신이있는 집이 없다면, 0을 포함한 모든 엘프는 0 초가 걸립니다.

산타의지도에서 집은로 표시되고 *각 집은로 나뉩니다 +. 산타는 여전히 다른 도전 과 같은지도를 사용 하지만 여기에 관련 문서를 포함시킬 것입니다.

집안의 양쪽에는 숫자가 있습니다. 왼쪽은 집안의 장난 꾸러기 사람들의 수를 나타내고, 오른쪽은 집안의 멋진 사람들의 수를 나타냅니다. 한쪽에 숫자가 없으면 0으로 해석됩니다.

나는 그것이 미친 것처럼 들릴지 모르지만, 어떤 사람들은 "크리스마스를 좋아하지 않습니다". 때때로 집의 양쪽에 숫자가 없을 수도 있습니다.

산타의지도 중 하나는 다음과 같습니다.

1*3+2*+*5+*+4*7

산타가 썰매에 9 명의 엘프를 가지고 있다고 가정 해 봅시다.

  1. (0s) 첫 번째 집에는 1 명의 장난 꾸러기와 3 명의 멋진 사람들이 있습니다. 엘프 중 3 명은 5 초, 석탄은 4 초가 걸리며 선물을 전달합니다. 5 초 후 산타의 썰매가 다음 집으로 이사

  2. (5s) 두 번째 집에는 2 명의 장난 꾸러기와 0 명의 멋진 사람들이 있습니다. 엘프 중 6 명은 5 초가 걸리며 석탄을 공급합니다. 5 초 후 산타의 썰매가 다음 집으로 이사

  3. (10s) 세번째 집에는 0 명의 장난 꾸러기와 5 명의 멋진 사람들이 있습니다. 엘프 중 8 명은 4 개의 선물을 전달합니다 (남은 선물은 선물을 전달할 수 없음). 4 초 후, 모든 엘프들이 돌아 왔고, 그들 중 2 명은 다른 선물을 배달하기 위해갔습니다 (썰매는 엘프가 다음 집으로 가기 전에 돌아올 때까지 기다려야 함).

  4. (18s) 네번째 집은 크리스마스 정신이 아니기 때문에 0 명의 장난 꾸러기와 0 명의 멋진 사람들이 있으며 건너 뜁니다.

  5. (18s) 다섯 번째 집에는 4 명의 장난 꾸러기와 7 명의 멋진 사람들이 있습니다. 이것은 조금 복잡해집니다 ...

    I. 9 명의 엘프 모두 석탄 3 개를 선물로 간다 (t + 0s, t + 5s) II. 5 초 후, 그들은 모두 썰매에 돌아 왔고, 그들 중 3 명은 석탄의 마지막 선물 (t + 5를 남겨두고, t + 10을 남겨두고)로 갔고, 나머지 6 명은 3 가지 멋진 선물을 주었다 (t +를 떠난다) 5s, t + 9s를 반환).

    III. 4 초 후, 6 명의 엘프가 돌아와서 3 가지 멋진 선물을 제공합니다 (t + 9는 그대로두고 t + 13은 반환).

    IV. 그들이 떠난 지 1 초 후, 석탄 선물을 전하던 3 명의 엘프가 돌아 왔고, 그 중 2 명은 마지막 멋진 선물을 전하기 위해 떠났습니다 (+10 초, t + 14 초 반환).

  6. (18 + 14 = 32 초 ) 산타가 해당 지역에 선물을 전달했습니다.

보시다시피 산타 가이 지역에 선물을 배달 하는 데 총 32 초가 걸립니다 . 그러나 그것은 산타의지도 중 하나의 단순화 된 버전이었습니다. 일반적으로 산타의지도에는 여러 줄이 있으며 그의 목록에 더 잘 맞도록 사각형 모양입니다. 노멀 맵은 다음과 같이 보일 수 있습니다 ( \n각 줄의 끝에 있는 a )

1*2+*+*4+1*
2*4+3*+1*6+*
*+*+4*2+1*1
*4+*3+1*+2*3
3*10+2*+*5+*

(26) 엘프 (또는 더 많은 양)는 산타에게 걸릴 71초를 .
20 엘프 , 그것은 산타에게 걸릴 것 76초을 .
15 엘프 , 그것은 산타에게 걸릴 것 80초을 .
3 엘프 , 그것은 산타에게 걸릴 것 2백88초을 .
2 엘프 (또는 낮은 금액), 그것은 것 없다.

아, 그리고 한 가지 더 – 엘프들이 선물을 전달하는 순서는 ( 선물 을 전달하는 사람들의 시간 차이 때문에) 사람들 에게 선물을 전달할 수있는 시간을 항상 출력 해야 합니다.

도전

산타가 주어진 수의 엘프들이 선물을 배달하는 데 걸리는 시간을 결정하도록 도와주세요.

주택

  • 집은 *
  • 주택은 +
  • 집 왼쪽의 숫자는 장난 꾸러기의 수를 나타냅니다 (숫자는 0을 의미하지 않음)
  • 오른쪽의 숫자는 좋은 사람의 수를 나타냅니다 (숫자는 0을 의미하지 않음)
  • \n입력에 줄 바꿈 ( ) 이있을 수 있으며 분할로 처리해야합니다.

엘프

  • 산타는 나쁜 사람들을 위해 3 명의 엘프의 도움이 필요합니다 (석탄은 선물보다 훨씬 무겁습니다). 선물 을 전달하는 데 5 초가 걸립니다 *
  • 산타의 도움을 필요로 두 개의 좋은 사람들을위한 엘프, 그리고 이러한 엘프 걸릴 것 사초는 * 선물을 전달하기를
  • 집의 양쪽에 숫자가 없으면 산타는 그 집을 방문하지 않으므로 시간이 걸리지 않을 것입니다 (크리스마스 정신이없는 사람들은 석탄조차도받을 자격이 없습니다)

산타

  • 산타는 집에 하나씩 선물을 전달해야합니다
  • 산타는 모든 엘프가 썰매에 돌아와 모든 선물이 그 집으로 배달 될 때까지 다음 집으로 이사 할 수 없습니다 (우리는 엘프를 뒤로두고 싶지 않습니다.
  • 산타의 썰매는 집에서 집으로 여행하는 데 시간을 소비하지 않습니다 (다시 말해 공유 할 자유가없는 이유로)

해야 할 일

주택과 많은 엘프의지도가 주어지면, 산타가지도에있는 집에 선물을 전달하는 데 얼마나 걸리는지 인쇄하십시오.

* (저는 엘프가 선물을 배달하는 데 걸리는 시간을 공유 할 수 없습니다.이 도전에 포함 된 시간이 정확한지 확인하거나 거부 할 수 없습니다)

규칙

  • 맵과 엘프 수의 두 가지 입력이 있습니다. 입력은 함수에 대한 인수 또는 STDIN 또는 이와 동등한 항목으로 사용할 수 있습니다. 귀하의 언어로 2 개의 입력을받는 것이 불가능한 경우에만 2 개의 입력을 단일 입력 문자열로 받아 들일 수 있으며, 일반적으로 입력에 포함되지 않은 일부 문자로 구분됩니다 ( +*\n또는 0-9입력 문자열 중 하나 가 모호 할 수 없음) 예 ,.
  • 엘프 수는 항상 음이 아닌 정수입니다 (0은 유효 함)
  • 출력은 함수의 리턴 값이거나 STDOUT 또는 이와 동등한 것으로 인쇄 될 수 있습니다 . 산타가 주어진 수의 엘프와 함께 주어진 지역에 선물을 전달하는 것이 불가능한 경우, 일정한 음수 또는 숫자가없는 일관된 메시지 출력해야 합니다
  • 에 인쇄 된 모든 STDERR는 당신이 결과 나에 오류 메시지가 인쇄되지 않을 수 있으므로, 무시됩니다 STDERR을
  • 지역에 유효하지 않은 엘프 수를 지정하면 프로그램이 중단되지 않습니다.
  • 산출물은 산타가 주어진 엘프 수와 함께 선물을 배달하는 데 걸리는 총 시간입니다.
  • 엘프들이 선물을 배달하는데 걸리는 시간은 항상 가장 적어야합니다
  • 입력은 숫자 만 포함 할 것 +, *그리고 줄 바꿈 \n(입력이 포함되는 다른 문자를 지정하지 않는 언어는 두 개의 입력을 할 수없는 경우 첫 번째 규칙에서 (보고) )
  • 표준 허점 적용

테스트 사례

"1*1", 5 elves => 5
"1*1", 3 elves => 9
"1*2", 7 elves => 5
"1*2", 5 elves => 10
"1*2", 3 elves => 13
"2*1", 8 elves => 5
"2*1", 5 elves => 9
"2*1", 3 elves => 14
"1*" , 3 elves => 5
"1*" , 2 elves => (error message)
"*1" , 2 elves => 4
"*1" , 0 elves => (error message)
"*"  , 0 elves => 0

"1*1+1*1",   5 elves => 10
"1*1+1*1",   3 elves => 18
"1*1+*+1*1", 3 elves => 18
"1*2+2*1",   8 elves => 10
"1*2+2*1",   7 elves => 14
"1*2+2*1",   6 elves => 18
"1*2+2*1",   3 elves => 27
"1*2+2*1",   2 elves => (error message)
"*+*+*+*",   2 elves => 0
"*+*+*+*",   0 elves => 0

"1*3+2*+*5+*+4*7", 9 elves => 32

(바람직하게 나는 그 모든 것을 얻었습니다)

채점

산타는 매일 매일 많은 것을 보고 있습니다. 그가 전달할 모든 선물, 그가 가지고있는 모든 엘프, 그가 배달하는 모든 집을 선물합니다 ... 산타에게 최고의 크리스마스 선물은 약간의 것을 볼 수 있습니다. 이러한 이유로 바이트 단위의 최단 제출이 이깁니다 .

리더 보드

리더 보드와 언어 별 수상자 개요를 모두 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

여기서 N은 제출 크기 (바이트)입니다.

헤더에 여러 숫자를 포함하려면 (예를 들어, 오래된 점수를 받거나 바이트 수에 플래그 포함) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오.

## Language Name, <s>K</s> X + 2 = N bytes


내 생각 288 읽어야 281 : (1+0+0+1+2+3+1+0+0+0+4+1+0+0+1+2+3+2+0+0)*5+(2+0+4+0+4+0+6+0+0+0+2+1+4+3+0+3+10+0+5+0)*4=21*5+44*4=105+176=281(내가 전체 "에세이를"읽지 않은 말을해야하지만!)
조나단 앨런에게

@JonathanAllan Yea ... 실수로 도전에 너무 많은 시간을 보냈습니다 ... 죄송합니다 ... 어쨌든, 빠진 것은 산타의 썰매가 모든 엘프가 보드에 다시 들어가기 전에 기다려야한다는 것입니다. 다음 집이므로 모든 숫자를 더하고 곱하면 어떤 경우에는 작동하지만 대부분의 경우 작동하지 않습니다. 예를 들어, 9 개의 엘프의 경우 집 4*7은 14 초가 소요됩니다 (2D 맵이 도입되기 직전에 "에세이"에서 약 절반 정도
적용됨

288 값은 3 명의 엘프를 예로 든 것이므로 항상 naughty*5+nice*4각 집에서 완전히 뒤 쳐야합니다 . ( 4*7예제 에는 없음 )
Jonathan Allan

엘프들은 항상 석탄을 먼저 방해하지 않습니까 (예시처럼) 효율적으로 계획합니까? 예를 들어지도가 5*15있고 9엘프가 있다면 (최소) 20 초 또는 22 초가 걸립니까? 해당 텍스트 표현 을 참조하여 해당 예를 설명하십시오.
Jonathan Allan

위의 수정 5*15은을 (를) 읽어야 4*15합니다.
Jonathan Allan

답변:


4

루비 , 433400 바이트

이것은 엘프 스케줄링이 NP 하드이기 때문에 실제로 이것은 어렵습니다.

또한, 제발 제출하십시오. 첫 번째 제출이므로 몇 가지 명백한 최적화를 놓쳤을 수 있습니다.

->e,h{h.split(/\+|\n/).map{|h|n,g=h.split(?*).map(&:to_i)+[0,0];return-1if(g>0&&e<2)||(n>0&&e<3);([[3,5]]*n+[[2,4]]*g).permutation.map{|j|c=[0]*e;j.map{|q|w,y=q;k=l=0;r=c.map{|x|a=b=0;c[k..e].map{|r|r<=x ?a+=1:break};(t=k+=1).times{c[t-=1]<=x ?b+=1:break};[a,b]};d=r.inject([]){|v,x|v<<l if x[0]>=w;l+=1;v}.min{|a,b|c[a]<=>c[b]};b=d-r[d][1]+1;z=c[d]+y;(b..(b+w-1)).map{|x|c[x]=z}};c.max}.min||0}.sum}

온라인으로 사용해보십시오!

처음에는 더 긴 테스트 사례가 있었지만 일정에 대한 가능한 모든 순열을 반복하기 때문에 시간이 오래 걸리므로 제거했습니다.


2
PPCG에 오신 것을 환영합니다! 당신은 확실히 당신의 첫 번째 답변에 대한 어려운 도전을 선택
Jo King

2

자바 (OpenJDK 8) 344 바이트

엘프 스케줄링은 생각보다 어렵 기 때문에 시간이 조금 걸리고 꽤 길다.

그럼에도 불구하고, 이것은 골프를 코딩하기 위해 제가 가장 좋아하는 도전이었습니다!

(e,d)->{int r=0,x,y,c,p,b,g,m;for(String h:d[0].split("\\+")){d=h.split("\\*",-1);b=new Byte("0"+d[0]);g=new Byte("0"+d[1]);m=-1>>>1;for(y=1;y<=e/3&(x=(e-y*3)/2)>0;c=b/y+(b%y++<1?0:1),p=g/x+(g%x<1?0:1),x=c*5>p*4?c*5:p*4,m=x<m?x:m);for(y=0;b+g>0;b-=c,g-=p){c=e/3<b?e/3:b;x=(e-c*3)/2;p=x<g?x:g;if(c+p<1)return-1;y+=c>0?5:4;}r+=m<y?m:y;}return r;}

온라인으로 사용해보십시오 (모든 테스트와 함께)!

설명;

너 자신을 속이십시오 : 그것은 긴 것입니다

    int r=0,x,y,c,p,b,g,m;               // Define all the variables I need

    for(String h:d[0].split("\\+")){     // Split houses on '+' and loop through them

        d=h.split("\\*",-1);             // Split the current house on '*' using the limit
                                         // to preserve empty strings.

        b=new Byte("0"+d[0]);            // Parse the naughty (b) and nice (g) people
        g=new Byte("0"+d[1]);

        m=-1>>>1;                        // Initialise minimum time as max integer using
                                         // overflow

        for(y=1;y<=e/3&(x=(e-y*3)/2)>0;  // For each number of elves that can concurrently
                                         // deliver coal, and still leave enough elves to
                                         // deliver presents

            c=b/y+(b%y++<1?0:1),         // Determine the number of runs needed to deliver
                                         // all coal using this number of elves

            p=g/x+(g%x<1?0:1),           // Determine the number of runs needed to deliver
                                         // all presents using this number of elves

            x=c*5>p*4?c*5:p*4,           // Get the maximum time required for the
                                         // delivery of coal or presents

            m=x<m?x:m);                  // If this is less than the current minimum time,
                                         // set it as the minimum time


        for(y=0;b+g>0;b-=c,g-=p){        // While there are still people to deliver to;

            c=e/3<b?e/3:b;               // Determine the max amount of coal to deliver

            x=(e-c*3)/2;                 // Determine how many presents can be
                                         // delivered with the remaining elves.

            p=x<g?x:g;                   // If this number is more than nice people
                                         // remaining, just use the nice people remaining

            if(c+p<1)return-1;           // If no presents can be delivered, return the
                                         // error code (-1)

            y+=c>0?5:4;                  // Increase the time by 5 if coal was
                                         // delivered, and 4 if only presents

        }                                // At the end of each loop (see above)
                                         // remove the presents and coal delivered
                                         // from the number of naughty and nice houses

        r+=m<y?m:y;                      // Increment the total time by which ever
                                         // is smaller of the calculated times
    }
    return r;                            // Return the total time

주의 :이 답변은 올바른 테스트 사례에 대한 나의 수정에 달려 있습니다.


나는 생각합니다 (e-y*3)/2-> e-y*3>>1바이트를 저장합니다. (대부분의 경우에도 적용됩니다 (e-c*3)/2.)
Jonathan Frech

runTest("1*4",5,12);실패 (당신이 얻는다 "1*4", 5 elves => 13 FAILED. 나는 당신의 알고리즘이 너무 적은 바이트로 예약하는 것이 얼마나 좋은지에 놀랐다. 그래서 나는 0에서 7까지의 가능한 모든 조합 (엘프, 장난 꾸러기 및 좋은)에 대해 그것을 실행했고 실패한 곳을 발견했다. BTW, 일정을
잡는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.