Mengambil anjing untuk jalan-jalan

14

Anjing saya menggonggong, tetapi saya terlalu malas untuk membawanya jalan-jalan. Saya punya ide! Saya akan membuat orang-orang di Code Golf melakukannya untuk saya!

Tantangan Anda adalah untuk mensimulasikan langkah anjing. Berikut adalah aturan untuk menuntun anjing:

  • Manusia ( H) akan mulai dari 0,0pada bidang koordinat (Cartesian), dan secara acak akan naik satu ruang baik naik, kiri, kanan, atau turun setiap detik.
  • Anjing ( D) akan mulai di lokasi yang sama, dan akan menjadi nol, satu, dua, atau tiga spasi baik atas, kiri, kanan, atau bawah setiap detik (tentu saja secara acak). Anjing kurang dapat diprediksi dan kadang-kadang akan berlari lebih cepat atau berhenti sepenuhnya.
  • Anjing tidak akan pernah mendapatkan lebih dari jumlah unit tertentu dari manusia (dalam jarak Euclidean), yang merupakan panjang tali ( L). Misalnya, jika Ladalah 6, posisi yang valid akan H(0,0) D(4,4)(karena jaraknya sekitar 5,65 unit), tapi tidak H(0,0) D(5,4)(sekitar 6,4 unit).
    • Jika, ketika anjing bergerak, ia akan melanggar persyaratan jarak tali, ia harus pergi sejauh mungkin ke arah yang ditentukan yang tidak melanggar persyaratan jarak. Sebagai contoh, jika posisi itu H(0,0) D(3,4)dan anjing secara acak memutuskan untuk memindahkan 3 ruang ke kanan, itu akan pergi ke D(4,4), karena itu yang terjauh ia bisa pergi tanpa mendapatkan lebih dari 6 unit. (Perhatikan bahwa ini mungkin menghasilkan gerakan 0 spasi, yaitu tidak ada gerakan sama sekali!)
  • Aturan lain-lain: manusia bergerak lebih dulu. Manusia tidak boleh melebihi panjang tali saat bergerak. Jika ya, ia harus memilih arah lain. "Acak" berarti "dengan distribusi yang merata dan tanpa pola."

Input akan diberikan dalam format ini (bisa STDIN, parameter fungsi, file, dll.):

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

Sebagai contoh:

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

Anda harus memberikan output dalam format ini (bisa STDOUT, nilai pengembalian fungsi, file, dll.):

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

(Jumlah output baris akan seconds + 1, karena H(0,0) D(0,0)baris tidak masuk hitungan.)

Ini adalah , jadi kode terpendek dalam byte akan menang!

Gagang pintu
sumber
4
Hal-hal yang jelas-jelas Anda maksudkan, tetapi mungkin baik untuk menyatakannya secara eksplisit: 1. Jarak berarti jarak Euclidean, 2. Pesawat koordinat adalah Cartesian, bukan kutub (atau Boeing 777); Hal-hal yang tidak jelas: 3. Apa yang dilakukan manusia jika gerakan mereka akan melebihi panjang tali? 4. Pada setiap belokan, siapa yang bergerak lebih dulu, anjing atau manusia?
Jonathan Van Matre
Jika arah yang dipilih tidak memungkinkan langkah yang valid: Apakah tidak ada langkah yang harus dilakukan atau arah lain yang dipilih?
TimWolla
Bagaimana seharusnya input didapat? STDIN? Apakah parameter fungsi juga baik-baik saja?
TimWolla
1
Anjing saya hanya menggonggong pada saya jika saya akan mengajaknya jalan-jalan.
TheDoctor
@Tim Diedit untuk kejelasan; Terima kasih.
Gagang pintu

Jawaban:

2

GolfScript, 140 karakter

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

Contoh jalankan (coba 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)
Howard
sumber
6

CoffeeScript - panggilan fungsi 324 +

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

Kode:

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

Kode Panjang:

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

Ruby, 189 177

Saya mungkin bisa menjatuhkan ini sedikit. Aku tidak mencintai 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}}

Tidak Disatukan:

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
  }
}
Bukan itu Charles
sumber
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}}])

Contoh

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


Tidak disatukan

Ada beberapa komentar dalam teks di bawah ini. Saya juga menyertakan cetakan yang memungkinkan untuk mengikuti beberapa perhitungan.

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

Contoh

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

[Bagian dari cetakan ditampilkan untuk memberi gambaran tentang bagaimana kode bekerja. ]

cetakan

DavidC
sumber