このシーケンスはグラフィックですか?


17

グラフィック・シーケンスはそれぞれのノードに対してエッジの数を表す正の整数のシーケンスである単純なグラフ。たとえば、シーケンス2 1 1は、2つのエッジと1つの接続を持つ2つの3つのノードを持つグラフを示します。

すべてのシーケンスがグラフィックシーケンスであるとは限りません。たとえば、2 12つのノードを接続してその一方に2つのエッジを持たせる方法がないため、グラフィックシーケンスではありません。


仕事

合理的な方法で整数のシーケンスを取得します。これには、整数の配列とそのサイズ、符号なし整数のリンクリスト、および倍精度ベクトルが含まれますが、これらに限定されません。入力にゼロがないと仮定できます。また、入力が最小から最大または最大から最小にソートされていると想定することもできます。

シーケンスがグラフィックシーケンスであるかどうかを出力する必要があります。それ以外の場合、偽の値である場合は、真の値。


ゴール

これは。目標はプログラムのバイト数を最小限にすることです

テストケース

大きい順に並べ替え

                  -> True
3 3 3 2 2 2 1 1 1 -> True
3 3 2 2 1 1       -> True
3 3 2             -> False
8 1 1 1 1 1 1 1 1 -> True
1 1 1 1           -> True
1 1 1             -> False
9 5 4             -> False

入力リストが空でないと仮定できますか?
ピーターテイラー

@PeterTaylor必要に応じ0て、空のシーケンスのsの文字列を取ることができます
ポストロックガーフハンター

回答:


7

Mathematica、25バイト

<<Combinatorica`
GraphicQ

うん、別のビルトイン。(入力を正の整数のリストとして取得します。)Combinatoricaパッケージをロードする必要があります。


7

Python 2(終了コード)、53バイト

l=input()
while any(l):l.sort();l[~l[-1]]-=1;l[-1]-=1

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

終了コードを介した出力。

Havel-Hakimiアルゴリズムのバージョンを使用します。最大要素kkk自分自身を数えない」番目の最大要素の両方を繰り返し減少させます。これは、2つの頂点間のエッジをそれらの角度で割り当てることに対応します。リストがすべてゼロになると、正常に終了します。それ以外の場合、範囲外のインデックスがあると、エラーで失敗します。作成された負の値も、最終的に範囲外エラーにつながります。


5

CJam(20バイト)

{{W%(Wa*.+$_0a<!}g!}

オンラインテストスイートいくつかの試みでバグをキャッチするために追加したいくつかの追加テストを含む。

これは、スタック上の整数の配列を取り、0またはを残す匿名ブロック(関数)です。1上です。入力が昇順でソートされることを前提としています。

入力配列は空ではないかもしれませんが、空の入力の件名に関する私のクエリに対するOPの回答に従って、ゼロを含むことができます。

解剖

これは、Havel-Hakimiアルゴリズムを実装する際のOPの回答に従います

{          e# Define a block
  {        e#   Do-while loop (which is the reason the array must be non-empty)
           e#     NB At this point the array is assumed to be non-empty and sorted
    W%     e#     Reverse
    (Wa*.+ e#     Pop the first element and subtract 1 from that many subsequent
           e#     elements. If there aren't enough, it adds -1s to the end. That's
           e#     the reason for using W (i.e. -1) and .+ instead of 1 and .-
    $      e#     Sort, restoring that part of the invariant
    _0a<!  e#     Continue looping if array >= [0]
           e#     Equivalently, break out of the loop if it starts with a negative
           e#     number or is empty
  }g
  !        e#   Logical not, so that an empty array becomes truthy and an array
           e#   with a negative number becomes falsy
}

2

Python 2、108バイト

Pythonでの私の実装です。私はそれがより経験豊富なゴルファーや数学者によって打たれると確信しています。Havel-Hakimiアルゴリズムを実装しています。

def f(x):p=x[0]+1;x=sorted(x+[0]*p)[::-1];return~x[-1]and(p<2or f(sorted([a-1for a in x[1:p]]+x[p:])[::-1]))

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


[2,1,1]戻りますTrueが、[1,1,2]戻ります0-編集:仕様がソートされていると仮定できると言っていることを見ました(テストケースを見ました9 4 5)。
ジョナサンアラン

2

Haskell102 98 95 94バイト

import Data.List
f(x:r)=length r>=x&&x>=0&&(f.reverse.sort$take x(pred<$>r)++drop x r)
f x=1<3

オンラインでお試しください! 使用法:f [3,3,2,2,1,1]Trueまたはを返しますFalse。入力にゼロが含まれておらず、チャレンジで許可されているように降順でソートされている想定します。

説明:

import Data.List          -- import needed for sort
f (x:r) =                 -- x is the first list element, r the rest list
  length r >= x           -- the rest list r must be longer or equal x
  && x >= 0               -- and x must not be negative
  && (f .                 -- and the recursive call of f
      reverse . sort $    --    with the descendingly sorted list
      take x(pred<$>r)    --    of the first x elements of r subtracted by 1
      ++ drop x r         --    and the rest of r
     )                    -- must be true
f [] = True               -- if the list is empty, return True

編集:これは他の回答で言及されたHaver-Hakimiに従っているようですが、回答を書くときにこのアルゴリズムを知りませんでした。


length r < x[1,0]trueを返すため、まったく正しくありませんが、1つのエッジとゼロのエッジを持つ2つのノードを持つ単純なグラフはありません。
ジョナサンアラン

@JonathanAllanそのとおりですが、チャレンジには「入力にゼロがないと仮定することができます」と記載されています。
ライコニ

ああ、それは定義に合わないので奇妙な決定のように思えます。
ジョナサンアラン

@JonathanAllanこれらのケースも処理するように変更し、そうすることで4バイトも節約しました。
ライコニ

それは良い!:D
ジョナサンアラン

2

ゼリー、12 バイト

ṢṚḢ-€+ƊƊƬ>-Ȧ

1そうでなければ、答えが一貫している場合に 生じるリストを受け入れる単項リンク0

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

ṢṚḢ-€+ƊƊƬ>-Ȧ - Link: list of integers
        Ƭ    - collect up while results change:
       Ɗ     -   last three links as a monad i.e. f(L):
Ṣ            -     sort                      [min(L),...,max(L)]
 Ṛ           -     reverse                   [max(L),...,min(L)]
      Ɗ      -     last three links as a monad i.e. f([a,b,c,...,x]):
  Ḣ          -       pop head                          a
   -€        -       -1 for each                       [-1,-1,...,-1] (length a)
     +       -       add to head result (vectorises)   [b-1,c-1,...,x-1,-1,-1,...]
         >-  - greater than -1? (vectorises)
           Ȧ - Any and all? (0 if empty or contains a 0 when flattened, else 1)

1

05AB1E26 25バイト

D0*«¹v{R¬U¦X¹gn‚£`s<ì}0QP

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

