Tính tổng các kết nối Vertex


14

Hãy nói rằng bạn có một dương tính số nguyên N . Đầu tiên, xây dựng một đa giác thông thường , có N đỉnh, với khoảng cách giữa các đỉnh lân cận là 1. Sau đó kết nối các đường từ mọi đỉnh, với mọi đỉnh khác. Cuối cùng, tính toán độ dài của tất cả các dòng tổng hợp lại với nhau.

Thí dụ

Cho đầu vào N = 6 , xây dựng một hình lục giác với các đường nối mọi đỉnh với các đỉnh khác.

Hình lục giác

Như bạn có thể thấy, có tổng cộng 6 đường viền (length = 1), 3 đường có gấp đôi chiều dài đường viền (length = 2) và 6 đường khác mà chúng ta, bằng cách sử dụng Định lý Pythagoras, có thể tính được độ dài cho , đó là

Nếu chúng ta cộng độ dài của các dòng với nhau, chúng ta sẽ nhận được (6 * 1) + (3 * 2) + (6 * 1.732) = 22.392 .

thông tin thêm

Vì các cấu trúc có 2 đỉnh trở xuống không được coi là đa giác, đầu ra 0 (hoặc NaN, vì khoảng cách giữa một đỉnh không có ý nghĩa nhiều) cho N = 1, vì một đỉnh duy nhất không thể được kết nối với các đỉnh khác và 1 cho N = 2, vì hai đỉnh được nối với nhau bằng một đường thẳng.

Đầu vào

Một số nguyên N, trong bất kỳ định dạng hợp lý.

Đầu ra

Độ dài của tất cả các dòng được tổng hợp lại với nhau, chính xác đến ít nhất 3 vị trí thập phân, dưới dạng trả về hàm hoặc được in trực tiếp stdout.

Quy tắc

  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là , vì vậy mã ngắn nhất tính bằng byte, trong bất kỳ ngôn ngữ nào, sẽ thắng.

Chúc may mắn!

Các trường hợp thử nghiệm

(Input) -> (Output)
1 -> 0 or NaN
2 -> 1
3 -> 3
5 -> 13.091
6 -> 22.392

1
Chúng ta phải thực sự xử lý 1? nanVí dụ, mục nhập hiện tại của tôi sẽ trả về chứ không phải bằng 0, và sẽ chỉ yêu cầu vỏ đặc biệt cho nó.
Jonathan Allan

1
@Jonathan ALLan Tôi đã nghĩ về nó sau khi thấy câu trả lời của bạn, nancũng tốt, vì khoảng cách giữa một đỉnh không có ý nghĩa gì cả.
Ian H.

6
Tôi có lẽ nên cho phép các lỗi được ném quá cho n=1tôi nghĩ.
Jonathan Allan

Thật khó để nói 3 vị trí thập phân của độ chính xác có nghĩa là gì mà không có giới hạn trên N, vì các đầu ra trở nên lớn hơn và các số float trở nên kém chính xác hơn.
xnor

@xnor Miễn là chính xác tới 3 chữ số thập phân cho bất kỳ đầu vào N hợp lý nào , thì kết quả của nó là ít chính xác hơn đối với các số khổng lồ.
Ian H.

Câu trả lời:


13

Python 3 (có sympy ) ,  61 60 58 54  48 byte

