삼각형 수를 센다


22

양의 정수 목록이 주어지면 측면 길이가 입력 목록의 세 가지 별개의 항목으로 표시되도록 형성 할 수있는 삼각형의 수를 찾으십시오.

(영감은 CR 에서 나옵니다 .)

세부

  • 세 변 길이 a , b , c모든 순열이 엄격한 삼각형 부등식 a + b > c를 만족하면 삼각형이 형성 될 수 있습니다 . (즉 , a + b > c , a + c > b 및 는 모두 보유해야 함을 의미합니다.)a,b,c
    a+b>c.
    a+b>ca+c>bb+c>a
  • 세 변의 길이 는 목록에서 서로 다른 위치에 나타나야하지만 반드시 쌍으로 구별 될 필요는 없습니다.a,b,c
  • 입력 목록에서 세 숫자의 순서는 중요하지 않습니다. 우리가 목록 a과 세 개의 숫자 a[i], a[j], a[k]( i,j,k쌍이 다른 곳) (a[i],a[j],a[k]), (a[i],a[k],a[j]), (a[j], a[i], a[k])를 고려하면 등은 모두 같은 삼각형으로 간주됩니다 .
  • 입력 목록에는 3 개 이상의 항목이 있다고 가정 할 수 있습니다.
  • 입력 목록이 오름차순으로 정렬되어 있다고 가정 할 수 있습니다.

작은 테스트 프로그램은 온라인 에서 사용해보십시오!

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

[1,2,3,...,n-1,n]이것 의 입력 은 A002623 입니다.

[1,1,...,1](길이 n) 입력의 경우 A000292 입니다.

첫 번째 n피보나치 수 ( A000045 ) 의 입력 은 A000004 입니다.


4
나는 별개의 삼각형으로 간주되는 것에 대해 도전이 명확해질 수 있다고 생각합니다. 로부터 A000292의 링크, 나는 그것을 받아 [1,1,1,1]모두 4 "다른"삼각형 수 있습니다 [1,1,1], 어떤 세 (1 개)의의 사용을 선택할 수 있나요? 그러나 3 개의 1이 순서가없는 것으로 선택 되었기 때문에 24가 아닙니다. 즉, 순서가있는 목록이 아닌 3 개의 지수의 하위 집합입니까?
xnor

2
@ xnor이 점을 지적한 것은 모든 것이 정확 해 보입니다. 방금 세부 사항에 요점을 추가했습니다. 그것이 더 명확 해지기를 바랍니다.
flawr

답변:


10

R , 62 52 40 34 바이트

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

온라인으로 사용해보십시오!

Luis Mendo의 Octave 솔루션 포트

이므로 a<=b<=c삼각형 조건은와 같습니다 a+b-c>0. 은 a+b-c간결 행렬 곱으로 캡처되는 [1,1,-1] * X, X입력 배열의 3 조합이다.

의견에 3 명의 다른 사람들이 개선을위한 제안이 많이있었습니다.

R , 40 바이트

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

온라인으로 사용해보십시오!



3
x[3]<x[1]+x[2]동일합니다 2*x[3]<sum(x): 51 바이트
로빈 라이더

4
실제로 45 바이트로 만드십시오 . 여러 의견에 대해 죄송합니다!
로빈 라이더

