Mit dem Hund spazieren gehen

14

Mein Hund bellt mich an, aber ich bin zu faul, um mit ihm spazieren zu gehen. Ich habe eine Idee! Ich werde die Leute von Code Golf dazu bringen, das für mich zu tun!

Ihre Herausforderung besteht darin, den Spaziergang eines Hundes zu simulieren. Hier sind die Regeln für das Laufen mit dem Hund:

  • Der Mensch ( H) beginnt 0,0auf einer (kartesischen) Koordinatenebene und geht jede Sekunde nach dem Zufallsprinzip ein Feld nach oben, links, rechts oder unten.
  • Der Hund ( D) startet an der gleichen Stelle und geht jede Sekunde entweder um null, eins, zwei oder drei Felder nach oben, links, rechts oder unten (natürlich nach dem Zufallsprinzip). Der Hund ist weniger vorhersehbar und rennt manchmal schneller oder hört ganz auf.
  • Der Hund wird niemals mehr als eine bestimmte Anzahl von Einheiten vom Menschen entfernt sein (in euklidischer Entfernung), was der Länge der Leine entspricht ( L). Wenn dies z. B. der Fall List 6, wäre eine gültige Position H(0,0) D(4,4)(da der Abstand ungefähr 5,65 Einheiten beträgt), aber nicht H(0,0) D(5,4)(ungefähr 6,4 Einheiten).
    • Wenn der Hund bei seiner Bewegung die Anforderungen an die Leinenentfernung verletzen würde, muss er in seiner festgelegten Richtung so weit wie möglich gehen, ohne die Anforderungen an die Entfernung zu verletzen. Wenn zum Beispiel die Position ist H(0,0) D(3,4)und der Hund willkürlich 3 Felder nach rechts schiebt, geht er zu D(4,4), da dies die am weitesten entfernte Position ist , ohne dass mehr als 6 Einheiten entfernt werden. (Beachten Sie, dass dies zu einer Bewegung von 0 Leerzeichen führen kann, dh überhaupt keine Bewegung!)
  • Verschiedene Regeln: Der Mensch bewegt sich zuerst. Der Mensch darf die Leinenlänge bei seiner Bewegung nicht überschreiten. Wenn ja, muss es eine andere Richtung wählen. "Zufällig" bedeutet "mit einer gleichmäßigen Verteilung und ohne Muster".

Die Eingabe erfolgt in diesem Format (kann STDIN, Funktionsparameter, Datei usw. sein):

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

Beispielsweise:

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

Sie müssen die Ausgabe in diesem Format geben (kann STDOUT, Funktionsrückgabewert, Datei usw. sein):

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

(Die Anzahl der ausgegebenen Zeilen ist seconds + 1, da die H(0,0) D(0,0)Zeile nicht zählt.)

Das ist , also gewinnt der kürzeste Code in Bytes!

Türknauf
quelle
4
Dinge, die Sie offensichtlich gemeint haben, aber es ist wahrscheinlich gut, sie trotzdem explizit anzugeben: 1. Entfernung bedeutet euklidische Entfernung, 2. Die Koordinatenebene ist kartesisch, nicht polar (oder Boeing 777); Dinge, die nicht klar sind: 3. Was macht der Mensch, wenn seine Bewegung die Länge der Leine überschreitet? 4. Wer bewegt sich in jedem Zug zuerst, Hund oder Mensch?
Jonathan Van Matre
Falls die gewählte Richtung keine gültige Bewegung zulässt: Sollte keine Bewegung erfolgen oder eine andere Richtung gewählt werden?
TimWolla
Wie soll man Input bekommen? STDIN? Ist ein Funktionsparameter auch in Ordnung?
TimWolla
1
Mein Hund bellt mich nur an, wenn ich mit ihm spazieren gehe.
TheDoctor
@Tim Der Übersichtlichkeit halber bearbeitet; Vielen Dank.
Türklinke

Antworten:

2

GolfScript, 140 Zeichen

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

Beispiellauf ( online versuchen ):

> 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
quelle
6

CoffeeScript - 324 + Funktionsaufruf

Demo (unter Verwendung von 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

Langer Code:

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
quelle
4

Ruby, 189 177

Ich kann das vielleicht ein bisschen fallen lassen. Ich weiß nicht lieben 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
  }
}
Nicht dieser Charles
quelle
2

Mathematica 285

Golf gespielt

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

Beispiel

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

Es gibt einige Kommentare im Text unten. Ich habe auch einen Ausdruck beigefügt, der es ermöglicht, einige der Berechnungen zu verfolgen.

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

Beispiel

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

[Ein Teil des Ausdrucks wird angezeigt, um einen Eindruck von der Funktionsweise des Codes zu vermitteln. ]

ausdrucken

DavidC
quelle