Bộ này có đại diện cho số tự nhiên không?


26

Trong lý thuyết tập hợp, các số tự nhiên N={0,1,2,3,...} thường được mã hóa dưới dạng các tập thuần túy , đó là các tập hợp chỉ chứa tập hợp trống hoặc các tập hợp thuần túy khác. Tuy nhiên, không phải tất cả các bộ thuần túy đại diện cho số tự nhiên. Thử thách này là về việc quyết định xem một tập hợp thuần nhất có đại diện cho mã hóa số tự nhiên hay không.

Mã hóa số tự nhiên hoạt động theo cách 1 sau:

  • Không là tập hợp trống: Set(0)={}
  • Với một số n>0 : Set(n)=Set(n1){Set(n1)}

Do đó, mã hóa của một vài số tự nhiên đầu tiên là

  • 0{}
  • 1{0}{{}}
  • 2{0,1}{{},{{}}}
  • 3{0,1,2}{{},{{}},{{},{{}}}}
  • 4{0,1,2,3}{{},{{}},{{},{{}}},{{},{{}},{{},{{}}}}}

Nhiệm vụ

  • Đưa ra một chuỗi đại diện cho một tập hợp thuần túy, xác định xem tập hợp này có mã hóa số tự nhiên theo cấu trúc trên không.
  • Tuy nhiên, lưu ý rằng các phần tử của một tập hợp không được sắp xếp, vì vậy không phải là đại diện hợp lệ duy nhất của như ví dụ đại diện cho cùng một bộ.{{},{{}},{{},{{}}}}3{{{}},{},{{{}},{}}}
  • Bạn có thể sử dụng [], ()hoặc <>thay vì {}.
  • Bạn có thể giả sử các bộ được đưa ra mà không có ,dấu phân cách.
  • Bạn có thể cho rằng sẽ không có bất kỳ yếu tố trùng lặp nào trong đầu vào, ví dụ {{},{}}không phải là đầu vào hợp lệ và đầu vào đó được định dạng tốt, ví dụ như không {{},, {,{}}hoặc tương tự.

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

Thật:

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

Sai:

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

Liên quan: Xây dựng tự nhiên (Xuất mã hóa đã đặt của một số tự nhiên nhất định.)
1 Xem https://en.wikipedia.org/wiki/set-theoretic_def định_of_natural_numbers


13
Các trường hợp thử nghiệm trông giống như một chương trình trong một esolang (chưa) chưa được thực hiện :)
Galen Ivanov

2
đầu vào có thể là một cấu trúc dữ liệu (danh sách lồng nhau) thay vì một chuỗi không?
ngn

3
Tôi nghĩ rằng đó là Brain-flak một lúc.
Belhenix

5
@ngn Không, đầu vào cần phải là một chuỗi.
Laikoni

4
@KirillL. Về mặt kỹ thuật, những câu trả lời này không hợp lệ để bắt đầu vì thử thách luôn nêu "Đưa ra một chuỗi đại diện cho một tập thuần túy", mặc dù tôi thấy điểm cho phép cấu trúc dữ liệu lồng nhau cho phép cơ hội chơi golf thú vị. Tuy nhiên, tôi thấy khó quyết định nơi vẽ đường thẳng trên cấu trúc dữ liệu được phép là gì và điều gì không tránh lạm dụng định dạng đầu vào quá khoan dung, vì vậy tôi quyết định hạn chế đầu vào chuỗi vì đơn giản và không rõ ràng .
Laikoni

Câu trả lời:


11

JavaScript (Node.js) , 53 48 44 byte

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

Hãy thử trực tuyến! Các trường hợp thử nghiệm chủ yếu bị đánh cắp một cách đáng xấu hổ từ câu trả lời của @ Arnauld. Giải thích: Nếu một tập hợp đại diện cho một số tự nhiên, thì số tự nhiên mà nó đại diện phải bằng với kích thước của tập hợp và (với điều kiện là các phần tử được đảm bảo khác biệt), các phần tử phải là biểu diễn của các số tự nhiên nhỏ hơn nó, và do đó phải có chiều dài ngắn hơn. Điều này là tầm thường của bộ trống tất nhiên. Chỉnh sửa: Đã lưu 5 byte nhờ @Arnauld. Đã lưu 4 byte nhờ @Cowsquack.


