산책 개를 복용


14

내 개가 짖고 있지만 산책하기에는 너무 게으르다. 나는 아이디어가! Code Golf 직원들이 저를 위해 할 수 있도록하겠습니다!

당신의 도전은 강아지의 산책을 시뮬레이션하는 것입니다. 개를 걷는 규칙은 다음과 같습니다.

  • 사람 ( H)은 0,0(직교도) 좌표 평면 에서 시작하여 매초마다 한 칸씩 위, 왼쪽, 오른쪽 또는 아래쪽으로 무작위로 이동합니다.
  • 개 ( D)는 같은 위치에서 시작하며 매 초마다 (무작위로) 0, 1, 2 또는 3 칸씩 위, 왼쪽, 오른쪽 또는 아래쪽으로 이동합니다. 개는 예측하기 어렵고 때로는 더 빨리 달리거나 완전히 멈출 것입니다.
  • 개는 가죽 끈의 길이 인 (유클리드 거리에서) 인간으로부터 일정량 이상 떨어져 있지 않습니다 L. 예를 들어 Lis 6인 경우 유효한 위치는 H(0,0) D(4,4)(거리는 약 5.65 단위이므로) H(0,0) D(5,4)(약 6.4 단위 이므로 )입니다.
    • 개가 움직일 때 개가 가죽 끈 거리 요구 사항을 위반하는 경우 거리 요구 사항을 위반하지 않는 결정된 방향으로 최대한 멀리 가야합니다. 예를 들어, 위치가 H(0,0) D(3,4)있고 개가 무작위로 오른쪽으로 3 칸 이동하기로 결정한 경우 6 칸을 D(4,4)넘지 않고 갈 수있는 가장 먼 거리가됩니다. (이것은 0 칸의 움직임을 초래할 수 있습니다. 즉 전혀 움직임이 없습니다!)
  • 기타 규칙 : 인간이 먼저 움직입니다. 사람이 움직일 때 가죽 끈 길이를 초과해서는 안됩니다. 그렇다면 다른 방향을 선택해야합니다. "임의의"는 "균등 한 분포와 패턴이 없음"을 의미합니다.

입력은이 형식으로 제공됩니다 (STDIN, 함수 매개 변수, 파일 등).

"<amount of seconds the walk will last> <leash length>"

예를 들면 다음과 같습니다.

300 6 // a 5 minute walk with a 6 yard leash

이 형식으로 출력을 제공해야합니다 (STDOUT, 함수 리턴 값, 파일 등일 수 있음).

H(0,0) D(0,0)
H(0,1) D(2,0)
H(1,1) D(2,1)
H(1,0) D(2,-1)
...

(라인의 양은 출력 것이다 seconds + 1때문에, H(0,0) D(0,0)라인에 포함되지 않는다.)

이것은 이므로 바이트 단위의 가장 짧은 코드가 이길 것입니다!


4
분명한 의미는 있지만 어쨌든 명시 적으로 언급하는 것이 좋을 것입니다. 1. 거리는 유클리드 거리를 의미합니다. 2. 좌표 평면은 극점이 아닌 직교입니다 (또는 Boeing 777). 명확하지 않은 것 : 3. 인간의 움직임이 가죽 끈 길이를 초과 할 경우 어떻게해야합니까? 4. 각 차례에 누가 먼저 개나 인간을 움직입니까?
Jonathan Van Matre

선택한 방향이 유효한 이동을 허용하지 않는 경우 : 이동을 수행하지 않거나 다른 방향을 선택해야합니까?
TimWolla

입력은 어떻게 받아야합니까? STDIN? 함수 매개 변수도 괜찮습니까?
TimWolla

1
산책을하려고 할 때만 내 개가 짖는다.
TheDoctor

명확성을 위해 @Tim 편집 됨; 감사.
Doorknob

답변:


2

GolfScript, 140 자

