Xây dựng các số tự nhiên với các bộ


17

Cấu trúc này là một cách đại diện cho số tự nhiên.

Trong biểu diễn này, 0 được định nghĩa là tập hợp trống và với tất cả các số khác, n là liên kết của {0} và {n-1}.

Ví dụ để xây dựng 3 chúng ta có thể làm theo thuật toán:

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

Bài tập

Như bạn có thể đoán nhiệm vụ của bạn là lấy số tự nhiên (bao gồm số không) và đưa ra kết cấu của nó.

Bạn có thể xuất ra dưới dạng chuỗi hoặc dưới dạng đối tượng được đặt nếu ngôn ngữ bạn chọn hỗ trợ các đối tượng đó.

Nếu bạn chọn xuất ra dưới dạng một chuỗi, bạn nên biểu diễn một tập hợp với dấu ngoặc nhọn ( {}). Bạn có thể tùy ý đại diện cho tập hợp trống là ø(nếu không nó phải là một tập hợp không có mục {}). Bạn cũng có thể chọn thêm dấu phẩy và khoảng trắng giữa và sau các mục trong tập hợp.

Thứ tự không quan trọng, tuy nhiên bạn có thể không có bất kỳ yếu tố lặp lại nào trong các bộ bạn xuất (ví dụ {ø,ø})

Đây là vì vậy mục tiêu là có ít byte nhất

Các trường hợp thử nghiệm

Dưới đây là một số trường hợp thử nghiệm với một số ví dụ đầu ra.

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

4
@ mbomb007 Không quan trọng định nghĩa là "sai" hay không. Đây vẫn là một thử thách tốt (và một thử thách khác).
Martin Ender


4
@ mbomb007 Các trường hợp thử nghiệm và định nghĩa được đưa ra trong thử thách này khớp với nhau và khác với thử thách khác. Nếu bất cứ điều gì, liên kết có thể được cải thiện, nhưng tôi không nghĩ rằng liên kết có liên quan đến chính thách thức.
Martin Ender

Tuy nhiên, ông gọi nó là công trình Von Neumann, và đó không phải là thách thức này. Đó là những gì các dup là. Theo sau, mỗi số tự nhiên bằng với tập hợp của tất cả các số tự nhiên nhỏ hơn nó
mbomb007

1
Chúng ta có thể trả về một đối tượng giống như tập hợp, chẳng hạn như danh sách các danh sách từ hàm hoặc in biểu diễn ngôn ngữ của chúng ta sang STDOUT không?
Dennis

Câu trả lời:


12

Python , 28 byte

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

Hãy thử trực tuyến!

Đây là một giải pháp khá nhạt nhẽo cho vấn đề. Đối với các số lớn hơn 0, bạn có thể nhận được biểu diễn với công thức chuỗi "{{}"*x+"}"*x. Tuy nhiên, điều này không hoạt động cho số không trong đó đây là chuỗi rỗng. Chúng ta có thể sử dụng thực tế này để ngắn mạch một orđể trả về tập hợp trống.

Tôi muốn sử dụng các đối tượng dựng sẵn của python để giải quyết vấn đề này nhưng thật không may:

TypeError: unhashable type: 'set'

Bạn không thể đặt các bộ bên trong các bộ trong python.


2
Bạn có thể di chuyển xđể "{{}"*x+x*"}"ortiết kiệm một byte
Rod

1
f=có thể được gỡ bỏ.
Yytsi


frozensetnhưng không ai có được byte cho điều đó ...
Esolanging Fruit 15/07/17

9

Haskell , 37 byte

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

Hãy thử trực tuyến!

Cho đến 10 phút trước, một câu trả lời như thế này sẽ không có ý nghĩa với tôi. Tất cả các khoản tín dụng đi đến lời khuyên này trả lời .

Về cơ bản, chúng tôi sử dụng >>như concat $ replicate(nhưng chuyển cho nó một danh sách gồm n phần tử thay vì chỉ đơn giản là n) và =<<khi concatMapsao chép sau đó n lần mỗi chuỗi trong danh sách và nối kết quả thành một chuỗi.

Các 0trường hợp được xử lý riêng vì nó sẽ trả về một chuỗi rỗng.


@Laikoni Tôi cũng đã thử một cái gì đó tương tự, nhưng bạn cũng cần phải có trường hợp đặc biệt f 1để làm cho nó hoạt động chính xác
Leo

Thật. Sau đó, tôi thích phiên bản của bạn hơn nữa.
Laikoni

6

JavaScript, 28 byte

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

Đại diện cho bộ sử dụng mảng. Giải pháp không hồi quy 38 byte:

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

Trả về các chuỗi đầu ra ví dụ.


6

Toán học, 27 byte

Tôi đã có hai giải pháp tại số byte này:

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

1
Gần bỏ lỡ ở 32 byte : #//.{1->{{}},x_/;x>1->{{},x-1}}&. Mặc dù tôi đoán nó làm rối đầu vào 0
Greg Martin

