MU 수 계산


19

처음 두 개의 MU 번호는 2와 3입니다. 다른 모든 MU 번호는 아직 나타나지 않은 가장 작은 숫자이며 정확히 하나의 방식으로 두 개의 이전의 고유 한 MU 번호의 곱으로 표현할 수 있습니다.

처음 10 개는 다음과 같습니다.

2, 3, 6, 12, 18, 24, 48, 54, 96, 162

직무

양수가 주어지면 n 번째 MU 수를 계산하여 출력하십시오 .

이것은 경쟁이므로 소스 코드를 최대한 작게 만드는 것을 목표로해야합니다.

OEIS A007335


1
0 인덱싱 또는 1 인덱싱?
HyperNeutrino

1
@HyperNeutrino 어느 쪽이든 괜찮습니다.
밀 마법사

2
왜 이것을 MU 번호라고 생각하십니까? (와일드 추측 : 곱셈 고유?)

답변:


5

Pyth, 22 21 바이트

@u+Gfq2l@GcLTGheGQhB2

온라인으로 사용해보십시오. 테스트 스위트.

인덱스가 0입니다.

설명

@u+Gfq2l@GcLTGheGQhB2Q    Implicitly append Q and read+eval input to it.
                  hB2     Take the list [2, 2 + 1].
 u               Q        Put the list in G and apply this Q times:
               eG           Get last number in G.
              h             Add one.
    f                       Starting from that, find the first T such that:
          cLTG                Divide T by each of the numbers in G.
        @G                    Find the quotients that are also in G.
       l                      Get the number of such quotients.
     q2                       Check that it equals 2.
  +G                        Append that T to G.
@                    Q    Get the Q'th number in G.

@마지막 줄 의 부호가 잘못 정렬되었습니다. 2 자로 변경되었으므로 제안 된 수정을 할 수 없습니다.
user2357112는

@ user2357112 수정되었습니다.
PurkkaKoodari

4

하스켈, 80 77 바이트