~.*:L;)[0.].@{['H('1$','*') D('4$','*')'n]@@{[@~]}+[{)}{(}{\(\}{\)\}]:^%{{~2$~@-.*@@-.*+L>!},}:F~.,{rand}:R~=\[.;{.[~}^4R=+{]}+4R*]F-1=\}*;;

예제 실행 ( 온라인 시도 ) :

> 10 3
H(0,0) D(0,0)
H(0,1) D(0,0)
H(0,0) D(0,2)
H(0,1) D(-1,2)
H(1,1) D(-1,2)
H(1,2) D(-1,4)
H(1,3) D(-1,5)
H(0,3) D(-1,5)
H(-1,3) D(1,5)
H(-1,4) D(1,5)
H(0,4) D(-1,5)

6

CoffeeScript-324 + 함수 호출

데모 (Leash 10 사용) :

H(0,0) D(0,0)
H(0,-1) D(0,3)
H(-1,-1) D(0,3)
H(-1,-2) D(-1,3)
H(-1,-3) D(-4,3)
H(-1,-2) D(-4,4)
H(-1,-3) D(-5,4)
H(-1,-2) D(-2,4)
H(-1,-3) D(-2,5)
H(-1,-4) D(-2,5)
H(-1,-3) D(-3,5)
H(0,-3) D(-4,5)
H(-1,-3) D(-4,6)
H(-1,-4) D(-2,6)
H(-2,-4) D(-2,6)
H(-3,-4) D(-5,6)
H(-4,-4) D(-5,6)
H(-4,-3) D(-5,8)
H(-5,-3) D(-2,8)
H(-5,-2) D(-2,8)
H(-5,-3) D(-2,5)

암호:

w=(i)->
    [s,l]=i.split ' ';m=Math;h=[0,0];d=[0,0];r=->(4*m.random())|0
    a=->m.abs(h[0]-d[0])**2+m.abs(h[1]-d[1])**2<=l**2
    b=(x)->if x%2 then 1else-1
    for i in[0..s]
        console.log "H(#{h}) D(#{d})"
        loop
            H=h.slice();x=r();h[(x/2)|0]+=b x;break if a();h=H
        D=r();x=r();(d[(x/2)|0]+=b x;d[(x/2)|0]-=b x if!a())while D-->0

긴 코드 :

human = [ 0, 0 ]
doge = [ 0, 0 ]
randomDirection = -> [ 'u', 'd', 'l', 'r' ][(4*Math.random())|0]
allowed = -> Math.abs(human[0] - doge[0]) ** 2 + Math.abs(human[1] - doge[1]) ** 2 <= leash**2
leash = 0
walk = (input) ->
    [ seconds, leash ] = input.split ' '
    for i in [0..seconds]
        console.log "H(#{human}) D(#{doge}) #{Math.sqrt Math.abs(human[0] - doge[0]) ** 2 + Math.abs(human[1] - doge[1]) ** 2}"
        valid = no
        loop
            oldHuman = human.slice()
            switch randomDirection()
                when 'u'
                    human[0]--
                when 'd'
                    human[0]++
                when 'l'
                    human[1]--
                when 'r'
                    human[1]++

            if allowed()
                break
            else
                human = oldHuman

        dogeDistance = (Math.random() * 4)|0
        switch randomDirection()
            when 'u'
                while dogeDistance-- > 0
                    doge[0]--
                    doge[0]++ if !allowed() 
            when 'd'
                while dogeDistance-- > 0
                    doge[0]++
                    doge[0]-- if !allowed() 
            when 'l'
                while dogeDistance-- > 0
                    doge[1]--
                    doge[1]++ if !allowed() 
            when 'r'
                while dogeDistance-- > 0
                    doge[1]++
                    doge[1]-- if !allowed() 
walk "10 2"

4

루비, 189 177

나는 이것을 조금 떨어 뜨릴 수 있습니다. 나는 사랑하지 않는다 j.

h=d=0;e,l=$*
def j;[1,-1,?i,'-i'].sample.to_c end
0.upto(e.to_i){puts'H(%d,%d) D(%d,%d)'%(h.rect+d.rect)
1 while((g=h+j)-d).abs>l.to_i
h,s=g,j
3.times{d+=s if(d+s-h).abs<=l.to_i}}

