Nakładające się koło

16

Należy napisać program lub funkcję, która podawany był Nprzez Nrówno rozmieszczone kwadratowy siatki i stały wyjść wpisanego koła lub zwraca liczbę kwadratów siatki, które pokrywały się częściowo lub całkowicie przez stałego kręgu.

Zakładki wielkości 0 (tj. Gdy okrąg dotyka tylko linii) nie są liczone. (Te nakładki występują np N = 10.)

Przykład

N = 8 (64 squares), Slices = 60

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

Wejście

  • Liczba całkowita N > 0. (Siatka będzie miała N * Nkwadraty).

Wynik

  • Liczba całkowita, liczba ciągłych wycinków koła.

Przykłady

(pary wejścia-wyjścia)

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

To jest golf golfowy, więc wygrywa najkrótszy wpis.

randomra
źródło
Czy to tylko ja, czy wszyscy brakuje tutaj oczywistego rozwiązania? Edycja: nieważne. Z początku wyglądało to na proste N^2.
nyuszika7h,

Odpowiedzi:

5

Pyth, 27 26

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

Wypróbuj online: Pyth Compiler / Executor

Używam 2Nx2Nsiatki i liczę zachodzące na siebie 2x2kwadraty. To jest trochę krótsze, ponieważ już znam promień N.

I właściwie nie liczę nakładających się kwadratów. Liczę nie nakładające się kwadraty drugiego kwadrantu, mnożę liczbę przez 4 i odejmuję wynik N*N.

Wyjaśnienie 27 rozwiązania:

-*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 - ...

Objaśnienie 26 rozwiązania:

Zauważyłem, że używam współrzędnych tylko raz i natychmiast odejmuję współrzędne Q. Dlaczego nie wygenerować wartości Q - coordsbezpośrednio?

To się dzieje w %2_UtQ. Tylko jeden znak większy niż w poprzednim rozwiązaniu i oszczędza 2 znaki, ponieważ nie muszę odejmować -Q.

Jakube
źródło
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

Nie golfowany:

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

Punkty siatki dla (n+1)*(n+1)kwadratu. Komórka nakłada się na okrąg, jeśli jej punkt siatki najbliżej środka znajduje się wewnątrz koła. Możemy więc liczyć punkty siatki, z wyjątkiem tego, że brakuje 2*n+1punktów siatki w osiach (zarówno dla parzystych, jak i nieparzystych n), więc korygujemy to ręcznie.

Kod zapisuje znaki, używając złożonych odległości do obliczenia odległości od środka, a pętla zwinięta w celu iteracji po jednym indeksie.

xnor
źródło
6

CJam, 36 35 34 27 bajtów

Okazało się, że jest to ten sam algorytm co xnor, ale zastanawiam się, czy jest jakiś lepszy.

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

Objaśnienie kodu :

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";

AKTUALIZACJA : Używanie sztuczki 2N od Jakube wraz z kilkoma innymi technikami, aby zaoszczędzić 7 bajtów!

Wypróbuj online tutaj

Optymalizator
źródło
2

Pyth  44  36

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

Próbuję go trochę wyczyścić, na wypadek, gdybym mógł ogolić kilka bajtów.

Wyjaśnienie

                           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

Muszę wyraźnie sprawdzić n = 1, ponieważ mój algorytm sprawdza tylko narożnik kwadratu najbliższego centrum (i żaden nie jest objęty n = 1).

PurkkaKoodari
źródło
2

Oktawa (74) (66) (64)

Oto wersja oktawowa. Zasadniczo znajdowanie wszystkich wierzchołków w okręgu, a następnie znajdowanie wszystkich kwadratów z jednym lub więcej prawidłowymi wierzchołkami za pomocą splotu. 64 bajty:

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

66 bajtów:

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

74 bajty:

n=input('');x=ones(n+1,1)*(-1:2/n:1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)
wada
źródło
1

R - 64

function(n)sum(rowSums(expand.grid(i<-0:n-n/2,i)^2)<n^2/4)+2*n-1
flodel
źródło