Sacar a pasear al perro

14

Mi perro me ladra, pero soy demasiado vago para llevarlo a pasear. ¡Tengo una idea! ¡Haré que la gente de Code Golf lo haga por mí!

Su desafío es simular el paseo de un perro. Estas son las reglas para pasear al perro:

  • El humano ( H) comenzará en 0,0un plano de coordenadas (cartesiano), e irá aleatoriamente un espacio arriba, izquierda, derecha o abajo cada segundo.
  • El perro ( D) comenzará en la misma ubicación, e irá a cero, uno, dos o tres espacios arriba, izquierda, derecha o abajo cada segundo (al azar, por supuesto). El perro es menos predecible y a veces correrá más rápido o se detendrá por completo.
  • El perro nunca obtendrá más de una cierta cantidad de unidades lejos del humano (en la distancia euclidiana), que es la longitud de la correa ( L). Por ejemplo, si Les así 6, una posición válida sería H(0,0) D(4,4)(ya que la distancia es de aproximadamente 5.65 unidades), pero no H(0,0) D(5,4)(aproximadamente 6.4 unidades).
    • Si, cuando el perro se mueve, violaría el requisito de distancia de la correa, debe ir lo más lejos que pueda en su dirección determinada que no viole el requisito de distancia. Por ejemplo, si la posición es H(0,0) D(3,4)y se decide aleatoriamente que el perro se mueva 3 espacios a la derecha, irá a D(4,4), ya que es lo más lejos que puede llegar sin alejarse más de 6 unidades. (Tenga en cuenta que esto podría resultar en un movimiento de 0 espacios, es decir, ¡ningún movimiento en absoluto!)
  • Reglas misceláneas: el humano se mueve primero. El humano no debe exceder la longitud de la correa en su movimiento. Si lo hace, debe elegir otra dirección. "Aleatorio" significa "con una distribución uniforme y sin patrones".

La entrada se dará en este formato (puede ser STDIN, parámetro de función, archivo, etc.):

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

Por ejemplo:

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

Debe dar salida en este formato (puede ser STDOUT, valor de retorno de función, archivo, etc.):

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

(La cantidad de líneas de salida será seconds + 1, ya que la H(0,0) D(0,0)línea no cuenta).

Este es el , ¡así que el código más corto en bytes ganará!

Pomo de la puerta
fuente
44
Cosas que obviamente quiso decir, pero probablemente sea bueno decirlas explícitamente de todos modos: 1. Distancia significa distancia euclidiana, 2. El plano de coordenadas es cartesiano, no polar (o Boeing 777); Cosas que no están claras: 3. ¿Qué hace el ser humano si su movimiento excedería la longitud de la correa? 4. En cada turno, ¿quién se mueve primero, perro o humano?
Jonathan Van Matre
En caso de que la dirección elegida no permita un movimiento válido: ¿no se debe hacer ningún movimiento o elegir otra dirección?
TimWolla
¿Cómo se debe obtener la entrada? STDIN? ¿También está bien un parámetro de función?
TimWolla
1
Mi perro solo me ladra si estoy a punto de llevarlo a caminar.
TheDoctor
@Tim Edited para mayor claridad; Gracias.
Pomo de la puerta

Respuestas:

2

GolfScript, 140 caracteres

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

Ejemplo ejecutado (intente en línea ):

> 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)
Howard
fuente
6

CoffeeScript - 324 + llamada de función

Demostración (usando 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)

Código:

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

Código largo:

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"
TimWolla
fuente
4

Rubí, 189 177

Posiblemente puedo dejar esto un poco. No amo 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}}

Sin golf:

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
  }
}
No es que Charles
fuente
2

Mathematica 285

Golfed

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}}])

Ejemplo

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})


Sin golf

Hay algunos comentarios en el texto a continuación. También he incluido una copia impresa que permite seguir algunos de los cálculos.

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}}]]

Ejemplo

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

[Se muestra que parte de la impresión da una idea de cómo funciona el código. ]

imprimir

DavidC
fuente