จำนวนมากที่สุดในช่วงเมื่อผลรวมของสแควร์สของปัจจัยสำคัญถูกลบออก


17

สูตรสำเร็จ

ยกตัวอย่างเช่นหมายเลข 300

  • ปัจจัยสำคัญของ 300 คือ[2, 3, 5](ตัวเลขเฉพาะที่เป็นปัจจัยของ 300 และนายกรัฐมนตรี)
  • กำลังสองจำนวนเหล่านั้นจะให้คุณ [4, 9, 25]
  • การรวมรายการนั้นจะทำให้คุณ 4 + 9 + 25 = 38
  • สุดท้ายลบผลรวมนั้น (38) จากหมายเลขเดิมของคุณ300-38 = 262(นี่คือผลลัพธ์)

อินพุต

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


เอาท์พุต

ผลลัพธ์ของคุณจะเป็นตัวเลขสองตัวคั่นด้วยช่องว่างเครื่องหมายจุลภาคขึ้นบรรทัดใหม่หรืออะไรก็ตามที่คุณอนุญาตให้ใช้ภาษา สิ่งเหล่านี้สามารถส่งออกไปยังไฟล์ stdout หรือสิ่งที่ภาษาของคุณใช้ เป้าหมายของคุณคือค้นหาตัวเลขในช่วงที่สร้างเอาต์พุตสูงสุดเมื่อเรียกใช้ผ่านสูตรด้านบน หมายเลขแรกที่แสดงควรเป็นหมายเลขเริ่มต้น (เช่น 300) และหมายเลขที่สองควรเป็นผลลัพธ์ที่สูตรที่สร้าง (เช่น 262)


กรณีทดสอบ

Input: 3       Output: 2, -2
Input: 10      Output: 8, 4
Input: 50      Output: 48, 35
Input: 1000    Output: 1000, 971
Input: 9999    Output: 9984, 9802


ทำงานผ่านตัวอย่าง

พิจารณาอินพุต 10 เราต้องเรียกใช้สูตรสำหรับตัวเลขทั้งหมดตั้งแต่ 2-10 (รวม)

Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2   [2]       [4]         4              -2
3   [3]       [9]         9              -6
4   [2]       [4]         4               0
5   [5]       [25]        25             -20
6   [2, 3]    [4, 9]      13             -7
7   [7]       [49]        49             -42
8   [2]       [4]         4               4
9   [3]       [9]         9               0
10  [2, 5]    [4, 25]     29             -19

ในขณะที่คุณสามารถเห็นผลลัพธ์ที่ยิ่งใหญ่ที่สุดคือ4ซึ่งเป็นผลมาจากการป้อนค่า8ลงในสูตร นั่นหมายความว่าเอาต์พุตสำหรับอินพุตของ10ควรเป็น8, 4


เกณฑ์การให้คะแนน &

ใช้กฎเริ่มต้นสำหรับอินพุตและเอาต์พุต: เริ่มต้นสำหรับ Code Golf: วิธีการอินพุต / เอาท์พุต
ช่องโหว่มาตรฐานนั้นเป็นสิ่งต้องห้าม: ช่องโหว่ที่ถูกห้ามโดยค่าเริ่มต้นการ
ส่งสามารถเป็นฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ฉันได้แก้ไขข้อผิดพลาดในการสะกดและไวยากรณ์เล็กน้อยและทำให้ชื่อมีความหมายมากขึ้น ฉันยังเปลี่ยนบิตเกี่ยวกับการไม่อนุญาตตัวคั่นช่องว่างเนื่องจากนั่นไม่ใช่สิ่งที่คุณต้องการอย่างชัดเจน (เนื่องจากการขึ้นบรรทัดใหม่และช่องว่างเป็นอักขระช่องว่าง) หากนี่ไม่ใช่สิ่งที่คุณตั้งใจคุณสามารถยกเลิกการแก้ไขและทำให้ความตั้งใจของคุณชัดเจนยิ่งขึ้น
Mego

2
จะเกิดอะไรขึ้นหากมีการเชื่อมโยงตัวเลขจำนวนมากเพื่อผลลัพธ์สูงสุด
เดนนิส

1
@Dennis ฉันยอมรับได้หรือไม่ที่จะอนุญาตให้เป็นหมายเลขที่สร้างผลลัพธ์สูงสุด ฉันไม่ต้องการกำหนดกฎใหม่ที่ทำลายโซลูชันที่มีอยู่ทั้งหมด
Keatinge

