Promener le chien

14

Mon chien aboie, mais je suis trop paresseux pour l'emmener faire une promenade. J'ai une idée! Je vais demander aux gens de Code Golf de le faire pour moi!

Votre défi est de simuler la promenade d'un chien. Voici les règles pour promener le chien:

  • L'humain ( H) commencera 0,0sur un plan de coordonnées (cartésien) et ira au hasard d'un espace soit vers le haut, vers la gauche, vers la droite ou vers le bas chaque seconde.
  • Le chien ( D) commencera au même endroit et ira à zéro, un, deux ou trois espaces vers le haut, la gauche, la droite ou le bas toutes les secondes (au hasard, bien sûr). Le chien est moins prévisible et court parfois plus vite ou s'arrête complètement.
  • Le chien n'éloignera jamais plus d'une certaine quantité d'unités de l'humain (en distance euclidienne), qui est la longueur de la laisse ( L). Par exemple, si Lc'est le cas 6, une position valide serait H(0,0) D(4,4)(puisque la distance est d'environ 5,65 unités), mais pas H(0,0) D(5,4)(environ 6,4 unités).
    • Si, lorsque le chien bouge, il violerait l'exigence de distance en laisse, il doit aller le plus loin possible dans sa direction déterminée qui ne viole pas l'exigence de distance. Par exemple, si la position est H(0,0) D(3,4)et que le chien est décidé au hasard de se déplacer de 3 cases vers la droite, il ira D(4,4), car c'est le plus loin qu'il peut aller sans éloigner plus de 6 unités. (Notez que cela pourrait entraîner un mouvement de 0 espace, c'est-à-dire aucun mouvement du tout!)
  • Règles diverses: l'humain se déplace en premier. L'humain ne doit pas dépasser la longueur de la laisse lors de ses déplacements. Si c'est le cas, il doit choisir une autre direction. "Aléatoire" signifie "avec une distribution uniforme et sans motifs".

L'entrée sera donnée dans ce format (peut être STDIN, paramètre de fonction, fichier, etc.):

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

Par exemple:

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

Vous devez donner une sortie dans ce format (peut être STDOUT, valeur de retour de fonction, fichier, 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)
...

(Le nombre de lignes produites sera seconds + 1, car la H(0,0) D(0,0)ligne ne compte pas.)

Il s'agit de , donc le code le plus court en octets gagnera!

Poignée de porte
la source
4
Choses que vous vouliez évidemment, mais il est probablement bon de les exprimer explicitement de toute façon: 1. La distance signifie la distance euclidienne, 2. Le plan de coordonnées est cartésien, pas polaire (ou Boeing 777); Choses qui ne sont pas claires: 3. Que fait l'homme si son mouvement dépasse la longueur de la laisse? 4. À chaque tour, qui bouge le premier, chien ou humain?
Jonathan Van Matre
Dans le cas où la direction choisie ne permet pas un mouvement valide: ne doit-on faire aucun mouvement ou choisir une autre direction?
TimWolla
Comment obtenir des informations? STDIN? Un paramètre de fonction est-il également correct?
TimWolla
1
Mon chien n'aboie que si je suis sur le point de l'emmener faire une promenade.
TheDoctor
@Tim Edited pour plus de clarté; Merci.
Poignée de porte

Réponses:

2

GolfScript, 140 caractères

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

Exemple d'exécution (essayez en ligne ):

> 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
la source
6

CoffeeScript - Appel de fonction 324 +

Démo (en utilisant 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)

Code:

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

Code long:

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
la source
4

Ruby, 189 177

Je peux peut-être laisser tomber un peu cela. Je n'aime pas 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}}

Non 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
  }
}
Pas que Charles
la source
2

Mathematica 285

Golfé

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

Exemple

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


UnGolfed

Il y a quelques commentaires dans le texte ci-dessous. J'ai également inclus une impression qui permet de suivre certains calculs.

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

Exemple

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

[Une partie de l'impression est illustrée pour donner une idée du fonctionnement du code. ]

imprimer

DavidC
la source