반복 제수 트위스트


13

정의

하자 mn양의 정수합니다. 우리는 말 mA는 제수 트위스트n정수가 존재하는 경우에 1 < a ≤ b하도록 n = a*b하고 m = (a - 1)*(b + 1) + 1. 0 또는 그 이상의 제수 트위스트를 적용하여 m얻을 수 있으면 의 자손 입니다 . 모든 숫자는 고유 한 자손입니다.nmn

예를 들어을 고려하십시오 n = 16. 우리는 선택할 수 a = 2하고 b = 8있기 때문에 2*8 = 16. 그때

(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10

이는 10제수의 비틀기 임을 나타냅니다 16. a = 2그리고 와 함께 b = 5, 우리 7는 이것이 제수의 비틀기임을 알 수 10있습니다. 따라서 7의 자손입니다 16.

작업

양의 정수가 주어지면 n의 자손을 계산합니다 n.

규칙

숫자의 제수를 계산하는 내장 연산을 사용할 수 없습니다.

전체 프로그램 및 함수가 모두 허용되며, 정렬되고 복제되지 않는 한 콜렉션 데이터 유형 (일종의 세트와 같은)을 리턴하는 것이 허용됩니다. 가장 낮은 바이트 수가 이기고 표준 허점이 허용되지 않습니다.

테스트 사례

1 ->  [1]
2 ->  [2] (any prime number returns just itself)
4 ->  [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]

@Zgarb 0의 제수 비틀기 체인을 허용하면 모든 숫자가 다른 숫자의 자손이 아닌가?
rorlork

3
@rcrmn 제로의 작동 체인은 항등 연산을 의미합니다. 따라서 제수 제곱 왜곡을 허용하면 모든 숫자가 자체의 자손임을 의미합니다.
Zgarb

@Zgarb는 괜찮아요. 정의 할 수없는 한, 모든 숫자는 다른 숫자의 자손으로 간주되기 때문에 정의를 변경해야합니다. 왜 반사가 필요한지 모르겠습니다. 설명해 주시겠습니까?
rorlork

@ rcrmn 나는 문구를 약간 바꿨습니다. 지금 명확합니까?
Zgarb

@ Zgarb 죄송하지만 아니요, 작업이 아닙니다. 숫자 사이의 관계를 정의하고 있습니다. <자연수에 대한 관계 를 정의하면 모든 n에 대해 모든 수보다 작지만 고유하지는 않습니다. 나는 이것이 비슷한 것이라고 생각합니다. 이 방법으로 나는 4 명만이 자신의 자손이라고 생각합니다 (그러나 확실하지 않습니다).
rorlork

답변:


9

파이썬 2, 109 98 85 82 바이트

f=lambda n:sorted(set(sum(map(f,{n-x+n/x for x in range(2,n)if(n<x*x)>n%x}),[n])))

이후 (a-1)*(b+1)+1 == a*b-(b-a)b >= a, 자손은 항상 미만 또는 원래의 수와 같다. 따라서 우리는 초기 숫자부터 시작해서 아무 것도 남지 않을 때까지 더 작은 자손을 계속 생성 할 수 있습니다.

조건의 (n<x*x)>n%x확인이 하나 일 - 그 n<x*xn%x == 0.

(기본 사례에서 3 바이트를 제거 한 @xnor에게 감사드립니다)

Pyth, 32 바이트

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2b

Pyth s가 빈 목록에서 합계 ( )를 시도 할 때 질식하는 것 외에는 위의 직접 번역 .

이것은 끝에 y추가하여 호출 할 수 있는 함수 를 정의합니다 y<number>( 온라인 시도 ).

LS{s+]]bmydm+-bk/bkf><b*TT%bTr2by60

CJam, 47 45 바이트

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}

또한 몇 가지 수정으로 동일한 방법을 사용합니다. CJam을 비교해보고 싶었지만 불행히도 CJam에서는 Pyth / Python보다 훨씬 나빠서 개선의 여지가 많을 것입니다.

위는 int를 받아서 목록을 반환하는 블록 (기본적으로 이름이없는 함수의 CJam 버전)입니다. 다음과 같이 테스트 할 수 있습니다 ( 온라인 시도 ).

{{:X_,2>{__*X>X@%>},{_X\/\-X+}%{F}%~}:F~]_&$}:G; 60 Gp

나는 파이썬 전문가가 아니지만 거기에 필요한 이유 set()가 있습니까? 정렬 된 목록 만 반환 할 수 없습니까?
Alex A.

@ 알렉스는 set():) 중복을 제거하는 것입니다
SP3000

오 알았어 산뜻한. 잘 했어!
Alex A.

당신은 아마 할 수 [n]+sum(...,[])sum(...,[n])?
xnor

@ xnor 아 네, 할 수 있습니다. 나는 []목록을 합산하기위한 기본 사례로만 사용한 적이 없으므로 완전히 잊어 버렸습니다!
Sp3000

