세트로 자연수 구성


17

이 구성은 자연수를 나타내는 방법입니다.

이 표현에서 0은 빈 세트로 정의되며 다른 모든 숫자의 경우 n은 {0}과 {n-1}의 합집합입니다.

예를 들어 3을 구성하기 위해 알고리즘을 따를 수 있습니다.

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

직무

짐작할 수 있듯이, 자연수 (0 포함)를 가져 와서 구성을 출력하는 것입니다.

선택한 언어가 해당 객체를 지원하는 경우 문자열 또는 세트 객체로 출력 할 수 있습니다.

문자열로 출력하도록 선택하면 중괄호 ( {})로 세트를 나타내야합니다 . 선택적으로 빈 세트를로 표시 할 수 있습니다 ø(그렇지 않으면 항목이없는 세트 여야 함 {}). 세트의 항목 사이 및 뒤에 쉼표와 공백을 추가하도록 선택할 수도 있습니다.

주문은 중요하지 않습니다,하지만 당신은 할 수 없습니다 (예를 세트하면 출력을 어떤 반복 요소가 {ø,ø})

이것은 이므로 목표는 가장 적은 바이트를 갖는 것입니다.

테스트 사례

다음은 일부 예제 출력이있는 테스트 사례입니다.

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

4
@ mbomb007 정의가 "잘못된"인지 여부는 중요하지 않습니다. 여전히 좋은 도전입니다 (그리고 다른 도전입니다).
마틴 엔더


4
@ mbomb007이 챌린지에 제공된 테스트 사례와 정의는 일치하며 다른 챌린지와 다릅니다. 어떤 것이라도, 링크는 개선 될 수 있지만, 링크는 도전 자체와 관련이 없다고 생각합니다.
Martin Ender

그는 그것을 폰 노이만 (Von Neumann) 건축이라고 불렀는데, 이것이이 도전이 아닙니다. 그것이 dup입니다. 각 자연수는 자연수보다 작은 모든 자연수의 집합과 같습니다.
mbomb007

1
함수의 목록 목록과 같은 세트와 유사한 객체를 반환하거나 언어 표현을 STDOUT에 인쇄 할 수 있습니까?
Dennis

답변:


12

파이썬 , 28 바이트

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

온라인으로 사용해보십시오!

이것은 문제에 대한 확실한 해결책입니다. 0보다 큰 숫자의 경우 문자열 수식으로 표현을 얻을 수 있습니다 "{{}"*x+"}"*x. 그러나 이것이 빈 문자열 인 경우 0에서는 작동하지 않습니다. 이 사실을 사용 or하여 빈 세트를 반환 하기 위해 단락을 할 수 있습니다 .

이 문제를 해결하기 위해 파이썬의 내장 세트 객체를 사용하고 싶지만 불행히도 :

TypeError: unhashable type: 'set'

파이썬에서는 세트 안에 세트를 넣을 수 없습니다.


2
바이트 x"{{}"*x+x*"}"or절약 할 수 있습니다
Rod

1
f=제거 될 수있었습니다.
Yytsi


거기에 frozenset아무도 바이트가 없습니다 ...
Esolanging 과일

9

하스켈 , 37 바이트

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

온라인으로 사용해보십시오!

10 분 전까지는 이와 같은 대답이 의미가 없었습니다. 모든 크레딧은 이 팁 답변으로 이동하십시오 .

기본적으로 우리가 사용 >>으로 concat $ replicate(단순히 N 대신 그것을 해당 요소들의리스트를 전달)과 =<<같은 concatMap리스트의 다음 N 배 스트링 각각 복제 및 하나의 문자열로 결과를 연접.

0경우는 빈 문자열을 반환 별도로 처리됩니다.


@Laikoni 저도 그런 것을 시도했지만 f 1제대로 작동 하려면 특별한 경우가 필요 합니다
Leo

과연. 그렇다면 나는 당신의 버전을 더 좋아합니다.
Laikoni

6

자바 스크립트, 28 바이트

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

배열을 사용하여 집합을 나타냅니다. 38 바이트 비 재귀 솔루션 :

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

예제 출력 문자열을 반환합니다.


6

Mathematica, 27 바이트

이 바이트 수에는 두 가지 해결책이 있습니다.

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

1
32 바이트에서 거의 빠짐 : #//.{1->{{}},x_/;x>1->{{},x-1}}&. 나는 그것이 입력 0을 엉망으로 생각하지만
Greg Martin

5

펄 6 , 37 바이트

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

시도 해봐

넓히는:

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

