이 세트는 자연수를 나타 냅니까?


26

이론적으로, 자연수 ={0,1,2,,...} 는 일반적으로 순수한 세트 , 즉 빈 세트 또는 순수한 다른 세트 만 포함하는 세트 로 인코딩됩니다 . 그러나 모든 순수한 세트가 자연수를 나타내는 것은 아닙니다. 이 과제는 주어진 순수 세트가 자연수의 인코딩을 나타내는 지 여부를 결정하는 것입니다.

자연수의 인코딩은 다음과 같은 방식으로 작동합니다 1 :

  • 0은 빈 세트입니다. 에스이자형(0)={}
  • 숫자 >0 : 에스이자형()=에스이자형(1){에스이자형(1)}

따라서 처음 몇 자연수의 인코딩은

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

작업

  • 순수한 집합을 나타내는 문자열이 주어지면 위의 구성에 따라이 집합이 자연수를 인코딩하는지 확인합니다.
  • 그러나 세트의 요소는 순서가 지정되지 않으므로 {{},{{}},{{},{{}}}}{ { { } } 같이 의 유일한 유효한 표현이 아닙니다. { } , { { { } } , { } } } 은 동일한 세트를 나타냅니다.{{{}},{},{{{}},{}}}
  • 당신은 사용할 수 있습니다 [], ()또는 <>대신 {}.
  • 세트는 ,as 구분 기호 없이 제공되었다고 가정 할 수 있습니다 .
  • 입력에 중복 요소가 없다고 가정 할 수 있습니다. 예를 들어 {{},{}}유효한 입력이 아니며 입력의 구성이 양호합니다 (예 : no {{},) {,{}}.

테스트 사례

참된:

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

그릇된:

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

관련 : 자연 건축 (출력 주어진 자연수의 인코딩 설정.)
1 참조 https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers


13
테스트 케이스 : A (아직) 구현되지 않은 esolang에서 프로그램처럼
갈렌 이바노프

2
입력이 문자열 대신 데이터 구조 (중첩 목록) 일 수 있습니까?
ngn

3
나는 그것이 잠시 Brain-flak 라고 생각했다 .
Belhenix

5
@ngn 아니요, 입력은 문자열이어야합니다.
Laikoni

4
@KirillL. 중첩 된 데이터 구조를 허용하면 흥미로운 골프 기회를 얻을 수 있다는 점을 알지만 기술적으로 이러한 답변은 항상 "순수한 세트를 나타내는 문자열 제공"이라는 과제로 언급되었으므로 유효하지 않았습니다. 그러나 허용되는 데이터 구조와 너무 관대 한 입력 형식의 남용을 피하지 않는 것에 대한 선을 그릴 위치를 결정하기가 어려웠으므로 단순성과 모호성을 위해 입력을 문자열로 제한하기로 결정했습니다. .
Laikoni

답변:


11

자바 스크립트 (Node.js) , 53 48 44 바이트

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

온라인으로 사용해보십시오! 테스트 사례는 대부분 @Arnauld의 답변에서 뻔뻔스럽게 도난당했습니다. 설명 : 세트가 자연수를 나타내는 경우, 그것이 나타내는 자연수는 세트의 크기와 같아야하며 (요소가 구별되는 경우) 요소는 자연수보다 작은 자연수의 표현이어야합니다. 따라서 길이가 더 짧아야합니다. 이것은 물론 빈 세트에 대해서는 사소한 사실입니다. 편집 : @Arnauld 덕분에 5 바이트가 절약되었습니다. @Cowsquack 덕분에 4 바이트를 절약했습니다.


!e[a.length-1]3 바이트를 저장해야합니다
Arnauld

1
@Arnauld 또는 a[e.length]&&5 바이트가 더 좋습니다 !
Neil

@ JoKing Ugh, 방금 Arnauld를 복사했습니다 ... 문자열 입력 비용 14 바이트 :-(
Neil

확실 g=(A,a=eval(A))=>a.every(e=>a[e.length]&&g(e))하게 작동합니까?
Kritixi Lithos

@Cowsquack 아, 좋습니다. 실제로 4 바이트를 절약합니다. 감사합니다!
Neil


5

Wolfram Language (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. f받고 모든 수준에서 적용하십시오 f[{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).

전체 프로그램 동작은 쉽게 설명 할 수 있습니다. 이는 I / O 명령어가 포함되지 않은 Brachylog의 전체 프로그램 처리에 전적으로 암시 적입니다. 문제의 동작은 "표준 입력에서 입력을 가져 와서 출력이 첫 번째 명령 행 인수가 제공 한 설명과 일치하는지 확인하는 기능입니다. 어설 션이 실패하거나 프로그램에서 예외가 발생하면 print false., 그렇지 않으면 print true." . 이 경우, 명령 행 인수가 누락되어 (즉, "anything goes") 함수의 예외 / 예외 없음 동작이 출력을 제공합니다.

기능 동작에 관해서는 :

↰ᵐ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) 모든 요소가 자연수인지 확인 b) 집합의 가장 큰 요소가 가장 큰 요소가없는 집합과 동일한 지 확인하여 자연수를 인식 할 수 있습니다.

세트가 아닌리스트를 사용하는 경우 (따라서 대괄호), 동등 비교가 작동하도록하기 위해 일관된 순서로 나열해야합니다 (이 경우에는 "값"으로 정렬). Brachylog의 기본 정렬 순서는 목록 자체 앞에 목록의 접두사를 정렬하므로 자연수를 숫자 값으로 정렬하는 것이 편리합니다. 따라서 모든 숫자를 재귀 적으로 정렬하여 일관된 순서로 정렬 할 수 있습니다. 실제로 재귀 적으로 정의하는 함수를 통해 숫자 요소를 재귀 적으로 정렬하고 자연수인지 확인하는 동시에 두 가지 결과를 동시에 얻을 수 있습니다.

따라서이 기능에는 네 가지 주요 부분이 있습니다. ↰ᵐ각 요소가 자연수인지 확인하고 각 요소를 정규화 된 형식으로 변환하는 재귀 호출입니다. o숫자 자체를 정규화합니다 (요소는 이미 정규화되어 있으므로 정렬하면됩니다). 그런 다음 .t~k|가장 큰 요소와 다른 요소가 동일한 지 확인하여 원하는 구조를 갖도록합니다. 빈 목록 (예 : 0)에는 마지막 요소가 없으므로 t; 로 어설 션 오류가 발생합니다 . 가 입력리스트가 비어있는 경우에 명시 적 대체를 통해주고,이 경우를 다룬다.


2

K (ngn / k) , 26 24 27 바이트

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

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

입력은 `j@(ngn / k에 특정한 구문)

{ }인수가있는 재귀 함수입니다 x. set로 표시되는 자연수를 리턴합니다. 자연수를 나타내지 않는 경우는 xnull ( 0N)을 돌려 줍니다 .

$[ ; ; ]if-then-else입니다. 0은 거짓, 다른 정수는 진실

!#x의 길이에 0 (포함)의 정수 x(전용)

^ 없이

o'xo각 ( ') 요소의 재귀 ( )x

# 길이

^ null입니까?

~ 아니

@그래서 더미 마지막 동사의 역할 ~^함께 구성 얻을 { }적용된되는 대신





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

이것은 Leaky Nun의 Python answer 포트입니다 .

입력은 문자열이어야하므로이 제출은 전체 프로그램으로 만 유효합니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인

작동 원리

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