-6 (thậm chí có thể -10 nếu chúng ta không cần xử lý n=1) nhờ xnor (đơn giản hóa lượng giác hơn nữa cộng với việc chơi gôn để xử lý trường hợp cạnh 1 và lưu dấu ngoặc đơn bằng cách di chuyển một floatphôi (hiện không cần thiết ).

Hy vọng có thể đánh bại mà không có thư viện bên thứ 3 ? Đúng!! nhưng hãy để mọi thứ trôi qua ...

lambda n:1%n*n/2/(1-cos(pi/n))
from math import*

Hãy thử trực tuyến!

Điều này sử dụng một công thức cho tổng độ dài nếu một đa giác được ghi bên trong một vòng tròn đơn vị n*cot(pi/2/n)/2và điều chỉnh kết quả thành một cho độ dài cạnh là một bằng cách chia cho tội lỗi của chiều dài dây đó sin(pi/n).

Công thức đầu tiên có được bằng cách xem xét n-1độ dài dây của tất cả các đường chéo phát ra từ một góc có độ dài sin(pi/n)(một lần nữa) sin(2*pi/n), ..., sin((n-1)pi/n). Tổng của điều này là cot(pi/2/n), có ncác góc để chúng ta nhân lên n, nhưng sau đó chúng ta đã nhân đôi tất cả các dây, vì vậy chúng ta chia cho hai.

Kết quả n*cot(pi/2/n)/2/sin(pi/n)sau đó được xnor đơn giản hóa thành n/2/(1-cos(pi/n))(giữ cho n>1)

... Điều này (miễn là độ chính xác có thể chấp nhận được) bây giờ không còn yêu cầu sympyđối với mathmô-đun tích hợp ( math.pi=3.141592653589793).


2
Đúng! lưu 11 byte. công thức tuyệt vời!
J42161217

1
Có vẻ như công thức đơn giản hóa n/2/(1-cos(pi/n)).
xnor

Tốt chỗ @xnor (chừng nào chúng tôi có thể sản lượng 0.25cho n=1- nhưng vỏ đặc biệt có thể ngắn quá ...)
Jonathan Allan

@Jonathan ALLan Huh, kỳ lạ đó 1/4là kết quả cho n=1. Nó có thể được vá với 1%n*. Ngoài ra, parens có thể được lưu bằng cách di chuyển floatbên trong đến float(1-cos(pi/n)). Tôi không biết nhiều về sympy, nhưng có lẽ có một cách số học để buộc nổi.
xnor

@xnor Cảm ơn! (Tôi nên chú ý floatdi chuyển). sympy đưa ra một biểu thức - ví dụ: n=6không có kết quả truyền trong biểu thức có biểu diễn 3.0/(-sqrt(3)/2 + 1)- có thể có một cách ngắn hơn nhưng tôi chưa biết điều đó.
Jonathan Allan

7

Python , 34 byte

lambda n:1%n*n/abs(1-1j**(2/n))**2

Hãy thử trực tuyến!

Sử dụng công thức n/2/(1-cos(pi/n))đơn giản hóa từ Jonathan Allan . Neil đã lưu 10 byte bằng cách lưu ý rằng Python có thể tính toán gốc của sự thống nhất dưới dạng sức mạnh phân số của 1j.

Python không nhập không có các hàm lượng giác tích hợp pi, hoặc e. Để thực hiện n=1cho 0hơn là 0.25, chúng tôi trả trước 1%n*.

Một phiên bản dài hơn chỉ sử dụng quyền hạn số tự nhiên:

lambda n:1%n*n/abs(1-(1+1e-8j/n)**314159265)**2

Hãy thử trực tuyến!


1
Mát như dưa leo.
Jonathan Allan

37 byte:lambda n:1%n*n/(1-(1j**(2/n)).real)/2
Neil

@Neil Wow, Python chỉ có thể tính toán gốc rễ của sự thống nhất.
xnor

Vâng, đó là một chút dễ dàng. Tôi không biết những gì abs()làm mặc dù.
Neil

@Neil nó nhận được giá trị tuyệt đối, do đó, định mức, tức là khoảng cách từ gốc.
Jonathan Allan

6

MATL , 16 15 byte

t:=ZF&-|Rst2)/s

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Điều này sử dụng một cam kết giới thiệu chức năng FFT (Biến đổi Fourier nhanh) và trước 8 ngày thử thách.

Giải trình

Mã sử ​​dụng thủ thuật này (thích nghi với MATL) để tạo ra gốc rễ của sự thống nhất. Chúng cho các vị trí của các đỉnh là số phức, ngoại trừ khoảng cách giữa các đỉnh liên tiếp không được chuẩn hóa thành 1. Để giải quyết điều đó, sau khi tính toán tất cả các khoảng cách theo cặp, chương trình chia chúng cho khoảng cách giữa các đỉnh liên tiếp.

