ชุดนี้แสดงถึงจำนวนธรรมชาติหรือไม่


26

ในการตั้งทฤษฎีจำนวนธรรมชาติN={0,1,2,3,...}มักจะเข้ารหัสเป็นชุดบริสุทธิ์นั่นคือชุดที่มีเพียงชุดที่ว่างเปล่าหรือชุดอื่น ๆ ที่มีความบริสุทธิ์ อย่างไรก็ตามไม่ใช่ชุดบริสุทธิ์ทั้งหมดที่แสดงถึงจำนวนธรรมชาติ ความท้าทายนี้เกี่ยวกับการตัดสินใจว่าเซตที่บริสุทธิ์นั้นแสดงถึงการเข้ารหัสของจำนวนธรรมชาติหรือไม่

การเข้ารหัสของตัวเลขธรรมชาติทำงานในวิธีต่อไปนี้1 :

  • Zero คือชุดว่าง: Set(0)={}
  • สำหรับตัวเลขn>0 : Set(n)=Set(n1){Set(n1)}

ดังนั้นการเข้ารหัสของตัวเลขธรรมชาติสองสามตัวแรกคือ

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

งาน

  • รับสตริงที่เป็นตัวแทนของชุดบริสุทธิ์พิจารณาว่าชุดนี้เข้ารหัสจำนวนธรรมชาติตามการก่อสร้างดังกล่าวข้างต้น
  • อย่างไรก็ตามโปรดทราบว่าองค์ประกอบของชุดไม่ได้รับคำสั่งดังนั้น{{},{{}},{{},{{}}}}ไม่ได้เป็นเพียงตัวแทนที่ถูกต้องของ3เช่น{{{}},{},{{{}},{}}}หมายถึงชุดเดียวกัน
  • คุณอาจจะใช้[], ()หรือแทน<>{}
  • คุณอาจคิดว่าชุดจะได้รับโดยไม่มี,ตัวคั่น
  • คุณสามารถสันนิษฐานได้ว่าจะไม่มีองค์ประกอบใด ๆ ที่ซ้ำกันในการป้อนข้อมูลเช่น{{},{}}ไม่ใส่ที่ถูกต้องและที่ใส่เป็นรูปแบบที่ดีเช่นไม่{{},, {,{}}หรือคล้ายกัน

กรณีทดสอบ

จริง:

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

เท็จ:

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

ที่เกี่ยวข้อง: การก่อสร้างตามธรรมชาติ (เอาท์พุทการเข้ารหัสของจำนวนธรรมชาติที่กำหนด)
1ดูhttps://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers


13
กรณีทดสอบลักษณะเช่นโปรแกรมใน (ยัง) esolang unimplemented :)
เลน Ivanov

2
อินพุตสามารถเป็นโครงสร้างข้อมูล (รายการซ้อนกัน) แทนสตริงได้หรือไม่?
ngn

3
ฉันคิดว่ามันเป็นสมองที่สะบัดอยู่ครู่หนึ่ง
Belhenix

5
@ngn ไม่อินพุตจะต้องเป็นสตริง
Laikoni

4
@KirillL ในทางเทคนิคแล้วคำตอบเหล่านี้ไม่ถูกต้องที่จะเริ่มต้นด้วยความท้าทายที่ระบุไว้เสมอว่า "ให้สตริงแทนชุดบริสุทธิ์" แม้ว่าฉันจะเห็นจุดที่อนุญาตให้โครงสร้างข้อมูลแบบซ้อนช่วยให้โอกาสในการเล่นกอล์ฟที่น่าสนใจ อย่างไรก็ตามฉันพบว่ามันยากที่จะตัดสินใจว่าจะวาดเส้นบนโครงสร้างข้อมูลที่อนุญาตอะไรและอะไรที่จะหลีกเลี่ยงการใช้รูปแบบอินพุตที่ผ่อนปรนเกินไปดังนั้นฉันจึงตัดสินใจ จำกัด อินพุตเป็นสตริงเพื่อประโยชน์ของความเรียบง่ายและไม่กำกวม .
Laikoni

คำตอบ:


11

JavaScript (Node.js) , 53 48 44 ไบต์

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

