Powiedzmy, że masz dodatnią liczbę całkowitą N . Najpierw zbuduj regularny wielokąt, który ma N wierzchołków, przy czym odległość między sąsiednimi wierzchołkami wynosi 1. Następnie połącz linie z każdego wierzchołka do każdego innego wierzchołka. Na koniec obliczyć długość wszystkich linii zsumowanych razem.
Przykład
Biorąc pod uwagę wartość wejściową N = 6 , zbuduj sześciokąt z liniami łączącymi każdy wierzchołek z innymi wierzchołkami.
Jak widać, istnieje w sumie 6 linii brzegowych (długość = 1), 3 linie, które mają podwójną długość granicy (długość = 2) i 6 innych linii, które za pomocą twierdzenia Pitagorasa możemy obliczyć długość dla , który jest
Jeśli dodamy razem długości linii, otrzymamy (6 * 1) + (3 * 2) + (6 * 1,732) = 22,392 .
Dodatkowe informacje
Ponieważ struktury z 2 lub mniejszymi wierzchołkami nie są uważane za wielokąty, wyjmij 0 (lub NaN
, ponieważ odległość między pojedynczym wierzchołkiem nie ma większego sensu) dla N = 1, ponieważ pojedynczego wierzchołka nie można połączyć z innymi wierzchołkami, a 1 dla N = 2, ponieważ dwa wierzchołki są połączone jedną linią.
Wejście
Liczba całkowita N, w dowolnym rozsądnym formacie.
Wynik
Długość wszystkich linii zsumowanych razem, z dokładnością do co najmniej 3 miejsc po przecinku, albo jako funkcja powrotu, albo bezpośrednio do wydruku stdout
.
Zasady
- Standardowe luki są zabronione.
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach, w dowolnym języku.
Powodzenia!
Przypadki testowe
(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392
1
? Mój obecny wpis powróciłbynan
na przykład zamiast zera i wymagałby po prostu specjalnej obudowy.nan
jest też w porządku, ponieważ odległość między jednym wierzchołkiem i tak nie ma większego sensu.n=1
Myślę, że powinieneś chyba pozwolić na zgłaszanie błędów .N
, ponieważ wyniki stają się większe, a zmiennoprzecinkowe mniej precyzyjne.Odpowiedzi:
Python 3
(z sympią ),61 60 58 5448 bajtów-6 (może nawet -10, jeśli nie musimy sobie poradzić
n=1
) dzięki xnor (dalsze uproszczenie trygonometryczne plus dalsze gry w golfa, aby obsłużyć skrzynkę 1 i oszczędzić nawiasy, przesuwając (teraz niepotrzebne)float
rzut).Mam nadzieję, że dopokonania bez bibliotekstron trzecich? Tak!!aleSprawmy, żeby wszystko kręciło się ...Wypróbuj online!
Wykorzystuje to wzór na sumę długości, jeśli wielokąt jest wpisany w koło jednostkowe,
n*cot(pi/2/n)/2
i dopasowuje wynik do jednego dla długości boku równej jeden, dzieląc przez grzech tej długości sznurkasin(pi/n)
.Pierwszą formułę uzyskuje się, biorąc pod uwagę
n-1
długości sznurka wszystkich przekątnych wychodzących z jednego rogu, które mają długościsin(pi/n)
(ponownie)sin(2*pi/n)
, ...,sin((n-1)pi/n)
. Suma tego jest takacot(pi/2/n)
, że sąn
rogi, więc mnożymy przezn
, ale potem policzyliśmy dwukrotnie wszystkie sznury, więc dzielimy przez dwa.Wynik
n*cot(pi/2/n)/2/sin(pi/n)
został następnie uproszczony przez xnor don/2/(1-cos(pi/n))
(przytrzymanien>1
)... to (o ile dokładność jest akceptowalna) nie wymaga już
sympy
wbudowanegomath
modułu (math.pi=3.141592653589793
).źródło
n/2/(1-cos(pi/n))
.0.25
dlan=1
- ale specjalny obudowa może być krótszy zbyt ...)1/4
jest wynikn=1
. Można go załatać1%n*
. Pareny można również zapisać, przesuwającfloat
wnętrze dofloat(1-cos(pi/n))
. Nie wiem zbyt dobrze, ale może istnieje arytmetyczny sposób na wymuszenie pływaka.float
ruch). sympy wyprowadza wyrażenie - np.n=6
brak rzutowania powoduje wyrażenie z reprezentacją3.0/(-sqrt(3)/2 + 1)
- może być krótszy sposób, ale jeszcze go nie znam.Python , 34 bajty
Wypróbuj online!
Używa formuły
n/2/(1-cos(pi/n))
uproszczonej od Jonathana Allana . Neil zaoszczędził 10 bajtów, zauważając, że Python może obliczyć pierwiastki jedności jako ułamkowe moce1j
.Python bez importu nie ma wbudowanych funkcji trygonometrycznych
pi
, lube
. Abyn=1
dać0
zamiast0.25
, możemy poprzedzić1%n*
.Dłuższa wersja wykorzystująca tylko moce liczb naturalnych:
Wypróbuj online!
źródło
lambda n:1%n*n/(1-(1j**(2/n)).real)/2
abs()
robi.MATL ,
1615 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wykorzystuje zatwierdzenie, które wprowadziło funkcję FFT (szybka transformata Fouriera) i które poprzedza wyzwanie o 8 dni.
Wyjaśnienie
Kod wykorzystuje tę sztuczkę (dostosowaną do MATL) do generowania korzeni jedności. Dają one pozycje wierzchołków jako liczby zespolone, z tym wyjątkiem, że odległość między kolejnymi wierzchołkami nie jest znormalizowana do 1. Aby rozwiązać ten problem, po obliczeniu wszystkich odległości parami, program dzieli je przez odległość między kolejnymi wierzchołkami.
źródło
Konik polny, 25 prymitywów (11 elementów, 14 drutów)
Czytam meta post na temat programów w GH i LabVIEW i postępuję zgodnie z podobnymi instrukcjami, aby zmierzyć język wizualny.
Drukuj
<null>
dla N =0, 1, 2
, ponieważPolygon Primitive
nie można wygenerować wielokąta o 2 lub mniejszej liczbie krawędzi, a otrzymasz pustą listę linii.Komponenty od lewej do prawej:
Side count
suwak: wprowadzaniePolygon Primitive
rysuje wielokąt na podstawie promienia, musimy przeskalować kształtźródło
Mathematica, 26 bajtów
używa formuły @Jathanathan Allan
Wypróbuj online!
-1 bajt Junghwan min
źródło
N@Cot[Pi/2/#]/2Csc[Pi/#]#&
od1/sin(x) = csc(x)
.5Csc[x=Pi/#]Cot[x/2]#&
Haskell , 27 bajtów
Wypróbuj online!
Właśnie zagłębiłem się w Haskell, więc okazało się, że jest to dobry golf dla początkujących (czyli kopiowanie formuły z innych odpowiedzi).
Starałem się też
$
gdzieś umieścić, ale kompilator wciąż na mnie krzyczy, więc to najlepsze, co mam. : Pźródło
Galaretka ,
131211 bajtówKorzysta ze wzoru Jonathana Allana (i dziękuje mu za uratowanie 2 bajtów)
Wypróbuj online!
Zawsze fascynowała mnie Jelly, ale nie używałem jej zbyt wiele, więc może to nie być najprostsza forma.
źródło
ɓ
aby wstawić link pomocnika w ten sposób:ØP÷ÆẠCḤɓn1×÷
’
i logicznie, iȧ
:ØP÷ÆẠCḤɓ’ȧ÷
:)JavaScript (ES6), 36 bajtów
Port odpowiedzi @ JonathanAllan na Python 3
źródło