t       % Implicit input, n. Duplicate
:       % Range: [1 2 ... n-1 n]
=       % Isequal, element-wise. Gives [0 0 ... 0 1]
ZF      % FFT. Gives the n complex n-th roots of unity
&-|     % Matrix of pairwise absolute differences
R       % Upper triangular matrix. This avoids counting each line twice.
s       % Sum of each column. The second entry gives the distance between
        % consecutive vertices
t2)/    % Divide all entries by the second entry
s       % Sum. Implicit display

1
cái này thật đẹp
Jonah

@Jonah Số phức FTW :-)
Luis Mendo

5

Châu chấu, 25 nguyên thủy (11 thành phần, 14 dây)

Tôi đã đọc một bài đăng meta về các chương trình trong GH và LabVIEW, và làm theo các hướng dẫn tương tự để đo lường một ngôn ngữ hình ảnh.

chương trình châu chấu

In <null>cho N = 0, 1, 2, vì Polygon Primitivekhông thể tạo đa giác có 2 cạnh trở xuống và bạn sẽ nhận được một danh sách các dòng trống.

Các thành phần từ trái sang phải:

  • Side count thanh trượt: đầu vào
  • Đa giác nguyên thủy: vẽ một đa giác trên vải
  • Explode: Phát nổ một polyline thành các phần và đỉnh
  • Tham chiếu chéo: xây dựng tham chiếu chéo tổng thể giữa tất cả các đỉnh
  • Line: vẽ một đường giữa tất cả các cặp
  • Xóa các dòng trùng lặp
  • Chiều dài của đường cong
  • (trên) Tổng
  • (thấp hơn) Phân chia: vì Polygon Primitivevẽ đa giác dựa trên bán kính, chúng ta cần chia tỷ lệ hình dạng
  • Đa dạng
  • Bảng điều khiển: đầu ra

ảnh chụp màn hình tê giác



2

Haskell , 27 byte

f 1=0
f n=n/2/(1-cos(pi/n))

Hãy thử trực tuyến!

Tôi mới tìm hiểu về Haskell, vì vậy đây hóa ra là một môn đánh gôn công bằng (nghĩa là sao chép công thức từ các câu trả lời khác).

Tôi cũng đã cố gắng hết sức để đặt $ở đâu đó nhưng trình biên dịch cứ mắng tôi, vì vậy đây là thứ tốt nhất tôi có. : P


2

Thạch , 13 12 11 byte

Sử dụng công thức của Jonathan Allan (và cảm ơn anh ấy vì đã tiết kiệm 2 byte)

ØP÷ÆẠCḤɓ’ȧ÷

Hãy thử trực tuyến!

Tôi luôn say mê Jelly, nhưng chưa sử dụng nhiều, vì vậy đây có thể không phải là hình thức đơn giản nhất.


Lưu một byte bằng cách sử dụng "đối số hoán đổi chuỗi phân tách dyadic" ɓ, để nội tuyến liên kết người trợ giúp của bạn như sau:ØP÷ÆẠCḤɓn1×÷
Jonathan Allan

@JonathanAllan oh cảm ơn, tôi vẫn là một người mới bắt đầu và biết có lẽ là một cách tốt hơn so với việc có một chuỗi mới nhưng không biết làm thế nào để làm điều đó
Jeffmagma

Ồ, chúng ta có thể cứu người khác bằng cách sử dụng giảm dần , và logic - và , ȧ: ØP÷ÆẠCḤɓ’ȧ÷:)
Jonathan Allan

oh wow cảm ơn tôi đã không nghĩ về điều đó
Jeffmagma

1

Javascript (ES6), 36 byte

n=>1%n*n/2/(1-Math.cos(Math.PI/n))

Câu trả lời Python 3 của Jonathan Jonathananan

f=n=>1%n*n/2/(1-Math.cos(Math.PI/n))
<input id=i type=number oninput="o.innerText=f(i.value)" /><pre id=o>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.