Portare a spasso il cane


14

Il mio cane mi abbaia, ma sono troppo pigro per portarlo a fare una passeggiata. Ho un'idea! Chiederò alle persone di Code Golf di farlo per me!

La tua sfida è simulare la passeggiata di un cane. Ecco le regole per portare a spasso il cane:

  • L'umano ( H) inizierà 0,0su un piano di coordinate (cartesiano) e andrà casualmente di uno spazio in alto, a sinistra, a destra o in basso ogni secondo.
  • Il cane ( D) inizierà nella stessa posizione e andrà a zero, uno, due o tre spazi in alto, a sinistra, a destra o in basso ogni secondo (a caso, ovviamente). Il cane è meno prevedibile e talvolta corre più veloce o si ferma completamente.
  • Il cane non otterrà mai più di una certa quantità di unità dall'umano (a distanza euclidea), che è la lunghezza del guinzaglio ( L). Ad esempio, se lo Lè 6, una posizione valida sarebbe H(0,0) D(4,4)(poiché la distanza è di circa 5,65 unità), ma non H(0,0) D(5,4)(circa 6,4 unità).
    • Se, quando il cane si muove, viola il requisito della distanza del guinzaglio, deve andare il più lontano possibile nella sua direzione determinata che non viola il requisito della distanza. Ad esempio, se la posizione è H(0,0) D(3,4)e il cane viene deciso casualmente di spostare 3 spazi a destra, andrà a D(4,4), poiché è il più lontano possibile senza allontanare più di 6 unità. (Nota che ciò potrebbe comportare un movimento di 0 spazi, cioè nessun movimento!)
  • Regole varie: l'essere umano si muove per primo. L'essere umano non deve superare la lunghezza del guinzaglio durante il suo movimento. In tal caso, deve scegliere un'altra direzione. "Casuale" significa "con una distribuzione uniforme e senza schemi".

L'input verrà fornito in questo formato (può essere STDIN, parametro di funzione, file, ecc.):

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

Per esempio:

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

È necessario fornire un output in questo formato (può essere STDOUT, valore di ritorno della funzione, file, ecc.):

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 quantità di linee in uscita sarà seconds + 1, poiché la H(0,0) D(0,0)linea non conta.)

Questo è , quindi vincerà il codice più breve in byte!


4
Cose che ovviamente intendevi, ma probabilmente è bene dichiararle esplicitamente in ogni caso: 1. Distanza significa distanza euclidea, 2. Il piano delle coordinate è cartesiano, non polare (o Boeing 777); Cose che non sono chiare: 3. Cosa fa l'essere umano se la sua mossa superasse la lunghezza del guinzaglio? 4. Ad ogni turno, chi si muove per primo, cane o umano?
Jonathan Van Matre,

Nel caso in cui la direzione scelta non consenta una mossa valida: non è necessario eseguire alcuna mossa o scegliere un'altra direzione?
TimWolla,

Come dovrebbe essere ottenuto l'input? STDIN? Anche un parametro di funzione va bene?
TimWolla,

1
Il mio cane mi abbaia solo se sto per portarlo a fare una passeggiata.
TheDoctor

@Tim Modificato per chiarezza; Grazie.
Maniglia della porta

Risposte:


2

GolfScript, 140 caratteri

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

Esempio di esecuzione (prova online ):

> 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 + chiamata di funzione

Demo (utilizzando 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)

Codice:

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

Codice lungo:

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

Ruby, 189 177

Posso lasciar perdere un po '. Io non 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}}

Ungolfed:

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

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

Esempio

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

Ci sono alcuni commenti nel testo qui sotto. Ho anche incluso una stampa che consente di seguire alcuni dei calcoli.

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

Esempio

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

[Viene mostrata una parte della stampa per dare un'idea di come funziona il codice. ]

stampare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.