Kontrolden çıkıyor, Doktor!


11

Doktor, Dalek kuvvetlerinden kaçmaya çalışırken, sarmal bir hareketle çeşitli alan ceplerinde seyahat ederek onları bir dönüşe göndermeye karar verdi.

Mevcut uzay-zamanın doğasına bağlı olarak, Doktorun TARDIS'e girmesi gerekir, alan bölümünün yüksekliğini ve genişliğini ve spiralin başlayacağı giriş noktasını kontrol eder.

Uzayın kesiti, 1'den başlayarak soldan sağa, yukarıdan aşağıya sıralı tamsayılarla dolu bir h x w ızgara olarak düşünülebilir .

Başlangıç ​​konumu, sıra ve sütun için rc olarak sağlanır ... Bundan TARDIS'in yazılımı, satır r sütunu c'den yukarı doğru başlayarak saat yönünün tersine doğru spiral şeklinde döndürülerek elde edilen tam sayıların listesini çıkarmalıdır ...

Göreviniz, Doktor'un arkadaşı olarak TARDIS'i dört sayı alacak şekilde programlamak ve TARDIS'in height width row columnaşağıda açıklanan spiral hareketine uyacak şekilde hangi alan sektörüne ihtiyacı olduğunu belirlemesini sağlamaktır ...

Giriş 1

5 5 3 3

(5 x 5 ızgara, 3,3 konumundan başlayarak)

Çıktı 1

13 8 7 12 17 18 19 14 9 4 3 2 1 6 11 16 21 22 23 24 25 20 15 10 5

Çıktı açıklanıyor

Orijinal ızgara resim açıklamasını buraya girin

Oluşturulan spiral resim açıklamasını buraya girin

Giriş 2

2 4 1 2

(1,2 konumundan başlayan 2 x 4 ızgara)

Çıktı 2

2 1 5 6 7 3 8 4

Çıktı açıklanıyor

Spiral olarak biraz farklı olan, şimdi ilgili çıktıyı oluşturmak için ızgara etrafında daire çizmek zorundadır ...

Orijinal ızgara resim açıklamasını buraya girin

Oluşturulan spiral resim açıklamasını buraya girin

Kurallar:

  1. Bu kod golf, bu yüzden en kısa kod uzunluğu onay alır.

  2. Yukarıdaki örnekler kodunuzu test etmek için kullanılmalıdır. İlgili çıktıyı sağlamazsa, yanlış bir şey var ...

  3. Cevabınızda hem golf hem de golf içi kod sürümleri bulunmalıdır ...

İyi şanslar!


Size hızlı bir şekilde makul çizimler yapabileceğiniz draw.io'ya işaret edebilir miyim (elle çizilmiş versiyonunuzla mükemmel okunabilirliğiniz var ... sadece kırmızı daireler görmüyorum). Yapabileceklerin bir örneği olarak i.stack.imgur.com/xbLSA.png adresini düşünün . Bunun xml içine gömülü olduğunu unutmayın, böylece draw.io'ya giderseniz url'den içe aktarabilirsiniz.

Bir sonraki çizime ihtiyacım olduğunu aklımda tutacağım, @MichaelT, teşekkür ederim ...
WallyWest

1
Dizi çıktı olarak dönen bir işlev ile bir cevap gönderirim. Kabul edilebilir mi?
edc65

@ edc65 Mate, sen ve ben CG'ye geri dönüyoruz, bunun için S (h, w, r, c) veya benzeri bir işleve izin vereceğim ... :)
WallyWest

Yanıtlar:


3

JavaScript (ES6) 124 163 177

Düzenle Tamamen farklı bir şekilde, ziyaret edilen hücreleri saklamak için bir diziye gerek yok. Spiral tarafının her 2 turdan sonra 1 artması gerçeğini kullanarak.

