このセットは自然数を表しますか?


26

集合論では、自然数は通常、純集合としてエンコードされます。これは、空集合または他の純集合のみを含む集合です。 。ただし、すべての純粋なセットが自然数を表すわけではありません。この課題は、特定の純粋なセットが自然数のエンコードを表すかどうかを決定することです。N={0123}

自然数のエンコードは、次のように機能します1

  • ゼロは空のセットです:Set0={}
  • 数値:n>0Setn=Setn1{Setn1}

したがって、最初のいくつかの自然数のエンコーディングは

  • 0{}
  • 1{0}{{}}
  • 2{01}{{}{{}}}
  • 3{012}{{}{{}}{{}{{}}}}
  • 4{0123}{{}{{}}{{}{{}}}{{}{{}}{{}{{}}}}}

タスク

  • 純粋なセットを表す文字列を指定して、このセットが上記の構成に従って自然数をエンコードするかどうかを決定します。
  • ただし、セットの要素は順序付けられていないため、{{}{{}}{{}{{}}}}3{{{}}{}{{{}}{}}}が同じセットを表すため、唯一の有効な表現ではありません。
  • あなたは使用することができ[]()または<>代わりに{}
  • セットが,asセパレータなしで指定されていると仮定できます。
  • 入力に重複する要素が存在しない、たとえば{{},{}}有効な入力ではない、入力が整形されていない{{},、たとえばno 、{,{}}または同様のものであると想定できます。

テストケース

正しい:

{}
{{}}
{{},{{}}}
{{{}},{}}
{{},{{}},{{},{{}}}}
{{{},{{}}},{},{{}}}
{{{{}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}
{{{{{}},{}},{{}},{}},{{}},{},{{},{{}}}}
{{},{{}},{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}},{{{}},{}},{{},{{}},{{},{{}}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}

偽:

{{{}}}
{{{{}}}}
{{{{}},{}}}
{{},{{}},{{{}}}}
{{{},{{}}},{{}}}
{{{{{}}},{}},{{}},{}}
{{},{{}},{{},{{}}},{{},{{}},{{{}}}}}
{{{{{}},{}},{{{}}},{}},{{}},{},{{},{{}}}}
{{{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}},{{{{{}},{}},{{}},{}},{{{}},{}},{{}}},{{{{}},{}},{{}},{}},{{{}},{}},{{}},{}}

関連:Natural Construction(指定された自然数のセットエンコーディングを出力します。)
1 https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbersを参照してください


13
テストケースは(まだ)実装されていないesolang :)内のプログラムのように見える
ガレン・イワノフ

2
入力は文字列ではなくデータ構造(ネストされたリスト)にできますか?
ngn

3
一瞬ブレインフラックだと思った。
Belhenix

5
@ngnいいえ、入力は文字列である必要があります。
ライコニ

4
@KirillL。技術的には、ネストされたデータ構造を許可すると興味深いゴルフの機会が得られるという点がわかりますが、挑戦は常に「純粋なセットを表す文字列を与える」と述べていたため、これらの答えはそもそも有効ではありませんでした。ただし、許容されるデータ構造と、あまりにも緩やかな入力形式の乱用を避けるために何を線で引くかを決めるのは難しいと思うので、単純さと明確さのために入力を文字列に制限することにしました。
ライコニ

回答:


11

JavaScript(Node.js)53 48 44バイト

f=a=>(a=eval(a)).every(e=>a[e.length]&&f(e))

オンラインでお試しください!テストケースは、@ Arnauldの回答からほとんど恥知らずに盗まれました。説明:セットが自然数を表す場合、それが表す自然数はセットのサイズと等しくなければならず、(要素が明確に保証されている場合)要素はそれより小さい自然数の表現でなければなりません。したがって、これらはより短い長さでなければなりません。これはもちろん、空のセットについても当然です。編集:@Arnauldのおかげで5バイト保存されました。@Cowsquackのおかげで4バイト節約されました。


!e[a.length-1]3バイトを保存する必要があります
Arnauld

1
@Arnauldまたはそれ以上、a[e.length]&&5バイト!
ニール

@JoKingうーん、私はアーノルドをコピーしました...文字列の入力は14バイトかかります:
Neil

きっとg=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))動作しますか?
Kritixi Lithos

@Cowsquackああ、実際には4バイトを節約できます、ありがとう!
ニール


5

Wolfram言語(Mathematica)60 59バイト

E!=(If[Sort@#===Range[t=Tr[1^#]]-1,t,E]&//@ToExpression@#)&

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

このソリューションの中核は機能です

If[Sort@#===Range[t=Tr[1^#]]-1,t,E]&

これは、フォームのリストを{0,1,2,...,n-1}任意の順序で出力nに変換{}し(特に、に変換します0)、他のすべてを実数に変換しますE

この関数を呼び出しますf。などの入力が与えられた場合、"{{{}},{}}"次のことを行います。

  1. 文字列をMathematica式に変換します。
  2. f取得して、すべてのレベルで適用しますf[{f[{f[{}]}], f[{}]}]
  3. すべてのを評価すると、fそれを表す入力の自然数が生成されます。たとえば、f[{f[{f[{}]}], f[{}]}]= f[{f[{0}], 0}]= f[{1, 0}]= 2。他のものは何でも生成しEます。
  4. 結果が自然数かどうかをテストして、そうでないかどうかを確認しEます。

3

Brachylog(v2)、9バイト

↰ᵐo.t~k|Ė

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

通常のように、これは完全なプログラムです。角括弧を使用した標準入力からの入力。true.対としての標準出力への出力false.

説明

これは完全なプログラムであると上で言ったが、実際にはそれよりも興味深い。完全なプログラムと機能の両方です。完全なプログラムとして使用するtrue.場合、セットが自然数であるかfalse.そうでないかを出力します。関数として使用する場合、自然数を「正規化」します(つまり、すべての要素を正規化し、値で並べ替えます。このプログラムは、セットではなく内部的にリストを使用します)、または「例外をスローします」入力が自然数ではない場合)

完全なプログラムの振る舞いは説明するのに十分簡単です。I/ O命令を含まない完全なプログラムのBrachylogの扱いには純粋に暗黙的です。問題の挙動は「;アサーションが失敗するか、プログラムが例外をスローした場合、印刷し、機能を実行し、標準入力から入力を取って、その出力は、最初のコマンドライン引数で与えられた記述と一致していることを主張しているfalse.、それ以外の印刷しますtrue.」 。この場合、コマンドライン引数が欠落している(つまり、 "anything goes")ため、関数の例外/例外なしの動作が出力を提供します。

関数の動作に関して:

↰ᵐo.t~k|Ė
↰ᵐ          Map a recursive call to this function over the list
  o         Sort the list
   .   |    Assert that the following operation need not change the list:
    t         Take the last (i.e. greatest) element of the list
     ~k       Append an arbitrary element to the resulting list
   .   |    Output the unchanged list
       |    Exception handler: if the above threw an exception,
        Ė     Assert that the input is empty, and output an empty list

自然数は、2つの部分を含むものとして定義されます。以下の自然数の要素で、数値自体と結合されます。したがって、そのすべての要素も自然数です。自然数は、a)すべての要素が自然数であることを検証すること、b)セットの最大要素が最大要素を持たないセットと同一であることを検証することで認識できます。

セットではなくリスト(角括弧)を使用している場合、等値比較が機能するためにリストを一貫した順序にする必要があります(この場合、「値」でソートされます)。Brachylogのデフォルトのソート順は、リスト自体の前にリストのプレフィックスをソートします。これは、自然数を数値でソートすることを便利に意味します。したがって、すべての数値を再帰的に並べ替えて、一貫した順序にすることができます。実際、再帰的に定義している関数を介して、数値の要素を再帰的にソートし、それが自然数であることを確認するという、両方の結果を同時に達成できます。

したがって、この関数には4つの主要部分があります。↰ᵐは再帰呼び出しであり、各要素が自然数であることを確認し、各要素を正規化された形式に変換します。oは、数値自体を正規化します(その要素は既に正規化されているため、必要なのはソートすることだけです)。次に.t~k|、最大の要素と他の要素が同じであることを確認して、目的の構造を確保します。空のリスト(つまり0)には最後の要素がないため、t;でアサーションエラーが発生します。入力リストが空である場合には、明示的なフォールバックを与えることを介して、このケースを扱います。


2

K(ngn / k)26 24 27バイト

~^{$[#(!#x)^o'x;0N;#x]}@`j@

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

入力は、`j@(ngn / kに固有の構文)によって解析されるJSON文字列です

{ }は、引数を持つ再帰関数xです。set xで表される自然数を返します0N。1を表さない場合はnull()を返します。

$[ ; ; ]if-then-elseです。0は偽、他の整数は真実

!#x0(包括的)からx(排他的)の長さまでの整数

^ なしで

o'xo各(')要素の再帰()x

# 長さ

^ 無効です?

~ じゃない

@そのダミーの最後の動詞として働き~^で構成されます{ }それに適用されるのではなく、



0

Japt、9バイト

ニールのJSソリューション。これを賛成する場合は、賛成してください。

e@Ê>XÊ©ßX

試してみるかすべてのテストケースを実行してください

              :Implicit input of array U
e             :Does every element in U return true
 @            :When passed through the following function as X
  Ê           :Length of U
   >          :Greater than
    XÊ        :Length of X
      ©       :Logical AND with
       ßX     :A recursive call of the programme with X passed as the new value of U


0

ゼリー、8バイト

߀Ṣ
ÇṖƤƑ

入力は文字列である必要があるため、この送信は完全なプログラムとしてのみ有効です。

オンラインでお試しください!またはすべてのテストケースを検証

使い方

߀Ṣ   Helper link. Argument: A (array)

߀    Recursively map the helper link over A.
  Ṣ   Sort the result.

これにより、ソートされた配列のみで構成される入力の正規表現が生成されます。

ÇṖƤƑ  Main link. Argument: A (array)

Ç     Call the helper link to canonicalize the array.
   Ƒ  Fixed; call the link to the left and test if it returns its argument unchanged.
 ṖƤ       Pop prefix; for each non-empty prefix of the result, remove its last element.

0

ゼリー、7バイト

Ẉ<La߀Ạ

これは、Leaky NunのPythonの回答の移植版です。

入力は文字列である必要があるため、この送信は完全なプログラムとしてのみ有効です。

オンラインでお試しください!またはすべてのテストケースを検証

使い方

Ẉ<La߀Ạ  Main link. Argument: A (array)

Ẉ        Width; compute the length of A's elements.
  L      Yield the length of A.
 <       Compare them, yielding an array of Booleans.
    ߀   Recursively map the main link over A.
   a     Take the logical AND of the Booleans and the results of the map.
      Ạ  All; yield 1 if and only if all ANDs yielded 1.

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