三角形の数を数える


22

正の整数のリストが与えられたら、それらの辺の長さが入力リストの3つの異なるエントリによって表されるように形成できる三角形の数を見つけます。

(インスピレーションはCR。)

詳細

  • 3つの辺の長さa b cのすべての順列が厳密な三角形の不等式a + b > cを満たす場合、三角形を形成できます(これは、a + b > ca + c > bおよびb + c > aがすべて成立なければならないことを意味します。)a,b,c
    a+b>c.
    a+b>ca+c>bb+c>a
  • 3辺の長さa,b,cは、リスト内の異なる位置に表示される必要がありますが、必ずしもペアごとに異なる必要はありません。
  • 入力リスト内の3つの数字の順序は重要ではありません。リストaと3つの数値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つを使用して選択することができます。しかし、3つの1は順不同で選択されているため、24ではありません。つまり、順序付きリストではなく、3つのインデックスのサブセットですか。
xnor

2
これを指摘してくれた@xnor Thatnks、それはすべて正しいようです-詳細にポイントを追加しました。それが今より明確になることを願っています。
flawr

回答:


10

R62 52 40 34バイト

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

オンラインでお試しください!

ポートオブルイスメンドーのオクターブソリューション

以来a<=b<=c、三角形の条件はと同等a+b-c>0です。a+b-c簡潔行列積によって捕捉され[1,1,-1] * XX入力配列の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

スタックス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..+は1バイトより短くなり{..f%ます。

初期リストが昇順でソートされていると仮定します。この仮定がなければo、先頭に8バイトを固定します。


1
r3SFE+<+これは、foreachループを使用してフィルター結果を追加します。加算は、1つの要素のみが存在する場合は何もしない操作の1つです。
再帰的

6

Haskell、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}ᶜ

オンラインでお試しください!

私の古いソリューションでソートされた入力を利用するのを忘れていたかもしれません:

Brachylog18 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

Perl 6、35バイト

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

オンラインでお試しください!

説明

これは、どんなコードでも、つまりラムダ関数の簡潔な表記法です(非常に単純な場合にのみ機能します)。それぞれ*が1つの引数のプレースホルダーです。したがって、長さのリスト(最初に表示されます*)を取得し、3つの要素のすべての組み合わせを作成し(常に元のリストと同じ順序で出力されるため、組み合わせもソートされます)、リストをフラット化します。次に、3行3列のリストを取得し、grepを満たす3組のみをフィルタ()します*+*>*。つまり、最初の2つの引数の合計が3番目の引数よりも大きくなります。これですべてのトリプレットが得られ、最後に数値コンテキストをaで強制的にカウントします+

(もちろん、「2つの小さな和>最大」の場合にのみテストする必要があります。これが成り立つ場合、もう一方はささいに成り立ち、そうでない場合、トリプレットは正しい三角形の長さを示しません。さらに調べる必要があります。)


4

網膜、55バイト

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

オンラインでお試しください!リンクにはテストケースが含まれていますが、5番目のケースの値を減らして、今日終了できるようにします。ソートされた入力を想定しています。説明:正規表現は、複数のものに一致することを本当に嫌います。通常の正規表現では、三角形の最短区間になる可能性のあるすべての値を見つけることができます。Retinaのvオプションは、先読みを避ける場合を除き、ここでは役に立ちません。ただし、Retinaのwオプションは、最短脚と最長脚の両方を同時に見つけることができるため、わずかに役立ちます。ただし、複数のミドルレッグが存在する可能性があるため、この課題には十分ではありません。

\d+
*

入力を単項に変換します。

L$`_+

入力番号ごとに...

$<'

...元の配列がその番号で始まるように切り捨てられた行を作成します。$'は通常、一致後の文字列<を意味しますが、前の区切り文字の後の文字列を意味するように変更し、で2バイトを無駄にしないようにします$&。したがって、各行は、その番号を最短区間として使用するすべての潜在的なソリューションを表します。

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

これらの線のそれぞれについて、考えられるすべての中間および最長の脚を見つけますが、その差が最初の脚よりも小さくなるようにします。_脚の一致する組み合わせごとにa を出力します。

_

見つかった三角形の総数を数えます。




3

05AB1E12 10 9バイト

05AB1Eを初めて使用しました![Grimy]の-1に感謝します!

3.Æʒ`α›}g

オンラインでお試しください!またはテストスイート

私のStax回答の直接ポート。3つのエントリのすべての組み合わせを取得し、三角形を形成する可能性があるものをカウントします。本当に私を獲得したのは、その数え上げの部分です。そこに大量のバイトを費やしています。そこにルーキーの間違いがあるはずです。

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が、バイトカウントは変わりません。PS:バイトカウント10とTIOは正しいですが、実際の回答には不要な明示的なyものが残っているため、削除できます。:)最初の答えはいいので、私から+1。
ケビンクルーッセン

@KevinCruijssenを失望させてすみません、私が持っているのは3.ÆʒRÆd_}g、同じバイト数です。
グリムミー

2
@KevinCruijssenああ、実際には私の推測では、3.Æʒ`α›}g9です
Grimmy

@Grimy Haha、それを知っていた。xD私が見た今、かなり簡単なゴルフ..しかし、最初のコメントで述べたように、あなたは通常、そのような種類のゴルフ(または一般的なゴルフ..)を思いつく方が良いでしょう。; p
ケビンクルーッセン



2

Zsh、66バイト

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

オンラインでお試しください!

比較的簡単で、ソートされた入力を利用し、forヘッダーをインクリメントします(インクリメントはループごとに1回発生します)。

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:Nextすることができ、スペースをにドロップすることができますNext k,j,i。それとは別に-まだ2 ** 60の組み合わせを行っていますが、うまくいきます
テイラースコット

ああ、ちょっと、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

Perl 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

おかげで失敗/バックトラックがうまくいく
ナウエル・フイユル




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

オンラインでお試しください!

強引な On3アルゴリズム。入力を改行で区切られたリストとして受け取り、三角形の数またはの空の行を出力し0ます。SNOBOLは0数値計算と同様に空の文字列を処理するため、これはおそらく許容されます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.