6

자바 148 146 104 바이트

골프 버전 :

import java.util.*;Set s=new TreeSet();void f(int n){s.add(n);for(int a=1;++a*a<n;)if(n%a<1)f(n+a-n/a);}

긴 버전 :

import java.util.*;
Set s = new TreeSet();
void f(int n) {
    s.add(n);
    for (int a = 1; ++a*a < n;)
        if (n%a < 1)
            f(n + a - n/a);
}

그래서이 프로그램을 사용하여 PPCG에 데뷔하고 있습니다.이 프로그램은 Geobits 프로그램 TreeSet과 비슷한 (자동으로 숫자를 정렬하고 고맙게도) 재귀를 사용하지만 다른 방식으로 n의 배수를 확인한 다음에 사용합니다. 다음 기능. 나는 이것이 초보자에게 꽤 공정한 점수라고 말하고 싶습니다 (특히 Java의 경우 이런 종류의 언어에 가장 이상적인 언어는 아니며 Geobits의 도움).


PPCG에 오신 것을 환영합니다! 당신은 변경하여 몇 가지를 절약 할 수 있습니다 a*bn라인 9 일
Geobits

환영과 제안에 감사드립니다! 그래,이 작은 것들을 발견하는 데 시간이 좀 걸릴거야 모든 바이트가 중요합니다! 다시 감사합니다!
TNT

c=n+a-b안에 넣어 두 개 더 저장할 수도 있습니다 add(). 또는 c모두 제거 n+a-b하고 동일한 두 바이트에 대해 두 곳에서 모두 사용할 수 있습니다 .
Geobits

말하자면, 나는 add두 번 사용해야한다고 생각하지 않습니다 . 잠깐만 ...
TNT

그러나 두 번째 루프는 전체적으로 필요하지 않습니다. 당신이 경우 a당신이 알고 분할을 n깨끗하게, 당신은 루프는 찾을 수 안 b그것은 단지, n/a. 그 시점에서 점점 더 가까워지기 시작합니다.;)
Geobits

4

자바 157 121

의 각 자손의 자손을 얻는 재귀 함수가 n있습니다. TreeSet기본적으로 정렬 된을 반환합니다 .

import java.util.*;Set t(int n){Set o=new TreeSet();for(int i=1;++i*i<n;)o.addAll(n%i<1?t(n+i-n/i):o);o.add(n);return o;}

줄 바꿈과 함께 :

import java.util.*;
Set t(int n){
    Set o=new TreeSet();
    for(int i=1;++i*i<n;)
        o.addAll(n%i<1?t(n+i-n/i):o);
    o.add(n);
    return o;
}

2

옥타브, 107 96

function r=d(n)r=[n];a=find(!mod(n,2:sqrt(n-1)))+1;for(m=(a+n-n./a))r=unique([d(m) r]);end;end

예쁜 인쇄 :

function r=d(n)
  r=[n];                          # include N in our list
  a=find(!mod(n,2:sqrt(n-1)))+1;  # gets a list of factors of a, up to (not including) sqrt(N)
  for(m=(a+n-n./a))               # each element of m is a twist
    r=unique([d(m) r]);           # recurse, sort, and find unique values
  end;
end

1
Octave endendforand 대신 블록을 끝낼 수 있다는 것을 이해합니다 endfunction. 11 바이트를 절약 할 수 있습니다.
Alex A.

이봐, 네 말이 맞아! 내가 어떻게 언어를 배우고 그것을 할 수 있다는 것을 결코 깨닫지 못했습니다. 내가 여러 골프를 한 후에 이것을 지적한 첫 번째 이유는 무엇입니까?
dcsohl

나는 최근에 다른 질문에서 다른 사람의 골프에서 그것을 본 후에 그것을 찾았 기 때문에 그것을 알았습니다. 나는 Octave를 사용한 적이 없으며 Matlab을 사용한 지 몇 년이 지났습니다. 내 생각 엔 PPCG에 활동중인 Octave 사용자가 많지는 않지만 잘못되었을 수 있습니다.
Alex A.

지적 해 주셔서 감사합니다.
dcsohl

기뻐요, 기꺼이 도와 드리겠습니다. 좋은 해결책.
Alex A.

1

하스켈 102 100 바이트

import Data.List
d[]=[]
d(h:t)=h:d(t++[a*b-b+a|b<-[2..h],a<-[2..b],a*b==h])
p n=sort$nub$take n$d[n]

사용법 : p 16어떤 출력[7,10,16]

이 함수 d는 모든 하위 항목을 재귀 적으로 계산하지만 중복 항목을 확인하지 않으므로 많은 항목이 두 번 이상 나타납니다. 예를 들어 s d [4]의 무한 목록을 반환합니다 4. 함수 pn이 목록에서 첫 번째 요소를 가져 와서 중복을 제거하고 목록을 정렬합니다. Voilà.


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