Apakah Perangkat Ini Mewakili Nomor Alami?

26

Dalam teori himpunan, bilangan N={0,1,2,3,...} biasanya dikodekan sebagai set murni , yaitu set yang hanya berisi set kosong atau set lainnya yang murni. Namun, tidak semua set murni mewakili bilangan asli. Tantangan ini adalah tentang memutuskan apakah suatu set murni yang diberikan mewakili pengkodean bilangan alami atau tidak.

Pengkodean bilangan asli bekerja dengan cara berikut 1 :

  • Nol adalah set kosong:Set(0)={}
  • Untuk angka :n>0Set(n)=Set(n-1){Set(n-1)}

Jadi, penyandian beberapa bilangan asli pertama adalah

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

Tugas

  • Diberikan string yang mewakili himpunan murni, tentukan apakah himpunan ini mengkodekan angka alami sesuai dengan konstruksi di atas.
  • Namun, perhatikan bahwa elemen-elemen set tidak dipesan, jadi {{},{{}},{{},{{}}}} bukan satu-satunya representasi yang valid dari 3 seperti misalnya {{{}},{},{{{}},{}}} mewakili set yang sama.
  • Anda dapat menggunakan [], ()atau <>bukannya {}.
  • Anda dapat menganggap set diberikan tanpa ,pemisah sebagai.
  • Anda dapat mengasumsikan tidak akan ada elemen duplikat dalam input, misalnya {{},{}}bukan input yang valid, dan bahwa input tersebut terbentuk dengan baik, misalnya tidak {{},, {,{}}atau serupa.

Uji Kasus

Benar:

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

Salah:

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

Terkait: Konstruksi Alami (Keluaran pengodean himpunan angka alami yang diberikan.)
1 Lihat https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers

Laikoni
sumber
13
Kasus-kasus tes terlihat seperti sebuah program di (belum) esolang yang belum diterapkan :)
Galen Ivanov
2
dapatkah input menjadi struktur data (daftar bersarang) alih-alih sebuah string?
ngn
3
Kupikir itu Brain-flak untuk sesaat.
Belhenix
5
@ ngn Tidak, input harus berupa string.
Laikoni
4
@ KirillL. Secara teknis jawaban ini tidak valid untuk memulai karena tantangan selalu menyatakan "Diberikan string yang mewakili set murni", meskipun saya memang melihat titik yang memungkinkan struktur data bersarang memungkinkan peluang golf yang menarik. Namun, saya merasa sulit untuk memutuskan di mana harus menarik garis pada apa yang merupakan struktur data yang diizinkan dan apa yang tidak untuk menghindari penyalahgunaan format input yang terlalu lunak, jadi saya memutuskan untuk membatasi input menjadi string demi kesederhanaan dan ketidakjelasan. .
Laikoni

Jawaban:

11

JavaScript (Node.js) , 53 48 44 byte

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

Cobalah online! Kasus uji sebagian besar dicuri tanpa malu-malu dari jawaban @ Arnauld. Penjelasan: Jika suatu himpunan mewakili bilangan alami, maka bilangan alami yang diwakilinya harus sama dengan ukuran himpunan, dan (mengingat bahwa unsur-unsur dijamin berbeda), unsur-unsur harus merupakan representasi dari bilangan alami kurang dari itu, dan karenanya harus memiliki panjang yang lebih pendek. Ini sepele dari set kosong tentu saja. Sunting: Disimpan 5 byte berkat @Arnauld. Disimpan 4 byte berkat @Cowsquack.

Neil
sumber
!e[a.length-1]harus menghemat 3 byte
Arnauld
1
@Arnauld Atau lebih baik lagi, a[e.length]&&selama 5 byte!
Neil
@ JoKing Ugh, saya baru saja menyalin Arnauld ... biaya input string 14 byte :-(
Neil
Tentunya, g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))akankah berhasil?
Kritixi Lithos
@ Cowsquack Ah, bagus, itu sebenarnya menghemat 4 byte, terima kasih!
Neil
6

Python 3 , 69 58 44 byte

11 byte berkat Erik the Outgolfer.

14 byte terima kasih kepada Tn. Xcoder.

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

Cobalah online!

Biarawati Bocor
sumber
@ Mr.Xcoder selesai
Leaky Nun
Oh wow, peningkatan yang bagus!
Tn. Xcoder
@ Mr.Xcoder dan kemudian sekarang saya menyadari bahwa itu sama dengan jawaban Neil ... jadi secara teknis Neil mengalahkan saya
Leaky Nun
5

Bahasa Wolfram (Mathematica) , 60 59 byte

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

Cobalah online!

Inti dari solusi ini adalah fungsinya

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

yang mengubah daftar formulir {0,1,2,...,n-1}dalam urutan apa pun menjadi keluaran n(khususnya, dikonversi {}ke 0), dan mengubah apa pun menjadi bilangan real E.

Panggil fungsi ini f. Diberikan input seperti "{{{}},{}}", kami melakukan hal berikut:

  1. Ubah string menjadi ekspresi Mathematica.
  2. Terapkan fdi setiap level, dapatkan f[{f[{f[{}]}], f[{}]}].
  3. Mengevaluasi semua fakan menghasilkan bilangan alami untuk input yang mewakilinya. Misalnya, f[{f[{f[{}]}], f[{}]}]= f[{f[{0}], 0}]= f[{1, 0}]=2 . Yang lain akan menghasilkan E.
  4. Kami menguji apakah hasilnya adalah bilangan alami dengan memeriksa jika tidak E.
Misha Lavrov
sumber
3

Brachylog (v2), 9 byte

↰ᵐo.t~k|Ė

Cobalah online!

Seperti biasa untuk masalah , ini adalah program lengkap. Input dari input standar, menggunakan tanda kurung siku. Keluaran ke keluaran standar sebagai true.lawan false..