ลองออนไลน์! กรณีทดสอบส่วนใหญ่ถูกขโมยอย่างไร้ยางอายจากคำตอบของ @ Arnauld คำอธิบาย: หากชุดหมายถึงจำนวนธรรมชาติดังนั้นจำนวนธรรมชาติที่มันหมายถึงจะต้องเท่ากับขนาดของชุดและ (ระบุว่าองค์ประกอบมีการรับประกันที่แตกต่างกัน) องค์ประกอบจะต้องเป็นตัวแทนของจำนวนธรรมชาติน้อยกว่ามัน และสิ่งเหล่านี้จะต้องมีความยาวที่สั้นกว่า นี่เป็นเรื่องจริงเล็กน้อยสำหรับชุดที่ว่างเปล่าของหลักสูตร แก้ไข: บันทึก 5 ไบต์ขอบคุณ @Arnauld บันทึกแล้ว 4 ไบต์ขอบคุณ @Cowsquack


!e[a.length-1]ควรบันทึก 3 ไบต์
Arnauld

1
@Arnauld หรือยังดีกว่าa[e.length]&&สำหรับ 5 ไบต์!
Neil

@ Joing Ugh ฉันเพิ่งคัดลอก Arnauld ... ค่าอินพุตสตริง 14 ไบต์ :-(
Neil

แน่นอนว่าg=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))จะได้ผล
Kritixi Lithos

@ Cowquack อาดีที่จริงแล้วช่วยประหยัด 4 ไบต์ขอบคุณ!
Neil

6

Python 3 , 69 58 44 ไบต์

11 ไบต์ขอบคุณ Erik the Outgolfer

14 ไบต์ขอบคุณ Mr. Xcoder

f=lambda s:all(len(e)<len(s)*f(e)for e in s)

ลองออนไลน์!


@ Mr.Xcoder เรียบร้อยแล้ว
Leaky Nun

โอ้วววการปรับปรุงดีมาก!
Mr. Xcoder

@ Mr.Xcoder แล้วตอนนี้ฉันก็รู้ว่ามันเป็นเช่นเดียวกับคำตอบของนีล ... ดังนั้นในทางเทคนิคนีลก็เอาชนะฉัน
Leaky Nun

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. สมัครในทุกระดับได้รับff[{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.หากไม่ใช่ เมื่อใช้เป็นฟังก์ชั่นมันจะ "ทำให้ปกติ" เป็นจำนวนธรรมชาติ (เช่นทำให้องค์ประกอบทั้งหมดเป็นปกติและเรียงลำดับตามค่าโดยโปรแกรมนี้ใช้รายการภายในไม่ได้ตั้งค่า) หรือ "โยนข้อยกเว้น" (จริง ๆ แล้วเป็นความล้มเหลวเช่นนี้ คือ Prolog) หากอินพุตไม่ใช่จำนวนธรรมชาติ

พฤติกรรมของโปรแกรมเต็มรูปแบบนั้นง่ายที่จะอธิบาย: มันเป็นการบอกเป็นนัยในการรักษาโปรแกรมเต็มรูปแบบของ Brachylog ที่ไม่มีคำสั่ง I / O พฤติกรรมที่เป็นปัญหาคือ "เรียกใช้ฟังก์ชันรับอินพุตจากอินพุตมาตรฐานและยืนยันว่าเอาต์พุตตรงกับคำอธิบายที่กำหนดโดยอาร์กิวเมนต์บรรทัดคำสั่งแรกหากการยืนยันล้มเหลวหรือโปรแกรมเกิดข้อผิดพลาดพิมพ์false.มิฉะนั้นพิมพ์true." . ในกรณีนี้อาร์กิวเมนต์บรรทัดคำสั่งหายไป (นั่นคือ "อะไรไป") ดังนั้นพฤติกรรมยกเว้น / ไม่มีข้อยกเว้นของฟังก์ชั่นให้เอาท์พุท

สำหรับพฤติกรรมการทำงาน:

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

หมายเลขธรรมชาติถูกกำหนดว่ามีสองส่วน: องค์ประกอบของหมายเลขธรรมชาติด้านล่างรวมกับตัวเลขเอง ดังนั้นองค์ประกอบทั้งหมดของมันก็เป็นตัวเลขตามธรรมชาติ เราสามารถรับรู้จำนวนธรรมชาติโดย a) ตรวจสอบว่าองค์ประกอบทั้งหมดของมันเป็นจำนวนธรรมชาติข) การตรวจสอบว่าองค์ประกอบที่ใหญ่ที่สุดของชุดเหมือนกันกับชุดที่ไม่มีองค์ประกอบที่ใหญ่ที่สุด

