오해의 소지품


9

긍정적 인 가정이 n있고x

방정식

두 모노 미널 사이의 관계를 표현합니다. 많은 사람들이 이것과 같은 간단한 실수를합니다 (즉 3x^2,와 (3x)^2).

도전

양수 주어 i, 결정 용액 복귀 nx배열로 가장 작은 합을 [n, x]. 동점의 경우 모든 솔루션 세트가 허용됩니다.

테스트 사례

62658722541234765
[15, 11]

202500
[4, 15]

524288
[8, 4]

33044255768277
[13, 9]

[x, n]대신에 돌아갈 수 있을까요 [n, x]?
페이탈 라이즈

또한 시간 제약이 있습니까?
치명적인

nx정수, 맞죠?
Luis Mendo

출력은 형식 [n, x]이며 시간 제한이 없습니다 @Fatalize
Zach Gates

예, n그리고 x정수 @LuisMendo 있습니다
자크 빌 게이츠

답변:


5

Brachylog , 35 바이트

,[N:X]#>>==L(.rMtT;Lr.rMtT),M^:T*?,

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

설명

우리는 목록 구축 [N, X], N >= X다음에 값을 할당 한 후, 우리는 모두 시도 [N, X]하고 [X, N]가능한 출력으로합니다. 예를 들어, N할당됩니다 3, 우리는 역 추적을 통해 시험 할 것이다 [3, 1], [1, 3], [3, 2], [2, 3], [3, 3][3, 3]. 다음 되돌아 단계의 값에 발생합니다 그 이후 N에 갈 것이다, 4등,

,[N:X]     The list [N, X]
#>         Both N and X are strictly positive
>=         N >= X
=L         Assign values to N and X, and L = [N, X]
(          Either...
    .          Output = L
    rM         M is the reverse of the Output
    tT         T is the second element of M
;          ...or...
    Lr.        Output is the reverse of L
    rM         M = L
    tT         T is the last element of M
),
M^         First element of M to the power of the second element of L (T)...
:T*?,      ... times T is equal to the Input

5

수학, 61 바이트

2 바이트를 절약 한 마일과 아무런 이유없이 셀 수없이 많은 바이트를 제공합니다!