説明

D0*«                       # extend the input list with as many zeroes as it has elements
    ¹v                     # len(input) times do:
      {R                   # sort in descending order
        ¬U¦X               # extract the first element of the list
            ¹gn‚           # pair it with len(input)^2
                £          # partition the list in 2 parts, the first the size of the 
                           # extracted element, the second containing the rest of the list
                 `         # split these list to stack (the second on top)
                  s<       # decrement the elements of the first list by 1
                    ì      # prepend it to the rest of the list
                     }     # end loop
                      0Q   # compare each element in the resulting list with 0
                        P  # reduce list by multiplication

1

JavaScript(ES6)、82 80 76バイト

f=([$,..._])=>1/$?_.length>=$&$>=0&f(_.map(a=>a-($-->0)).sort((a,b)=>b-a)):1

多くのバイトを節約してくれたETHproductionsに感謝します!

使用法

f=([$,..._])=>1/$?_.length>=$&$>=0&f(_.map(a=>a-($-->0)).sort((a,b)=>b-a)):1
f([3,3,3,2,2,2,1,1,1])

出力

1

で置き換えmap((a,b)=>b<$?a-1:a)map(a=>a-($-->0))4バイト節約できます。
アーナウド

1

R、20バイト

igraph::is_graphical

組み込みの言語はMathematicaだけではありません!;-)

igraphパッケージをインストールする必要があります。入力を整数のベクトルとして受け取ります。



0

05AB1E、19 バイト

[D{RćD1‹#Å0<0ζO})dW

ポートオブジョナサンアランのジェリーの返事ですので、必ず投票してください!!

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

[            # Start an infinite loop:
 D           #  Duplicate the current list
             #  (which is the implicit input-list in the first iteration)
  {R         #  Sort it from highest to lowest
    ć        #  Extract the head; pop and push the remainder and head
     D1     #  If the head is 0 or negative:
        #    #   Stop the infinite loop
     Å0<     #  Create a list of the head amount of -1
        0ζ   #  Zip/transpose it with the remainder list, with 0 as filler
          O  #  Sum each pair
})           # After the loop: wrap everything on the stack into a list
  d          # Check for each value if it's non-negative (>= 0)
             # (resulting in 1/0 for truthy/falsey respectively)
   W         # Get the flattened minimum (so basically check if none are falsey)
             # (which is output implicitly as result)

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