Doğal sayıları setlerle oluşturma


17

Bu yapı Doğal Sayıları temsil etmenin bir yoludur.

Bu gösterimde, 0 boş küme olarak tanımlanır ve diğer tüm sayılar için n, {0} ve {n-1} birleşimidir.

Örneğin, yapı 3 için algoritmayı takip edebiliriz:

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

Görev

Tahmin edebileceğiniz gibi, göreviniz doğal bir sayı (sıfır dahil) almak ve yapısını çıkarmaktır.

Tercih ettiğiniz dil bu tür nesneleri destekliyorsa, dize veya ayarlanmış bir nesne olarak çıktı alabilirsiniz.

Bir dize olarak çıktı almayı seçerseniz, küme parantezi ( {}) içeren bir kümeyi temsil etmelisiniz . İsteğe bağlı olarak boş grubu şu øşekilde temsil edebilirsiniz (aksi takdirde giriş içermeyen bir küme olmalıdır {}). Kümedeki girdiler arasına ve arkasına virgül ve boşluk eklemeyi de seçebilirsiniz.

Sipariş önemli değil, ancak olabilir değil (örneğin setleri size çıkışını herhangi tekrarlanan elemanları var {ø,ø})

Bu bu yüzden amaç en az bayt

Test senaryoları

İşte bazı örnek çıktıları olan bazı test durumları.

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

4
@ mbomb007 Tanımın "yanlış" olup olmadığı önemli değildir. Hala iyi bir meydan okuma (ve farklı bir meydan okuma).
Martin Ender


4
@ mbomb007 Bu testte verilen test senaryoları ve tanım eşleşir ve diğer testlerden farklıdır. Bir şey varsa, bağlantı geliştirilebilir, ancak bağlantının kendisiyle ilgili olduğunu düşünmüyorum.
Martin Ender

Buna Von Neumann inşası adını verdi ve bu meydan okuma bu değil. Dup budur. Her doğal sayının, tüm doğal sayılardan daha az olan kümeye eşit olduğu
görülür

1
Bir işlevden liste listesi gibi set benzeri bir nesneyi döndürebilir miyiz veya dilimizin temsilini STDOUT'a yazdırabilir miyiz?
Dennis

Yanıtlar:


12

Python , 28 bayt

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

Çevrimiçi deneyin!

Bu, soruna oldukça yumuşak bir çözümdür. Sıfırdan büyük sayılar için dize formülü ile temsil alabilirsiniz "{{}"*x+"}"*x. Ancak bu, boş dize olduğunda sıfır için çalışmaz. Bu gerçeği or, boş seti geri döndürmek için a kısa devre yapmak için kullanabiliriz.

Bu sorunu çözmek için python yerleşik nesneleri kullanmak istedim ama ne yazık ki:

TypeError: unhashable type: 'set'

Python'daki kümelerin içine kümeler koyamazsınız.


2
Sen taşıyabilirsiniz xiçin "{{}"*x+x*"}"orbir byte tasarrufu
Çubuk

1
f=kaldırılabilir.
Yytsi


Orada frozensetkimse yok ama bayt yok ...
Esolanging Fruit

9

Haskell , 37 bayt

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

Çevrimiçi deneyin!

10 dakika öncesine kadar böyle bir cevap bana hiç mantıklı gelmeyecekti. Tüm krediler bu ipuçlarına cevap veriyor .

Temelde, kullandığımız >>olarak concat $ replicate(ama sadece n yerine o n elemanlı bir liste geçirerek) ve =<<olarak concatMap, listede daha sonra n kere dizelerin her kopyalayan ve tek bir dize halinde sonucun artarda.

0Vaka boş bir dize dönecekti olarak ayrı ayrı ele alınır.


@Laikoni Ben de böyle bir şey denedim, ancak f 1düzgün çalışmasını sağlamak için de özel bir davaya ihtiyacınız olacak
Leo

Aslında. Sonra sürümünüzü daha çok seviyorum.
Laikoni

6