l#(a:b)|[x]<-[a|i<-l,j<-l,i<j,i*j==a]=a:(a:l)#b|1<2=l#b
((2:3:[2,3]#[4..])!!)

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

작동 원리

2:3:             -- start the list with 2 and 3 and append a call to # with
    [2,3]        -- the list so far and
         #[4..]  -- list of candidate elements

l # (a:b)        -- l -> list so far, a -> next candidate element, b -> rest c.el.
  | [x]<-[...]   -- if the list [...] is a singleton list
    =a:(a:l#b) -- the result is a followed by a recursive call with l extended
                    by a and b
  | 1<2=l#b      -- if it's not a singleton list, drop a and retry with b

                 -- the [...] list is
 [ i<-l,j<-l,    -- loop i through l and j through l and whenever   
       i<j,      -- i<j and
       i*j==a]   -- i*j==a
  a|             -- add a to the list              

3

젤리 , 22 바이트

ŒcP€ḟ⁸ṢŒgLÞḢḢṭ
2,3Ç¡ị@

1- 인덱스 된 모나드 링크.

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

어떻게?

ŒcP€ḟ⁸ṢŒgLÞḢḢṭ - Link 1, add the next number: list, a  e.g. [2,3,6,12,18,24]
Œc             - unordered pairs                            [[2,3],[2,6],[2,12],[2,18],[2,24],[3,6],[3,12],[3,18],[3,24],[6,12],[6,18],[6,24],[12,18],[12,24],[18,24]]
  P€           - product of €ach                            [6,12,24,36,48,18,36,54,72,72,108,144,216,288,432]
     ⁸         - chain's left argument, a                   [2,3,6,12,18,24]
    ḟ          - filter discard                             [36,48,36,54,72,72,108,144,216,288,432]
      Ṣ        - sort                                       [36,36,48,54,72,72,108,144,216,288,432]
       Œg      - group runs of equal elements               [[36,36],[48],[54],[72,72],[108],[144],[216],[288],[432]]
          Þ    - sort by:
         L     -   length                                   [[48],[54],[108],[144],[216],[288],[432],[36,36],[72,72]]
           Ḣ   - head                                       [48]
            Ḣ  - head                                       48
             ṭ - tack to a                                  [2,3,6,12,18,24,48]

2,3Ç¡ị@ - Link: number, i                              e.g. 7
2,3     - literal [2,3]                                     [2,3]
    ¡   - repeat i times:
   Ç    -   call last link (1) as a monad                   [2,3,6,12,18,24,48,54,96]
     ị@ - index into with swapped @rguments (with i)        48

3

R , 127 118 111 108 105 100 98 90 바이트

주세페 덕분에 8 바이트.

r=3:2;for(i in 1:scan())r=c(min((g=(r%o%r)[i:-1<i])[colSums(g%o%g==g*g)+g%in%r<3]),r);r[3]

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


<우선 순위가 낮은 것을 깨닫는 데 영원히 걸렸습니다. +그래서 도대체 무슨 일을했는지 ​​알 수 없었 습니다. 그렇게 +g%in%r<3하면서 내가 제안하려고했던 두 부분을 골라 내었습니다. +1
Giuseppe

@Giuseppe 저는 오늘 R을 배우기 시작했습니다. 괜찮은 R 골퍼를 만나서 반갑습니다.
Leaky Nun

나는 당신에게도 같은 말을하려고 .............
Giuseppe

아, 한 가지 더, n=scan()함수 정의 대신 stdin에서 읽을 수 있습니다. 100 세 미만인
주세페

입력 실패 :0
리프트

2

CJam (32 바이트)

4,{_2m*{~>},::*1$-$e`$0=|}qi*-2=

인덱스가 0 인 온라인 데모 .

나는 확실히 많이 한 가지 예외 사양의 사소한 번역 이상이 수행 할 것 아니에요 : 목록과 함께 시작하여 [0 1 2 3](대신 [2, 3]나는 즉시 초기화에 한 바이트를 저장)하고 할 수있는하여 다른 두 0=|(단지 추가 새 요소의 빈도가 목록에 있고 이미 목록에 1있기 때문에) x, 목록의 모든 요소에 대해 이미 목록에 있기 때문에 잘못된 요소를 도입하지 마십시오 .0*x1*x



1

Mathematica, 154 바이트

oeis 링크에있는 간단한 코드 수정

(s={2,3};Do[n=Select[Split@Sort@Flatten@Table[s[[j]]s[[k]],{j,Length@s},{k,j+1,Length@s}],#[[1]]>s[[-1]]&&Length@#==1&][[1,1]];AppendTo[s,n],{#}];s[[#]])&

1

PHP , 130 바이트

0 인덱스

for($r=[2,3];!$r[$argn];$r[]=$l=min($m)/2){$m=[];foreach($r as$x)foreach($r as$y)($p=$x*$y)<=$l|$y==$x?:$m[$p]+=$p;}echo$r[$argn];

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

넓히는

for($r=[2,3];!$r[$argn]; #set the first to items and loop till search item exists
$r[]=$l=min($m)/2){ # add the half of the minimum of found values to the result array
  $m=[]; # start with empty array
  foreach($r as$x) # loop through result array
    foreach($r as$y) # loop through result array
      ($p=$x*$y)<=$l|$y==$x? # if product is greater as last value and we do multiple two distinct values
        :$m[$p]+=$p; # add 2 times or more the product to array so we drop 36 cause it will be 144  
}
echo$r[$argn]; # Output 

PHP , 159 바이트

0 인덱스

for($r=[2,3];!$r[$argn];$r[]=$l=min(array_diff_key($m,$d))){$d=$m=[];foreach($r as$x)foreach($r as$y)$x<$y?${dm[$m[$p=$x*$y]<1&$p>$l]}[$p]=$p:0;}echo$r[$argn];

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

PHP , 161 바이트

0 인덱스

for($r=[2,3];!$r[$argn];$r[]=$l=min(array_diff($m,$d))){$d=$m=[];foreach($r as$x)foreach($r as$y)$x<$y?${dm[!in_array($p=$x*$y,$m)&$p>$l]}[]=$p:0;}echo$r[$argn];

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


1

Mathematica, 140 바이트

(t=1;s={2,3};While[t<#,s=AppendTo[s,Sort[Select[First/@Select[Tally[Times@@@Permutations[s,{2}]],#[[2]]==2&],#>Last@s&]][[1]]];t++];s[[#]])&

1

MATL , 25 바이트

3:i:"t&*9B#u2=)yX-X<h]2_)

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

설명

3:     % Push [1 2 3]. Initial array of MU numbers, to be extended with more numbers
i:     % Input n. Push [1 2 ... n]
"      % Do this n times
  t    %   Duplicate array of MU numbers so far
  &*   %   Matrix of pair-wise products
  9B   %   Push 9 in binary, that is, [1 0 0 1]
  #    %   Specify that next function will produce its first and fourth ouputs
  u    %   Unique: pushes unique entries (first output) and their counts (fourth)
  2=   %   True for counts that equal 2
  )    %   Keep only unique entries with count 2
  y    %   Duplicate (from below) array of MU numbers so far
  X-   %   Set difference
  X<   %   Minimum. This is the new MU number
  h    %   Concatenate vertically horizontally to extend the array
]      % End
2_     % Push 2 negated, that is, -2
)      % Get entry at position -2, that is, third-last. Implicitly display

1

펄 6 , 96 바이트

{(2,3,{first *∉@_,@_.combinations(2).classify({[*]
$_}).grep(*.value==1)».key.sort}...*)[$_]}

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

  • 2, 3, { ... } ... *는 세 번째로 시작하는 각 요소가 중괄호 구분 코드 블록으로 계산되는 무한 시퀀스입니다. 코드 블록은 slurpy @_배열을 통해 인수를 취하므로 해당 배열의 전체 현재 시퀀스를받습니다.
  • @_.combinations(2)의 모든 2 요소 조합의 순서입니다 @_.
  • .classify({ [*] $_ }) 각 2 튜플을 제품별로 분류하여 제품이 키이고 값이 해당 제품이있는 2 튜플의 목록 인 해시를 생성합니다.
  • .grep(*.value == 1) 값 (즉, 해당 키를 제품으로 갖는 쌍 목록)의 크기가 1 인 해시에서 해당 키-값 쌍을 선택합니다.
  • ».key각 쌍의 키만 선택합니다. 이것은 현재 순서의 한 요인 조합에서만 발생하는 제품 목록입니다.
  • .sort 제품을 숫자로 정렬합니다.
  • first * ∉ @_, ... 시퀀스에 아직 나타나지 않은 제품 중 첫 번째 제품을 찾습니다.

1

자바 스크립트 (ES6) 119 118 117 바이트

0 기반 인덱스를 사용하는 재귀 함수입니다.

f=(n,a=[2,m=3])=>a[n]||a.map(c=>a.map(d=>c<d&(d*=c)>m?b[d]=b[d]/0||d:0),b=[])|f(n,a.push(m=b.sort((a,b)=>a-b)[0])&&a)

어떻게?

f () 의 각 반복 에서 우리 는 시퀀스 의 마지막 항 m 과 처음에 빈 배열 b 를 사용하여 다음 항을 식별합니다. 이전에 구분 된 두 개의 MU 번호 중 d> m 인 각 제품 에 대해 다음을 수행합니다.

b[d] = b[d] / 0 || d

그런 다음 b 의 최소값을 유지하십시오 .

위 식은 다음과 같이 평가됩니다.

b[d]               | b[d] / 0  | b[d] / 0 || d
-------------------+-----------+--------------
undefined          | NaN       | d
already equal to d | +Infinity | +Infinity
+Infinity          | +Infinity | +Infinity

이를 통해 여러 가지 방법으로 표현할 수있는 제품을 선택하지 않을 수 있습니다.

형식화 및 의견

f = (n, a = [2, m = 3]) =>           // given: n = input, a[] = MU array, m = last term
  a[n] ||                            // if a[n] is defined, return it
  a.map(c =>                         // else for each value c in a[]:
    a.map(d =>                       //   and for each value d in a[]:
      c < d &                        //     if c is less than d and
      (d *= c) > m ?                 //     d = d * c is greater than m:
        b[d] = b[d] / 0 || d         //       b[d] = either d or +Infinity (see 'How?')
      :                              //     else:
        0                            //       do nothing
    ),                               //   end of inner map()
    b = []                           //   initialization of b[]
  ) |                                // end of outer map()
  f(                                 // do a recursive call:
    n,                               //   - with n
    a.push(                          //   - push in a[]:
      m = b.sort((a, b) => a - b)[0] //     m = minimum value of b[]
    ) && a                           //     and use a[] as the 2nd parameter
  )                                  // end of recursive call

데모



0

파이썬 (3) (2) , 167 (139) 136 133 123 121 120 118 바이트

a=[2,3];exec'p=[x*y for x in a for y in a if x-y];a+=min(q for q in p if p.count(q)+(q in a)<3),;'*input();print a[-2]

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


개선을위한 @ Mr.Xcoder와 @LeakyNun에게 감사합니다!


불필요한 공백과 괄호를 제거하여 159 바이트
Mr. Xcoder

@ Mr.Xcoder 개선에 감사드립니다. 이것이 챌린지의 "정확한 방식으로"조건을 보장하는 코드이기 때문에로 변경 p.count(q)==1하는 p.count(q)>0것이 확실하지 않습니다 .
체이스 보글 리

p.count(q)-~(q in a)<=3동등하다p.count(q)+(q in a)<3
리키 수녀

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