セットで自然数を構成する


17

この構造は、自然数を表す方法です。

この表現では、0は空のセットとして定義され、他のすべての数値では、nは{0}と{n-1}の結合です。

たとえば、3を構成するには、アルゴリズムに従うことができます。

3 =
{ø, 2} =
{ø, {ø, 1}} =
{ø, {ø, {ø}}}

仕事

ご想像のとおり、タスクは自然数(ゼロを含む)を取り込み、その構造を出力することです。

選択した言語がそのようなオブジェクトをサポートしている場合は、文字列またはセットオブジェクトとして出力できます。

文字列として出力することを選択した場合、中括弧({})でセットを表す必要があります。オプションで、空のセットをとして表すことができますø(そうでない場合は、エントリのないセットである必要があります{})。また、セットのエントリの前後にコンマと空白を追加することもできます。

順序は重要ではありませんが、出力するセットに繰り返し要素がない場合があります(例{ø,ø}

これはので、目標はバイト数を最小限にすることです

テストケース

次に、いくつかの出力例を含むいくつかのテストケースを示します。

0 -> {}
1 -> {{}}
2 -> {{}{{}}}
3 -> {{}{{}{{}}}}
4 -> {{}{{}{{}{{}}}}}

4
@ mbomb007定義が「間違っている」かどうかは関係ありません。それはまだ素晴らしい挑戦です(そして別の挑戦です)。
マーティンエンダー


4
@ mbomb007このチャレンジで指定されたテストケースと定義は一致しており、他のチャレンジとは異なります。どちらかといえば、リンクは改善される可能性がありますが、私はリンクがチャレンジ自体に関連しているとは思いません。
マーティンエンダー

彼はそれをフォン・ノイマン構造と呼んでいたが、それはこの挑戦がそうではない。それがdupです。つまり、各自然数はそれよりも小さいすべての自然数のセットに等しくなります
-mbomb007

1
関数からリストのリストなどのセットのようなオブジェクトを返すか、言語の表現をSTDOUTに出力できますか?
デニス

回答:


12

Python、28バイト

lambda x:"{{}"*x+x*"}"or"{}"

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

これは問題に対するかなり当たり障りのない解決策です。ゼロより大きい数値の場合、文字列式で表現を取得できます"{{}"*x+"}"*x。ただし、これは空の文字列であるゼロでは機能しません。この事実を使用して、回路を短絡しorて空のセットを返すことができます。

残念ながら、この問題を解決するためにpythonの組み込みセットオブジェクトを使用したかったのです。

TypeError: unhashable type: 'set'

Pythonのセットの中にセットを置くことはできません。


2
あなたが移動することができますx"{{}"*x+x*"}"orバイトを保存する
ロッド

1
f=削除できます。
-Yytsi


ありますfrozenset...しかし、誰もがそのためにバイトを持っていないされていません
Esolangingフルーツ

9

Haskell、37バイト

f 0="{}"
f n=([1..n]>>)=<<["{{}","}"]

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

10分前までは、このような答えは私には意味がありませんでした。すべてのクレジットは、このヒントの回答に進みます

基本的に、>>as を使用しますconcat $ replicate(ただし、nの代わりにn個の要素のリストを渡します)。=<<としてconcatMap、リストに次にn回ストリングのそれぞれを複製し、単一の文字列に結果を連結します。

0それは空の文字列を返すように、ケースを別々に処理されます。


@Laikoni私もそのようなものを試してみましたが、それをf 1正しく動作させるには特別なケースも必要です
レオ

確かに。それから私はあなたのバージョンがさらに好きです。
ライコニ

6

JavaScript、28バイト

f=n=>n?--n?[[],f(n)]:[[]]:[]

配列を使用するセットを表します。38バイトの非再帰的ソリューション:

n=>'{{}'.repeat(n)+'}'.repeat(n)||'{}'

出力文字列の例を返します。


6

Mathematica、27バイト

このバイト数で2つのソリューションがあります。

Nest[{{}}~Union~{#}&,{},#]&
Union//@Nest[{{},#}&,{},#]&

1
32バイトでのニアミス:#//.{1->{{}},x_/;x>1->{{},x-1}}&。私はそれが入力0を台無しにすると思うが
グレッグマーティン

5

Perl 6、37バイト

{('{}','{{}}',{q:s'{{}$_}'}...*)[$_]}

それを試してみてください

拡張:

{   # bare block lambda with implicit parameter 「$_」

  (
    # generate a sequence

    '{}',   # seed it with the first two values
    '{{}}',

    {   # bare block lambda with implicit parameter 「$_」

      q         # quote
      :scalar   # allow scalar values

      '{{}$_}'  # embed the previous value 「$_」 in a new string

    }

    ...         # keep using that code block to generate values

    *           # never stop

  )[ $_ ] # get the value at the given position in the sequence
}

引用符のターミネーターが欠落しています:か、これはPerl 6にとって新しいものですか?
CraigR8806

@ CraigR8806コロンは副詞に使用されるため、Perl 6で引用構造を区切るためにコロンを使用することはできません。(拡張版を見てください)
ブラッドギルバートb2gills

5

05AB1E6 5バイト

コード

ƒ)¯sÙ

CP-1252エンコードを使用します。オンラインでお試しください!またはすべてのテストケースを検証してください!

説明

ƒ       # For N in range(0, input + 1)..
 )      #   Wrap the entire stack into an array
  ¯     #   Push []
   s    #   Swap the two top elements
    Ù   #   Uniquify the array

F¯)、それは動作しませんか?
魔法のタコUr

