한 걸음 더 올라가다


24

Numberphile의 최신 비디오 제목 13,532,385,396,179 다음 함수의 고정 점 인 F 양의 정수는 :

n을 양의 정수로 하자 . 소인수 분해를 일반적인 방식으로 작성하십시오 (예 : 60 = 2 2 · 3 · 5). 소인수가 증가하는 순서로 작성되고 지수 1은 생략됩니다. 그런 다음 지수를 줄로 가져오고 모든 곱셈 부호를 생략하고 숫자 f (n)를 얻습니다 . [...] 예를 들어, f (60) = f (2 2 · 3 · 5) = 2235입니다.

(위의 정의는 5 개의 $ 1,000 문제5 번 문제-John H. Conway 에서 발췌 한 것입니다 )

참고 F (13,532,385,396,179) = F (13 · 53 2 * 3853 * 96,179)가 13,532,385,396,179 =.

태스크

양의 복합 정수 n를 입력으로 사용하고 출력하십시오 f(n).

또 다른 예

48 = 2 4 · 3이므로 f (48) = 243입니다.

테스트 케이스

더 많은 테스트 케이스가 여기에 있습니다 .

   4 -> 22
   6 -> 23
   8 -> 23
  48 -> 243
  52 -> 2213
  60 -> 2235
 999 -> 3337
9999 -> 3211101

11
+1 나는 누군가가 추측의 증거로 13532385396179를 찾아 냈다는 것에 여전히 놀랐다. 나는 $ 1000 상금이 사용한 전기를 지불하는 데 어떤 길을 갈 것이라고 생각합니다! :)
Wossname 2016 년

7
링크를 따르지 않으면 f (n) 의 반복 된 적용 이 항상 소수에 도달 할 것 (그리고 p 가 소수 이면 f (p) = p 임) 이라는 추측이 명확하지 않습니다 . 13532385396179 추측이 복합적이고 고정 된 opint이기 때문에 추측을 반박합니다.
Chris H

답변:


16

파이썬 166 162 159 바이트

너희들은 훨씬 낫다. 이것이 내가 사용한 것입니다! (해결 한 알고리즘은 이것을 호출합니다)

from primefac import*
def c(n):
 x=factorint(n)
 a=''
 for i in range(len(x)):
  l=min(x.keys())
  a+=str(l)
  if x[l]>1:a+=str(x[l])
  x.pop(l)
 return int(a)

