총알이 충돌 할 때


16

이 문제는 내가 다시 찾을 내가 얼마 전에 어떤 책 A의 읽기 수수께끼 오프를 기반으로 여기에 . 총 속도는 1 초에 한 번 총에서 발사되는 총알에 관한 것입니다. 한 총알이 다른 총알에 맞으면 둘 다 완전히 파괴됩니다 ( "bullet"의 모든 인스턴스를 "missile"로 자유롭게 교체하십시오.)

작업

발사 순서대로 총알 속도 목록이 주어지면 모든 총알이 파괴되었는지 확인하십시오.

규칙

  • 입력은 음수가 아닌 정수의 목록으로, 구분 기호로 구분되며 전후에 하나의 선택적 문자가 있습니다. 유효한 입력입니다 : 1 2 3 4 5 6[1,2,3,4,5,6]. 프로그래머가 선택합니다.
  • 적어도 하나의 총알이 영원히 살아남 으면 진실한 가치를, 그렇지 않으면 거짓 가치를 산출하십시오.
  • 총알 속도는 초당 단위로 제공됩니다.
  • 총알이 동시에 지속적으로 움직입니다.
  • 총알이 분수 오프셋에서 충돌 할 수 있습니다.
  • 원점으로부터의 정수 또는 분수 오프셋에서 정확히 동일한 위치에 동시에 도달하는 여러 개의 총알이 서로 충돌합니다.

이 다이어그램 G에서 총과 >총알을 나타내고 *총알이 충돌하고 폭발하는 시간입니다.

Truthy

입력: 0

        0123456789
Time 0 G>
     1 G>
     2 G>
   ...

산출: 1


입력: 0 0 0

        0123456789
Time 0 G>
     1 G*
     2 G>
     3 G>
     4 G>
   ...

산출: 1


입력: 1

        0123456789
Time 0 G>
     1 G >
     2 G  >
     3 G   >
   ...

산출: 1


입력: 2 1

        0123456789
Time 0 G>
     1 G> >
     2 G >  >
     3 G  >   >
     4 G   >    >
   ...

산출: 1


입력: 2 3 1

        0123456789
Time 0 G>
     1 G> >
     2 G>  >>
     3 G >    *
     4 G  >
     5 G   >
   ...

산출: 1


거짓

입력: 1 2 3 4 5 6

        Unit      1111111111
        01234567890123456789
Time 0 G>
     1 G>>
     2 G> *
     3 G>  >
     4 G>   > >
     5 G>    >  >>
     6 G      >   > *
     7 G            >  >
     8 G                  > >
     9 G                        >>
    10 G                              *
                  111111111122222222223
        0123456789012345678901234567890

산출: 0


입력: 1 0 0 3

        Unit
        0123456789
Time 0 G>
     1 G>>
     2 G* >
     3 G>  >
     4 G   >>
     5 G     *

(두 번째 충돌은 4.5 시점입니다)
출력 :0


입력: 2 1 2 3 6 5

        Unit      1111111111
        01234567890123456789
Time 0 G>
     1 G> >
     2 G>>  >
     3 G> *   >
     4 G>  >    >
     5 G>     *   >
     6 G     >      >
     7 G          >   >
     8 G               >>
     9 G                *
                  1111111111
        01234567890123456789

산출: 0


입력: 2 3 6

        Unit
        0123456789
Time 0 G>
     1 G> >
     2 G>  >>
     3 G      *

산출: 0


입력을 구분해야 1<enter>2<enter>3...합니까?
cat

@ sysreq : 그것은 추진하고 있지만 허용 할 것입니다.
El'endia Starman

나는 qunitopia에 동의합니다 –이 도전은
심히 어렵지만

답변:


4

파이썬 2 388 392 388 346 342 336 331 바이트

