캔터 세트 내에 있습니까?


20

도전

이 문제를 해결하려면 주어진 숫자가 Cantor 세트에 있는지 확인해야합니다. 먼저 Cantor 세트를 정의하겠습니다.

먼저, 0과 1 사이의 숫자로 시작하십시오.이 범위 밖의 숫자는 Cantor 세트에 없습니다. 이제 숫자를 [0,1 / 3], [1 / 3,2 / 3], [2/3, 1]의 세 부분으로 나눕니다. 첫 번째 부분과 마지막 부분의 범위 안에 있지 않은 숫자는 Cantor 세트에 없습니다. 이제 [0,1 / 3] 및 [2/3, 1] 세그먼트에 대해이 프로세스를 반복하십시오. 그런 다음 남은 것을 반복합니다. 당신은 이것을 영원히 계속합니다. 결국, 남은 모든 숫자는 Cantor 세트에 있습니다. 처음 6 개의 반복에 대한 다이어그램은 다음과 같습니다.

캔터 다이어그램


입력

두 정수 xy.
0 < y < 2^15
0 <= x <= y
의 가장 큰 공통 분모 x와는 y하지 않는 한, 1 x == 0.


산출

x/yCantor 세트에 들어있는 경우 진실 입니다. Cantor 세트에 없으면
거짓 x/y입니다.


이제 Cantor 세트에있는 숫자의 예를 보겠습니다.

1/3 -> true  

경계에 있으며 경계가 제거되지 않습니다.

1/4 -> true  

1/4세그먼트의 중간 1/3에 있지는 않지만 경계에 있지는 않습니다. 경로를 따라 가면 실제로 섹션의 첫 번째와 마지막 1/3 사이에 번갈아 나타나는 것을 알 수 있습니다.

1/13 -> true  

1/13 첫 번째 섹션과 첫 번째 섹션과 마지막 섹션 사이를 번갈아 표시합니다.

1/5 -> false

1/5 위의 다이어그램에서 1/9와 2/9 사이의 세 번째 행의 첫 번째 빈 블록에 속합니다.

다른 테스트 사례 :

0/4 -> true
3/10 -> true
3/4 -> true
10/13 -> true
1/1 -> true
12/19 -> false
5/17 -> false
3/5 -> false
1/7 -> false
1/2 -> false

이 스 니펫으로 다른 숫자를 시도 할 수 있습니다.


목표

바이트 수가 가장 적은 사람이 이깁니다.


입력이 (0,0)이 아님을 보증합니까? 분수가 가장 간단한 형태로 제공됩니까?
xnor

1
@xnor y에 주어진 범위를 보라. 다음과 같은 경우가 아니라면 분수가 가장 간단한 형태라고 말할 것입니다.x == 0
TheNumberOne

x! = 1이 좋은 일부 테스트 사례. 또한 스 니펫은 1/3이 캔터 세트에 없다고 말합니다.
xnor

@xnor 추가 및 수정;)
TheNumberOne

6
캔터를 찾을 수 있습니까?
mbomb007

답변:


13

수학, 54 바이트