เมื่อเราใช้รายการมากกว่าชุด (เช่นวงเล็บเหลี่ยม) เราต้องใส่ลำดับที่สอดคล้องกันเพื่อเปรียบเทียบความเท่าเทียมกันในการทำงาน (ในกรณีนี้เรียงตาม "ค่า") ลำดับการจัดเรียงเริ่มต้นของ Brachylog จะเรียงลำดับคำนำหน้าของรายการก่อนรายการซึ่งหมายความว่ามันจะเรียงลำดับหมายเลขธรรมชาติตามค่าตัวเลข ดังนั้นเราสามารถเรียงลำดับหมายเลขทั้งหมดซ้ำเพื่อให้ได้ลำดับที่สอดคล้องกัน ในความเป็นจริงผ่านฟังก์ชั่นที่เรากำหนดแบบวนซ้ำเราสามารถบรรลุผลลัพธ์ทั้งสองในเวลาเดียวกัน: การเรียงลำดับองค์ประกอบของตัวเลขซ้ำและยืนยันว่าเป็นจำนวนธรรมชาติ

ฟังก์ชั่นนี้มีสี่ส่วนหลัก ↰ᵐคือการเรียกซ้ำเพื่อให้แน่ใจว่าแต่ละองค์ประกอบเป็นจำนวนธรรมชาติและแปลงเป็นองค์ประกอบตามปกติ onormalizes จำนวนตัวเอง (องค์ประกอบเป็นปกติแล้วดังนั้นสิ่งที่เราต้องทำคือการจัดเรียงมัน) จากนั้น.t~k|ตรวจสอบให้แน่ใจว่าเรามีโครงสร้างที่เราต้องการโดยตรวจสอบว่าองค์ประกอบที่ใหญ่ที่สุดและองค์ประกอบอื่น ๆ เหมือนกัน รายการที่ว่างเปล่า (เช่น 0) ไม่ได้มีองค์ประกอบสุดท้ายเพื่อจะได้รับความล้มเหลวในการยืนยันกับt; จัดการกรณีนี้ผ่านการให้ทางเลือกที่ชัดเจนในกรณีที่รายการเข้าเป็นที่ว่างเปล่า


2

K (ngn / k) , 26 24 27 ไบต์

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

ลองออนไลน์!

อินพุตเป็นสตริง json ที่แยกวิเคราะห์โดย`j@(ไวยากรณ์เฉพาะ ngn / k)

{ }เป็นฟังก์ชัน recursive xกับข้อโต้แย้ง มันจะส่งกลับจำนวนธรรมชาติที่แสดงโดยชุดxหรือ null ( 0N) ถ้ามันไม่ได้เป็นตัวแทนหนึ่ง

$[ ; ; ]ถ้าเป็นอย่างอื่น 0 คือเท็จ, จำนวนเต็มอื่น ๆ เป็นจริง

!#xจำนวนเต็มตั้งแต่ 0 (รวม) ถึงความยาวของx(พิเศษ)

^ ไม่มี

o'xการเรียกซ้ำ ( o) บนแต่ละ'องค์ประกอบ( ) ของx

# ความยาว

^ เป็นโมฆะ?

~ ไม่

@ทำหน้าที่เป็นคำกริยาจำลองสุดท้ายเพื่อที่จะได้รับ~และ^ประกอบกับ{ }แทนที่จะถูกนำไปใช้กับมัน



0

Japt , 9 ไบต์

ท่าเรือนีทางออก JS กรุณา upvote ว่าถ้าคุณกำลัง upvoting นี้

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߀Ạ

นี่คือพอร์ตของรั่วนูนคำตอบของงูหลาม

เนื่องจากอินพุตต้องเป็นสตริงการส่งนี้จึงใช้ได้เป็นโปรแกรมแบบเต็มเท่านั้น

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

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