2
@LeakyNun이하는 것처럼 누군가가 자신의 답변을 향상시키는 대신 새로운 이민자를 왜 하향 투표 했습니까? :(
Shaggy

3
죄송합니다. 실제로 사용한 것입니다 (숫자를 찾았습니다). 방금 엉뚱한 코드가 재미있을 것이라고 생각했습니다. 당신은 그것을 내려받을 수 있습니다.
jchd

9
사이트에 오신 것을 환영합니다. 당신의 솔루션을 우리와 공유하게되어서 정말 기쁩니다. (모르는 사람들에게는 짐 데이비스가 처음에이 문제를 해결 한 사람입니다). 그러나 문제에 대한 답변은 몇 가지 규칙을 따라야합니다. @LeakyNun의 제안을 따르면 답변이 유효합니다. (일반적으로 어떻게 보이는지 알아보기 위해 다른 답변을 살펴볼 수도 있습니다)
Dada

4
오 마이 갓, 나는 짐 데이비스 자신이이 사이트에 나타나고 내 도전에 대답하기를 기대하지 않았다 ... 나는 지금 영광을 느낀다 ...
Leaky Nun

2
그건 그렇고 트롤이 아닙니다. 내 이메일 주소는 gladhoboexpress.blogspot.ca/2014/10/climb-to-prime.html에 있습니다 ... 나는 게시물을 남겼습니다. 아무도 수학을 통해 이메일로 늪 에 빠지지 않았습니다.
jchd

9

Brachylog , 8 바이트

ḋoọc;1xc

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

설명

Example input: 60

ḋ          Prime decomposition: [5,3,2,2]
 o         Order: [2,2,3,5]
  ọ        Occurences: [[2,2],[3,1],[5,1]]
   c       Concatenate: [2,2,3,1,5,1]
    ;1x    Execute 1s: [2,2,3,5]
       c   Concatenate: 2235

당신은 사용할 수 있습니다 ℕ₂ˢ( 모든 2보다 크거나 정수 선택 대신에) ;1x아마 더 읽기 더 Brachylog의 정신입니다.


9

젤리 , 6 바이트

ÆFFḟ1V

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

설명

ÆF      Get prime factorisation of input as prime-exponent pairs.
  F     Flatten.
   ḟ1   Remove 1s.
     V  Effectively flattens the list into a single integer.

V= "단일 문자열로 연결하고 젤리로 평가"
Outgolfer Erik

@EriktheOutgolfer 그렇기 때문에 "효과적으로".
Martin Ender 2016 년

@MartinEnder 사용하지 않는 특별한 이유는 (10 진수에서 정수로 변환)?
산란

@Christian 목록에 여러 자리 정수가 포함될 수 있으므로.
Martin Ender

@MartinEnder 아, 영리하다. 나는 FḌ과거에 사용 했습니다-좋은 팁입니다!
산란


4

CJam , 8 바이트

limF:~1-

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

설명

li  e# Read input and convert to integer.
mF  e# Get prime factorisation as prime-exponent pairs.
:~  e# Flatten.
1-  e# Remove 1s.
    e# Implicitly print a flattened representation of the list.

그것이 e_평평하기 때문에 평평하게 사용했을 것입니다. 그러나 점수를 변경하지는 않습니다.
피터 테일러

1
@PeterTaylor 흠, 나는 어느 것을 사용 해야할지 결정할 수는 없지만 e_깊게 평평하게 :~하고 단 하나의 레벨 일 때마다 사용 하는 경향이 있습니다.
Martin Ender 2016 년

4

05AB1E , 10 바이트

Òγʒ¬?gDië?

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

Ò          # Push list of prime factors with duplicates
 γ         # Break into chunks of consecutive elements
  ʒ        # For each
   ¬?      #   Print the first element
     gD    #   Push the length of this chunk twice
       ië  #   If not 1
         ? #     Print the length

3

05AB1E , 12 11 바이트

Òγvy¬sgD≠×J

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

설명

Ò            # calculate prime factors with duplicates
 γ           # group consecutive equal elements
  vy         # for each group
    ¬        # get the head without popping
     sg      # push the length of the group
       D≠×   # repeat the length (length != 1) times
          J  # join

에 실패합니다 48.
Leaky Nun

2

Pyth, 12 바이트

smjk_>hddr8P

시도 해봐!

대안, 12 바이트

smjk<_AdGr8P

해봐!

설명

smjk_>hddr8P
           PQ  # prime factorization (already in correct order) of the implicit input: [3, 3, 11, 101]
         r8    # length encode: [[2, 3], [1, 11], [1, 101]]
 m             # map over the length encoded list (lambda variable: d)
     >hdd      # take the d[0] last elements of d (so only the last for d[0]==1 and all else)
    _          # reverse that list
  jk           # join into a string
s              # conatenate the list of strings


2

파이썬 2 , 99 바이트

n=input()
r=''
p=2
while~-n:
 e=0
 while n%p<1:e+=1;n/=p
 r+=str(p)*(e>0)+str(e)*(e>1);p+=1
print r

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

입력이 아래로 제한 2147483659되면 둘 다 6 바이트 str(...)`...`절약 할 수 있습니다 (이 프로그램은 영향을받는 숫자 가 매우 느리게 진행됩니다 !).


2

, 11 바이트

o:_]D2<?O;J

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

설명

o:_]D2<?O;J
o           # Push prime factors with powers from input (Format [[prime,power],...]
 :          # For each...
  _          # Push current element
   ]         # flatten
    D        # Duplicate power
     2<? ;   # Is the power smaller than 2?
        O     # Delete top of stacks
          J  # Join

1

Japt , 19 바이트

k ó¥ ®¯1 pZlÃc fÉ q

온라인으로 테스트하십시오!

설명

 k ó¥  ®   ¯  1 pZlà c fÉ  q
Uk ó== mZ{Zs0,1 pZl} c f-1 q  // Ungolfed
                              // Implicit: U = input number
