Bu Set Doğal bir Sayıyı temsil ediyor mu?


26

Grubu Teorik olarak, doğal sayılar N={0,1,2,3,...} genellikle saf kümeler olarak kodlanır , yani yalnızca boş kümeyi veya diğer saf kümeleri içeren kümelerdir. Ancak, tüm saf kümeler doğal sayıları temsil etmez. Bu zorluk, verilen bir saf kümenin bir doğal sayı kodlamasını temsil edip etmemesine karar vermektir.

Doğal sayıların kodlanması şu şekilde çalışır 1 :

  • Sıfır boş küme: Set(0)={}
  • n>0 bir sayı için : Set(n)=Set(n1){Set(n1)}

Böylece, ilk birkaç doğal sayının kodlaması

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

Görev

  • Saf bir seti temsil eden bir dize verildiğinde, bu setin yukarıdaki yapıya göre doğal bir sayıyı kodlayıp kodlamadığını belirleyin.
  • Bununla birlikte, kümenin öğelerinin sıralı olmadığına dikkat edin, bu nedenle {{},{{}},{{},{{}}}}3 geçerli olduğu tek örnek değil; örneğin, {{{}},{},{{{}},{}}} aynı kümeyi temsil eder.
  • Sen kullanabilir [], ()ya da <>yerine {}.
  • Setlerin ,ayırıcı olmadan verildiğini varsayabilirsiniz .
  • Sen mesela, girişteki yinelenen unsurlar olmayacak varsayabiliriz {{},{}}geçerli bir giriş değildir ve giriş iyi biçimlendirilmiş olması, örneğin hayır {{},, {,{}}ya da benzer.

Test Kılıfları

Doğru:

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

Yanlış:

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

İlgili: Doğal Yapı (Belirli bir doğal sayının kümesinin kodlamasını çıkar.)
1 Bkz. Https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers


13
Test vakaları (henüz) uygulanmamış bir esolang'da bir program gibi görünüyor :)
Galen Ivanov

2
giriş bir dize yerine bir veri yapısı (iç içe listeler) olabilir mi?
21'de

3
Bir an için Brain-Flak olduğunu sanıyordum .
Belhenix

5
@ Hayır, giriş bir dize olmalı.
Laikoni

4
@KirillL. Teknik olarak bu cevaplar, her zaman "Saf kümesi temsil eden bir dize verildiğinde" olarak belirtilen zorlukla başlayacağınız için geçerli değildi, ancak iç içe geçmiş veri yapılarına izin vermenin ilginç golf fırsatları için olanak sağladığı noktasını görüyorum. Ancak, izin verilen veri yapısının ne olduğu ve çok cömert bir giriş biçiminin kötüye kullanılmasından kaçınılmaması için hangi çizginin çizileceğine karar vermekte zorlanıyorum, bu yüzden girdilerin basitlik ve açıklık adına dizelere sınırlandırılmasına karar verdim .
Laikoni

Yanıtlar:


11

JavaScript (Node.js) , 53 48 44 bayt

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

Çevrimiçi deneyin! Test vakaları çoğunlukla @ Arnauld'un cevabından utanmadan çalındı. Açıklama: Bir küme doğal bir sayıyı temsil ediyorsa, temsil ettiği doğal sayı kümenin boyutuna eşit olmalıdır ve (öğelerin farklı olması garanti edilirse), öğeler doğal sayıların kendisinden daha az gösterimi olmalıdır, ve bu nedenle bunlar daha kısa uzunluklara sahip olmalıdır. Bu boş tabiki set için gerçekten doğrudur. Düzenleme: @Arnauld sayesinde 5 bayt kaydedildi. @Cowsquack sayesinde 4 bayt kaydedildi.


!e[a.length-1]3 bayt kurtarmalı
Arnauld

1
@Arnauld Veya daha iyi, hala a[e.length]&&5 byte!
Neil

@JoKing Ugh, az önce Arnauld'u kopyaladım ... string girişi maliyeti 14 bayt :-(
Neil

Elbette g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))işe yarar mı?
Kritixi Lithos,

@Cowsquack Ah, güzel, bu aslında 4 byte kazandırır, teşekkürler!
Neil


5

Wolfram Dili (Mathematica) , 60 59 bayt

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

Çevrimiçi deneyin!

Bu çözümün özü işlevidir

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

hangi formda bir listesini dönüştürür {0,1,2,...,n-1}çıkış içine herhangi bir sırada n(özellikle, bu dönüştürür {}için 0), ve dönüşüm başka bir şey gerçek sayıya E.

Bu fonksiyonu çağır f. Gibi bir giriş göz önüne alındığında "{{{}},{}}", biz aşağıdakileri yapın:

  1. Dizeyi bir Mathematica ifadesine dönüştürün.
  2. fHer seviyede uygulayın f[{f[{f[{}]}], f[{}]}].
  3. Tüm değerlendirme, fonu temsil eden bir girdi için doğal bir sayı üretecektir. Örneğin, f[{f[{f[{}]}], f[{}]}]= f[{f[{0}], 0}]= f[{1, 0}]= 2. Başka bir şey üretecek E.
  4. Sonuçta doğal bir sayı olup olmadığını test ederiz, olmadığını kontrol ederek E.

