Câu đố hóc búa


8

Nhiệm vụ của bạn là, với một số đầu vào p, tìm số thứ tự súng thần công dương nhỏ nhất pkhông phải là 1.

Định nghĩa

Số súng thần công (theo thứ tự p) là một số có cả hai:

  • Một psố chéo ( Xem trang này ).
  • và một psố kim tự tháp chéo.

    • Các nthứ psố kim tự tháp -gonal là tổng của ngày 1 đến nngày psố -gonal.
      • (ví dụ 4th square pyramid number = 1 + 4 + 9 + 16 = 30)
    • Hình dưới đây đại diện cho số kim tự tháp vuông thứ 4, như một kim tự tháp vuông. nhập mô tả hình ảnh ở đây

    • Để biết thêm thông tin, hãy truy cập liên kết này .

Số súng thần công của thứ tự 3, ví dụ, là 10, bởi vì nó là:

  • Số tam giác thứ tư ( 1 + 2 + 3 + 4 = 10)
  • và số kim tự tháp tam giác thứ ba. ( 1 + 3 + 6 = 10)

Công thức

LƯU Ý: Nếu bạn có thể tìm thấy (hoặc thực hiện) các công thức hữu ích hơn các công thức của tôi ở đây, vui lòng gửi nó ở đây (hoặc nhắn tin cho tôi về điều trò chuyện câu hỏi).

  • Nếu bạn quan tâm, công thức cho số nthứ ptự là:

nhập mô tả hình ảnh ở đây

  • nthứ psố kim tự tháp -gonal là:

nhập mô tả hình ảnh ở đây

Thông số kỹ thuật

  • p được đảm bảo lớn hơn 2.
  • Chương trình phải kiểm tra các giá trị cho một giải pháp ptối đa (và bao gồm) 2^16. Chương trình của bạn có thể làm bất cứ điều gì nếu không tìm thấy giải pháp cho p.
  • Chỉ các chỉ số tích cực cho n.

Các trường hợp thử nghiệm

  • 3đầu ra 10(số tam giác thứ 4, số kim tự tháp tam giác thứ 3)
  • 4đầu ra 4900(số vuông thứ 70, số kim tự tháp vuông thứ 24)

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte thắng.

Lưu ý: Nếu bạn đăng một giải pháp, vui lòng bao gồm mô tả về cách thức hoạt động của mã.

Tôi có nên bắt đầu tiền thưởng cho một giải pháp tốt hơn và không sử dụng công thức của mình không?


2
Bạn có thể thêm một số chi tiết về số súng thần công là gì không? Nó không hoàn toàn rõ ràng từ mô tả của bạn.
James

3
Có đảm bảo rằng có một câu trả lời cho bất kỳ n? Nếu không, phạm vi nbạn sẽ sử dụng là gì?
Geobits

@DrGreenEggsandIronMan Đã chỉnh sửa để đưa ra định nghĩa. số kim tự tháp chéo nnchéo không cần xác định.
clismique

@Geobits Đã chỉnh sửa để tạo phạm vi thay vì sử dụng bộ nhớ.
clismique

1
@DerpfacePython TL; DR: Số Cannonball khá hiếm. Tìm cho chính mình.
Rɪᴋᴇʀ

Câu trả lời:


1

Python 3, 129 127 byte

def f(p):
 x=2
 while 1:
  for i in range(x*x):
   if i//x*((p-2)*i//x+4-p)/2==i%x*(i%x+1)*((p-2)*i%x+5-p)/6==x:return x
  x+=1

Một hàm nhận đầu vào thông qua đối số và trả về đầu ra.

Đây là một lực lượng vũ phu cực kỳ ngây thơ, và mất một thời gian rất dài cho thậm chí lớn vừa phải p; thời gian thực hiện sẽ là vô lý cho bất cứ điều gì tiếp cận tối đa đưa ra cho pcác 2^16, nhưng không có lý do tại sao chương trình sẽ không làm việc, có đủ thời gian.

Có lẽ có nhiều cách ngắn hơn và nhanh hơn để làm điều này, nhưng tôi nghĩ sẽ tốt hơn nếu đăng một cái gì đó để bắt đầu điều này.

Làm thế nào nó hoạt động

Giá trị trả về xđược khởi tạo 2, và sau đó chương trình chỉ đơn giản lặp lại trên tất cả các số hình chóp chéo ppchéo theo thứ tự x. Nếu các số hình chóp chéo pvà chéo hiện tại p, được tính bằng các công thức, bằng nhau và x, thì xphải là số súng thần công có liên quan và điều này được trả về. Khác, xđược tăng lên, và chương trình thử lại cho giá trị mới của x.

Về môn đánh gôn, một sản phẩm của Cartesian được sử dụng để thu gọn hai vòng lặp for cho các số hình chóp chéo ppchéo thành một vòng duy nhất, và các công thức được tính thêm để tiết kiệm một vài byte.