// New way
f=(h,w,y,x)=>
  (e=>{
    for(o=[],d=i=t=l=0;l<w*h;i<t?i+=2:[i,d,e]=[1,-e,d,++t])
      o[l]=y*w-w+x,l+=x>0&x<=w&y>0&y<=h,x+=d,y-=e
  })(1)||o


// Golfed
g=(h,w,y,x)=>
  (g=>{
    for(e=n=0;n<h*w;)g[[n%w+1,-~(n/w)]]=++n;
    for(o=[g[[x,y]]],l=d=1;l<n;l+=!!(o[l]=g[[x+=d,y+=e]]))
      g[[x,y]]=0,
      g[[x+e,y-d]]!=0&&([d,e]=[e,-d])
  })([])||o



// Not golfed
u=(h,w,y,x)=>{
  var i,j,dx,dy,kx,ky,o,n,
    g={} // simulate a 2dimensional array using a hashtable with keys in the form 'x,y'

  for(n=i=0; i++<h;) // fill grid (probably better done in a single loop)
    for(j=0; j++<w;)
      g[[j,i]] = ++n;
  o=[g[[x,y]]] // starting point in output
  dx=1, dy=0 // start headed right
  
  for(; !o[w*h-1]; ) // loop until all w*h position are put in output
  {
    g[[x, y]] = 0 // mark current position to avoid reusing
    kx=dy, ky=-dx // try turning left
    if(g[[x+kx, y+ky]] != 0) // check if position marked
    { // found a valid position
      dx=kx, dy=ky // change direction
    }
    x+=dx, y+=dy // move
    k=g[[x, y]] // get current value
    if (k) o.push(k) // put in output list if not 'undefined' (outside grid)
  }
  return o
}

// TEST - In FireFox

out=x=>O.innerHTML+=x+'\n';
[
 [[5,5,3,3],'13 8 7 12 17 18 19 14 9 4 3 2 1 6 11 16 21 22 23 24 25 20 15 10 5'],
 [[2,4,1,2],'2 1 5 6 7 3 8 4']
].forEach(t=>out(t[0] + '\n Result: ' + f(...t[0])+'\n Check:  ' + t[1]))

test=()=>
{
  var r, i=I.value.match(/\d+/g), h=i[0]|0, w=i[1]|0, y=i[2]|0, x=i[3]|0
  if (y>h||x>w) r = 'Invalid input'
  else r = f(h,w,y,x)
  out(i+'\n Reault: ' +r)
}
<pre id=O></pre>
Your test:<input id=I><button onclick="test()">-></button>


Muhteşem golf! 300'den
163'e

1
@WallyWest bu yorum ile beni daha iyisini yapmak için zorluyorsunuz. Thnx
edc65

Güzel! Python çözümüm çok daha uzun sürdü, ama gibiydim, tamam, daha iyi bir yöntem kullanıyorsun. Şimdi aynı kullanıyorsunuz ve daha da kısadır ... Yapacak işlerim var. :)
randomra

@randomra hala görmek isterim ...
WallyWest

2

Python 3, 191

Muhtemelen büyük bir puan değil, ama işte gidiyor:

def f(b,a,d,c):
 p,r,l,s,h=c+1j*d,-1j,1,0,0
 for _ in [0]*((a+b)**2):x,y=p.real,p.imag;0<x<a+1and 0<y<b+1and print(int((y-1)*a+x),end=' ');p+=r;s=(s+1)%l;t=s==0;h=(h+t)%2;l+=h<t;r*=(-1j)**t 

Her saniye dönüşten sonra yan uzunluğu artırarak spiral boyunca hareket ediyoruz. Konumumuz verilen kılavuzun içindeyse, karşılık gelen sayısını yazdırırız.

Değişkenler:

  • p karmaşık konumdur
  • x ve y konum koordinatlarıdır
  • r yön
  • s geçerli taraftaki konumdur
  • l akım tarafı uzunluğu
  • h şimdiki tarafın ordinalinin paritesidir
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.