JavaScript, 28 bayt

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

Dizileri kullanarak kümeleri temsil eder. 38 bayt geri dönüşümsüz çözüm:

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

Örnek çıktı dizelerini döndürür.


6

Mathematica, 27 bayt

Bu bayt sayımında iki çözümüm var:

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

1
32'de ramak kala bayt: #//.{1->{{}},x_/;x>1->{{},x-1}}&. Her ne kadar giriş 0 berbat sanırım
Greg Martin

5

Perl 6 , 37 bayt

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

Dene

Expanded:

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

Bir teklif sonlandırıcısı eksik mi yoksa :bu Perl 6 için yeni bir şey mi?
CraigR8806

@ CraigR8806 Zarflar için kullanıldığından Perl 6'daki alıntı yapılarını sınırlamak için iki nokta üst üste kullanamazsınız. (genişletilmiş versiyona bakınız)
Brad Gilbert b2gills


4

Retina , 22 bayt

.+
$*
\`.
{{}
{

^$
{}

Çevrimiçi deneyin!

açıklama

.+
$*

Girişi tekli olarak dönüştürün.

\`.
{{}

Her tekli basamağı ile değiştirin {{}ve sonucu bir satır besleme ( \) olmadan yazdırın .

{

Açıklıkları kaldırın {, böylece kalanlar }tam olarak tüm setleri kapatmak için yazdırmamız gerekenlerdir. Bununla birlikte, yukarıdaki prosedür 0hiçbir şey yazdırmayacağımız giriş için başarısız olur . Yani...

^$
{}

Dize boşsa, boş kümeyle değiştirin.


Retina'da bir dizeyi nasıl tekrarlayacağımı merak ediyordum n...
Neil

4

Brain-Flak , 135 bayt

İçin +1 içerir -A

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

Çevrimiçi deneyin!

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

Lri{]La|}*p

Liste listelerinden oluşan set benzeri bir nesne yazdırır. CJam, boş listeleri boş dizeler olarak yazdırır, çünkü listeler ve dizeler neredeyse değiştirilebilirdir.

Çevrimiçi deneyin!

açıklama

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

Eski yanıt, 21 18 bayt

Bu, iç içe bir liste yapısının yazdırılmasının TAMAM olduğu onaylanmadan önceydi. Dize tekrarlama algoritmasını kullanır.

Martin Ender sayesinde 3 bayt tasarruf etti!

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

açıklama

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

Jöle , 6 bayt

⁸,⁸Q$¡

Bu, STDIN'den bir tam sayı okuyan ve düzensiz bir dizi döndüren niladik bir bağlantıdır.

Çevrimiçi deneyin!

Nasıl çalışır

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

Kardinal , 51 50 bayt

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

Çevrimiçi deneyin!

açıklama

%:#
x

Girişi alın ve # tuşundan aşağı ve sola gönderin

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

"{" Bir kez yazdırdıktan sonra "{} {" n> 1 ise n-1 kez yazdırın, sonra n> 0 ise "{}" yazdırın

       #

v <8/ ?<
>  8\

İlk döngü tamamlanana kadar giriş değerini tutun

v"}"<
>?-?^

"}" Bir kez yazdırın ve n> 1 ise n-1 kez tekrarlayın


2

AHK, 55 bayt

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

Bu en kısa cevap değil, ama bundan zevk aldım çünkü AutoHotkey'in kendine özgü ifadeleri bu özyineleme yönteminin süper yanlış görünmesini sağlıyor . Ifve Loopifadeler, köşeli parantez kullanılmadığında dahil edilen tek satırın bir sonraki satır olduğunu varsayar. Kıvırcık parantezler kaçış karakterleridir, bu nedenle bunları metin olarak kullanmak için diğer kıvırcık parantezlerle kaçmanız gerekir. Ayrıca, değişken 1ilk geçirilen argümandır. Bu tidbitleri bilmeden kodu okuduğumda, mantık şöyle görünür :

  • 1 = 0 ise, s equal to the wrong answer
  • Loop and add a bunch of brackets to the beginning and a few to the end every time
  • Ortaya çıkan dizeyi geçerli pencereye göndererek geri dönme

Tüm parantez kaçış karakterleri olmadan, şöyle görünecektir:

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

1

JavaScript 50 bayt

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

bir sayı 0'a eşit olduğunda, JavaScript için yanlış bir değerdir. Üçlü ifadelerinizi tersine çevirirseniz == 0 değerini kaldırabilirsiniz
fəˈnɛtɪk

1

tinylisp , 52 bayt

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

Çevrimiçi deneyin! (kablo demeti).

açıklama

Not (cons x (cons y nil))Eğer içeren bir liste oluşturmak nasıl xve yLisp'te.

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

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

Try it online!

Input on stdin, output on stdout.

This works by computing a formula for the desired output as a base-256 number. The P command in dc is then used to print the base-256 number as a string.


Further explanation:

Let n be the input n. The dc program computes the sum of

A = floor(256^n / 255) * 125     (BF is interpreted by dc as 11*10+15 = 125)

and

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

 

For A:

Observe that 1 + 256 + 256^2 + ... + 256^(n-1) equals (256^n-1)/255, by the formula for a geometric progression, and this equals floor(256^n / 255). So this is the number consisting of n 1's in base 256.

When you multiply it by 125 to get A, the result is the number consisting of n 125's in base 256 (125 is a single digit in base 256, of course). It's probably better to write the digits in base 256 as hex numbers; 125 is hex 7D, so A is the base-256 number consisting of n 7D's in a row.

 

B is similar:

This time observe that 1 + 16777216 + 16777216^2 + ... + 16777216^(n-1) equals (16777216^n - 1)/16777215, and this equals floor(16777216^n/16777215).

Now, 256^3 = 16777216, and 8^8-1 = 16777215, so this is what we're computing as floor((256^n)^3 / (8^8-1)).

From the geometric series representation, this number in base 256 is 100100100...1001 with n of the digits being 1 and the rest of the digits being 0.

This is multiplied by 8092541, which is 7B7B7D in hexadecimal. In base 256, this is a three-digit number consisting of the digits 7B, 7B, and 7D (writing those digits in hex for convenience).

It follows that the product written in base 256 is a 3n-digit number consisting of the 3 digits 7B 7B 7D repeated n times.

This is multiplied by 256^n, resulting in a 4n-digit base-256 number, consisting of the 3 digits 7B 7B 7D repeated n times, followed by n 0's. That's B.

 

Adding A + B now yields the 4n-digit base-256 number consisting of the 3 digits 7B 7B 7D repeated n times, followed by n 7D's. Since 7B and 7D are the ASCII codes for { and }, respectively, this is the string consisting of n copies of {{} followed by n copies of }, which is exactly what we want for n > 0. The P command in dc prints a base-256 number as a string, just as we need.

Unfortunately, n=0 has to be treated as a special case. The computation above happens to yield a result of 0 for n=0; in that case, I've just hard-coded the printing of the string {}.


That's a very interesting approach using the less known behavior of that printing command. Nicely done! An explanation of how this works would improve the answer.
seshoumara

@seshoumara Thanks -- I've added a detailed explanation.
Mitchell Spector


0

Batch, 88 bytes

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

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

(newline for aesthetics) Since it's brainf***, it takes input as ascii char codes (input "a" corresponds to 96)

Braineasy, 60 bytes

Also, in my custom language (brainf** based, interpreter here):

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

You have to hardcode the program input into the interpreter because i'm lazy.


Welcome to the site! Why is there a []? It seems like it could be removed
Post Rock Garf Hunter

If you don't have that, it will output an extra {} at the end (it infinitely loops).
internet_user

0

05AB1E, 5 3 bytes

F¯)

Try it online!

This version is after he clarified that sets are okay.

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

Old version (that makes use of ø):

05AB1E, 5 4 bytes

FX¸)

Try it online!

Where 1 is equivalent to ø.

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