ตรวจสอบว่าตัวเลขเป็นผลคูณของจำนวนเต็มต่อเนื่องหรือไม่


18

ตัวเลขบางตัวเช่น: 6, 12, 20, 30, 42, 56, 60, 90, 120 และอื่น ๆ สามารถแสดงเป็นผลิตภัณฑ์ของตัวเลขจำนวนเต็มต่อเนื่องตามที่แสดงด้านล่าง

6   = 2 * 3  
12  = 3 * 4  
30  = 5 * 6
60  = 3 * 4 * 5  
90  = 9 * 10  
120 = 4 * 5 * 6  

เขียนโปรแกรมหรือฟังก์ชั่นที่ส่งออกรายการจำนวนเต็มต่อเนื่องซึ่งผลิตภัณฑ์เท่ากับจำนวนที่ระบุ

ตัวอย่างของตัวเลขที่ไม่เหมาะกับตรรกะนี้คือ:

99  = 9 * 11  (Product of non-consecutive numbers)
121 = 11 * 11 (Same numbers)
2   = 1 * 2   (Product of itself and 1)
13  = 13      (Product of only one number)

โปรดทราบว่าสำหรับกรณีของ2 = 2 * 1เราไม่ถือว่าผลลัพธ์ที่ถูกต้องเนื่องจากจำนวนเต็มคูณด้วย 1 ให้ผลลัพธ์เหมือนกัน สำหรับคำถามนี้เราจะพิจารณาเฉพาะจำนวนเต็ม> = 2 ในผลิตภัณฑ์

อินพุต

จำนวนเต็มบวก 32 บิตที่ถูกต้อง สามารถจากอินพุตมาตรฐานอาร์กิวเมนต์ของฟังก์ชันและอื่น ๆ

เอาท์พุต

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

ข้อ จำกัด

รหัสควรใช้เวลาพอสมควร (<5 นาที) ในการทำงานบนคอมพิวเตอร์มาตรฐานสำหรับอินพุตที่ถูกต้องทั้งหมด (จำนวนเต็มบวก 32- บิต 32 บิต) หากมีผลิตภัณฑ์จำนวนเต็มต่อเนื่องรหัสควรส่งออกหนึ่งหรือมากกว่าภายในเวลาที่กำหนด มิฉะนั้นรหัสควรยุติโดยไม่มีผลลัพธ์ภายในเวลาที่กำหนด

นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


1
ปริศนานี้ตามที่ระบุไว้ไม่เหมาะสำหรับรูปแบบของไซต์นี้ ไซต์นี้มีไว้สำหรับการแข่งขันที่มีวิธีที่ดีในการตัดสินผู้ชนะ (เช่นรหัสที่สั้นที่สุดรหัสที่เร็วที่สุด upvotes ส่วนใหญ่เป็นต้น) คุณไม่ได้ให้วิธีดังกล่าว
Chris Jester-Young

2
ฉันขอแนะนำให้คุณทำรหัสนี้ - กอล์ฟ (รหัสที่สั้นที่สุด) คุณต้องใส่ข้อ จำกัด บางอย่างลงไป ตัวอย่างเช่นหมายเลข 0 ถึง 1000000 เวลาดำเนินการสูงสุด 10 วินาทีเป็นต้น
ระดับแม่น้ำเซนต์

พยายามแก้ไขเพื่อกอบกู้คำถามนี้ แต่ฉันไม่ได้ตั้งคำถามใด ๆ มาก่อนดังนั้นหากคุณเห็นสิ่งใดโปรดแก้ไข
Vectorized

@bitpwner นอกเหนือจากความผิดพลาดบางอย่างดูเหมือนว่าดีสำหรับฉัน โหวตให้เปิดใหม่
seequ

5
30=5*6ฉันคิดว่าคุณหมายถึง
Kyle Kanos

คำตอบ:


8

Java - 124