!e[a.length-1]nên lưu 3 byte
Arnauld

1
@Arnauld Hoặc tốt hơn nữa, a[e.length]&&cho 5 byte!
Neil

@JoKing Ugh, tôi vừa sao chép Arnauld ... chuỗi đầu vào có giá 14 byte :-(
Neil

Chắc chắn, g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))sẽ làm việc?
Kritixi Lithos

@Cowsquack Ah, thật tuyệt, thật sự tiết kiệm được 4 byte, cảm ơn!
Neil


5

Ngôn ngữ Wolfram (Mathicala) , 60 59 byte

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

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

Cốt lõi của giải pháp này là chức năng

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

trong đó chuyển đổi một danh sách của biểu mẫu {0,1,2,...,n-1}theo bất kỳ thứ tự nào thành đầu ra n(cụ thể là nó chuyển đổi {}thành 0) và chuyển đổi bất cứ thứ gì khác thành số thực E.

Gọi chức năng này f. Đưa ra một đầu vào như "{{{}},{}}", chúng tôi làm như sau:

  1. Chuyển đổi chuỗi thành một biểu thức Mathicala.
  2. Áp dụng fở mọi cấp độ, nhận được f[{f[{f[{}]}], f[{}]}].
  3. Đánh giá tất cả các số fsẽ tạo ra một số tự nhiên cho một đầu vào đại diện cho nó. Ví dụ: f[{f[{f[{}]}], f[{}]}]= f[{f[{0}], 0}]= f[{1, 0}]= 2. Bất cứ điều gì khác sẽ sản xuất E.
  4. Chúng tôi kiểm tra xem kết quả có phải là số tự nhiên hay không bằng cách kiểm tra xem có phải không E.

3

Brachylog (v2), 9 byte

↰ᵐo.t~k|Ė

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

Như thường lệ cho một , đây là một chương trình đầy đủ. Đầu vào từ đầu vào tiêu chuẩn, sử dụng dấu ngoặc vuông. Đầu ra cho đầu ra tiêu chuẩn true.so với false..

Giải trình

Mặc dù tôi đã nói ở trên rằng đây là một chương trình đầy đủ, nhưng nó thực sự thú vị hơn thế; nó vừa là một chương trình đầy đủ vừa là một chức năng. Khi được sử dụng như một chương trình đầy đủ, nó sẽ in true.nếu tập hợp là số tự nhiên hoặc false.nếu không. Khi được sử dụng như một hàm, nó "bình thường hóa" một số tự nhiên (nghĩa là bình thường hóa tất cả các phần tử của nó và sắp xếp chúng theo thứ tự theo giá trị; chương trình này sử dụng danh sách bên trong, không đặt) hoặc "ném ngoại lệ" (thực sự là một thất bại, vì điều này là Prolog) nếu đầu vào không phải là số tự nhiên.

Hành vi chương trình đầy đủ đủ dễ để giải thích: nó hoàn toàn tiềm ẩn trong cách đối xử của Brachylog đối với các chương trình đầy đủ không chứa hướng dẫn I / O. Hành vi trong câu hỏi là "chạy hàm, lấy đầu vào của nó từ đầu vào tiêu chuẩn và khẳng định rằng đầu ra của nó khớp với mô tả được đưa ra bởi đối số dòng lệnh đầu tiên; nếu xác nhận thất bại hoặc chương trình ném ngoại lệ, in false., nếu không thì in true." . Trong trường hợp này, đối số dòng lệnh bị thiếu (nghĩa là "mọi thứ đều ổn"), do đó, hành vi ngoại lệ / không ngoại lệ của hàm cung cấp đầu ra.