If[Last@#===1,Most@#,#]&@RealDigits[#,3][[1]]~FreeQ~1&

일부 촬영 기능 이름 x/y입력과 같은 y > 00 ≤ x ≤ y, 그리고 복귀 True또는 False.

밑이 3 인 확장의 숫자가 1이 아닌 경우 0과 1 사이의 실수는 정확하게 Cantor 세트에 있습니다. 단, 분모가 3의 거듭 제곱 (따라서 밑이 3 인 확장은 끝남)은 1로 끝날 수 있습니다.

RealDigits[#,3][[1]]분수 입력베이스 -3- 확장에서 모든 숫자를 제공 #같은 형태 {1, 0, 2, {0, 1, 0, 2}}: 정수 미리 주기성 시작되기 전에 자리 동안 최종리스트는 팽창주기의 일부이다. base-3 확장이 즉시 주기적이면 출력은 다음과 같습니다 {{0, 1, 0, 2}}. base-3 확장이 종료되면 양식은 {1, 0, 2}입니다.

그래서 우리 ~FreeQ~1는리스트를 가지고 있지 않은지 아닌지를 사용하여 검사하고 싶습니다 1. 그러나 확장 확장이 종료 되었기 때문에 목록의 마지막 요소가 같으면 1; 그것이 If[Last@#===1,Most@#,#]성취 하는 것입니다. ( ===잠재적 목록을 1다음 과 비교하는 데 필요합니다 ==. 해당 상황에서는 단독으로 평가되지 않습니다.)


4
나는 Mathematica는 가지고 있지 않지만 IsCantorNumber무언가 가 염소라는 것을 결정하는 기능을 가지고 있다는 것에 놀랐다 .
Brain Guider

3
글쎄, 난 몰라, 염소 나 도형 같은 실생활에서 더 많이 나올까? ;)
Greg Martin

FreeQ[RealDigits[#,3][[1]]/.{{x___,1}}:>{x},1]&
ngenisis 2012

이러한 규칙은 1주기적 부분에서 후행을 제거 하여 잘못된 답변을 초래합니다. 예를 들어 7/8의 밑이 3 인 확장은 .21212121 .... 또는 {{2,1}}; 그러나 제안 된 규칙은을 {{2}}(를) 무료로 변경해야합니다 (으)로 변경 1합니다.
Greg Martin

터치 어때요 #==0||FreeQ[RealDigits[#,3]/.{{x___,1},_}:>{x},1]&? 종료되고 0 RealDigits[#,3]이 아닌 형식 {{__Integer},-1}이 반복되고 반복되는 경우 형식 이 됩니다 {{___Integer,{__Integer}},-1}. 나는 모바일에 있으므로 지금 테스트하기가 어렵습니다. 이것이 효과가 있다면,에 대한 표기법을 사용 RealDigits하는 것도 효과가 있습니다.
ngenisis 2012


7

젤리 , 22 17 16 15 바이트

,ạµ%⁹×3µÐĿ:⁹Ḅ3ḟ

진실을 위해 3 을 인쇄 하고 거짓을 위해 아무것도 인쇄 하지 않습니다.

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

배경

Cantor 세트의 잘 알려진 속성은 3 진 확장에서 1 없이 쓸 수있는 01 사이의 숫자를 정확하게 포함한다는 것 입니다.

세트 구성에 포함 된 닫힌 간격의 오른쪽 가장자리와 같은 일부 숫자는 단일 (트레일 링) 1 또는 무한량의 트레일 링 2 로 쓸 수 있습니다 . 예를 들어, = 1 (3) = 0.22222 ... (3)1/3 = 0.1 (3) = 0.022222 ... (3) , 마찬가지로 0.5 10 = 0.499999 ... (10) .

오른쪽 가장자리를 특수하게 배치하지 않기 위해 1x / y1-x / y = (y-x) / y 에서 가장 짧은 10 진수 확장인지 확인할 수 있습니다 . 여기서 x / y 는 오른쪽 가장자리입니다. (y-x) / y 는 왼쪽 가장자리입니다. 이들 중 적어도 하나가 더 포함되어 있지 않은 경우 1 의를, X / Y는 선창자 집합에 속한다.

작동 원리

,ạµ%⁹×3µÐĿ:⁹Ḅ3ḟ  Main link. Left argument: x. Right argument: y

 ạ               Absolute difference; yield y - x.
,                Pair; yield [x, y - x].
       µ         Begin a new, monadic chain with argument [a, b] := [x, y - x].
  µ     ÐĿ       Repeatedly execute the links in between until the results are no
                 longer unique, updating a and b after each execution. Return the
                 array of all unique results.
   %⁹              Compute [a % y, b % y].
     ×3            Compute [3(a % y), 3(b % y)].
                 This yields all unique dividends of the long division of x by y in
                 base 3.
          :⁹     Divide all dividends by y to get the corresponding ternary digits.
            Ḅ    Unbinary; turn [1, 1] into 3, other pairs into other numbers.
             3ḟ  Remove all occurrences of the resulting numbers from [3], leaving
                 an empty array if and only if one pair [a, b] is equal to [1, 1].

3진정한입니다 true+1.
매직 문어 Urn

3

자바 스크립트 (ES6), 65 67

thx @Luke로 저장된 2 바이트 편집

n=>d=>(z=>{for(q=0;~-q*n*!z[n];n=n%d*3)z[n]=1,q=n/d|0})([])|q!=1|!n

덜 골프

n=>d=>{
  z = []; // to check for repeating partial result -> periodic number
  for(q = 0; q != 1 && n != 0 && !z[n]; )
    z[n] = 1,
    q = n / d | 0,
    n = n % d * 3
  return q!=1 | n==0
}

테스트

f=
n=>d=>(z=>{for(q=0;~-q*n*!z[n=n%d*3];q=n/d|0)z[n]=1})([])|q!=1|!n
  

console.log(
'Truthy: 1/3 1/4 1/13 0/4 3/10 3/4 10/13 1/1\nFalsey: 1/5 12/19 5/17 3/5 1/7 1/2'.replace(/(\d+).(\d+)/g,(a,x,y)=>a+':'+f(x)(y))
)  


나는 당신이 바꿀 수 있다고 생각 n=n%d*3과 함께 q=n/d|0다음 교체 z[n]와 함께z[n=n%d*3]
누가 복음

2

자바 스크립트 (ES6), 55 바이트

y=>f=(x,z,n=~y,q=x/y|0)=>n?!z|!q&&f(x%y*3,z|q==1,n+1):1

분모를 먼저, 분자를 두 번째로 카레로 사용하십시오. 표준 형식은 1 바이트 더 깁니다.

f=(x,y,z,n=~y,q=x/y|0)=>n?!z|!q&&f(x%y*3,y,z|q==1,n+1):1

설명

분수가 캔터 세트에없는 경우, 중간 지점 중 하나에 속해야합니다. 따라서 기수 3의 표현은 1 뒤에 0이 아닌 숫자가 있어야합니다. 이것이 작동하는 방식입니다.

  • z 우리가 1을 찾았는지 추적합니다.
  • q 기본 3의 현재 숫자입니다.
  • !z|!q경우에 true zfalse입니다 (우리는 하나를 발견하지 않았습니다) 또는 q(현재의 자리가 0) false입니다.

경우 n우리는 1 일 이후 비제로 자리 곳을 찾기 전에 제로 아래로 실행이 분수가와 칸토어 집합에 우리는 반환 1.


2

Bash + GNU 유틸리티, 62 바이트

dc -e3o9d$2^$1*$2/p|tr -cd 012|grep -P "1(?!(0{$2,}|2{$2,})$)"

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

arg1 <= arg2 및 0 <arg2와 함께 두 개의 정수 인수를 전달하십시오.

PPCG I / O 메소드에서 허용하는대로 출력이 종료 코드 (거짓의 경우 0, 거짓의 경우 1)로 리턴 됩니다.

grep -z를 사용하여 tr 명령을 제거하여 정규식을 더 골프화 할 수 있다고 생각하지만 이것이 내가 찾은 가장 짧은 것입니다. 불행히도 grep -z는 grep -P와 호환되지 않으며?! 구문에는 perl 스타일 정규식을 가져 오기위한 -P 옵션이 필요합니다.

테스트 베드 프로그램 및 출력 :

for x in '1 3' '1 4' '1 13' '1 5' '0 4' '3 10' '3 4' '10 13' '1 1' '12 19' '5 17' '3 5' '1 7' '1 2'
  do
    printf %-6s "$x "
    ./cantor $x >/dev/null && echo F || echo T
  done

1 3   T
1 4   T
1 13  T
1 5   F
0 4   T
3 10  T
3 4   T
10 13 T
1 1   T
12 19 F
5 17  F
3 5   F
1 7   F
1 2   F

설명

dc 부분 (인수는 x와 y 임) :

3o     Set output base to 3.
9      Push 9 on the stack.
d      Duplicate the top of the stack. (The extra 9 on the stack isn't actually used, but I need some delimiter in the code here so that the 9 doesn't run into the number coming up next.  If I used a space as a no-op, then I'd need to quote it for the shell, adding an extra character.)
$2^    Raise 9 to the y power. This number in base 3 is 1 followed by 2y 0's.
$1*$2/ Multiply the base-3 number 10....0 (with 2y 0's in it) by x and then divide by y (truncating). This computes 2y digits (after an implied ternary point) of x/y.  That's enough digits so that the repeating part of the rational number is there at least twice.
p      Print the result, piping it to tr.

tr과 grep 부분 :

사소한 문제는 dc가 임의의 큰 정수를 처리하지만 dc가 많은 수를 인쇄 할 때 마지막 줄을 제외한 마지막 줄과 백 슬래시로 끝나는 줄과 각 줄 다음에 줄 바꿈을 사용하여 69자를 줄로 나누는 것입니다.

tr 명령은 백 슬래시와 개행을 삭제합니다. 이것은 한 줄만 남습니다.

grep 명령은 perl 스타일 정규식 (-P 옵션, GNU 확장)을 사용합니다. 줄에 1이 포함되지 않고 1 이상의 y 0 또는 2 이상의 y 2가 포함되어 있으면 정규식이 일치합니다.

합리적 숫자 x / y의 밑이 3 인 표현의 반복 부분은 3 진 포인트 뒤의 숫자 # y + 1에서 시작하는 것으로 볼 수 있기 때문에 이것은 정확하게 Cantor 세트에없는 것으로 x / y를 식별하는 데 필요한 것입니다. 이며 최대 y 자리 길이입니다.


1

CJam (19 바이트)

{_@3@#*\/3b0-W<1&!}

온라인 테스트 스위트

이것은 익명 블록 (함수)으로 스택과 스택 0또는 스택에서 두 개의 인수를 취 1합니다. 분수 x/yy기본 3자릿수 로 변환하고 접미사 를 포함하지 1않거나 1접미사의 일부인 경우 true를 반환 하여 작동합니다 1 0 0 0 ....

{            e# Begin a block
  _@3@#*\/3b e#   Base conversion
   0-W<      e#   Remove all zeros and the final non-zero digit
   1&!       e#   True iff no 1s are left
}

1

Pyth , 14 바이트

gu*3hS,G-QGQE0

내 C 솔루션을 기반으로합니다. y첫 번째 입력 라인, x두 번째 입력 라인 .

                Q = y
 u         QE   G = x
                loop y times
  *3                x = 3 *
    hS,G                min(x,
        -QG                 y-x)
g            0  return x >= 0

x/yCantor 세트 내에 있으면 및 x사이 에 유지됩니다 . 그렇지 않으면 보다 큼0yxy 한 지점 나머지 반복에서 음의 무한대로 분기됩니다.

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


0

배치, 91 바이트

@set/ai=%3+1,n=%1*3%%%2,f=%1*3/%2%%2,f^|=j=!((%2-i)*n)
@if %f%==0 %0 %n% %2 %i%
@echo %j%

의 첫 번째 y-13 자리를 테스트합니다 x/y. i테스트 한 자릿수입니다. n의 다음 값입니다 x. 확장이 종료되기 때문에 0에 도달하거나 를 찾지 않고 숫자를 테스트하면 jtrue 입니다. 경우에 true true이거나 다음 자리 인 경우 ,있는 우리가 루핑 및 출력 정지 점 .ny-11fj1j

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