Đếm số lượng hình tam giác


22

Đưa ra một danh sách các số nguyên dương, tìm số tam giác mà chúng ta có thể tạo thành sao cho độ dài cạnh của chúng được biểu thị bằng ba mục khác nhau của danh sách đầu vào.

(Cảm hứng đến từ CR .)

Chi tiết

  • Một tam giác có thể được hình thành nếu tất cả các hoán vị của ba cạnh dài một,b,c thỏa mãn bất đẳng thức tam giác nghiêm ngặt
    một+b>c.
    (Điều này có nghĩa là một+b>c , một+c>b và phải giữ tất cả.)b+c>một
  • Ba chiều dài một,b,c phải xuất hiện ở các vị trí riêng biệt trong danh sách, nhưng không nhất thiết phải khác biệt theo cặp.
  • Thứ tự của ba số trong danh sách đầu vào không quan trọng. Nếu chúng ta xem xét một danh sách avà ba số a[i], a[j], a[k](trong đó i,j,kkhác nhau theo cặp), thì (a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])tất cả đều được coi là cùng một tam giác.
  • Danh sách đầu vào có thể được giả định chứa ít nhất 3 mục.
  • Bạn có thể giả sử rằng danh sách đầu vào được sắp xếp theo thứ tự tăng dần.

Ví dụ

Một chương trình thử nghiệm nhỏ có thể được tìm thấy ở đây trên Dùng thử trực tuyến!

Input, Output:
[1,2,3]  0
[1,1,1]  1
[1,1,1,1] 4
[1,2,3,4] 1
[3,4,5,7] 3
[1,42,69,666,1000000] 0
[12,23,34,45,56,67,78,89] 34
[1,2,3,4,5,6,7,8,9,10] 50

Đối với đầu vào của [1,2,3,...,n-1,n]điều này là A002623 .

Đối với đầu vào của [1,1,...,1](độ dài n), đây là A000292 .

Đối với đầu vào của các nsố Fibonacci đầu tiên ( A000045 ), đây là A000004 .


4
Tôi nghĩ rằng thách thức có thể rõ ràng hơn về những gì được coi là một tam giác khác biệt. Từ liên kết A000292 , tôi [1,1,1,1]cho rằng nó cho phép 4 hình tam giác "khác nhau", tất cả [1,1,1], được chọn bằng cách sử dụng bất kỳ ba trong số 1? Nhưng, đó không phải là 24 vì ba số 1 được chọn không có thứ tự, tức là nó là một tập hợp con của ba chỉ số chứ không phải là một danh sách theo thứ tự?
xnor

2
@xnor Điều đó đã chỉ ra điều này, tất cả có vẻ đúng - Tôi chỉ cần thêm một điểm trong chi tiết. Tôi hy vọng điều đó làm cho nó rõ ràng hơn bây giờ.
flawr

Câu trả lời:


10

R , 62 52 40 34 byte

sum(c(1,1,-1)%*%combn(scan(),3)>0)

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

Giải pháp Octave của cảng Luis Mendo

a<=b<=c, điều kiện tam giác tương đương với a+b-c>0. Các a+b-cđược cô đọng bắt bởi các sản phẩm ma trận [1,1,-1] * X, nơi Xlà 3 sự kết hợp của các mảng đầu vào.

Có rất nhiều đề xuất cải tiến được thực hiện bởi 3 người khác nhau trong các bình luận:

R , 40 byte

y=combn(scan(),3);sum(y[3,]<y[1,]+y[2,])

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



3
x[3]<x[1]+x[2]tương đương với 2*x[3]<sum(x): 51 byte
Robin Ryder

4
Trên thực tế, tạo 45 byte đó . Xin lỗi vì nhiều ý kiến!
Robin Ryder