Ummm ... điều này có thể hơi muộn để nói ... nhưng ... công thức của tôi đã sai. Bạn chỉ cần thay đổi công thức đa giác.
clismique

@DerpfacePython Cảm ơn bạn đã nắm bắt được điều đó.
TheBikingViking 10/07/2016

1

JavaScript, 111 98 byte

f=n=>{for(b=c=g=1;b++;)for(p=b*(b*3+b*b*(n-2)-n+5)/6;g<p;c++)if(p==(g=c*(c*n-c-c-n+4)/2))return p}

vô dụng

f=n=>{
for(b=2,c=g=1;b<1e6;b++)    // run index b from 2 (to 100k)
    for(
        p=(b*b*3+b*b*b*(n-2)-b*(n-5))/6 // p=the b-th n-pyramidal number
        ;g<p&&c<1e6;c++)   // run while n-gonal is lower than n-pyramidal (and c below 100k)
        if(p==(
            g=(c*c*(n-2)-c*(n-4))/2     // g=the c-th n-gonal number
        )) return p                     // if they are equal, return
}

c không được khởi tạo lại trong vòng lặp bên trong vì p [b] tiếp theo chắc chắn lớn hơn g [c] hiện tại (vì vậy chúng ta phải tiếp tục bằng mọi cách)

ví dụ

samples=[3,4,6,8,10,11,14,17,23,26,30,32,35,41,43,50,88]
for(i in samples) document.write('n='+(n=samples[i])+': '+f(n)+'<br>');

0

C, 107 byte

#define X(x)(1+p/2.0*x)*++x
c(p,m,n,a,b){m=n=a=b=1;p-=2;do if(a>b)b+=X(n);else a=X(m);while(a^b);return a;}

Ungolfed với các thông số thử nghiệm:

#include <stdio.h>

#define X(x)(1+p/2.0*x)*++x
int c(int p)
{
    int m = 1, n = 1, a = 1, b = 1;
    p -= 2;
    do
        if(b < X(m))
            b += X(n);
        else
            a = X(m);
    while(a != b);
    return a;
}

int main()
{
    printf("%d\n", c(3));
    printf("%d\n", c(4));
}

Điều này sử dụng thực tế là số p-gonal thứ n có thể được định nghĩa n(1+(p-2)(n-1)/2)và số kim tự tháp là tổng của các số đã nói ở trên.

Tôi nghĩ rằng nó có thể được chơi thêm, vì nó không thực sự cần thiết cho biến ađược lưu.


Đợi ... itrong công thức của bạn là số tưởng tượng i?
clismique

Ối xin lỗi. iđược coi là n. Tôi đã có ký hiệu khác nhau rải rác trong nghiên cứu của tôi. Tôi không thể tưởng tượng việc sử dụng một số ảo cho vấn đề này và tôi chắc chắn không thể tưởng tượng được việc sử dụng nó trong C.

0

chương trình PHP cũ, 115 106 byte

+16 cho PHP hiện tại, xem bên dưới

<?for($b=2;1;$b++)for($p=$b*($b*3+$b*$b*($n-2)-$n+5)/6;$g<$p;++$c)if($p==$g=$c*($c*$n-2*$c-$n+4)/2)echo$p;
  • mãi mãi
  • cách sử dụng: với PHP <4.2: chạy từ trình duyệt <scriptpath>?n=<number>
    với PHP <5.4, thêm register_globals=1vào php.ini(+18?)
  • xem câu trả lời JavaScript của tôi để mô tả
  • +10 cho PHP> = 5.4: thay thế 1bằng $n=$_GET[n]. Hoặc thay thế 1bằng $n=$argv[1], chạy php -f <filename> <number>.
  • +6 cho vòng lặp hữu hạn khi thành công: thay thế echo$pbằngdie(print$p)
  • +/- 0 cho chức năng:

    function f($n){for($b=2;1;$b++)for($p=$b*($b*3+$b*$b*($n-2)-$n+5)/6;$g<$p;++$c)if($p==$g=$c*($c*$n-2*$c-$n+4)/2)return$p;}
    

    vòng lặp mãi mãi nếu nó không tìm thấy gì. Thay thế 1bằng $p<1e6để phá vỡ ở mức 100k hoặc với $p<$p+1vòng lặp cho đến khi tràn số nguyên. (đã thử nghiệm với PHP 5.6)

ví dụ (về chức năng)

$samples=[3,4,6,8,10,11,14,17,23,26,30,32,35,41,43,50,88];
foreach($samples as $n)echo "<br>n=$n: ", f($n);

ví dụ đầu ra

n=3: 10
n=4: 4900
n=6: 946
n=8: 1045
n=10: 175
n=11: 23725
n=14: 441
n=17: 975061
n=23: 10680265
n=26: 27453385
n=30: 23001
n=32: 132361021
n=35: 258815701
n=41: 55202400
n=43: 245905
n=50: 314755
n=88: 48280
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.