1
@RobinRyder 그 [별칭은 매끄럽고 접근 방식을 실제로 정리합니다.
CriminallyVulgar


9

Stax , 8 7 바이트

-1 재귀 감사합니다 !

é═rê÷┐↨

staxlang.xyz에서 실행하고 디버그하십시오!

압축 해제 (8 바이트) 및 설명 :

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

깔끔한 트릭입니다. 항상 0 또는 1을 초래하는 명령 시퀀스가 ​​있고 프로그램 끝에서 정확한 결과를 산출하는 배열의 항목을 계산해야하는 F..+경우 바이트보다 짧은 바이트 {..f%입니다.

초기 목록이 오름차순으로 정렬되어 있다고 가정합니다. 이 가정이 없으면 o시작 부분에 8 바이트를 붙이십시오.


1
r3SFE+<+필터 결과를 추가하기 위해 foreach 루프를 사용합니다. 덧셈은 하나의 요소 만 존재할 때 작동하지 않는 작업 중 하나입니다.
재귀

6

하스켈 , 49 바이트

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

온라인으로 사용해보십시오!

l(반전) 의 모든 하위 시퀀스를 재귀 적으로 생성하고 삼각형을 형성하는 길이 3을 확인합니다.

50 바이트

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

온라인으로 사용해보십시오!

mapM각 값 l을 자체 (포함) 또는 0(제외) 에 매핑 하여 하위 시퀀스를 생성하는 동일한 아이디어 입니다.

50 바이트

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

온라인으로 사용해보십시오!

모든 파티션 포인트를 시도하여 중간 요소를 가져옵니다 b.

51 바이트

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

온라인으로 사용해보십시오!

이 함수 q=scanr(:)[]는 접미사 목록을 생성합니다. 동일한 요소를 올바른 횟수로 포함하는 것을 고려해야 할 때 많은 문제가 발생합니다.

52 바이트

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

온라인으로 사용해보십시오!

도우미 기능 q=scanr(:)[] 은 접미사 목록을 생성합니다.

57 바이트

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

온라인으로 사용해보십시오!


4

Brachylog , 11 바이트

{⊇Ṫ.k+>~t}ᶜ

온라인으로 사용해보십시오!

이전 솔루션에서 정렬 된 입력을 사용하는 것을 잊었을 수 있습니다.

Brachylog , 18 17 15 바이트

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

온라인으로 사용해보십시오!

{            }ᶜ    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

펄 6 , 35 바이트

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

온라인으로 사용해보십시오!

설명

그것은 Whatever 코드, 즉 람다 함수에 대한 간결한 표기법입니다 (매우 간단한 경우에만 작동합니다). 각각 *은 하나의 인수에 대한 자리 표시 자입니다. 그래서 우리는 길이 목록 (첫 번째에 나타남)을 가져 *와서 3 개의 요소를 모두 조합합니다 (항상 원래 목록과 동일한 순서로 나오므로 조합도 정렬 됨). 그런 다음 목록을 grep3x3으로 가져가 만족하는 삼중 항만 필터링하십시오 ( *+*>*즉, 첫 두 인수의 합이 세 번째 인수보다 큼). 모든 삼중 항을 제공하고 마침내 숫자 컨텍스트를 a로 강제 계산하여 계산합니다 +.

(물론 우리는 "두 개의 작은 것의 합> 가장 큰 것"의 경우에만 테스트 할 필요가있다. 이것이 유지된다면, 다른 것은 사소하게 잡히고, 그렇지 않으면, 삼중 항은 정확한 삼각형 길이를 나타내지 않으며 우리는 그렇지 않다 더 볼 필요가 있습니다.)


4

망막 , 55 바이트

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

온라인으로 사용해보십시오! Link에는 테스트 사례가 포함되어 있지만 오늘 완료 할 수 있도록 다섯 번째 사례의 값이 줄어 듭니다. 정렬 된 입력을 가정합니다. 설명 : 정규 표현식은 둘 이상의 일치하는 것을 정말로 좋아하지 않습니다. 정규 표현식은 삼각형의 가장 짧은 구간이 될 수있는 모든 값을 찾을 수 있습니다. Retina의 v옵션은 미리보기를 피하는 것을 제외하고는 여기에 도움이되지 않습니다. 그러나 Retina의 w옵션은 가장 짧은 다리와 가장 긴 다리를 동시에 찾을 수 있기 때문에 약간 더 유용합니다. 여러 개의 중간 다리가있을 수 있으므로이 도전에는 충분하지 않습니다.

\d+
*

입력을 단항으로 변환하십시오.

L$`_+

각 입력 번호에 대해 ...

$<'

... 해당 번호에서 시작하도록 잘린 원래 배열 인 행을 만듭니다. $'일반적으로 일치 후 문자열 <을 의미 하지만 2 바이트를 낭비하지 않고 이전 구분 기호 뒤의 문자열을 의미하도록 수정합니다 $&. 따라서 각 줄은 해당 숫자를 가장 짧은 구간으로 사용하는 모든 잠재적 솔루션을 나타냅니다.

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

각 선에 대해 가능한 가장 긴 다리와 가장 긴 다리를 찾으 되 차이는 첫 번째 다리보다 작아야합니다. _일치하는 각 다리 조합에 대해 a 를 출력합니다 .

_

발견 된 총 삼각형 수를 센다.




3

05AB1E , 12 10 9 바이트

05AB1E를 처음 사용했습니다! -1의 [Grimy]에게 감사합니다!

3.Æʒ`α›}g

온라인으로 사용해보십시오! 또는 테스트 스위트

내 Stax 답변의 직접 포트. 세 항목을 모두 조합하여 삼각형을 형성 할 수있는 항목을 세십시오. 정말 나를 데려 간 것은 계산 부분입니다. 나는 거기에 많은 바이트를 소비합니다. 거기에 신인 실수가있을 것입니다.

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
나는 Grimy 가 보통 내 대답을하기 때문에 더 짧은 것을 내놓을 것이라고 확신 합니다. ;) 그러나 당신의 대답은 내가 생각했던 것과 상당히 비슷해 보입니다. 유일한 차이점은 ì필터 Š내부의 (트리플 스왑) 대신 필터 앞에 (각각 역전) 사용했다는 것 입니다. 또는 ε...}O대신 대신 사용할 수도 ʒ...}g있지만 바이트 수는 동일하게 유지됩니다. 추신 : 바이트 수 10과 TIO는 정확하지만 실제 답변에는 여전히 불필요한 명시 적이 y있으며 제거 할 수 있습니다. :) 좋은 첫 번째 대답, 그래서 +1.
Kevin Cruijssen