1
@RobinRyder [Bí danh đó là lắt léo, thực sự làm sạch cách tiếp cận.
CriminallyVulgar


9

Stax , 8 7 byte

Cảm ơn đệ quy cho -1!

é═rê÷┐↨

Chạy và gỡ lỗi nó tại staxlang.xyz!

Giải nén (8 byte) và giải thích:

r3SFE+<+
r           Reverse
 3S         All length-3 combinations
   F        For each combination:
    E         Explode: [5,4,3] -> 3 4 5, with 3 atop the stack
     +        Add the two shorter sides
      <       Long side is shorter? 0 or 1
       +      Add result to total

Đó là một mánh khóe gọn gàng. Nếu bạn có một chuỗi các hướng dẫn sẽ luôn dẫn đến 0 hoặc 1 và bạn cần đếm các mục từ một mảng mang lại kết quả trung thực ở cuối chương trình của bạn, F..+thì ngắn hơn một byte {..f%.

Giả sử danh sách ban đầu được sắp xếp tăng dần. Nếu không có giả định này, hãy gắn ovào đầu 8 byte.


1
r3SFE+<+gói đến 7. Nó sử dụng một vòng lặp foreach để thêm kết quả lọc. Bổ sung là một trong những hoạt động không có tác dụng khi chỉ có một yếu tố duy nhất hiện diện.
đệ quy

6

Haskell , 49 byte

([]%)
[c,b,a]%l|a+b>c=1
p%(h:l)=(h:p)%l+p%l
_%_=0

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

Đệ quy tạo ra tất cả các phần sau của l(đảo ngược) và kiểm tra xem phần nào dài 3 hình thành các hình tam giác.

50 byte

f l=sum[1|[a,b,c]<-filter(>0)<$>mapM(:[0])l,a+b>c]

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

Ý tưởng tương tự, tạo ra các chuỗi con với mapM, bằng cách ánh xạ từng giá trị vào lchính nó (bao gồm) hoặc 0(loại trừ).

50 byte

([]%)
p%(b:t)=sum[1|c<-t,a<-p,a+b>c]+(b:p)%t
_%_=0

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

Thử mọi điểm phân vùng để lấy phần tử ở giữa b.

51 byte

f(a:t)=f t+sum[1|b:r<-scanr(:)[]t,c<-r,a+b>c]
f _=0

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

Hàm q=scanr(:)[]tạo danh sách các hậu tố. Rất nhiều rắc rối xuất phát từ việc cần phải xem xét bao gồm các yếu tố bằng nhau đúng số lần.

52 byte

q=scanr(:)[]
f l=sum[1|a:r<-q l,b:s<-q r,c<-s,a+b>c]

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

Hàm trợ giúp q=scanr(:)[]tạo danh sách các hậu tố.

57 byte

import Data.List
f l=sum[1|[a,b,c]<-subsequences l,a+b>c]

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


4

Brachylog , 11 byte

{⊇Ṫ.k+>~t}ᶜ

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

Tôi có thể đã quên tận dụng lợi thế của đầu vào được sắp xếp trong giải pháp cũ của mình:

Brachylog , 18 17 15 byte

{⊇Ṫ¬{p.k+≤~t}}ᶜ

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

{            }ᶜ    The output is the number of ways in which
 ⊇                 a sublist of the input can be selected
  Ṫ                with three elements
   ¬{       }      such that it is not possible to show that
     p             for some permutation of the sublist
       k+          the sum of the first two elements
         ≤         is less than or equal to
      .   ~t}      the third element.

4

Perl 6 , 35 byte

+*.combinations(3).flat.grep(*+*>*)

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

Giải trình

Đó là mã Dù là gì, tức là ký hiệu ngắn gọn cho các hàm lambda (chỉ hoạt động trong các trường hợp rất đơn giản). Mỗi người *là một giữ chỗ cho một đối số. Vì vậy, chúng tôi lấy danh sách độ dài (xuất hiện ở đầu tiên *), thực hiện tất cả các kết hợp của 3 phần tử (chúng luôn xuất hiện theo thứ tự như trong danh sách ban đầu, do đó có nghĩa là các kết hợp cũng được sắp xếp), làm phẳng danh sách, và sau đó lấy danh sách 3 nhân 3 và chỉ lọc ( grep) những bộ ba thỏa mãn *+*>*, tức là tổng của hai đối số đầu tiên lớn hơn đối số thứ ba. Điều đó mang lại cho tất cả các bộ ba và cuối cùng chúng tôi đã tính chúng bằng cách buộc bối cảnh số với a +.

(Tất nhiên chúng ta chỉ cần kiểm tra nó cho trường hợp "tổng của hai nhỏ hơn> lớn nhất". Nếu cái này giữ, cái kia giữ một cách tầm thường, nếu cái này không, bộ ba không biểu thị độ dài tam giác chính xác và chúng ta không cần nhìn xa hơn.)


4

Võng mạc , 55 byte

\d+
*
L$`_+
$<'
%L$w`(,_+)\b.*\1(_*)\b(?<=^_+\2,.*)
_
_

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm, nhưng với các giá trị trong trường hợp thứ 5 giảm để cho phép nó kết thúc ngày hôm nay. Giả sử đầu vào được sắp xếp. Giải thích: Regexes không thực sự thích kết hợp nhiều thứ. Một regex bình thường sẽ có thể tìm thấy tất cả các giá trị có thể là một chân ngắn nhất của một tam giác. vTùy chọn của Retina không giúp đỡ ở đây, ngoại trừ để tránh một cái nhìn. Tuy nhiên, wtùy chọn của Retina hữu ích hơn một chút, vì nó có thể tìm thấy cả chân ngắn nhất và chân dài nhất cùng một lúc. Điều đó là không đủ cho thử thách này, vì có thể có nhiều chân giữa.

\d+
*

Chuyển đổi đầu vào thành unary.

L$`_+

Đối với mỗi số đầu vào ...

$<'

... Tạo một dòng mà mảng ban đầu bị cắt bớt để bắt đầu ở số đó. $'thông thường có nghĩa là chuỗi sau khớp, nhưng <sửa đổi nó có nghĩa là chuỗi sau dấu phân cách trước đó, tránh lãng phí 2 byte trên $&. Do đó, mỗi dòng đại diện cho tất cả các giải pháp tiềm năng sử dụng số đó là chân ngắn nhất.

%L$w`(,_+)\b.*\1(_*)\b(?<=^_+\2,.*)
_

Đối với mỗi dòng đó, hãy tìm tất cả các chân giữa và dài nhất có thể, nhưng đảm bảo rằng sự khác biệt nhỏ hơn chân đầu tiên. Đầu ra a _cho mỗi kết hợp khớp chân.

_

Đếm tổng số hình tam giác được tìm thấy.




3

05AB1E , 12 10 9 byte

Lần đầu tiên tôi sử dụng 05AB1E! Cảm ơn [Grimy] cho -1!

3.Æʒ`α›}g

Hãy thử trực tuyến! hoặc bộ kiểm tra

Một cổng trực tiếp của câu trả lời Stax của tôi. Nhận tất cả các kết hợp của ba mục và đếm những mục có thể tạo thành hình tam giác. Đó là phần đếm thực sự có tôi. Tôi dành một tải byte ở đó. Bị ràng buộc là một số sai lầm tân binh ở đó.

3.Æʒ`α›}g
3.Æ          List of length-3 combinations
   ʒ   }g    Count truthy results under operation:
    `          Push the two shorter sides, then the long one
     α         Absolute difference (negated subtraction in this case)
      ›        Remaining short side is longer?

2
Tôi chắc chắn Grimy sẽ đưa ra một cái gì đó ngắn hơn, vì anh ấy thường làm theo câu trả lời của tôi. ;) Nhưng câu trả lời của bạn trông khá giống với những gì tôi nghĩ. Khác biệt duy nhất là tôi đã sử dụng ì(đảo ngược từng bộ lọc) trước bộ lọc thay vì Š(bộ ba trao đổi) bên trong bộ lọc. Ngoài ra, bạn cũng có thể sử dụng ε...}Othay vì ʒ...}g, nhưng số byte vẫn giữ nguyên. PS: Số byte của bạn là 10 và TIO là chính xác, nhưng câu trả lời thực tế của bạn vẫn có một nội dung rõ ràng không cần thiết ycó thể bị xóa. :) Mặc dù vậy, câu trả lời đầu tiên rất hay, vì vậy +1 từ tôi.
Kevin Cruijssen

Xin lỗi đã làm thất vọng @KevinCruijssen, tất cả những gì tôi có là 3.ÆʒRÆd_}g, đó là cùng một bytecount.
Grimmy

2
@KevinCruijssen Ồ thực sự tôi đoán 3.Æʒ`α›}glà 9.
Grimmy