2
ใช่ว่าอาจเป็นตัวเลือกที่ดีที่สุด 950อาจเป็นตัวอย่างซึ่งทั้ง[900, 862]และ[945, 862]จะเป็นคำตอบที่ถูกต้อง
เดนนิส

1
ฉันสามารถส่งออกตัวเลขในลำดับย้อนกลับได้เช่นสำหรับอินพุท50: 35, 48?
nimi

คำตอบ:



4

Java 8 lambda, 247 239 233 225 224 219 198 161 ตัวอักษร

ฉันคิดว่าต้องเป็นไปได้ใน 300 ตัวอักษรเพราะ ... คุณรู้ ... Java!

และเป็นไปได้แม้ใน 200 ตัวอักษร!

m->{int n=1,u,f,F[],g,G=g=1<<31;for(;++n<=m;){u=n;F=new int[m+1];for(f=1;++f<=u;)u/=u%f<1?(F[f]=f--):1;f=0;for(int p:F)f+=p*p;g=n-f>g?(G=n)-f:g;}return G+","+g;}

ฉันไม่รู้ว่าการใช้การนำเข้านี้ถูกต้องหรือไม่ แต่ฉันคิดว่าน่าจะโอเค นี่คือแลมบ์ดาที่ไม่ได้รับการเรียนในชั้นเรียน:

public class Q80507 {
    static String greatestAfterReduction(int maxNumber) {
        int number = 1, upper, factor, primeFactors[], greatestResult, greatestNumber = greatestResult = 1 << 31; // <-- Integer.MIN_VALUE;
        for (;++number <= maxNumber;) {
            // get unique primefactors
            upper = number;
            primeFactors = new int[maxNumber + 1];
            for (factor = 1; ++factor <= upper;)
                upper /= upper % factor < 1 ? (primeFactors[factor] = factor--) : 1;

            factor = 0;
            for (int prime : primeFactors)
                factor += prime * prime;

            greatestResult = number - factor > greatestResult ? (greatestNumber = number) - factor : greatestResult;
        }
        return greatestNumber + "," + greatestResult;
    }
}

การค้นหาเฉพาะเจาะจงจะขึ้นอยู่กับคำตอบนี้ รหัสใช้ฟังก์ชันการทำงานของชุดเนื่องจากจะบันทึกแต่ละค่าเพียงครั้งเดียวดังนั้นฉันจึงไม่ต้องสนใจว่าจะเพิ่มรายการซ้ำในภายหลัง ส่วนที่เหลือของรหัสค่อนข้างตรงไปตรงมาเพียงทำตามคำถาม

อัพเดท

ลบ newline ออกจากเอาต์พุต

ขอบคุณ @ogregoire สำหรับการเล่นกอล์ฟ Integer.MIN_VALUE ถึง 1 << 31!

หลังจากดูรหัสอีกครั้งฉันก็พบว่ามีสถานที่อื่น ๆ ที่สามารถเล่นกอล์ฟได้อีก

ขอบคุณ @Blue สำหรับเคล็ดลับ == 0 ถึง <1 เคล็ดลับ!

ลบส่วนที่เหลือออกบางส่วน สำหรับการแยกถ่านเพียงตัวเดียวก็ไม่จำเป็นต้องเสียถ่านอีกตัว

ขอขอบคุณอีกครั้งที่ @ogregoire ที่ชี้ให้เห็นว่าฉันสามารถคืนค่าได้แทนที่จะพิมพ์และประกาศร่วมกัน! สิ่งนี้ช่วยได้มาก!

พบว่าฉันสามารถใช้ ternary แทนที่จะเป็นวินาทีหากช่วยประหยัดได้มากกว่านี้

ขอขอบคุณที่ @AstronDan สำหรับน่ากลัวการใช้งานของอาร์เรย์ซึ่งจะช่วยประหยัดการนำเข้า นั่นก็ทำให้ฉันมีความเป็นไปได้ที่จะย่อให้สั้นลงถ้าเป็นไตรภาค


1
Integer.MIN_VALUE1<<31จะสั้นลงเป็น
Olivier Grégoire

1
บันทึก 1 ไบต์ด้วย if (u% f <1) แทน
Blue

1
ประกาศสิ่งของทั้งหมดของคุณintในที่เดียวกันเพื่อหลีกเลี่ยงการทำซ้ำintหลาย ๆ ครั้งและกำหนดมูลค่าให้หากเป็นไปได้
Olivier Grégoire