Uk                            // Break U into its prime factors.
   ó==                        // Group into runs of equal items.
       mZ{         }          // Map each item Z in this to
          Zs0,1               //   Z.slice(0, 1) (the array of the first item),
                pZl           //   with Z.length added at the end.
                              // This returns an array of prime-exponent pairs (Jelly's ÆF).
                     c        // Flatten.
                       f-1    // Filter to the items X where X - 1 is truthy (removes '1's).
                           q  // Join the resulting array into a single string.
                              // Implicit: output result of last expression


0

C #, 206100 바이트

n=>{var r="";for(int d=1,c;++d<=n;){c=0;while(n%d<1){c++;n/=d;}r+=c>0?d+(c>1?c+"":""):"";}return r;}

풀 / 포맷 버전 :

using System;

class P
{
    static void Main()
    {
        Func<int, string> func = n =>
        {
            var r = "";
            for (int d = 1, c; ++d <= n;)
            {
                c = 0;
                while (n % d < 1)
                {
                    c++;
                    n /= d;
                }

                r += c > 0 ? d + (c > 1 ? c + "" : "") : "";
            }

            return r;
        };

        Console.WriteLine(func(4));
        Console.WriteLine(func(6));
        Console.WriteLine(func(8));
        Console.WriteLine(func(48));
        Console.WriteLine(func(52));
        Console.WriteLine(func(60));
        Console.WriteLine(func(999));
        Console.WriteLine(func(9999));

        Console.ReadLine();
    }
}

0

자바 스크립트-91 바이트

(x,r='',i=1,n)=>{while(x>i++){for(n=0;x%i<1;n++)x/=i;r+=(n>0?i+'':'')+(n>1?n:'')}return r}

설명

(x,r='',i=1,n)=>(          // input x is the number to process, r, i, n are default values only
    while(x>i++){          // iterate over i until x
        for(n=0;x%i<1;n++) // iterate over n until i is not a factor of x
            x/=i;          // factor i out of x
        r+=(n>0?i+'':'')   // append i to r if n > 0
            +(n>1?n:'')    // append n to r if n > 1
                           // i+'' prevents adding i and n before appending to r
    }
    return r               // return r by comma-operator and arrow function syntax
)

0

자바 8,103 자

매우 간단한 솔루션입니다.

n->{String r="";int d=2,c;while(n>1){c=0;while(n%d<1){c++;n/=d;}if(c>0)r+=d;if(c>1)r+=c;d++;}return r;}

언 골프 드 :

private static Function<Integer, String> f = n->{
    String result = "";
    int divisor = 2, count;
    while (n>1) {
        count = 0;
        while (n % divisor < 1) {
            count++;
            n /= divisor;
        }
        if (count > 0) result += divisor;
        if (count > 1) result += count;
        divisor++;
    }
    return result;
};


0

옥타브 , 69 바이트

@(a)printf('%d',(f=[[~,c]=hist(b=factor(a),d=unique(b));d](:))(f~=1))

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

꽤 길어졌지만 원하는 출력을 생성합니다.

기본적으로 히스토그램 함수를 사용하여 입력 값의 소인수 분해에서 고유 한 값의 발생 횟수를 계산합니다.

  • factor()함수 의 결과는 오름차순으로 주요 요소를 제공합니다
  • 그런 다음 unique()해당 배열에서 값 을 찾습니다
  • hist() 발생 횟수를 반환

일단 두 개의 배열 (하나는 고유 한 요인, 하나는 카운트)을 가지면 배열을 수직으로 연결하고 (하나는 다른 하나의 상단에) 평탄화합니다. 계수와 계수를 인터리브합니다.

마지막으로 결과를 문자열로 표시하여 최종 배열에서 1을 건너 뜁니다. 1이 나타날 수있는 유일한 시간은 1이 절대 요인이 아니므로 카운트가 1 인 경우입니다. 이 제거는 문자열로 변환하기 전에 수행되므로 숫자 10과 같은 것에 영향을 미치지 않습니다.




0

R , 72 바이트

x=rle(pracma::factors(scan()));x$l[x$l<2]='';paste0(x$v,x$l,collapse='')

pracmaTIO에 설치되지 않은 패키지가 필요합니다 .

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