따옴표 종결자가 누락되었거나 :Perl 6의 새로운 기능입니까?
CraigR8806

@ CraigR8806 부사에 사용되기 때문에 콜론을 사용하여 Perl 6의 인용 구문을 구분할 수 없습니다. (확장 된 버전을보십시오)
Brad Gilbert b2gills

5

05AB1E , 6 5 바이트

암호

ƒ)¯sÙ

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오! .

설명

ƒ       # For N in range(0, input + 1)..
 )      #   Wrap the entire stack into an array
  ¯     #   Push []
   s    #   Swap the two top elements
    Ù   #   Uniquify the array

F¯)작동하지 않습니까?
Magic Octopus Urn

@carusocomputing n=0출력이 비어 있기 때문에 (빈 세트가 아님) 작동하지 않는다고 생각합니다 .
Adnan

4

망막 , 22 바이트

.+
$*
\`.
{{}
{

^$
{}

온라인으로 사용해보십시오!

설명

.+
$*

입력을 단항으로 변환하십시오.

\`.
{{}

각 단항 숫자를 {{}바꾸고 줄 바꿈없이 결과를 인쇄하십시오 ( \).

{

개구부를 제거하여 {나머지 }가 정확히 모든 세트를 닫기 위해 인쇄해야하는 것이되도록합니다. 그러나 위의 절차는 input 0에 대해 실패하며 아무 것도 인쇄하지 않습니다. 그래서...

^$
{}

문자열이 비어 있으면 빈 세트로 바꾸십시오.


나는 nRetina에서 문자열 시간 을 반복하는 방법을 궁금해했습니다 ...
Neil

4

Brain-Flak , 135 바이트

에 +1 포함 -A

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

온라인으로 사용해보십시오!

(({}())<                 # 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 바이트

Lri{]La|}*p

목록 목록으로 구성된 세트와 유사한 객체를 인쇄합니다. CJam은 목록과 문자열이 거의 호환되므로 빈 목록을 빈 문자열로 인쇄합니다.

온라인으로 사용해보십시오!

설명

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

이전 답변, 21 18 바이트

중첩 된 목록 구조를 인쇄해도 괜찮다는 것이 확인되기 전입니다. 문자열 반복 알고리즘을 사용합니다.

Martin Ender 덕분에 3 바이트를 절약했습니다!

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

설명

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

젤리 , 6 바이트

⁸,⁸Q$¡

STDIN에서 정수를 읽고 비정형 배열을 반환하는 닐라 딕 링크입니다.

온라인으로 사용해보십시오!

작동 원리

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

추기경 , 51 50 바이트

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

온라인으로 사용해보십시오!

설명

%:#
x

입력을 받고 #에서 왼쪽으로 보내십시오.

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

"{"를 한 번 인쇄 한 다음 n> 1 인 경우 "{} {"n-1 번 인쇄 한 다음 n> 0 인 경우 "{}"를 인쇄하십시오.

       #

v <8/ ?<
>  8\

첫 번째 루프가 완료 될 때까지 입력 값을 유지

v"}"<
>?-?^

">"를 한 번 인쇄 한 다음 n> 1 인 경우 n-1 번 반복하십시오.


2

AHK, 55 바이트

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

가장 짧은 대답은 아니지만 AutoHotkey의 특이성 이이 재귀 방법을 매우 잘못 보이기 때문에 이것을 즐겼습니다 . If그리고 Loop문은 다음 줄은 괄호를 사용하지 않은 경우 포함 된 유일한 것입니다 가정합니다. 중괄호는 이스케이프 문자이므로 텍스트로 사용하려면 다른 중괄호로 이스케이프해야합니다. 또한 변수 1는 첫 번째 전달 된 인수입니다. 그 tidbits를 모르고 코드를 읽으면 논리 는 다음 과 같습니다.

  • 1이 0이면 s오답과 동일하게 설정 하십시오.
  • 매번 시작 부분과 끝 부분에 대괄호 묶음 반복 및 추가
  • 결과 문자열을 현재 창으로 보내서 반환

모든 대괄호 이스케이프 문자가 없으면 다음과 같습니다.

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

1

자바 스크립트 50 바이트

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

숫자가 0과 같으면 JavaScript에 대한 잘못된 값입니다. 따라서
삼항식

1

tinylisp , 52 바이트

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

온라인으로 사용해보십시오! (시험 장치).

설명

이것이 Lisp를 (cons x (cons y nil))포함 x하고 있는 목록을 작성하는 방법 y입니다.

(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 바이트

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

온라인으로 사용해보십시오!

stdin에 입력하고 stdout에 출력

이것은 원하는 출력에 대한 공식을 기본 -256 숫자로 계산하여 작동합니다. dc의 P 명령은 기본 256 숫자를 문자열로 인쇄하는 데 사용됩니다.


추가 설명 :

n을 입력 n으로하자. dc 프로그램은 다음의 합을 계산합니다

A = 층 (256 ^ n / 255) * 125 (BF는 dc에 의해 11 * 10 + 15 = 125로 해석 됨)

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

 

A의 경우 :

1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1)은 기하 진행의 공식에 의해 (256 ^ n-1) / 255와 같으며 이는 바닥과 같습니다 (256 ^ n / 255). ). 이것은 기본 256의 n 1로 구성된 숫자입니다.

A를 얻기 위해 125를 곱하면 결과는 기본 256의 n 125로 구성된 숫자입니다 (125는 기본 256의 한 자리 수임). 기본 256의 숫자를 16 진 숫자로 쓰는 것이 좋습니다. 125는 16 진 7D이므로 A는 연속 된 n 7D로 구성된 기본 256 개의 숫자입니다.

 

B는 비슷합니다.

이번에는 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1)이 (16777216 ^ n-1) / 16777215와 같고 floor (16777216 ^ n / 16777215)와 같습니다.

이제 256 ^ 3 = 16777216 및 8 ^ 8-1 = 16777215이므로 이것이 floor ((256 ^ n) ^ 3 / (8 ^ 8-1))로 계산됩니다.

기하 계열 표현에서 기본 256의이 숫자는 100100100 ... 1001이며 숫자 중 n은 1이고 나머지 숫자는 0입니다.

여기에는 16B의 7B7B7D 인 8092541이 곱해집니다. 기본 256에서이 숫자는 7B, 7B 및 7D 숫자로 구성되는 3 자리 숫자입니다 (편의를 위해 16 진수로 해당 숫자를 씁니다).

베이스 256으로 작성된 제품은 n 번 반복 된 3 자리 7B 7B 7D로 구성된 3n 자리 숫자이다.

여기에 256 ^ n을 곱하면 4n 자리의 기본 256 개 숫자가 만들어지고 3 자리 7B 7B 7D가 n 번 반복되고 n 0이옵니다. B입니다.

 

A + B를 추가하면 이제 n 번 반복 된 3 자리 7B 7B 7D로 구성된 4n 자리 기본 256 개의 숫자가 생성되고 n 7D가 생성됩니다. 도 7b 및도 7d는 ASCII 코드이므로 위해 {하고 }, 각각이 n 개의 복사본 이루어지는 문자열 인 {{}의 N 개의 복사본이어서 }정확히 우리가 N 원하는 무엇> DC에 0으로 P 명령은베이스 (256) 번호를 인쇄 필요에 따라 문자열로

불행하게도, n = 0은 특별한 경우로 취급되어야합니다. 상기 계산은 n = 0에 대해 0의 결과를 산출하며; 이 경우 문자열 인쇄를 하드 코딩했습니다 {}.


이것은 인쇄 명령의 덜 알려진 동작을 사용하는 매우 흥미로운 접근법입니다. 잘 했어요! 이것이 어떻게 작동하는지에 대한 설명은 답을 향상시킬 것입니다.
seshoumara

@seshoumara 감사합니다-자세한 설명을 추가했습니다.
Mitchell Spector


0

배치, 88 바이트

@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 바이트

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

(미학에 대한 줄 바꿈) brainf ***이므로 ASCII 문자 코드로 입력됩니다 (입력 "a"는 96에 해당).

Braineasy, 60 바이트

또한, (기반 brainf **, 통역 내 사용자 지정 언어 여기에 ) :

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

내가 게으 르기 때문에 프로그램 입력을 인터프리터에 하드 코딩해야합니다.


사이트에 오신 것을 환영합니다! 왜 []있습니까? 삭제 될 수있는 것 같습니다
Post Rock Garf Hunter

그것을 가지고 있지 않으면 끝에 여분의 {}을 출력합니다 (무한하게 반복됩니다).
internet_user

0

05AB1E , 5 3 바이트

F¯)

온라인으로 사용해보십시오!

이 버전은 세트가 정상임을 명확히 한 후입니다.

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

이전 버전 (ø를 사용하는) :

05AB1E , 5 4 바이트

FX¸)

온라인으로 사용해보십시오!

경우 1에 해당합니다 ø.

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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.