1
นอกจากนี้กำจัดสิ่งนั้นSystem.out.println(...)และคืนค่าแทนการพิมพ์: เนื่องจาก OP กล่าวถึงวิธีมาตรฐาน I / O ที่ใช้งานอยู่
Olivier Grégoire

1
คุณสามารถใช้เคล็ดลับอาร์เรย์ที่ฉันใช้ใน C # เพื่อเปลี่ยน hashset ให้เป็นอาร์เรย์ int การทำเช่นนี้จะทำให้คุณสามารถนำเข้าที่บันทึกได้หลายไบต์
AstroDan

3

ที่จริงแล้ว 21 ไบต์

u2x;`;y;*@-`M;M;)@í@E

ลองออนไลน์!

คำอธิบาย:

u2x;`;y;*@-`M;M;)@í@E
u2x;                   push two copies of range(2, n+1) ([2, n])
    `      `M          map:
     ;                   duplicate
      y;                 push two copies of prime divisors
        *                dot product of prime divisors lists (equivalent to sum of squares)
         @-              subtract from n
             ;M;)      duplicate, two copies of max, move one copy to bottom of stack
                 @í    get index of max element
                   @E  get corresponding element from range

คุณสามารถลิงค์ไปยังภาษานี้ได้หรือไม่
ไม่ใช่ชาร์ลส์ที่

1
@NotthatCharles คุณสามารถคลิกชื่อภาษาในล่ามออนไลน์
เดนนิส

โอเคฉัน googled Actually Programming Languageและไม่พบอะไรเลยแม้หลังจากเรียกดูหน้าผลลัพธ์ Google 5 หน้า ภาษานี้คืออะไร
Tejas Kale

2
@Tejas คุณสามารถคลิกที่ชื่อภาษาที่จะส่งคุณไปยังแหล่งที่มาของมัน: github.com/Mego/Seriously
Amndeep7

3

MATL , 18 ไบต์

:"@tYfu2^s-]v2#X>w

ลองออนไลน์!

กรณีสุดท้ายใช้เวลานานเกินไปสำหรับคอมไพเลอร์ออนไลน์ แต่มันให้ผลลัพธ์ที่ถูกต้อง (ใช้เวลาประมาณ 11 วินาทีในคอมพิวเตอร์ของฉันที่ทำงานบน Matlab):

enter image description here

คำอธิบาย

แอพพลิเคชั่นที่ตรงไปตรงมาของขั้นตอนที่อธิบายไว้

:         % Implicit input n. Range [1 2 ... n]
"         % For each
  @       %   Push that number
  tYfu    %   Duplicate. Prime factors. Unique values
  2^s-    %   Square. Sum of array values. Subtract
]         % End for each
v         % Concatenate stack contents into vertical vector
2#X>      % Max and arg max
w         % Swap. Implicit display         

3

C #, 194 ไบต์

กอล์ฟรหัสแรกของฉัน :) ฉันใช้ภาษาที่ฉันชอบแม้จะใช้คำฟุ่มเฟื่อย ฉันเริ่มต้นนี้เป็นพอร์ตฟังก์ชั่น C # ของ Java ของ @ Frozn แต่พบหลายวิธีในการย่อขนาดโค้ดเพิ่มเติมด้วยการปรับให้เหมาะสม

string R(int a){int u,f,g,N=g=1<<31;for(int n=1;++n<=a;){u=n;int[]P=new int[a+1];for(f=1;++f<=u;){if(u%f<1){u/=f;P[f]=f--;}}f=0;foreach(var p in P){f+=p*p;}if(n-f>g){g=(N=n)-f;}}return N+","+g;}

สิ่งนี้ใช้อาร์เรย์เพื่อจัดเก็บปัจจัยสำคัญ เนื่องจากมีการจัดทำดัชนีโดยปัจจัยที่จะแทนที่ปัจจัยซ้ำด้วยสำเนาของปัจจัย สิ่งนี้ทำให้ฟังก์ชั่นไม่มีการนำเข้า สิ่งนี้ไม่จำเป็นต้องมีแม้แต่ระบบ


นี่เป็นเคล็ดลับที่ดีจริงๆ! จะลองใช้มันในรุ่นของฉัน
Frozn

3

ยูทิลิตี Bash + GNU, 74

