Köpeği yürüyüşe çıkarmak


14

Köpeğim bana havlıyor, ama onu yürüyüşe çıkaramayacak kadar tembelim. Bir fikrim var! Code Golf'teki insanları benim için yapmasını sağlayacağım!

Zorluklarınız bir köpeğin yürüyüşünü simüle etmektir. Köpek yürüyüş kuralları:

  • İnsan ( H) 0,0bir (Kartezyen) koordinat düzleminde başlar ve her saniye rastgele bir boşluk yukarı, sola, sağa veya aşağı gider.
  • Köpek ( D) aynı yerden başlayacak ve her saniye yukarı, sola, sağa veya aşağıya sıfır, bir, iki veya üç boşluk bırakacaktır (rastgele). Köpek daha az tahmin edilebilir ve bazen daha hızlı çalışır veya tamamen durur.
  • Köpek asla tasma uzunluğu ( L) olan insandan (Öklid mesafesindeki) belirli bir miktardan daha fazla uzaklaşmayacaktır . Örneğin, Lbir 6, geçerli bir pozisyon olacaktır H(0,0) D(4,4)(mesafe 5.65 birimleri hakkında olduğu) için değil, H(0,0) D(5,4)(6,4 birim).
    • Köpek hareket ettiğinde, tasma mesafesi gereksinimini ihlal ederse, mesafe gereksinimini ihlal etmediği belirlenen yönde mümkün olduğunca uzağa gitmelidir. Örneğin, konum H(0,0) D(3,4)ve köpek rastgele 3 boşluk sağa hareket etmeye karar verilirse, D(4,4)6 birimden fazla uzaklaşmadan gidebileceği en uzağa gideceği için gidecektir. (Bunun 0 boşluk hareketine neden olabileceğini unutmayın, yani hiç hareket yok!)
  • Çeşitli kurallar: önce insan harekete geçer. İnsan hareket halindeyken tasma uzunluğunu aşmamalıdır. Eğer öyleyse, başka bir yön seçmelidir. "Rastgele", "eşit dağılımlı ve desensiz" anlamına gelir.

Giriş bu biçimde verilecektir (STDIN, fonksiyon parametresi, dosya vb. Olabilir):

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

Örneğin:

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

Bu biçimde çıktı vermelisiniz (STDOUT, işlev dönüş değeri, dosya vb. Olabilir):

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

(Çizgilerin miktarı çıkış olacaktır seconds + 1, çünkü H(0,0) D(0,0)hattı sayılmaz.)

Bu , bu yüzden bayt içindeki en kısa kod kazanacak!


4
Açıkçası kastettiğiniz şeyler, ancak muhtemelen onları açıkça belirtmek iyi olabilir: 1. Mesafe, Öklid mesafesi anlamına gelir, 2. Koordinat düzlemi polar değil (veya Boeing 777); Açık olmayan şeyler: 3. İnsanların hareketleri tasma uzunluğunu aşarsa ne yapar? 4. Her dönüşte ilk kim, köpek ya da insan hareket eder?
Jonathan Van Matre

Seçilen yön geçerli bir harekete izin vermiyorsa: Hiçbir hareket yapılmamalı mı yoksa başka bir yön seçilmeli mi?
TimWolla

Girdi nasıl elde edilmelidir? STDIN? Bir işlev parametresi de iyi mi?
TimWolla

1
Köpeğim bana sadece onu yürüyüşe çıkarmak üzereyken havlıyor.
TheDoctor

@Tim Netlik için düzenlenmiştir; Teşekkürler.
Kapı tokmağı

Yanıtlar:


2

GolfScript, 140 karakter

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

Örnek çalışma ( çevrimiçi deneyin ):

> 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 + işlev çağrısı

Demo (Tasma 10 Kullanarak):

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)

Kod:

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

Uzun Kod:

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

Yakut, 189 177

Bunu biraz bırakabilirim. Sevmiyorum 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}}])

Misal

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

Aşağıdaki metinde bazı yorumlar var. Ayrıca bazı hesaplamaları takip etmeyi mümkün kılan bir çıktı da ekledim.

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

Misal

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

[Çıktının bir kısmı, kodun nasıl çalıştığına dair bir fikir vermektedir. ]

çıktı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.