Đối với hành vi chức năng:

↰ᵐ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

Một số tự nhiên được định nghĩa là chứa hai phần: các phần tử của số tự nhiên bên dưới, được kết hợp với chính số đó. Do đó, tất cả các yếu tố của nó cũng là số tự nhiên. Chúng ta có thể nhận ra một số tự nhiên bằng cách a) xác minh rằng tất cả các phần tử của nó là số tự nhiên, b) xác minh rằng phần tử lớn nhất của tập hợp giống hệt với tập hợp không có phần tử lớn nhất của nó.

Khi chúng tôi sử dụng danh sách thay vì tập hợp (do đó là dấu ngoặc vuông), chúng tôi cần đặt chúng vào một thứ tự nhất quán để so sánh công bằng hoạt động (trong trường hợp này, được sắp xếp theo "giá trị"). Thứ tự sắp xếp mặc định của Brachylog sẽ sắp xếp tiền tố của danh sách trước chính danh sách đó, điều đó có nghĩa là nó sẽ sắp xếp các số tự nhiên theo giá trị số. Vì vậy, chúng tôi chỉ có thể sắp xếp đệ quy tất cả các số của chúng tôi để đưa chúng vào một trật tự nhất quán. Trên thực tế, thông qua chức năng chúng tôi xác định đệ quy, chúng tôi có thể đạt được cả hai kết quả cùng một lúc: sắp xếp đệ quy các phần tử của số và xác minh rằng đó là số tự nhiên.

Các chức năng do đó có bốn phần chính. ↰ᵐlà cuộc gọi đệ quy, đảm bảo rằng mỗi phần tử là số tự nhiên và chuyển đổi từng phần tử thành dạng chuẩn hóa. otự chuẩn hóa số (các phần tử của nó đã được chuẩn hóa, vì vậy tất cả những gì chúng ta phải làm là sắp xếp nó). Sau đó, .t~k|đảm bảo chúng ta có cấu trúc mà chúng ta muốn bằng cách kiểm tra xem phần tử lớn nhất và các phần tử khác có giống nhau không. Một danh sách trống (tức là 0) không có phần tử cuối cùng, do đó sẽ nhận được lỗi xác nhận với t; việc xử lý trường hợp này, thông qua việc đưa ra một dự phòng rõ ràng trong trường hợp danh sách đầu vào trống.


2

K (ngn / k) , 26 24 27 byte

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

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

đầu vào là một chuỗi json được phân tích cú pháp bởi `j@(cú pháp cụ thể cho ngn / k)

{ }là một hàm đệ quy với đối số x. nó trả về số tự nhiên được biểu thị bằng tập hợp xhoặc null ( 0N) nếu nó không đại diện cho một số.

$[ ; ; ]là nếu-thì-khác. 0 là falsey, các số nguyên khác là sự thật

!#xcác số nguyên từ 0 (đã bao gồm) đến độ dài của x(độc quyền)

^ không có

o'xđệ quy ( o) trên mỗi 'phần tử ( ) củax

# chiều dài

^ là không

~ không phải

@đóng vai trò như một động từ cuối cùng hình nộm để ~^được sáng tác với { }thay vì được áp dụng cho nó





0

Thạch , 8 byte

߀Ṣ
ÇṖƤƑ

Vì đầu vào phải là một chuỗi, bài nộp này chỉ có giá trị như một chương trình đầy đủ.

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm

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

߀Ṣ   Helper link. Argument: A (array)

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

Điều này mang lại một đại diện chính tắc của đầu vào, chỉ bao gồm các mảng được sắp xếp.

ÇṖƤƑ  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

Thạch , 7 byte

Ẉ<La߀Ạ

Đây là một cổng của câu trả lời Python của Leaky Nun .

Vì đầu vào phải là một chuỗi, bài nộp này chỉ có giá trị như một chương trình đầy đủ.

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm

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

Ẉ<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.

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.