seq 2 $1|factor|sed -r 's/:?( \w+)\1*/-\1*\1/g'|bc|nl -v2|sort -nrk2|sed q
  • seq สร้างจำนวนเต็มทั้งหมด 2 ถึง n
  • factorให้ตัวเลขตามด้วยเครื่องหมายโคลอนจากนั้นช่องว่างคั่นรายการปัจจัยหลักทั้งหมดรวมถึงรายการซ้ำ เช่นผลลัพธ์สำหรับ 12 คือ12: 2 2 3
  • sedลบเครื่องหมายโคลอนและตัวประกอบซ้ำจากนั้นสร้างนิพจน์ทางคณิตศาสตร์ที่จำเป็น เช่นสำหรับ 12:12- 2* 2- 3* 3
  • bc ประเมินสิ่งนี้
  • nl คำนำหน้า n กลับเข้ามา (เริ่มที่ 2)
  • sort โดยคอลัมน์ที่สองตัวเลขตามลำดับจากมากไปน้อย
  • seq พิมพ์บรรทัดแรกและออก

Ideone


2

Brachylogขนาด 48 ไบต์

:2:{eI$pd:{:2^.}a+:I--:I.}fF$\hor:0m:Ir.r~m[F:J]

คำอธิบาย

Main predicate:

:2:{}fF                     Unify F with the list of all binding for which predicate 1 is
                            true, given [Input, 2] as input.
       $\hor:0m             Retrieve the max of F by diagonalizing it, taking the
                            first row, sorting that row and reversing the sorted row.
               :Ir.         Unify the Output with [I, Max],
                   r~m[F:J] [I, Max] is in F at index J (the index is unimportant)


Predicate 1:

eI                          I is an integer in the range given in Input
  $pd                       Get the list of prime factors of I, with no duplicates
     :{:2^.}a               Apply squaring to each element of that list
             +              Sum the list
              :I-           Subtract I from the sum
                 -          Multiply by -1 (let's call it Result)
                  :I.       Unify the Output with [Result, I]

2

เยลลี่ขนาด 13 ไบต์

ÆfQ²S_@,µ€ḊṀṚ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

ÆfQ²S_@,µ€ḊṀṚ  Main link. Argument: n

        µ      Combine the chain to the left into a link.
         €     Apply it to each k in [1, ..., n].
Æf               Yield k's prime factors as a list.
  Q              Unique; deduplicate the prime factors.
   ²             Square each unique prime factor.
    S            Compute their sum.
     _@          Subtract the result from k.
       ,         Pair with k, yielding [result(k), k].
          Ḋ    Dequeue; discard the first pair which corresponds to k = 1.
           Ṁ   Get the maximum (lexicographical order).
            Ṛ  Reverse the pair.

2

05AB1E, 19 17 16 ไบต์

รหัส:

L©f€n€O®-®)ø¦{¤R

คำอธิบาย:

L                    # make a list of 1..input [1,2,3,4,5,6]
 ©                   # save the list for reuse
  f                  # get primefactors of numbers in list [[],[2],[3],[2],[5],[2,3]]
   €n                # square each factor [[],[4],[9],[4],[25],[4,9]]
     €O              # sum the factors [0,4,9,4,25,13]
       ®-            # subtract from saved list [1,-2,-6,0,-20,-7]
         ®)ø         # zip with saved list [[1,1],[-2,2],[-6,3],[0,4],[-20,5],[-7,6]]
            ¦        # drop the first item (n=1) [[-2,2],[-6,3],[0,4],[-20,5],[-7,6]]
             {       # sort [[-20,5],[-7,6],[-6,3],[-2,2],[0,4]]
              ¤      # get last item [0,4]
               R     # reverse [4,0]

ลองออนไลน์


2

Julia, 56 ไบต์

!n=maximum(k->(k-sumabs2(k|>factor|>keys),k),2:n)[[2,1]]

ลองออนไลน์!

มันทำงานอย่างไร

รับอินพุตn , สำหรับจำนวนเต็มkแต่ละตัวที่2 ≤ k ≤ nเราสร้าง tuple (f (k), k) , โดยที่f (k)คือความแตกต่างระหว่างkและผลรวมของกำลังสองของปัจจัยสำคัญ .

f (k)ตัวเองมีการคำนวณด้วยk-sumabs2(k|>factor|>keys)ซึ่งเป็นปัจจัยkเป็น Dict ของคีย์นายกรัฐมนตรีและค่าสัญลักษณ์, สารสกัดจากคีย์ทั้งหมด (ปัจจัยสำคัญ) ใช้ผลรวมของสี่เหลี่ยมและลบเลขเป็นผลมาจากพวกเขาk

สุดท้ายเราใช้เวลาสูงสุด lexicographical ของ tuples สร้างและย้อนกลับได้โดย accesing มันที่ดัชนี2และ1


1

Clojure, 215 ไบต์

(fn j[x](apply max-key second(map(fn[w][w(- w(let[y(reduce +(map #(* % %)(set(flatten((fn f[q](let[c(filter(fn[r](=(mod q r)0))(range 2 q))](if(empty? c)q(map f c))))w)))))](if(= y 0)(* w w)y)))])(range 2(inc x)))))

เพียงทำตามกฎ คำนวณค่าเฉพาะของแต่ละหมายเลขนำมาเป็นกำลังสองและหาผลรวม หลังจากนั้นสร้างรายการเวกเตอร์ของ 2 องค์ประกอบ: หมายเลขเริ่มต้นและผลลัพธ์และค้นหาองค์ประกอบที่มีค่าสูงสุดขององค์ประกอบที่สอง

คุณสามารถดูออนไลน์ได้ที่นี่: https://ideone.com/1J9i0y





1

PowerShell v2 +, 124 120 117 ไบต์

2..$args[0]|%{$y=$z=$_;2..$_|%{$y-=$_*$_*!($z%$_)*('1'*$_-match'^(?!(..+)\1+$)..')};if($y-gt$o){$o=$y;$p=$_}}
"$p $o"

บรรทัดแรกจะคำนวณค่าส่วนที่สองคือเอาท์พุท

เราเริ่มต้นด้วยการสร้างช่วงจาก2ถึงอาร์กิวเมนต์บรรทัดคำสั่งของเราและห่วงว่า$args[0] แต่ละวงเราตัวแปรผู้ช่วยตั้งค่าเท่ากับมูลค่าปัจจุบันของเราด้วย|%{...} $y=$z=$_จากนั้นเราวนซ้ำทุกตัวเลขจาก2จนถึงจำนวนปัจจุบันของเรา แต่ละวงด้านในเราตรวจสอบว่าตัวเลขนั้นเป็นตัวหาร!($z%$_)หรือไม่และมันสำคัญ ('1'*$_-match'^(?!(..+)\1+$)..')หรือไม่และถ้าเป็นทั้งสองเราจะลบสี่เหลี่ยมออกจาก$y(การตรวจสอบเสร็จสิ้นโดยใช้การคูณบูลีน)

เมื่อเราได้ผ่าน divisors สำคัญและหักสี่เหลี่ยมถ้าจำนวนที่เหลือเป็นที่ใหญ่ที่สุดที่เราเคยเห็นเพื่อให้ห่างไกลเราตั้งค่าตัวแปรผลผลิตของเรา$y-gt$o $o=$y;$p=$_หลังจากที่เราวนรอบช่วงทั้งหมดเราก็แค่ส่งออกด้วยช่องว่างระหว่าง


1

Haskell, 91 ไบต์

f m=reverse$maximum[[n-sum[p^2|p<-[2..n],mod n p<1,mod(product[1..p-1]^2)p>0],n]|n<-[2..m]]

ตัวอย่างการใช้: f 50->[48,35] ->

ฟังก์ชั่นปัจจัยสำคัญที่มีอยู่เพียงผ่านimport Data.Numbers.Primesซึ่งค่าใช้จ่ายไบต์มากเกินไปดังนั้นฉันใช้@ ตรวจสอบนายกลินน์ ที่เหลือก็เป็นตรงไปข้างหน้า: สำหรับใส่mห่วงnผ่าน[2..m]และในวงภายในผ่านp [2..n]เก็บทุกอย่างpที่ดีที่สุดและหารnสแควร์และผลรวม



1

JavaScript (ES6), 111 105 ไบต์

f=n=>{r=n<2?[]:f(n-1);for(s=[],j=n,i=2;j>1;k%i?i++:j/s[i]=i);s.map(i=>j-=i*i,j=n);return j<r[1]?r:[n,j]}

ไม่รู้เลยว่าทำไมฉันไม่คิดจะทำแบบนี้ซ้ำ ๆ ก่อน


1

J, 44 ไบต์

[:((],.~2+I.@e.)>./)@:}.1(-[:+/*:@~.@q:)@+i.

วิธีการตรงไปข้างหน้า ยังส่งคืนค่าทั้งหมดของnผลลัพธ์นั้นด้วยค่าสูงสุด

การใช้

   f =: [:((],.~2+I.@e.)>./)@:}.1(-[:+/*:@~.@q:)@+i.
   f 3
2 _2
   f 10
8 4
   f 50
48 35
   f 1000
1000 971
   f 9999
9984 9802
   f 950
900 862
945 862
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.