String f(int t){int s=2,h=3,p=s,i;String o="";for(;p!=t&&s*s<t;p=p<t?p*h++:p/s++);if(p==t)for(i=s;i<h;o+++=i+" ");return o;}

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

ตัวอย่างเช่นสำหรับ 30 มันจะตรวจสอบ:

2*3     = 6 (too low, multiply)
2*3*4   = 24 (too low, multiply)
2*3*4*5 = 120 (too high, divide)
3*4*5   = 60 (too high, divide)
4*5     = 20 (too low, multiply)
4*5*6   = 120 (too high, divide)
5*6     = 30 (bingo!)

เอาต์พุตสตริงที่คั่นด้วยช่องว่างของปัจจัยในลำดับจากน้อยไปหามาก

ด้วยตัวแบ่งบรรทัด:

String p(int t){
    int s=2,h=3,p=s,i;
    String o="";
    for(;p!=t&&s*s<t;p=p<t?p*h++:p/s++);
    if(p==t)
        for(i=s;i<h;o+=i+" ");
    return o;
}

7

Python - 104 97 95 92 ลอง

n=input()
s=i=2
c=1
while s<n:
 s*=i+c;c+=1
 if s==n:print range(i,i+c)
 if s/n:i+=1;s,c=i,1

หากnเป็นเช่นตั้งไว้ที่ 120 ไว้ล่วงหน้าโปรแกรมจะแสดงผลสองวิธี:

[2, 3, 4, 5]
[4, 5, 6]

ขออภัยฉันลืมกำหนดข้อมูลบางอย่าง
Falko

1
แทนที่ c = c + 1, i = i + 1 ด้วย c + = 1, i + = 1
Gerrat

1
Oh yeah +=ไม่ได้คิดเกี่ยวกับ แต่ฉันคิดถึง++Python ...
Falko

1
if s>=nและif s/nเทียบเท่าดังนั้นคุณสามารถให้บริการโซลูชั่นทั้งหมดด้วยจำนวนอักขระที่เท่ากัน
isaacg

1
คุณสามารถบันทึกตัวละครทั้งสามโดยการเปลี่ยนไปs=s*(i+c) s*=i+c
El'endia Starman

4

Clojure - 127 109 ไบต์