3

Brachylog (v2), 9 bayt

↰ᵐo.t~k|Ė

Çevrimiçi deneyin!

için her zamanki gibi , bu tam bir programdır. Köşeli parantez kullanarak standart girdiden giriş yapın. Standart çıktıya true.karşı çıktı false..

açıklama

Yukarıda bunun tam bir program olduğunu söylememe rağmen, aslında bundan daha ilginç; öyle hem tam programı ve fonksiyonu. Tam program olarak kullanıldığında true., set doğal bir sayıysa veya false.değilse de yazdırır . İşlev olarak kullanıldığında, doğal bir sayıyı "normalleştirir" (yani tüm öğelerini normalleştirir ve değere göre sıralar; bu program dahili olarak kümeleri değil listeleri kullanır) veya "istisna atar" (aslında bir hata Prolog ise) giriş doğal bir sayı değilse.

Programın tüm davranışını açıklamak yeterince kolaydır: Brachylog’un G / Ç talimatı içermeyen tüm programları tedavi etmesinde tamamen gizlidir. Söz konusu davranış "işlevi çalıştırmak, girdisini standart girdiden almak ve çıktısının ilk komut satırı argümanı tarafından verilen tanımla aynı olduğunu iddia etmek; iddia başarısız olursa veya program bir istisna atarsa, yazdır false., aksi halde yazdır true." dır. . Bu durumda, komut satırı argümanı eksik (yani "her şey gider"), bu nedenle işlevin istisna / istisnasız davranışı çıktı verir.

İşlev davranışı gelince:

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

Doğal bir sayı iki bölüm içerecek şekilde tanımlanır: aşağıdaki doğal sayının elemanları, sayının kendisi ile birlikte. Böylece, tüm unsurları aynı zamanda doğal sayılardır. Doğal sayıyı a ile anlayabiliriz: a) tüm öğelerinin doğal sayılar olduğunu doğrulayarak, b) kümenin en büyük öğesinin kümesinin en büyük öğesi olmadan aynı olduğunu doğrulayarak.

Kümeler yerine listeleri (yani köşeli parantezleri) kullanırken, eşitlik karşılaştırmalarının çalışması için bunları tutarlı bir sıraya koymamız gerekir (bu durumda, "değer" e göre sıralanmış). Brachylog'un varsayılan sıralama düzeni, listenin kendisinden önce bir listenin önekini sıralar; bu, doğal sayıları sayısal değere göre sıralayacağı anlamına gelir. Böylece tüm sayıları tutarlı bir sıraya sokmak için tekrar tekrar sıralayabiliriz. Aslında, özyinelemeli olarak tanımladığımız işlevle aynı anda her iki sonucu da elde edebiliriz: sayının öğelerini özyinelemeli olarak sıralamak ve bunun doğal bir sayı olduğunu doğrulamak

Böylece işlev dört ana parçadan oluşur. ↰ᵐözyinelemeli çağrıdır, her bir öğenin doğal bir sayı olmasını sağlar ve her bir öğeyi normalleştirilmiş bir forma dönüştürür. osayının kendisini normalleştirir (elemanları zaten normalize edilmiştir, bu yüzden tek yapmamız gereken sıralamaktır). Sonra .t~k|en büyük elemanın ve diğer elemanların aynı olup olmadığını kontrol ederek istediğimiz yapıya sahip olduğumuzu garanti eder. Boş bir liste (yani 0) son bir elemana sahip değildir t; giriş listesi boş durumda açık Yedek özelliği veren aracılığıyla, bu durumda işler.


2

K (ngn / k) , 26 24 27 bayt

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

Çevrimiçi deneyin!

giriş, tarafından ayrıştırılan bir json dizesidir `j@(ngn / k'ye özgü sözdizimi).

{ }argümanı olan özyinelemeli bir işlevdir x. set tarafından temsil edilen doğal sayıyı x, 0Neğer temsil etmiyorsa null ( ) değerini döndürür .

$[ ; ; ]eğer-o zaman-başka. 0 falsey, diğer tamsayılar truthy

!#xuzunluğuna 0 (dahil) dan tamsayılar x(hariç)

^ olmadan

o'xrecursion ( ) öğesinin oher ( ') öğesindex

# uzunluk

^ boş mu?

~ değil

@kukla bir son fiil gibi davranır ~ve ona uygulamak yerine ^bestelendi{ }





0

Jöle , 8 bayt

߀Ṣ
ÇṖƤƑ

Giriş bir dize olması gerektiğinden, bu gönderim yalnızca tam bir program olarak geçerlidir.

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın

Nasıl çalışır

߀Ṣ   Helper link. Argument: A (array)

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

Bu, yalnızca sıralanmış dizilerden oluşan girdinin kanonik bir gösterimini sağlar.

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

Jöle , 7 bayt

Ẉ<La߀Ạ

Bu, Sızdıran Rahibe'nin Python cevabının limanı .

Giriş bir dize olması gerektiğinden, bu gönderim yalnızca tam bir program olarak geçerlidir.

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın

Nasıl çalışır

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.