@Grimy Haha, biết rồi. xD Golf khá đơn giản bây giờ tôi thấy nó .. Nhưng bạn thường tốt hơn khi đến với những loại golf đó (hoặc golf nói chung ..), như tôi đã đề cập trong bình luận đầu tiên của tôi. ; p
Kevin Cruijssen



2

Zsh , 66 byte

for a;z=$y&&for b (${@:2+y++})for c (${@:3+z++})((t+=c<a+b))
<<<$t

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

Tương đối đơn giản, tận dụng lợi thế của đầu vào được sắp xếp và tăng dần trong fortiêu đề (gia tăng xảy ra một lần trên mỗi vòng lặp cha ).

for a;{
  z=$y
  for b (${@:2+y++});{   # subarray starting at element after $a
    for c (${@:3+z++})   # subarray starting at element after $b
      ((t+=c<a+b))
  }
}

2

VBA Excel, 171 164 152 byte

-26 byte nhờ TaylorScott

Sub z
t=[A:A]
u=UBound(t)
For i=1To u-2
For j=i+1To u-1
For k=j+1To u
a=t(i,1):b=t(j,1):c=t(k,1)
r=r-(a+b>c)*(b+c>a)*(c+a>b)
Next k,j,i
Debug.?r
End Sub

Đầu vào là trong phạm vi A:Acủa bảng hoạt động. Đầu ra là cửa sổ ngay lập tức.