@carusocomputing n=0出力は空(空のセットではない)であるため、私はそれが機能しないと思います。
アドナン

4

網膜、22バイト

.+
$*
\`.
{{}
{

^$
{}

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

説明

.+
$*

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

\`.
{{}

各単項数字を置き換え{{}、結果を末尾の改行なしで印刷します(\)。

{

{残りの}部分が、すべてのセットを閉じるために印刷する必要があるものとまったく同じになるように、開口部を削除します。ただし、入力については上記の手順は失敗し0、何も出力されません。そう...

^$
{}

文字列が空の場合は、空のセットに置き換えます。


nRetinaで文字列を何回繰り返すか疑問に思っていた
ニール

4

Brain-Flak、135バイト

+1を含む -A

(({}())<{({}[()]<((((((()()()()()){}){}){}())()){}{})>)}{}({}[()()])>)(({})<{({}[()]<(((({}()())[()()])))>)}{}>[()]){(<{}{}{}>)}{}{}{}

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

(({}())<                 # Replace Input with input + 1 and save for later
  {({}[()]<              # For input .. 0
    (...)                # Push '}'
  >)}{}                  # End for and pop counter
  ({}[()()])             # change the top '}' to '{'. This helps the next stage
                         # and removes the extra '}' that we got from incrementing input
>)                       # Put the input back on

(({})<                   # Save input
  {({}[()]<              # For input .. 0
    (((({}()())[()()]))) # Replace the top '{' with "{{{}"
  >)}{}                  # end for and pop the counter
>[()])                   # Put down input - 1
{(<{}{}{}>)}             # If not 0, remove the extra "{{}"
{}{}{}                   # remove some more extras


4

CJam、11バイト

Lri{]La|}*p

リストのリストで構成されるセットのようなオブジェクトを印刷します。リストと文字列はほぼ交換可能であるため、CJamは空のリストを空の文字列として出力します。

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

説明

L            Push an empty array 
 ri          Read an integer from input
   {    }*   Run this block that many times:
    ]          Wrap the entire stack in an array
     La        Wrap an empty list in an array, i.e. [[]]
       |       Set union of the two arrays
          p  Print the result

古い回答、21 18バイト

これは、ネストされたリスト構造を印刷しても問題ないことが確認される前です。文字列繰り​​返しアルゴリズムを使用します。

Martin Enderのおかげで3バイト節約できました!

ri{{}}`3/f*~_{{}}|

説明