Penjelasan

Meskipun saya katakan di atas bahwa ini adalah program lengkap, sebenarnya lebih menarik dari itu; itu baik program penuh dan fungsi. Ketika digunakan sebagai program lengkap, ia mencetak true.jika set adalah bilangan alami, ataufalse. jika tidak. Ketika digunakan sebagai fungsi, ia "menormalkan" bilangan alami (yaitu menormalkan semua elemen dan mengurutkannya berdasarkan nilai; program ini menggunakan daftar secara internal, bukan set), atau "melempar pengecualian" (sebenarnya merupakan kegagalan, karena ini adalah Prolog) jika inputnya bukan bilangan asli.

Perilaku program lengkap cukup mudah untuk dijelaskan: itu murni tersirat dalam perlakuan Brachylog terhadap program penuh yang tidak mengandung instruksi I / O. Perilaku yang dimaksud adalah "menjalankan fungsi, mengambil input dari input standar, dan menyatakan bahwa outputnya cocok dengan deskripsi yang diberikan oleh argumen baris perintah pertama; jika pernyataan gagal atau program melempar pengecualian, cetak false., atau cetak true." . Dalam kasus ini, argumen baris perintah tidak ada (yaitu "apa pun berjalan"), sehingga perilaku pengecualian / tanpa pengecualian fungsi memberikan output.

Adapun perilaku fungsi:

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

Bilangan alami didefinisikan sebagai mengandung dua bagian: unsur-unsur bilangan alami di bawah ini, disatukan dengan nomor itu sendiri. Dengan demikian, semua elemennya adalah bilangan asli. Kita dapat mengenali bilangan asli dengan a) memverifikasi bahwa semua elemennya adalah bilangan alami, b) memverifikasi bahwa elemen terbesar himpunan identik dengan himpunan tanpa elemen terbesarnya.

Ketika kita menggunakan daftar daripada set (dengan demikian tanda kurung siku), kita perlu menempatkannya dalam urutan yang konsisten agar perbandingan kesetaraan berfungsi (dalam hal ini, diurutkan berdasarkan "nilai"). Urutan sortir default Brachylog akan mengurutkan awalan daftar sebelum daftar itu sendiri, yang dengan mudah berarti bahwa ia akan mengurutkan angka alami dengan nilai numerik. Jadi kita bisa menyortir semua nomor kita secara rekursif untuk membuatnya menjadi urutan yang konsisten. Faktanya, melalui fungsi yang kita definisikan secara rekursif, kita dapat mencapai kedua hasil pada saat yang sama: menyortir elemen angka secara rekursif, dan memverifikasi bahwa itu adalah bilangan alami.

Dengan demikian fungsinya memiliki empat bagian utama. ↰ᵐadalah panggilan rekursif, memastikan bahwa setiap elemen adalah bilangan alami, dan mengubahnya setiap elemen menjadi bentuk normal. oyang menormalkan angka itu sendiri (elemen-elemennya sudah dinormalisasi, jadi yang harus kita lakukan adalah mengurutkannya). Kemudian .t~k|memastikan kita memiliki struktur yang kita inginkan dengan memeriksa bahwa elemen terbesar dan elemen lainnya sama. Daftar kosong (mis. 0) tidak memiliki elemen terakhir, sehingga akan mendapatkan kegagalan pernyataan dengan t; yang menangani kasus ini, melalui memberi fallback eksplisit dalam kasus di mana daftar masukan kosong.

ais523
sumber
2

K (ngn / k) , 26 24 27 byte

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

Cobalah online!

input adalah string json yang diuraikan oleh `j@(sintaks khusus untuk ngn / k)

{ }adalah fungsi rekursif dengan argumen x. itu mengembalikan nomor alami yang diwakili oleh set x, atau null ( 0N) jika tidak mewakili satu

$[ ; ; ]adalah jika-maka-lagi. 0 adalah falsey, bilangan bulat lainnya benar

!#xbilangan bulat dari 0 (inklusif) hingga panjang x(eksklusif)

^ tanpa

o'xrekursi ( o) pada setiap 'elemen ( ) darix

# panjangnya

^ adalah null?

~ tidak

@bertindak sebagai kata kerja dummy terakhir sehingga ~dan ^dikomposisi dengan { }bukannya diterapkan padanya

ngn
sumber
1

Jelly , 10 byte

ẈṢ‘⁼Jȧ@ßƇƑ

Cobalah online!

Erik the Outgolfer
sumber
0

Japt , 9 byte

Solusi JS Port of Neil . Harap pilih itu jika Anda membatalkan ini.

e@Ê>XÊ©ßX

Cobalah atau jalankan semua test case

              :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
Shaggy
sumber
0

Merah , 81 byte

func[a][p: 1 foreach e to-block a[p: p *(pick[1 0](length? e)< length? a)* f e]p]

Cobalah online!

Mirip dengan jawaban Leaky Nun's Python 3

Galen Ivanov
sumber
0

Jelly , 8 byte

߀Ṣ
ÇṖƤƑ

Karena input harus berupa string, pengiriman ini hanya berlaku sebagai program lengkap.

Cobalah online! atau verifikasi semua kasus uji

Bagaimana itu bekerja

߀Ṣ   Helper link. Argument: A (array)

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

Ini menghasilkan representasi kanonik input, yang hanya terdiri dari array yang diurutkan.

ÇṖƤƑ  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.
Dennis
sumber
0

Jelly , 7 byte

Ẉ<La߀Ạ

Ini adalah port jawaban Python Leaky Nun .

Karena input harus berupa string, pengiriman ini hanya berlaku sebagai program lengkap.

Cobalah online! atau verifikasi semua kasus uji

Bagaimana itu bekerja

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