(defn f[x](first(for[r[range]y(r 2 x)v[(take-while #(<=(apply * %(r y %))x)(r y x))]:when(=(apply * v)x)]v)))

ตัวอย่าง:

(map f [6 12 30 60 90 120 1404816 99 121 2 13])
=> ((2 3) (3 4) (5 6) (3 4 5) (9 10) (2 3 4 5) (111 112 113) nil nil nil nil)

คำอธิบาย:

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

ที่ง่ายที่สุดในการทดสอบในhttp://tryclj.com/


ตอนนี้ฉันก็สังเกตเห็นว่าฉันสามารถคืนความเป็นไปได้ทั้งหมด: 120 ไบต์ 102 ไบต์แต่ให้ผลลัพธ์ในรายการซ้อนกัน

(defn f[x](for[r[range]y(r 2 x)v[(take-while #(<=(apply * %(r y %))x)(r y x))]:when(=(apply * v)x)]v))

ตัวอย่าง:

(map f [6 12 30 60 90 120 1404816 99 121 2 13])
=> (((2 3)) ((3 4)) ((5 6)) ((3 4 5)) ((9 10)) ((2 3 4 5) (4 5 6)) ((111 112 113)) () () () ())

3

CJam, 31 ไบต์

q~:Qmq,A,m*{2f+~,f+_:*Q={p}*}%;

มันเป็นวิธีการแรงเดรัจฉาน แต่เวลาการดำเนินการเป็นเพียงไม่กี่วินาทีโดยใช้การอย่างเป็นทางการล่าม Java

หากคุณต้องการทดสอบรหัสโดยใช้ล่ามออนไลน์คุณควรให้อินพุตอยู่ในระดับต่ำอย่างสมเหตุสมผล อะไรที่น้อยกว่า 2 26ยังคงทำงานบนเครื่องของฉัน

ตัวอย่าง

$ TIME="%e s"
$ time cjam product.cjam <<< 2
0.12 s
$ time cjam product.cjam <<< 6
[2 3]
0.10 s
$ time cjam product.cjam <<< 120
[2 3 4 5]
[4 5 6]
0.12 s
$ time cjam product.cjam <<< 479001600
[2 3 4 5 6 7 8 9 10 11 12]
0.68 s
$ time cjam product.cjam <<< 4294901760
[65535 65536]
1.48 s
$ time cjam product.cjam <<< 4294967295
1.40 s

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

q~:Q      " Read from STDIN, interpret the input and save the result in variable “Q”.     ";
mq,       " Push the array [ 0 1 2 … (Q ** 0.5 - 1) ].                                    ";
A,m*      " Push the array [ 0 1 2 … 9 ] and take the Cartesian product.                  ";
{         " For each pair in the Cartesian product:                                       ";
  2f+     " Add 2 to each component.                                                      ";
  ~       " Dump the array's elements on the stack.                                       ";
  ,       " Push the array [ 0 1 2 … n ], where “n” is the topmost integer on the stack.  ";
  f+      " Add “m” to each element, where “m” is the integer below the array.            ";
  _:*     " Duplicate the resulting array and push the product of its elements.           ";
  Q={p}*  " If the product is equal to “Q”, print.                                        ";
}%        " Collect the remaining results into an array.                                  ";
;         " Discard the array from the stack.                                             ";

2

Java, 162

ส่งคืนอาร์เรย์ของจำนวนเต็มหรือnullหากไม่มีตัวเลขติดต่อกันที่มีอยู่

int[] e(int n){for(int i=1;i<n;i++){int h=i+1,c=1,s=i;while(s<n){c++;s*=h++;}if(s==n){int[] o=new int[c];for(int j=0;j<c;j++){o[j]=h-j-1;}return o;}}return null;}

ungolfed:

int[] execute(int input){
    for(int i=1; i<input; i++){
        int highest = i+1, count = 1, sum = i;
        while(sum < input){
            count++;
            sum *= highest++;
        }
        if(sum == input){
            int[] numbers = new int[count];
            for(int j=0; j<count; j++){
                numbers[j] = highest-j-1;
            }
            return numbers;
        }
    }
    return null;
}

2

C 105 110 ลองดู

n,k,l;main(i){for(scanf("%d",&n);++i<n;)for(k=1,l=i;k<n;)if(k*=l++,k==n)for(l=n;l/=i;)printf("%d ",i++);}

144พร้อมโบนัส: สิ่งนี้วนซ้ำทุกหมายเลขและค้นหาผลิตภัณฑ์ที่ตรงกัน

main(i,j,k,l,m){for(scanf("%d",&m);++i<13;)for(j=0;++j<46341-i;){for(l=k=1;k<=i;)l*=j+k++;if(l==m)for(puts(""),k=0;k<i;)printf("%d ",j+k+++1);}}

ดีมากง่ายและสง่างาม! ทำงานได้แน่นอนสำหรับตัวเลขที่น้อยกว่าที่ฉันโยนลงไป จากนั้นฉันให้ 50815512 (7128 x 7129) และมันเข้าสู่วงวนไม่สิ้นสุด มันล้นเมื่อพยายามคำนวณ 7128 x 7129 x 7130 = 362314600560 หรือไม่
ทอดด์เลห์แมน

ขอบคุณ! เห็นได้ชัดว่าสภาพไปเพราะสูงเกินไปk < n k *= l++ฉันสามารถผนวกยาวไม่ได้ลงนามนานถึงจุดเริ่มต้น แต่ ... ที่จะทำลายชีวิต
bebe

2

PHP 258 chars, 201 ไม่นับฟังก์ชันแฟกทอเรียล

วิธีที่ง่ายที่สุดในการแสดงทางคณิตศาสตร์ "ปัจจัยต่อเนื่องที่เท่ากับจำนวน" คือX!/Y!ที่ไหนXเป็นจำนวนสูงสุดและYเป็นลบต่ำสุดที่หนึ่ง น่าเสียดายที่ฉันหยุดเรียนแคลคูลัสก่อนที่ฉันจะเรียนรู้ที่จะแก้ปัญหาZ = X!/Y!ดังนั้นฉันจึงต้องถ่อมตนเล็กน้อย

รุ่นยุ่งยุ่ง:

<?php
// PHP does not define a factorial function, so I've kludged one in.
function fact($n) {
    $r = 1;
    for($i=$n; $i>1; $i--) {
        $r *= $i;
    }
    return $r;
}

$input = intval($argv[1]);

if( $input < 2 ) { die('invalid input'); }

printf("input: %s\n", $input);

$max=min(ceil(sqrt($input)),170); // integer breakdown for > 170!
$grid = array();
for( $x=1;$x<$max;$x++ ) {
    for( $y=$max;$y>=1;$y-- ) {
        if( $y >= $x ) { continue; } // Skip results that would be < 1
        $cur = fact($x)/fact($y);
        if( $cur > $input ) { // too large!
            echo "\n"; continue 2;
        }
        if( $cur == $input ) { //just right
            printf("%7d\n\nFound %s == %s\n", $cur, implode(' * ', range($y+1, $x)), $cur);
            break 2;
        }
        printf("%7d ", $cur);
    }
    echo "\n";
}
if($cur!=$input){printf("No consecutive factors produce %d\n", $input);}

ตัวอย่างผลลัพธ์:

input: 518918400

  2
  3       6
  4      12      24
  5      20      60     120
  6      30     120     360     720
  7      42     210     840    2520    5040
  8      56     336    1680    6720   20160   40320
  9      72     504    3024   15120   60480  181440  362880
 10      90     720    5040   30240  151200  604800 1814400 3628800
 11     110     990    7920   55440  332640 1663200 6652800 19958400 39916800
 12     132    1320   11880   95040  665280 3991680 19958400 79833600 239500800 479001600
 13     156    1716   17160  154440 1235520 8648640 51891840 259459200
 14     182    2184   24024  240240 2162160 17297280 121080960
 15     210    2730   32760  360360 3603600 32432400 259459200
 16     240    3360   43680  524160 5765760 57657600 518918400

Found 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 == 518918400

แข็งแรงเล่นกอล์ฟ:

<? function f($n){$r=1;for($i=$n;$i>1;$i--)$r*=$i;return $r;}$i=$argv[1];$m=min(ceil(sqrt($i)),170);for($x=1;$x<$m;$x++){for($y=$m;$y>0;$y--){if($y>=$x)continue;$c=f($x)/f($y);if($c>$i)continue 2;if($c==$i){$y++;echo "$y $x";break 2;}}}if($c!=$i){echo 'No';}

เอาท์พุท:

[sammitch@vm ~/golf] time php consecutive_golf.php 518918400
9 16
real 0m0.019s
user 0m0.011s
sys  0m0.009s
[sammitch@vm ~/golf] time php consecutive_golf.php 518918401
No
real 0m0.027s
user 0m0.017s
sys  0m0.011s

ฉันไม่ได้คาดหวังว่าเวลาทำงานจะค่อนข้างเร็วขนาดนี้!


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

1
@ เป็น 258 ตัวอักษรไม่เลวเกินไปสำหรับ PHP ถ้าฉันไม่ขี้เกียจและดื้อรั้นฉันจะทำมันด้วยภาษาจริง : P
Sammitch

X! / Y! เป็นผลคูณของจำนวนเต็ม N ซึ่ง Y <N <= X มันช่วยได้บ้างไหม?
trichoplax

2

Pyth , 35

JvwKr2 4W-ZJ~@KgJZ1=YurGHK=Zu*NTY)Y

หมายเหตุ:รหัสของฉันจริง ๆ แล้วพบว่าการเป็นตัวแทนที่สั้นที่สุดของการเป็นตัวแทนของจำนวนเต็มติดต่อกัน> = 2 ดังนั้นในการป้อนข้อมูลที่ไม่ถูกต้องมันจะพิมพ์ 1 รายการองค์ประกอบอาจหลังจากเวลานานมาก เนื่องจากคำแถลงปัญหาระบุว่าอินพุตจะถูกต้องฉันจึงถือว่านี่เป็นโอเค

คำอธิบายสั้น ๆ :

โดยพื้นฐานแล้วโปรแกรมจะจัดเก็บขีด จำกัด บนและล่างของช่วงคำนวณผลิตภัณฑ์ของตัวเลขในช่วงโดยใช้การลดปรับจุดสิ้นสุดตามความจำเป็นและทำซ้ำจนกว่าจะเท่ากับอินพุต

คำอธิบายยาว:

สำหรับโค้ดแต่ละอันฉันจะให้ python ที่เทียบเท่ารวมทั้งคำอธิบายและเหตุผลที่ละเอียดกว่า

Jvw => J=eval(input())

วิธีมาตรฐานในการรับอินพุตเป็น Pyth

Kr2 4 => K=range(2,4) =>K=[2,3]

นี่คือส่วนแรกที่แปลก: แทนที่จะเก็บปลายทางเป็นตัวแปรแยกกันฉันเก็บมันไว้เป็นองค์ประกอบของรายการ เหตุผลจะชัดเจนในไม่ช้า นอกจากนี้แทนที่จะทำภารกิจง่ายๆซึ่งใน Pyth จะเป็นK[2 3)ฉันกำลังใช้ช่วงเพื่อบันทึกอักขระ

W-ZJ => while Z-J =>while Z!=J

ณ จุดนี้คุณอาจถามว่า "Z คืออะไรคุณยังไม่ได้กำหนด" ใน Pyth ตัวแปรทั้งหมดจะถูกกำหนดไว้ล่วงหน้า Z เกิดขึ้นเมื่อเริ่มต้นเป็น 0 อย่างไรก็ตาม Z จะถูกกำหนดเป็นมูลค่าของผลิตภัณฑ์ในภายหลังดังนั้นการตรวจสอบนี้จะทำหน้าที่สิ้นสุดในขณะที่ลูปเมื่อรายการอยู่ในค่าที่ถูกต้อง

~@K>JZ1 => K[J>Z] += 1

นี่คือเหตุผลที่ฉันเก็บค่าไว้ในรายการไม่ใช่ในตัวแปรที่แยกจากกัน: ฉันต้องการเพิ่มจุดปลายหนึ่งในสองจุดขึ้นอยู่กับว่าผลิตภัณฑ์นั้นสูงเกินไปหรือต่ำเกินไป นั่นจะเป็นเงื่อนไขที่ค่อนข้างยาวหากจุดปลายเป็นตัวแปรแยก แต่ด้วยความมหัศจรรย์ของการทำดัชนีรายการมันจะสั้น นอกจากนี้ความจริงที่ว่าการตรวจสอบนี้มาก่อนผลิตภัณฑ์และความจริงที่ว่า Z เริ่มต้นเป็น 0 ให้แน่ใจว่า K จะเป็น[2,4]เวลาที่เราใช้ผลิตภัณฑ์ครั้งแรกซึ่งเป็นจุดสิ้นสุดที่เหมาะสม

=YurGHK => Y=reduce(lambda G,H: range(G,H),K) =>Y=range(K[0],K[1])

ตอนนี้ฉันต้องการรายชื่อจริงที่จะนำผลิตภัณฑ์และที่จะพิมพ์ออกมาหากเราประสบความสำเร็จ เห็นได้ชัดว่าเราจะใช้ฟังก์ชั่นช่วง ความยุ่งยากอยู่ในการรับอินพุตไปยังฟังก์ชันช่วง วิธีที่ชัดเจนในการทำเช่นนี้โดยการจัดทำดัชนีรายการจะเป็น=Yr'K@K1วิธีที่ชัดเจนที่จะทำเช่นนี้โดยการจัดทำดัชนีรายการจะเป็นอย่างไรก็ตามโดยใช้ฟังก์ชั่นการลดลงในรายการองค์ประกอบสองนี้เราสามารถย่อให้สั้นลงโดยตัวละคร

=Zu*NTY => Z=reduce(lambda N,T: N*T,Y)

และตอนนี้สำหรับจุดรวมของเรื่องนี้การลดการดำเนินการเพื่อค้นหาผลิตภัณฑ์ของรายการ

) => สิ้นสุดในขณะที่

Y => print(Y)

สำเร็จพิมพ์รายการ

ตัวอย่างการเรียกใช้:

$ cat seq_prod 
JvwKr2 4W-ZJ~@K>JZ1=YurGHK=Zu*NTY)Y

$ cat seq_prod | python3 pyth.py
<debug stuff>
==================================================
[9, 10, 11, 12, 13, 14, 15, 16]

1

Java - 115

void f(int i){for(int j=2;j<i;j++)for(int k=1,x=j;(x*=j+k)<i;k++);if(x==i)for(i=j;i<j+k;i++)System.out.println(i);}

golfed น้อยกว่าเล็กน้อย:

void f(int i) {
 for(int j=2; j<i; j++)
  for(int k=1, x=j; (x*=j+k) < i; k++);
   if(x == i)
    for(i=j; i<j+k; i++)
     System.out.println(i);
}

ใช่คุณสร้างฟังก์ชั่นและพิมพ์ค่าส่งคืน ไม่เคยเห็นแบบนี้มาก่อนเลย
seequ

ฉันไม่สามารถได้รับมันจะพิมพ์อะไร ... แต่ถ้าจะให้ฉันเอาท์พุทบางอย่างคุณกอล์ฟสามารถSystem.out.printlnลงไปSystem.out.printและอัฒภาคในตอนท้ายของการfor(int k=1,x=j;(x*=j+k)<i;k++)ไม่ได้เป็นที่ไม่จำเป็นเพียง แต่ยังเกิดข้อผิดพลาด
Qwix

มันไม่ได้ผลสำหรับฉัน x, j, kจะออกจากขอบเขตในช่วงบล็อกเพราะif/for ;ถ้าฉันลบ;มันจะไม่พิมพ์อะไรเลย
Geobits

1
@Qwix การเปลี่ยนเป็นprintหมายความว่าเขาต้องการเพิ่มอักขระช่องว่างเพื่อหลีกเลี่ยงการใช้ตัวเลขร่วมกัน
Geobits

1
@Geobits จุดดี! ฉันอาจจะเห็นว่าถ้ามันให้ผลลัพธ์ออกมาบ้าง
Qwix

1

Matlab (88)

รหัสคาดว่าหมายเลขจะถูกเก็บไว้ในxและส่งออกlมา

for n=2:12
r=ceil(x^(1/n))
for s=-3*n:n
l=r-s+(1:n)
if prod(l)==x
return 
end;end;l=x;end

เนื่องจาก13! > 2^32รหัสนี้จะค้นหาเฉพาะผลิตภัณฑ์ที่มีความยาว 2 ไม่เกิน 12 รหัสนี้มีการรันไทม์ที่คงที่ประมาณ 0.001 วินาที


1

สกาลา - 86

def p(n:Int)=(2 to n).flatMap(i=>(i to n).map(i to _-1).find(_.product==n)).headOption

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

ungolfed:

def product(n: Int): Option[Range] = {
  def productStartingAt(start: Int): Option[Range] =
    (start to n-1).map(start to _).find(_.product == n)

  (2 to n).flatMap(i => productStartingAt(i)).headOption
}

1

CJam ไม่ได้กับคนจำนวนมากเนื่องจากใช้เวลาในการคำนวณนาน

นี่คือรหัส CJam ที่สั้นที่สุดของฉัน การทดสอบที่http://cjam.aditsu.net/ มันทำงานโดย: การกำหนดอินพุตเป็น A; สร้างอาร์เรย์ของตัวเลขทั้งหมดตั้งแต่ 0 ถึง A-1; เตะ 0; การเตะจำนวนที่น้อยที่สุดจนกว่าการคูณตัวเลขทั้งหมดในอาร์เรย์จะไม่มากกว่า A ตรวจสอบว่ามันมากกว่า A; ถ้าไม่สร้างอาร์เรย์จาก 0 ถึง A-2; และทำซ้ำจนกว่าจะพบคำตอบ หากไม่พบข้อผิดพลาดจะถูกโยนทิ้ง ฉันไม่ได้พิจารณาว่าต้องการช่องว่างระหว่างตัวเลขดังนั้นพวกเขาจึงไม่ได้ใช้รหัสที่สองซึ่งมีความยาว 32 ตัวอักษร

ri:A,{)\;,1{;(;_{*}*_A>}gA<}g

ri:A,{)\;,1{;(;_{*}*_A>}gA<}g" "*

ฉันคิดว่าคำตอบของคุณช้าเกินไปที่จะใช้ได้ จำไว้ว่าต้องใช้เวลาไม่เกิน 5 นาทีสำหรับจำนวนเต็ม 32 บิตที่ถูกต้อง 3600060000 == 60000 * 60001 ใช้เวลานานเท่าไหร่
isaacg

จุดยุติธรรมฉันจะทำใหม่และโพสต์ถ้ามันสั้น
kaine

หากคุณกำลังจะทำใหม่โปรดลบคำตอบนี้จนกว่าจะถึงตอนนั้นมิฉะนั้นจะแสดงว่าไม่ถูกต้อง
isaacg

1

โผ - 102 ตัวอักษร

นี่เป็นการใช้งานที่ช้า สามารถสร้างได้เร็วขึ้น แต่ต้องใช้อักขระมากขึ้น (เช่นการวนซ้ำเท่านั้นจนกระทั่งi*i<n)

f(n,[i=2]){
  t(j,p,a)=>p<n?t(++j,p*j,a..add(j)):p>n?f(n,i+1):a;
  for(;i<n;i++)if(n%i<1)return t(i,i,[i]);
}

(102 ตัวอักษรไม่มีเส้นแบ่งและช่องว่างนำ)

หากต้องการใช้ให้ทำดังนี้:

main() {
  print(f(123456789*123456790));
}

0

Javascript, 88

รหัส Golfed:

function f(a){for(i=2;i<a;i++){b=[1];for(j=i;j>1;j--)if((b[0]*=b[i-j+1]=j)==a)alert(b)}}

ง่ายต่อการอ่านรหัส (เว้นระยะทาง):

function f(a){
    for(i=2;i<a;i++){
        b=[1];
        for(j=i;j>1;j--)
            if((b[0]*=b[i-j+1]=j)==a)
                alert(b);
    }
}

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

มันจะส่งออกจำนวนการป้อนข้อมูลตามด้วยจำนวนเต็มต่อเนื่องซึ่งผลิตภัณฑ์คือหมายเลขการป้อนข้อมูล

ตัวอย่างเช่น f (120) สร้างการแจ้งเตือนด้วยข้อความ "120,5,4,3,2" จากนั้นแจ้งเตือนครั้งที่สองด้วยข้อความ "120,6,5,4"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.