프라임의 매핑


19

최근에 나는 양의 정수에서 유한하고 중첩 된 시퀀스까지 의 형용사 매핑 f 를 발견했습니다 . 이 과제의 목적은 선택한 언어로 구현하는 것입니다.

매핑

인수 가 n 인 숫자 n 을 고려하십시오 . 그때:

예를 들면 다음과 같습니다.

규칙

  • 이 작업을 수행하기 위해 전체 프로그램 또는 함수를 작성할 수 있습니다.
  • 출력은 시퀀스로 인식 가능한 모든 형식이 될 수 있습니다.
  • 소인수 분해, 소질 검사 등을위한 내장 기능이 허용 됩니다.
  • 표준 허점은 허용되지 않습니다.
  • 프로그램은 내 컴퓨터에서 10 분 이내에 마지막 테스트 사례를 완료해야합니다.
  • 이것은 코드 골프이므로 가장 짧은 코드가 승리합니다!

테스트 사례

  • 10: {{},{{}},{}}
  • 21: {{{}},{},{{}}}
  • 42: {{{}},{},{{}},{}}
  • 30030: {{{}},{{}},{{}},{{}},{{}},{}}
  • 44100: {{{{}}},{{{}}},{{{}}},{},{}}
  • 16777215: {{{{}}},{{}},{{}},{},{{}},{{}},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{{}}}
  • 16777213: 페이스트 빈

쉼표없이 동일한 출력을 여전히 시퀀스로 인식 할 수 있습니까?
Dennis

@Dennis 네, 괄호로 말할 수 있습니다.
LegionMammal978

1
Akangka

아, {}입니다.
Akangka

1
싶은 수용 가능한 출력 포맷이 될? CJam은 빈 목록과 빈 문자열을 구별하지 않으므로 중첩 배열을 나타내는 자연스러운 방법입니다.
Dennis

답변:


1

Pyth, 29 바이트

L+'MhMtbmYhbL&JPby/LJf}TPTSeJ

데모

이것은 '원하는 매핑을 수행 하는 함수를 정의합니다 .

도우미 함수 () y는 주요 분해가 주어지면 반복적으로 매핑을 수행합니다. 기본 사례와 프라임 분해는에서 수행됩니다 '.


5

CJam, 51 48 44 42 41 39 34 33 31 바이트

{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J

CJam 통역사 에서 온라인으로 사용해보십시오 .

3 바이트를 사용하지 않은 @ MartinBüttner에게 감사합니다!

3 바이트를 골라 내고 1 개 더 길을 포장 한 @PeterTaylor에게 감사합니다!

적어도 내 컴퓨터에서 파일을 다운로드하는 것이 프로그램을 실행하는 것보다 오래 걸립니다 ...

I / O

이것은 STDIN에서 pop과 integer를 반환하고 배열을 리턴하는 명명 된 함수입니다.

CJam은 빈 배열과 빈 문자열을 구분하지 않기 때문에 문자열은 단순히 문자 만 포함하는 목록이므로 문자열 표현은 다음과 같습니다.

[[""] "" [""] ""]

다음의 중첩 배열을 참조하십시오.

[[[]] [] [[]] []]

확인

$ wget -q pastebin.com/raw.php?i=28MmezyT -O test.ver
$ cat prime-mapping.cjam
ri
  {mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
~`
$ time cjam prime-mapping.cjam <<< 16777213 > test.out

real    0m25.116s
user    0m23.217s
sys     0m4.922s
$ diff -s <(sed 's/ //g;s/""/{}/g;y/[]/{}/' < test.out) <(tr -d , < test.ver)
Files /dev/fd/63 and /dev/fd/62 are identical

작동 원리

{                           }:J  Define a function (named block) J.
 mf                              Push the array of prime factors, with repeats.
   _W=                           Push a copy and extract the last, highest prime.
      )1|                        Increment and OR with 1.
         {mp},                   Push the array of primes below that integer.

                                 If 1 is the highest prime factor, this pushes
                                 [2], since (1 + 1) | 1 = 2 | 1 = 3.
                                 If 2 is the highest prime factor, this pushes
                                 [2], since (2 + 1) | 1 = 3 | 1 = 3.
                                 If p > 2 is the highest prime factor, it pushes
                                 [2 ... p], since (p + 1) | 1 = p + 2, where p + 1
                                 is even and, therefor, not a prime.

              \fe=               Count the number of occurrences of each prime
                                 in the factorization.

                                 This pushes [0] for input 1.

                  (              Shift out the first count.
                   0a*           Push a array of that many 0's.
                      +          Append it to the exponents.

                                 This pushes [] for input 1.

                       {  }%     Map; for each element in the resulting array:
                                   Increment and call J.

Blame Pastebin : P
LegionMammal978

mf e=훨씬 더 문제는 샌드 박스에있는 동안 나는 정신 테스트를 노크 할 때 내가 찾은 것보다,하지만 난 당신이 사용하지 않은 어떤 발견 한 개선으로의 보수에 대한 매핑하는 것입니다 (0a*+- 즉 ri{}sa2*{mf_W=){mp},\fe=(0a*+0j\{)j}%*}j. 그리고 훨씬 더 개선 된 부분도 있습니다. 몇 시간 동안 헤드 스타트를하겠습니다.
Peter Taylor

@PeterTaylor 골프와 힌트에 감사드립니다.
Dennis

그러나 출력 표현을 변경하는 것이 실제로 더 크게 개선되었습니다. 기본 사례를 처리하는 더 좋은 방법이 있습니다. 방금 찾은 것입니다. 그러나 솔루션을 이길 수 있도록 두 가지 아이디어를 사용해야합니다.{mf_W=)1|{mp},\fe=(0a*+{)J}%}:J
Peter Taylor

@PeterTaylor 그 중 하나는 마법 1|이다. 다시 감사합니다!
Dennis

2

수학, 88 바이트

f@1={};f@n_:=f/@Join[1+{##2},1&~Array~#]&@@SparseArray[PrimePi@#->#2&@@@FactorInteger@n]

문서화되지 않은 내부의 마법 ...
LegionMammal978
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.