Üst üste binen daire


16

Bir program ya da işlevi yazmak gereken bir verilen Nile Neşit aralıklı kare ızgara ve bir katı yazılı daire çıkışları veya geri döner katı bir daire ile kısmen ya da tamamen üst üste ızgara, karelerden oluşan sayısı.

0 boyutlu çakışmalar (yani daire yalnızca bir çizgiye dokunduğunda) sayılmaz. (Bu çakışmalar örn N = 10.

Misal

N = 8 (64 squares), Slices = 60

[Imgur] (http://i.imgur.com/3M1ekwY.png)

Giriş

  • Bir tamsayı N > 0. (Izgarada N * Nkareler olacak.)

Çıktı

  • Bir tam sayı, katı daire dilimlerinin sayısı.

Örnekler

(giriş-çıkış çiftleri)

Inputs:  1 2 3  4  5  6  7  8  9 10  11  12  13  14  15
Outputs: 1 4 9 16 25 36 45 60 77 88 109 132 149 172 201

Bu kod golf çok kısa giriş kazanır.


Sadece ben mi yoksa herkes burada bariz çözümü mi kaçırıyor? Düzenleme: Boş ver. İlk başta basit gibi görünüyordu N^2.
nyuszika7h

Yanıtlar:


5

Pyth, 27 26

-*QQ*4lfgsm^d2T*QQ^%2_UtQ2

Çevrimiçi deneyin: Pyth Derleyici / Yönetici

Bir 2Nx2Nızgara kullanıyorum ve üst üste binen 2x2kareleri sayıyorum . Yarıçapı zaten bildiğim için bu biraz daha kısa N.

Ve aslında üst üste binen kareleri saymıyorum. İkinci çeyreğin üst üste binmeyen karelerini sayıyorum, sayıyı 4 ile çarpıyorum ve sonucu çıkarıyorum N*N.

27 çözüm için açıklama:

-*QQ*4lfgsm^-Qd2T*QQ^t%2UQ2   implicit: Q = input()
                     t%2UQ    generates the list [2, 4, 6, ..., Q]
                    ^     2   Cartesian product: [(2, 2), (2, 4), ..., (Q, Q)]
                              These are the coordinates of the right-down corners
                              of the 2x2 squares in the 2nd quadrant. 
       f                      Filter the coordinates T, for which:
        gsm^-Qd2T*QQ             dist-to-center >= Q
                                 more detailed: 
          m     T                   map each coordinate d of T to:
           ^-Qd2                       (Q - d)^2
         s                          add these values
        g        *QQ                 ... >= Q*Q
    *4l                       take the length and multiply by 4
-*QQ                          Q*Q - ...

26 çözüm için açıklama:

Koordinatları yalnızca bir kez kullandığımı ve hemen koordinatları çıkardığımı fark ettim Q. Neden değerleri Q - coordsdoğrudan oluşturmuyorsunuz ?

Bu olur %2_UtQ. Önceki çözümdekinden yalnızca bir karakter daha büyüktür ve 2 karakter kaydeder, çünkü özetlemem gerekmez -Q.


6

Python 2, 72

lambda n:sum(n>abs(z%-~n*2-n+(z/-~n*2-n)*1j)for z in range(~n*~n))+n+n-1

Ungolfed:

def f(n):
    s=0
    for x in range(n+1):
        for y in range(n+1):
            s+=(x-n/2)**2+(y-n/2)**2<(n/2)**2
    return s+n+n-1

Izgara bir (n+1)*(n+1)kareyi gösterir. Merkeze en yakın ızgara noktası dairenin içindeyse bir hücre daireyle çakışır. Bu nedenle, 2*n+1eksenlerdeki (hem tek hem de tek n) ızgara noktalarını kaçırması dışında ızgara noktalarını sayabiliriz , bu yüzden manuel olarak düzeltiriz.

Kod , merkeze olan mesafeyi hesaplamak için karmaşık mesafeler ve tek bir dizin üzerinde yineleme yapmak için bir döngü daraltma kullanarak karakterleri kaydeder .


6

CJam, 36 35 34 27 bayt

Bu xnor ile aynı algoritma olduğu ortaya çıktı, ama daha iyi bir tane olup olmadığını merak ediyorum.

rd:R,_m*{{2*R(-_g-}/mhR<},,

Kod açıklaması :

rd:R                                "Read the input as double and store it in R";
    ,_                              "Get 0 to input - 1 array and take its copy";
      m*                            "Get Cartesian products";
                                    "Now we have coordinates of top left point of each";
                                    "of the square in the N by N grid";
        {               },,         "Filter the squares which are overlapped by the";
                                    "circle and count the number";
         {        }/                "Iterate over the x and y coordinate of the top left";
                                    "point of the square and unwrap them";
          2*                        "Scale the points to reflect a 2N grid square";
            R(-                     "Reduce radius - 1 to get center of the square";
               _g-                  "Here we are reducing or increasing the coordinate";
                                    "by 1 in order to get the coordinates of the vertex";
                                    "of the square closer to the center of the grid";
                    mhR<            "Get the distance of the point from center and check";
                                    "if its less than the radius of the circle";

GÜNCELLEME : 7 bayt kurtarmak için bazı diğer tekniklerle birlikte Jakube 2N hile kullanarak!

Buradan çevrimiçi deneyin


2

Pyth,  44  36

JcQ2L^-+b<bJJ2sm+>*JJ+y/dQy%dQqQ1*QQ

Bazı baytları tıraş edebilmem için biraz temizlemeye çalışıyorum.

açıklama

                           Q = eval(input())    (implicit)
JcQ2                       calculate half of Q and store in J
L                          define function y(b) that returns
 ^-+b<bJJ2                 (b - J + (1 if b < J else 0)) ^ 2
s                          output sum of
 m                 *QQ      map d over integers 0..(Q*Q-1)
  +
   >*JJ                      J*J is greater than
       +y/dQy%dQ              sum of y(d / Q) and y(d % Q)
                qQ1          or Q is 1; see below

n = 1Algoritmam sadece merkeze en yakın karenin köşesini kontrol ettiği için (ve hiçbiri kapalı değildir n = 1) açıkça kontrol etmeliyim .


2

Oktav (74) (66) (64)

İşte oktav versiyonu. Temel olarak daire içindeki tüm köşeleri bulmak ve daha sonra bir veya daha fazla geçerli köşeye sahip tüm kareleri kıvrım yoluyla bulmak. 64 Bayt:

x=ndgrid(-1:2/input(''):1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)

66 Bayt:

x=meshgrid(-1:2/input(''):1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)

74 Bayt:

n=input('');x=ones(n+1,1)*(-1:2/n:1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)

1

R - 64

function(n)sum(rowSums(expand.grid(i<-0:n-n/2,i)^2)<n^2/4)+2*n-1
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.