@KevinCruijssen을 실망시켜 죄송합니다. 내가 가진 모든 3.ÆʒRÆd_}g것은 동일한 바이트 수입니다.
그리미

2
@KevinCruijssen 아 실제로 3.Æʒ`α›}g는 9 라고 생각합니다.
Grimmy

@Grimy Haha는 알고있었습니다. xD 이제는 아주 간단한 골프를 봅니다.하지만 제가 첫 번째 언급에서 언급했듯이 일반적으로 이런 종류의 골프 (또는 일반적으로 골프 ..)를 만드는 것이 더 좋습니다. ; p
Kevin Cruijssen



2

Zsh , 66 바이트

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

온라인으로 사용해보십시오!

정렬 된 입력을 활용하고 for헤더 에서 증분을 사용하는 비교적 간단 합니다 (증분은 상위 루프 당 한 번 발생 함 ).

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, 171 (164) 152 바이트

TaylorScott 덕분에 -26 바이트

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

입력이 범위 내에 있습니다 A:A 활성 시트 에 있습니다. 출력은 즉시 창에 나타납니다.

이것은 키가 2 20 셀 (거의 2 60 조합) 인 열의 모든 셀의 모든 조합을 보이 므로이 코드는 빠르지 않습니다. 바이트를 희생시키면서 훨씬 더 빠르게 만들 수 있습니다 .


당신은 삭제할 수 있습니다 ()에서 서브 문에서 공간을 Debug.? r드롭 할 수 있습니다 Next:Next:NextNext k,j,i. 그것과는 별도로-여전히 2 ** 60 조합을하고 있지만 작동합니다
Taylor Scott

아, 이봐, if 줄을r=r-(a+b>c)*(b+c>a)*(c+a>b)
Taylor Scott

1

, 17 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 정렬 된 입력을 가정합니다. 설명:

   θ                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

Pyth , 14 바이트

*1sm>sPded.cQ3

온라인으로 사용해보십시오!

          .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

대안 (14 바이트) :

lfTm>sPded.cQ3

1

펄 5 ( -p), 55 52 바이트

정규식 역 추적을 사용하면 @Cows quack 덕분에 -3 바이트 가 실패하고 역 추적 하는 ^대신 사용 됩니다 (?!).

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

또는

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

TIO


(?!)^있습니까?
Kritixi Lithos

고마워요 / 실패 추적
Nahuel Fouilleul

1

젤리 , 9 바이트

œc3+>ƭ/€S

온라인으로 사용해보십시오!

정렬 된 정수 목록을 인수로 사용하고 삼각형 수를 리턴하는 모나드 링크.

설명

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

대안 9s :

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



0

SNOBOL4 (CSNOBOL4) , 181 바이트

	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

온라인으로 사용해보십시오!

무차별 대입 영형()연산. 입력을 개행으로 분리 된 목록으로 가져 와서 삼각형 수 또는에 대한 빈 줄을 출력합니다 0. SNOBOL은 0숫자 계산 과 같이 빈 문자열을 처리하므로 가능합니다 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.