Đưa chó đi dạo


14

Con chó của tôi đang sủa tôi, nhưng tôi quá lười để đưa nó đi dạo. Tôi có ý này! Tôi sẽ nhờ những người ở Code Golf làm điều đó cho tôi!

Thử thách của bạn là mô phỏng việc dắt chó đi dạo. Dưới đây là các quy tắc để dắt chó đi dạo:

  • Con người ( H) sẽ bắt đầu tại 0,0một mặt phẳng tọa độ (Cartesian) và sẽ ngẫu nhiên đi một khoảng trống lên, trái, phải hoặc xuống mỗi giây.
  • Con chó ( D) sẽ bắt đầu ở cùng một vị trí và sẽ đi bằng không, một, hai hoặc ba khoảng trống lên, trái, phải hoặc xuống mỗi giây (tất nhiên, ngẫu nhiên). Con chó ít dự đoán hơn và đôi khi sẽ chạy nhanh hơn hoặc dừng lại hoàn toàn.
  • Con chó sẽ không bao giờ nhận được nhiều hơn một số đơn vị nhất định cách xa con người (theo khoảng cách Euclide), đó là chiều dài của dây xích ( L). Ví dụ: nếu L6, một vị trí hợp lệ sẽ là H(0,0) D(4,4)(vì khoảng cách là khoảng 5,65 đơn vị), nhưng không H(0,0) D(5,4)(khoảng 6,4 đơn vị).
    • Nếu, khi con chó di chuyển, nó sẽ vi phạm yêu cầu về khoảng cách dây xích, nó phải đi xa nhất có thể theo hướng xác định không vi phạm yêu cầu khoảng cách. Ví dụ: nếu vị trí H(0,0) D(3,4)và con chó được quyết định ngẫu nhiên di chuyển 3 khoảng trống sang phải, nó sẽ đi đến D(4,4), vì đó là nơi xa nhất mà nó có thể đi mà không cần đi quá 6 đơn vị. (Lưu ý rằng điều này có thể dẫn đến chuyển động 0 khoảng trắng, nghĩa là không có chuyển động nào cả!)
  • Quy tắc linh tinh: con người di chuyển đầu tiên. Con người không được vượt quá chiều dài dây xích khi di chuyển. Nếu có, nó phải chọn hướng khác. "Ngẫu nhiên" có nghĩa là "với phân phối đồng đều và không có mẫu."

Đầu vào sẽ được cung cấp ở định dạng này (có thể là STDIN, tham số chức năng, tệp, v.v.):

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

Ví dụ:

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

Bạn phải cung cấp đầu ra ở định dạng này (có thể là STDOUT, giá trị trả về của hàm, tệp, v.v.):

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

(Số lượng đầu ra của dòng sẽ là seconds + 1, vì H(0,0) D(0,0)dòng không được tính.)

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!


4
Những điều bạn rõ ràng có nghĩa là, nhưng dù sao đi nữa cũng có thể nói rõ: 1. Khoảng cách có nghĩa là khoảng cách Euclide, 2. Mặt phẳng tọa độ là Cartesian, không phải cực (hoặc Boeing 777); Những điều không rõ ràng: 3. Con người sẽ làm gì nếu di chuyển của họ vượt quá chiều dài dây xích? 4. Trên mỗi lượt, ai di chuyển trước, chó hay người?
Jonathan Van Matre

Trong trường hợp hướng được chọn không cho phép di chuyển hợp lệ: Không nên thực hiện di chuyển hay hướng khác?
TimWolla

Làm thế nào đầu vào nên được nhận? STDIN? Là một tham số chức năng quá tốt?
TimWolla

1
Con chó của tôi chỉ sủa tôi nếu tôi chuẩn bị đưa nó đi dạo.
TheDoctor

@Tim Đã chỉnh sửa cho rõ ràng; cảm ơn.
Doorknob

Câu trả lời:


2

GolfScript, 140 ký tự

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

Chạy ví dụ (thử trực tuyến ):

> 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 - Cuộc gọi chức năng 324 +

Bản demo (Sử dụng 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)

Mã số:

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

Mã dài:

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

Hồng ngọc, 189 177

Tôi có thể có thể thả cái này một chút. Tôi không yêu 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}}

Ung dung:

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

Toán học 285

Chơi gôn

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

Thí dụ

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


Vô duyên

Có một số ý kiến ​​trong văn bản dưới đây. Tôi cũng đã bao gồm một bản in để có thể làm theo một số tính toán.

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

Thí dụ

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

[Một phần của bản in được hiển thị để cho biết cách thức hoạt động của mã. ]

in ra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.