5

Perl 6 , 37 byte

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

Thử nó

Mở rộng:

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

Bạn đang thiếu một terminator trích dẫn :hay đây là một cái gì đó mới cho Perl 6?
CraigR8806

@ CraigR8806 Bạn không thể sử dụng dấu hai chấm để phân định cấu trúc trích dẫn trong Perl 6 vì chúng được sử dụng cho trạng từ. (nhìn vào phiên bản mở rộng)
Brad Gilbert b2gills

5

05AB1E , 6 5 byte

ƒ)¯sÙ

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm! .

Giải trình

ƒ       # 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¯), điều đó không làm việc?
Bạch tuộc ma thuật Urn

@carusocomputing Tôi không nghĩ rằng nó hoạt động được n=0, vì đầu ra trống (không phải là một bộ trống).
Ad Nam

4

Võng mạc , 22 byte

.+
$*
\`.
{{}
{

^$
{}

Hãy thử trực tuyến!

Giải trình

.+
$*

Chuyển đổi đầu vào thành unary.

\`.
{{}

Thay thế từng chữ số đơn {{}và bằng cách in kết quả mà không có dòng cấp dữ liệu ( \).

{

Loại bỏ các {s mở , sao cho phần còn lại }chính xác là những cái chúng ta vẫn cần in để đóng tất cả các bộ. Tuy nhiên, quy trình trên không thành công cho đầu vào 0, nơi chúng tôi sẽ không in bất cứ điều gì. Vì thế...

^$
{}

Nếu chuỗi trống, thay thế nó bằng tập rỗng.


Tôi đã tự hỏi làm thế nào để lặp lại một chuỗi nthời gian trong Retina ...
Neil

4

Brain-Flak , 135 byte

Bao gồm +1 cho -A

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

Hãy thử trực tuyến!

(({}())<                 # 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 byte

Lri{]La|}*p

In một đối tượng giống như tập hợp bao gồm danh sách các danh sách. CJam in danh sách trống dưới dạng chuỗi rỗng, vì danh sách và chuỗi gần như có thể hoán đổi cho nhau.

Hãy thử trực tuyến!

Giải trình

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

Câu trả lời cũ, 21 18 byte

Điều này là trước khi nó được xác nhận rằng nó ổn khi in cấu trúc danh sách lồng nhau. Sử dụng thuật toán lặp lại chuỗi.

Đã lưu 3 byte nhờ Martin Ender!

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

Giải trình

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

Thạch , 6 byte

⁸,⁸Q$¡

Đây là một liên kết niladic đọc một số nguyên từ STDIN và trả về một mảng rách rưới.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

⁸,⁸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

Hồng y , 51 50 byte

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

Hãy thử trực tuyến!

Giải trình

%:#
x

Nhận đầu vào và gửi xuống và rời khỏi #

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

In "{" một lần rồi in "{} {" n-1 lần nếu n> 1 rồi in "{}" nếu n> 0

       #

v <8/ ?<
>  8\

Giữ giá trị đầu vào cho đến khi vòng lặp đầu tiên hoàn thành

v"}"<
>?-?^

In "}" một lần rồi lặp lại n-1 lần nếu n> 1


2

AHK, 55 byte

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

Đó không phải là câu trả lời ngắn nhưng tôi rất thích điều này vì các đặc tính của AutoHotkey làm cho phương pháp đệ quy nhìn này siêu sai. Ifvà các Looptuyên bố giả định dòng tiếp theo là điều duy nhất được bao gồm nếu dấu ngoặc không được sử dụng. Dấu ngoặc nhọn là ký tự thoát, do đó bạn phải thoát chúng bằng dấu ngoặc nhọn khác để sử dụng chúng làm văn bản. Ngoài ra, biến 1là đối số được thông qua đầu tiên. Khi tôi đọc mã mà không biết các mẩu tin đó, logic sẽ xuất hiện như thế này:

  • Nếu 1 = 0, sau đó đặt s bằng với câu trả lời sai
  • Lặp lại và thêm một loạt dấu ngoặc vào đầu và một vài dấu chấm mỗi lần
  • Quay trở lại bằng cách gửi chuỗi kết quả đến cửa sổ hiện tại

Nếu không có tất cả các ký tự thoát khung, nó sẽ trông như thế này:

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

1

JavaScript 50 byte

g=n=>n==0?"":"{{}"+g(n-1)+"}"
z=m=>m==0?"{}":g(m)

khi một số bằng 0 thì đó là giá trị giả cho JavaScript. Vì vậy, bạn có thể xóa == 0 nếu bạn đảo ngược các biểu thức ternary của mình
fəˈnɛtɪk

1

tinylisp , 52 byte

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

Hãy thử trực tuyến! (khai thác thử nghiệm).

Giải trình

Lưu ý rằng đó (cons x (cons y nil))là cách bạn xây dựng một danh sách chứa xytrong Lisp.

(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 byte

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

Hãy thử trực tuyến!

Đầu vào trên stdin, đầu ra trên thiết bị xuất chuẩn.

Điều này hoạt động bằng cách tính toán một công thức cho đầu ra mong muốn dưới dạng số cơ sở 256. Lệnh P trong dc sau đó được sử dụng để in số cơ sở 256 dưới dạng chuỗi.


Giải thích thêm:

Gọi n là đầu vào n. Chương trình dc tính tổng của

A = floor (256 ^ n / 255) * 125 (BF được hiểu bởi dc là 11 * 10 + 15 = 125)

B = sàn ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).

 

Cho một:

Quan sát rằng 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) bằng (256 ^ n-1) / 255, theo công thức cho một tiến trình hình học và giá trị này bằng sàn (256 ^ n / 255 ). Vì vậy, đây là số bao gồm n 1 trong cơ sở 256.

Khi bạn nhân nó với 125 để có A, kết quả là số bao gồm n 125 trong cơ sở 256 (tất nhiên 125 là một chữ số trong cơ sở 256). Có lẽ tốt hơn để viết các chữ số trong cơ sở 256 dưới dạng số hex; 125 là hex 7D, vì vậy A là số cơ sở 256 gồm n 7D liên tiếp.

 

B tương tự:

Lần này quan sát rằng 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) bằng (16777216 ^ n - 1) / 16777215 và giá trị này bằng sàn (16777216 ^ n / 16777215).

Bây giờ, 256 ^ 3 = 16777216 và 8 ^ 8-1 = 16777215, vì vậy đây là những gì chúng tôi tính toán dưới dạng sàn ((256 ^ n) ^ 3 / (8 ^ 8-1)).

Từ biểu diễn chuỗi hình học, số này trong cơ sở 256 là 100100100 ... 1001 với n chữ số là 1 và phần còn lại của các chữ số là 0.

Điều này được nhân với 8092541, là 7B7B7D theo hệ thập lục phân. Trong cơ sở 256, đây là một số có ba chữ số bao gồm các chữ số 7B, 7B và 7D (viết các chữ số đó thành hex để thuận tiện).

Theo sau, sản phẩm được viết trong cơ sở 256 là một số có 3 chữ số bao gồm 3 chữ số 7B 7B 7D được lặp lại n lần.

Số này được nhân với 256 ^ n, dẫn đến số cơ sở gồm 4 chữ số gồm 256 chữ số, bao gồm 3 chữ số 7B 7B 7D được lặp lại n lần, theo sau là n 0 '. Đó là B.

 

Thêm A + B bây giờ sẽ mang lại số cơ sở gồm 4 chữ số gồm 256 chữ số gồm 3 chữ số 7B 7B 7D được lặp lại n lần, tiếp theo là n 7D. Vì 7B và 7D là mã ASCII cho {}, tương ứng, đây là chuỗi bao gồm n bản sao {{}theo sau là n bản sao của} , chính xác là những gì chúng ta muốn cho n> 0. Lệnh P trong dc in một số cơ sở 256 như một chuỗi, giống như chúng ta cần.

Thật không may, n = 0 phải được coi là trường hợp đặc biệt. Việc tính toán ở trên xảy ra để mang lại kết quả là 0 cho n = 0; trong trường hợp đó, tôi chỉ mã hóa việc in chuỗi {}.


Đó là một cách tiếp cận rất thú vị bằng cách sử dụng hành vi ít được biết đến của lệnh in đó. Làm tốt lắm! Một lời giải thích về cách làm việc này sẽ cải thiện câu trả lời.
seshoumara

@seshoumara Cảm ơn - Tôi đã thêm một lời giải thích chi tiết.
Spector Mitchell


0

Mẻ, 88 byte

@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 byte

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

(dòng mới về tính thẩm mỹ) Vì nó là bộ não ***, nó nhận đầu vào là mã char ascii (đầu vào "a" tương ứng với 96)

Braineasy, 60 byte

Ngoài ra, trong ngôn ngữ tùy chỉnh của tôi (dựa trên brainf **, thông dịch viên ở đây ):

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

Bạn phải mã hóa đầu vào chương trình vào trình thông dịch vì tôi lười biếng.


Chào mừng đến với trang web! Tại sao có một []? Có vẻ như nó có thể được gỡ bỏ
Wheat Wizard

Nếu bạn không có điều đó, nó sẽ xuất thêm {} ở cuối (vòng lặp vô hạn).
internet_user

0

05AB1E , 5 3 byte

F¯)

Hãy thử trực tuyến!

Phiên bản này là sau khi anh ấy làm rõ rằng bộ là ổn.

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

Phiên bản cũ (sử dụng ø):

05AB1E , 5 4 byte

FX¸)

Hãy thử trực tuyến!

Trường hợp 1tương đương với ø.

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.