Last@Select[{n,(#/n)^(1/n)}~Table~{n,2Log@#},IntegerQ@*Last]&

가능한 모든 n 값을 사용하여 {n, x} 쌍의 테이블을 계산합니다. 여기서 x = (i / n) ^ (1 / n); 해당 x가 정수인 것만 유지합니다. 그런 다음 가장 큰 n 값을 가진 쌍을 반환합니다.

여기서, "n의 모든 가능한 값"의 범위는 1 내지 2 * ln (i)이다. 이것은 {n, x} = {i, 1} 솔루션을 무시하지만, {n, x} = {1, i} 솔루션이 최선의 선택이라면 충분하기 때문에 괜찮습니다. 따라서 x는 2보다 작아 질 필요가 없습니다. 즉, n * 2 ^ n ≤ i이며, 그러한 모든 n은 2 * ln (i)보다 작습니다.

이 맥락에서 합계를 최소화하는 {n, x} 쌍이 가장 큰 n을 가진 쌍 {n, x}와 동일하다는 것을 미적분학을 사용하여 보여줄 수 있습니다 ({i, 1} 제외). 그렇기 때문에 이니셜 Last이 최적의 쌍을 찾을 수있을 정도로 좋습니다.


1
IntegerQ@*Last2 바이트를 절약 하는 데 사용하여 테스트 조건을 작성할 수 있지만이 현재 버전에서는 86 바이트가 아닌 63 바이트를 계산합니다.
마일

3

MATL , 22 바이트

`T@XK:"@K@-@^*G=?3Mb~.

출력은 x, n그 순서.

입력은 MATL의 기본 double데이터 유형에 의해 제한되며 , 최대 정수만 정확하게 표현할 수 있습니다 2^53. 이것은 첫 번째 테스트를 제외합니다 (여전히 올바른 결과를 제공하지만 입력이 너무 큰 경우 일반적으로 보장 할 수는 없습니다).

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

설명

이 코드는 두 개의 중첩 루프를 사용합니다.

  • 외부 do...while루프는 가능한 모든 합계 n+x를 순서대로 증가시킵니다. 솔루션이 발견되는 즉시 루프가 중지됩니다. 이를 통해 솔루션을 최소 합계로 출력 할 수 있습니다.
  • 내부 for each루프는 모든 시험 nx그 합. 합이 입력과 일치하면 내부 루프가 종료되고 외부 루프의 루프 조건 false이 종료되도록 설정됩니다 .

주석이 달린 코드 :

`         % Do...while
  T       %   Push "true". Will be used as loop condition (possibly negated to exit loop)
  @       %   Push iteration index, say K, which represents n+x
  XK      %   Copy that into clipboard K
  :       %   Range [1 2 ... K]
  "       %   For each
    @     %     Push loop variable (1, 2, ... K), which represents n
    K@-   %     Compute x as K minus n
    @     %     Push n again
    ^*    %     Power, multiply. This gives n*x^n
    G=    %     Does this equal the input?
    ?     %     If so
      3M  %       Push the inputs of the third-last function, that is, x and n
      b   %       Bubble up the "true" that is at the bottom of the stack
      ~   %       Transform it into "false". This will exit the do...while loop
      .   %       Break the for loop
          %     Implicitly end if
          %   Implicitly end for
          % Implicitly end do...while
          % Implicitly display

2

젤리 , 23 16 바이트

×*@¥/=³
ṗ2ÇÐfSÞḢ

주어진 i, 이것은 대체로 모든 정수 쌍을 생성합니다 [1, i]. 그런 다음 아래에 표시된 이전 솔루션과 동일한 필터링 및 정렬을 수행합니다. 시간 제약이 없으므로 충분한 시간이 주어지면 무차별 대입이 작동합니다.

온라인으로 사용해보십시오! 온라인에서 큰 가치를 시도하지 마십시오.

내 PC에서는 i = 2048비효율적 인 버전 을 사용하여 결과를 계산하는 데 약 6 분이 걸립니다 .

효율적인 버전

이것은 큰 값을 빠르게 해결할 수있는 23 바이트의 이전 솔루션입니다.

×*@¥/=³
ÆDµṚ*İ⁸żḞÇÐfSÞḢ

을 감안할 때 i,의 약수를 계산 i쌍 생성하는 [n, x]경우 n제수와입니다 x = floor( (i/n)^(1/n) ). 그런 다음 값을 필터링 n * x^n == i하여 나머지 쌍을 합계로 정렬하고 첫 번째 쌍을 반환합니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오.

설명

×*@¥/=³  Helper link. Input: list [n, x]
    /    Reduce using
   ¥       A dyadic chain
 *@        Compute x^n
×          Multiply by n
      ³  The initial value i
     =   Test if n * x^n == i

ṗ2ÇÐfSÞḢ  Main link (16 byte version). Input: integer i
ṗ2        Generate all pairs of integers in [1, i]
  ÇÐf     Filter for where the helper link is true
     SÞ   Sort them by their sum
       Ḣ  Return the first result

ÆDµṚ*İ⁸żḞÇÐfSÞḢ  Main link (23 byte version). Input: integer i
ÆD               Compute the divisors of i
  µ              Begin a new monadic chain operating on the divisors
   Ṛ             Reverse the divisors
     İ           Reciprocal of each divisors
    *            Raise each in the reversed divisors to the reciprocal of a divisor
      ⁸          Get the divisors
       ż         Interleave the divisors with the previous powers
        Ḟ        Floor each
         ÇÐf     Filter for where the helper link is true
            SÞ   Sort them by their sum
              Ḣ  Return the first result

1

PHP, 104 바이트

for(;1<$x=(($i=$argv[1])/++$n)**(1/$n);)!($x==ceil($x))?:$a[$x+$n]="[$x, $n]";ksort($a);echo$a[key($a)];

이것은 제안 된 포맷 73 바이트가 아닌 가능한 모든 솔루션을 출력합니다

for(;1<=$x=(($i=$argv[1])/++$n)**(1/$n);)!($x==ceil($x))?:print"$x,$n\n";

1

펄, 52 바이트

에 +2 포함 -ap

STDIN에 입력하십시오

mono.pl <<< 33044255768277

mono.pl:

#!/usr/bin/perl -ap
$_=("@F"/++$.)**(1/$.)while!/\./?$\="$. $_":$_>2}{

그것을 위해 노력하기 위해 약간의 노력을 기울였습니다 1. 부동 소수점 오류로 인해 일부 입력에 대해 잘못된 대답을 반환 할 수 있는지 잘 모르겠습니다.

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