Monomials เข้าใจผิด


9

มีอยู่สมการสมมติnและxเป็นบวก

สมการ

เป็นการแสดงออกถึงความสัมพันธ์ระหว่างสอง monomials คนหนึ่งเป็นเรื่องผิดของคนอื่น หลายคนทำผิดพลาดอย่างง่าย ๆ ในการเทียบสิ่งเหล่านี้ (เช่น3x^2และ(3x)^2)

ท้าทาย

ได้รับจำนวนเต็มบวกiกำหนดและกลับไปแก้ปัญหาnและมีผลรวมที่มีขนาดเล็กที่สุดเป็นอาร์เรย์x [n, x]ในกรณีของเน็คไทชุดการแก้ปัญหาใด ๆ ที่เป็นที่ยอมรับ

กรณีทดสอบ

62658722541234765
[15, 11]

202500
[4, 15]

524288
[8, 4]

33044255768277
[13, 9]

เรากลับมา[x, n]แทนได้[n, x]ไหม
ทำให้เสียชีวิต

นอกจากนี้ยังมีข้อ จำกัด เวลาใด ๆ ?
ทำให้เสียชีวิต

nและxจำนวนเต็มใช่ไหม
Luis Mendo

เอาต์พุตอยู่ในรูปแบบ[n, x]และไม่มีการ จำกัด เวลา @Falize
Zach Gates

ใช่nและxเป็นจำนวนเต็ม @LuisMendo
Zach Gates

คำตอบ:


5

Brachylogขนาด 35 ไบต์

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

ลองออนไลน์!

คำอธิบาย

เราสร้างรายการ[N, X]โดยที่N >= Xหลังจากกำหนดค่าให้แล้วเราจะลองทั้งสองอย่าง[N, X]และ[X, N]ให้ได้ผลลัพธ์ที่เป็นไปได้ ตัวอย่างเช่นถ้าNได้รับมอบหมายให้3เราจะทดสอบผ่าน backtracking [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

Mathematica, 61 ไบต์

ขอบคุณไมล์สำหรับการบันทึก 2 ไบต์บวกทั้งไบต์จำนวนมากฉันนับได้โดยไม่มีเหตุผล!

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

คำนวณตารางของคู่ {n, x} โดยที่ x = (i / n) ^ (1 / n) โดยใช้ค่าที่เป็นไปได้ทั้งหมดของ 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, x} ที่มี n มากที่สุด (ไม่นับ {i, 1}) นั่นเป็นสาเหตุที่การเริ่มต้นLastนั้นดีพอที่จะหาคู่ที่ดีที่สุด


1
คุณสามารถเขียนเงื่อนไขการทดสอบโดยใช้IntegerQ@*Lastเพื่อบันทึก 2 ไบต์ แต่ฉันยังนับ 63 ไม่ใช่ 86 ไบต์ในเวอร์ชันปัจจุบันนี้
ไมล์

3

MATL , 22 ไบต์

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

ผลลัพธ์เป็นxไปnตามลำดับที่

อินพุตถูก จำกัด โดยdoubleชนิดข้อมูลเริ่มต้นของ MATL ซึ่งสามารถแสดงจำนวนเต็มได้อย่างถูกต้อง2^53เท่านั้น สิ่งนี้ไม่รวมการทดสอบครั้งแรก (แต่จะให้ผลลัพธ์ที่ถูกต้อง แต่ไม่สามารถรับประกันได้ว่าโดยทั่วไปสำหรับอินพุตที่มีขนาดใหญ่มาก)

ลองออนไลน์!

คำอธิบาย

รหัสใช้ลูปซ้อนกันสองวง:

  • do...whileวนรอบด้านนอกต้องผ่านผลรวมทั้งหมดที่เป็นไปได้n+xเพื่อเพิ่มลำดับ การวนซ้ำจะหยุดลงทันทีที่พบวิธีแก้ไข สิ่งนี้รับประกันได้ว่าเราจะแสดงผลลัพธ์ด้วยผลรวมขั้นต่ำ
  • for eachวงด้านในทดสอบทั้งหมดnและxผลรวมนั้น เมื่อผลรวมเกิดขึ้นพร้อมกับอินพุตลูปด้านในจะถูกออกและเงื่อนไขลูปของลูปด้านนอกถูกตั้งค่าเป็นเพื่อ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]จากนั้นจะทำการกรองและเรียงลำดับเดียวกันกับในโซลูชันก่อนหน้าที่แสดงด้านล่าง เนื่องจากไม่มีข้อ จำกัด ด้านเวลากำลังดุร้ายจะทำงานให้เวลาเพียงพอ

ลองออนไลน์! แต่อย่าลองใช้ค่าจำนวนมากทางออนไลน์

บนพีซีของฉันใช้เวลาประมาณ 6 นาทีในการคำนวณผลลัพธ์สำหรับการi = 2048ใช้เวอร์ชันที่ไม่มีประสิทธิภาพ

รุ่นที่มีประสิทธิภาพ

นี่เป็นโซลูชันก่อนหน้าสำหรับ 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

Perl, 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.