z=k=input();l=len(k);v=range;u=v(l)
while l<z:
 r="";o=[r]*l;z=l
 for h in v(l):
    if r:o[h-1]=o[m]=r;m=h;r=""
    for j in v(h+1,l):
     p=k[h];q=k[j];t=u[j];n=(1.0*q*t-p*u[h])/(q-p)if q-p else""if p>0 else t
     if t<=n<r<()>o[j]>=n<=o[h]:r=n;m=j
 i=0;s=o and min(o)
 while i<l:
    if o[i]==s!="":del k[i],o[i],u[i];l-=1
    else:i+=1
print l

나의 신이이 거대한 것입니다, 그러나 나는 그것이 실제로 작동한다고 믿습니다. 당신이 그것의 모든 복잡성을 본다면,이 도전은 엄청나게 어렵다.

몇 시간 동안 입력하지 않고 어떻게 작동하는지 자세히 설명 할 수 있는지 확실하지 않으므로 간단히 요약하면됩니다.

입력 목록이 줄어들지 않을 때까지 큰 기본 while 루프가 반복됩니다.

중첩 된 for 루프 (중첩 된 for 루프가 실제로 가장 짧다고 생각할 수 있습니까?)는 각 글 머리 기호 속도를 반복하며 그 이후에 각 글 머리 기호와 해당 글 머리 기호가 충돌하는 시간 을 계산하는 데 사용 numpy.roots됩니다 . 여기서는 ""무한대를 의미하는 데 사용됩니다 (교차 없음). 정지 된 글 머리 기호가 시간 0이 아닌 표시되는 순간에 충돌하는 것으로 표시되도록 추가 조건이 포함되어야합니다.

각 숫자에 대해 우리는 어떤 총알이 가장 빨리 닿는지를 추적 한 다음 o관련 총알의 최소 충돌 시간으로 업데이트합니다.

이 이중 루프가 종료 된 후 입력 목록을 반복하고 모든 충돌 시간의 최소 충돌 지점 (있는 경우)을 삭제합니다. 이를 통해 동시에 많은 총알이 충돌하는 경우 많은 총알을 동시에 삭제할 수 있습니다.

그런 다음 나머지 총알에 대해 전체 프로세스를 반복합니다. 충돌했을 때 총알이 파괴되었을 수 있기 때문입니다.

글 머리 기호가 삭제되지 않으면 (목록이 축소되지 않음으로 표시됨) while 루프를 벗어나 나머지 목록의 길이를 인쇄합니다. 따라서이 프로그램은 글 머리 기호가 살아남는 경우 진실을 인쇄 할뿐만 아니라 실제로 살아남은 글 머리 기호 수를 정확하게 인쇄합니다.

편집 : 버그를 찾는 데 도움이되는 테스트 사례를 생성 한 feersum에게 특별한 감사를드립니다.

편집 2 : numpy를 사용하는 대신 손으로 선형 방정식을 풀고 시작 시간을 별도의 목록으로 나누고 조건부를 재구성하여 42 바이트를 절약했습니다.

편집 3 : 범위 이름을 바꾸어 4 바이트 저장

편집 4 : 이중 공백을 탭으로 대체하여 6 바이트를 더 절약했습니다. 또한 feersum은 분수와 세트를 사용하여 비교를 구현할 수있을 정도로 친절했습니다. 나는 약간 골프를 쳤고 솔루션을 묶어서 331 바이트로 나옵니다.

편집 5 : 불필요한 초기화를 제거하고 조건부를 다시 작성하여 5 바이트를 절약했습니다.


예제 입력을 다시 테스트하지 않았습니까? [1, 0, 0, 3]이 작동하지 않습니다.
feersum

내가 테스트하지 않은 유일한 것은 @feersum, dangit. 그러나 고정. 이 모든 노력으로 나는 더 나은 찬성을 얻습니다. : P
퀴 토피아

여전히 작동하지 않습니다. [1, 16, 18, 20, 30] 1 돌려
feersum

좋아, 적어도 지금은 대부분 작동하는 것 같습니다.
feersum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.