Vì điều này xem xét mọi kết hợp của mọi ô trong một cột có chiều cao 2 20 ô (gần 2 60 kết hợp), mã này ... không nhanh. Bạn có thể làm cho nó nhanh hơn nhiều nhưng với chi phí byte.


Bạn có thể thả ()vào báo cáo kết phụ, không gian trong Debug.? rvà có thể thả Next:Next:Nextđể Next k,j,i. ngoài ra - nó vẫn thực hiện 2 ** 60 kết hợp nhưng nó hoạt động
Taylor Scott

Ồ và này, bạn có thể bỏ qua một số chi tiết bằng cách thay thế dòng if bằng r=r-(a+b>c)*(b+c>a)*(c+a>b)
Taylor Scott

1

Than , 17 byte

IΣ⭆θ⭆…θκ⭆…θμ›⁺νλι

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giả sử đầu vào được sắp xếp. Giải trình:

   θ                Input array
  ⭆                 Map over elements and join
      θ             Input array
     …              Truncated to length
       κ            Outer index
    ⭆               Map over elements and join
          θ         Input array
         …          Truncated to length
           μ        Inner index
        ⭆           Map over elements and join
              ν     Innermost value
             ⁺      Plus
               λ    Inner value
            ›       Is greater than
                ι   Outer value
 Σ                  Take the digital sum
I                   Cast to string for implicit print




1

Bình thường , 14 byte

*1sm>sPded.cQ3

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

          .cQ3  # All combinations of length 3 from Q (input), sorted in ascending order
   m            # map over that lambda d:
     sPd        #   sum(d[:-1])
    >   ed      #     > d[-1]
  s             # sum all of those (uses the fact that True = 1)
*1              # multiply by 1 so it doesn't output True if there's only one triangle

Thay thế (cũng 14 byte):

lfTm>sPded.cQ3

1

Perl 5 ( -p), 55 52 byte

sử dụng quay lui regex, -3 byte nhờ vào quẻ @Cows sử dụng ^thay vì (?!)thất bại và quay lui.

$d='(\d++)';$_=/$d.* $d.* $d(?{$n++if$1+$2>$3})^/+$n

hoặc là

$_=/(\d++).* (\d++).* (\d++)(?{$n++if$1+$2>$3})^/+$n

TIO


Có thể (?!)được ^không?
Kritixi Lithos

cảm ơn vì nó thất bại / quay lui tốt
Nahuel Fouilleul

1

Thạch , 9 byte

œc3+>ƭ/€S

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

Một liên kết đơn âm lấy một danh sách các số nguyên được sắp xếp làm đối số của nó và trả về số lượng tam giác.

Giải trình

œc3       | Combinations of length 3
     ƭ/€  | Reduce each using each of the following in turn:
   +      | - Add
    >     | - Greater than
        S | Sum (counts the 1s)

9 thay thế:

œc3Ṫ€<§ƊS
œc3Ṫ<SƊ€S



0

SNOBOL4 (CSNOBOL4) , 181 byte

	S =TABLE()
R	X =X + 1
	S<X> =INPUT	:S(R)
I	I =J =K =I + 1	LT(I,X)	:F(O)
J	J =K =J + 1	LT(J,X)	:F(I)
K	K =K + 1	LT(K,X - 1)	:F(J)
	T =T + 1 GT(S<I> + S<J>,S<K>)	:(K)
O	OUTPUT =T
END

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

Lực lượng vũ phu Ôi(n3)thuật toán. Đưa đầu vào dưới dạng danh sách phân tách dòng mới và xuất số lượng hình tam giác hoặc một dòng trống cho 0. Điều này có thể được cho phép vì SNOBOL xử lý chuỗi trống như 0đối với các phép tính số.


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.