언 골프 드 :

h=d=0 # use complex numbers since it has distance built in
time,leash=$*

def randomDirection
  [1,-1,'i','-i'].sample.to_c 
end

0.upto(time.to_i) { # (1 + time) times
  puts"H(%d,%d) D(%d,%d)"%(h.rect+d.rect) # that's [h.real, h.imag, d.real, d.imag]

  # find a newH that doesn't violate the leash
  newH = h + randomDirection
  while((g-d).abs > leash.to_i) 
    newH = h + randomDirection
  end

  h = newH

  newD = randomDirection
  3.times{
    # keep adding newD until you hit the leash
    d += newD if(d + newD - h).abs <= leash.to_i
  }
}

2

매스 매 티카 285

골프

r=RandomChoice;k=False;
s:=r[{{0,1},{-1,0},{1,0},{0,-1}}]
w:=r[{0,1,2,3,4}]
f[{-1,___}]:="";
f[{n_,l_,{h_,d_}}]:=
(Print["H(",h,")\t","D(",d,")"];
m[i_,u_,v_]:=EuclideanDistance[u+i,v]<l;
z=k;While[z==k,t=s;z=m[t,h,d]];
y=h+t;t=w*s;z=k;While[z==k,t=t-Sign@t;z=m[t,d,y]];
dp=d+t;f[{n-1,l,{y, dp}}])

f[{17,7,{{0,0},{0,0}}}]

H ({0,0}) D ({0,0})
H ({1,0}) D ({0,0})
H ({2,0}) D ({0,2})
H ( {2, -1}) D ({0, -1})
H ({1, -1}) D ({-3, -1})
H ({1,0}) D ({-3,1 })
H ({1,1}) D ({0,1})
H ({1,2}) D ({0,2})
H ({1,1}) D ({0,2})
H ({1,0}) D ({-2,2})
H ({2,0}) D ({1,2})
H ({2, -1}) D ({-2,2} )
H ({2,0}) D ({-2,3})
H ({2,1}) D ({-2,0})
H ({1,1}) D ({-2,3 })
H ({2,1}) D ({-2,6})
H ({1,1}) D ({-3,6})
H ({0,1}) D ({-4, 6})


언 골프

아래 텍스트에 주석이 있습니다. 또한 일부 계산을 수행 할 수있는 인쇄물이 포함되었습니다.

step:=RandomChoice[{{0,1},{-1,0},{1,0},{0,-1}}]
dogWander:=RandomChoice[{0,1,2,3,4}]

f[{-1,___}]:="";

f[{n_,l_,{humanPos_,dogPos_}}]:=
Module[{tempStep,moveOK,hp,hp1,dp,p,test},

(* human imagines step, checks with leash, chooses another step if would choke the dog *)
moveOK[intendedStep_,pos1_,pos2_]:=EuclideanDistance[pos1+intendedStep,pos2]<l;
test=False;While[test==False,tempStep=step;test=moveOK[tempStep,humanPos,dogPos]];
hp=humanPos+tempStep;
Print["humanPos before: ", humanPos,"\t","human step: ",tempStep,"\thumanPos after: ",hp,"\tdistance from dog: ",N@EuclideanDistance[hp,dogPos]];

(*move closer to human if needed *)
tempStep=dogWander*step;
test=False;While[test==False,tempStep=tempStep-Sign[tempStep];test=moveOK[tempStep,dogPos,hp]];
dp=dogPos+tempStep;
Print["dog's intended step: ",tempStep,"\tdogPos before: ",dogPos,"\t","dog actual step: ",tempStep, "\t","dogPos after: ",dp,"\tdistance: ",N@EuclideanDistance[hp,dp],"\n"];
f[{n-1,l,{hp, dp}}]]

f[{17,5,{{0,0},{0,0}}}]

[인쇄물의 일부는 코드 작동 방식을 보여줍니다. ]

인쇄물

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.