ri                  Read an integer from input
  {{}}`             Push the string "{{}}"
       3/           Split it into length-3 subtrings, gives ["{{}" "}"]
         f*         Repeat each element of that array a number of times equal to the input
           ~_       Dump the array on the stack, duplicate the second element
             {{}}|  Pop the top element, if it's false, push an empty block, which gets 
                      printed as "{}". An input of 0 gives two empty strings on the 
                      repetition step. Since empty strings are falsy, we can correct the 
                      special case of 0 with this step.

4

ゼリー、6バイト

⁸,⁸Q$¡

これは、STDINから整数を読み取り、不規則配列を返すniladicリンクです。

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

使い方

⁸,⁸Q$¡  Niladic link.

⁸       Set the return value to [].
    $   Combine the three links to the left into a monadic chain.
 ,⁸     Pair the previous return value with the empty array.
   Q    Unique; deduplicate the result.
     ¡  Read an integer n from STDIN and call the chain to the left n times.


3

Cardinal51 50バイト

%:#>"{"#? v
x  ^?-"}{"<
v <8/ ?<
>  8\
v"}"<
>?-?^

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

説明

%:#
x

入力を受信し、#から左下に送信します

   >"{" ? v
   ^?-"}{"<

「{」を1回印刷してから「{} {」をn-1回印刷し、n> 1の場合は「{}」を印刷します。

       #

v <8/ ?<
>  8\

最初のループが完了するまで入力値を保持する

v"}"<
>?-?^

「}」を1回印刷してから、n> 1の場合はn-1回繰り返します


2

AHK、55バイト

IfEqual,1,0
s={{}{}}
Loop,%1%
s={{ 2}{}}%s%{}}
Send,%s%

最短の答えではありませんが、AutoHotkeyの特異性により、この再帰メソッドが非常に間違っているように見えるため、これを楽しんでいます。Ifまた、Loopステートメントは、括弧が使用されていない場合に含まれるのは次の行のみであると想定しています。中かっこはエスケープ文字であるため、テキストとして使用するには、他の中かっこでエスケープする必要があります。また、変数1は最初に渡された引数です。これらの情報を知らずにコードを読むと、ロジックようになります。

  • 1 = 0の場合、設定 s、間違った答えに等しくます
  • ループし、最初と最後にいくつかのブラケットを毎回追加します
  • 結果の文字列を現在のウィンドウに送信して戻る

すべてのブラケットエスケープ文字がないと、次のようになります。

IfEqual,1,0
   s={}
Loop,%1%
   s={{}%s%}
Send,%s%


1

tinylisp、52バイト

(d f(q((n)(i n(i(e n 1)(c()())(c()(c(f(s n 1))())))(

オンラインでお試しください!(テストハーネス)。

説明

(cons x (cons y nil))あなたが入ったリストの構築方法であるxyLispのでは。

(d f           Define f to be
 (q(           a quoted list of two items (which acts as a function):
  (n)           Arglist is a single argument n
  (i n          Function body: if n is truthy (i.e. nonzero)
   (i(e n 1)     then if n equals 1
    (c()())       then cons nil to nil, resulting in (())
    (c            else (if n > 1) cons
     ()            nil to
     (c            cons
      (f(s n 1))    (recursive call with n-1) to
      ())))         nil
   ()))))        else (if n is 0) nil



1

dc、46バイト

[[{}]]sx256?^dd3^8d^1-/8092541**r255/BF*+d0=xP

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

stdinの入力、stdoutの出力。

これは、希望する出力の数式を基数256の数値として計算することで機能します。次に、dcのPコマンドを使用して、base-256番号を文字列として出力します。


詳細な説明:

nを入力nとします。dcプログラムは、以下の合計を計算します

A = floor(256 ^ n / 255)* 125(BFはDCによって11 * 10 + 15 = 125として解釈されます)

そして

B = floor((256 ^ n)^ 3 /(8 ^ 8-1))* 8092541 *(256 ^ n)。

 

のために:

1 + 256 + 256 ^ 2 + ... + 256 ^(n-1)が(256 ^ n-1)/ 255と等しいことを観察します。これは等比数列の式であり、これはfloor(256 ^ n / 255と等しくなります)。したがって、これは基数256のn個の1で構成される数です。

Aを得るために125を掛けると、結果は基数256のn個の125からなる数になります(125は基数256の1桁の数字です)。おそらく、ベース256の数字を16進数として書く方が良いでしょう。125は16進数の7Dであるため、Aは連続したn個の7Dで構成される256を底とする数値です。

 

Bも同様です。

今回は、1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^(n-1)が(16777216 ^ n-1)/ 16777215に等しく、これがfloor(16777216 ^ n / 16777215)に等しいことを確認します。

現在、256 ^ 3 = 16777216、および8 ^ 8-1 = 16777215であるため、これはfloor((256 ^ n)^ 3 /(8 ^ 8-1))として計算しています。

幾何級数表現から、基数256のこの数は100100100 ... 1001であり、桁のnは1、残りの桁は0です。

これに8092541が乗算されます。これは16進数の7B7B7Dです。基数256では、これは数字7B、7B、および7Dで構成される3桁の数字です(便宜上、これらの数字を16進数で書きます)。

つまり、ベース256で書かれた製品は、3回の数字7B 7B 7Dからなる3n桁の数字で、n回繰り返されます。

これに256 ^ nを掛けると、n回繰り返される3桁の7B 7B 7Dとそれに続くn個の0で構成される4n桁の基数256の数値になります。それはBです。

 

A + Bを追加すると、n回繰り返される3桁の7B 7B 7Dで構成された4n桁のbase-256数が得られ、その後にn 7Dが続きます。7Bと7Dはそれぞれ{とのASCIIコードであるため}、これはのn個のコピーの{{}後にn個のコピーが続く文字列です。} n> 0の場合にまさに必要なものです。必要に応じて文字列として。

残念ながら、n = 0は特別なケースとして扱われなければなりません。上記の計算では、n = 0の場合、結果が0になります。その場合、文字列の印刷をハードコーディングしました{}


これは、その印刷コマンドのあまり知られていない動作を使用する非常に興味深いアプローチです。うまくできました!これがどのように機能するかの説明は、答えを改善するでしょう。
seshoumara

@seshoumaraありがとう-詳細な説明を追加しました。
ミッチェルスペクター


0

バッチ、88バイト

@set s={}
@if %1 gtr 0 set s=&for /l %%i in (1,1,%1)do @call set s={{}%%s%%}
@echo %s%

0

Brainf ***、99バイト

>+>+>+>+<[>[-<+++++>]<-<]>--[->+>+<<]
>[-<+>]>++<,[[->>+>+<<<]>>[-<<<..>>.>]>[-<<.>>]+[]]<.>>.

(美学の改行)brainf ***であるため、ASCII文字コードとして入力を受け取ります(入力 "a"は96に対応)

簡単、60バイト

また、私のカスタム言語(brainf **ベース、インタープリターはこちら):

#123#[->+>+<<]>++<,[[-<+<+>>]<[->>>..<.<<]<[->>>.<<<]!]>>.<.

私は怠け者なので、プログラム入力をインタープリターにハードコーディングする必要があります。


サイトへようこそ!なぜあるの[]?削除できるようです
ポストロックガーフハンター

それがない場合、最後に余分な{}を出力します(無限ループします)。
internet_user

0

05AB1E5 3バイト

F¯)

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

このバージョンは、彼がセットに問題がないことを明確にした後のものです。

F   # From 1 to input...
 ¯  # Push global array (default value is []).
  ) # Wrap stack to array.

古いバージョン(øを使用):

05AB1E5 4バイト

FX¸)

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

whereはと1同等øです。

F    # From 1 to input...
 X   # Push value in register X (default is 1).
  ¸  # Wrap pushed value into an array.
   ) # Wrap whole stack into an array.
     # Implicit loop end (-1 byte).
     # Implicit return.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.