Yếu tố đó! …tệ


15

Một đứa trẻ tò mò sử dụng một chương trình có thể nhân một số hoặc một biểu thức thành dạng sau : p1^e1 * p2^e2 * ... * pn^en. Số mũ bằng 1được bỏ qua, ví dụ360 = 2^3 * 3^2 * 5

Đứa trẻ gõ đầu ra này vào chương trình dưới dạng đầu vào mới nhưng cô ấy không hiểu được ^dấu hiệu nên đôi khi cô bỏ qua một hoặc nhiều trong số đó nối liền với số nguyên tố và số mũ tương ứng. Ví dụ(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Vì những sai lầm này, cô ấy có thể nhận được một yếu tố khác mà cô ấy có thể nhập lại (với việc bỏ qua 0 hoặc nhiều hơn ^). Cô ấy lặp lại quy trình cho đến khi hệ số hóa không thay đổi nữa (có thể không còn ^sao chép chính xác đầu ra nữa).

Bạn nên viết một chương trình hoặc hàm đưa ra một số nguyên n( n>1) xuất ra tất cả các số có thể theo thứ tự tăng dần mà hệ số của nó có thể là số mà đứa trẻ kết thúc với (bao gồm n). Ví dụ: cho 16các yếu tố cuối cùng có thể là(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Chi tiết đầu vào:

  • đầu vào là một số nguyên lớn hơn 1
  • không có đầu vào nào được đưa ra mà tạo ra số đầu ra lớn hơn 2^31-1
  • không có đầu vào nào được đưa ra mà tạo ra nhiều hơn 1000số đầu ra

Chi tiết đầu ra:

  • một danh sách các số nguyên ở dạng thuận tiện cho ngôn ngữ của bạn

Ví dụ:

Đầu vào => Đầu ra

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

Đây là môn đánh gôn nên chương trình ngắn nhất sẽ thắng.


Chúng ta đã không có Factorize nó?
Tối ưu hóa

5
@Optimizer Điều này khá khác biệt.
Randomra

1
Số cuối cùng cho 360 phải là 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange Cảm ơn, đã chỉnh sửa.
Randomra

Câu trả lời:


5

Camam - 66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

Dùng thử tại http://cjam.aditsu.net/

Giải trình:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) Cảm ơn Martin


mã cjam từ vị thần
cjam

Bất kỳ số lượng ^nào có thể được loại bỏ trong một bước. Vì vậy, cho 58564 = 2^2 * 11^4nó sẽ có thể tạo ra 2508 = 22 * 114.
Randomra

@randomra bạn nên thêm một ví dụ cho loại điều này
aditsu

@randomra nên tốt hơn bây giờ
aditsu 10/2/2015

Tuyệt quá! Đã thêm ví dụ. Xin lỗi vì đã bỏ qua nó.
Randomra

4

Ruby, 219

Để bắt đầu điều này:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

Tạo một hàm s trả về một mảng các số.

https://ideone.com/iOMGny

Sử dụng nó như thế này:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

Rất nhiều niềm vui khi viết tất cả những điều này trên điện thoại di động ...


3

Perl, 193 byte

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

Dòng mới chỉ được thêm vào để dễ đọc.

Vòng lặp for nhân số tiếp theo ( $x) thành hàm băm (%f ) của các số nguyên tố và lũy thừa. Hàm đệ quy ( R) sử dụng hàm băm này để tạo ra tất cả các số có thể đạt được bằng cách xóa ^các dấu hiệu. Các số này được thêm vào hàng đợi ( @q) và quá trình được lặp lại bởi vòng lặp while. Mỗi số từ hàng đợi cũng được giữ trong một mảng duy nhất, được sắp xếp ( @r) để in.


3

Bình thường, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

Hãy thử nó ở đây.

Đã sửa nhiều ^ lỗi. Ví dụ:

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

Lưu ý rằng mã này dựa trên một vài lỗi để trình biên dịch chính thức được đẩy sau khi câu hỏi được hỏi. Tuy nhiên, nó không sử dụng bất kỳ tính năng ngôn ngữ mới.


Bạn nhận được gì cho 58564?
aditsu

[230, 456, 1311, 58564, 322102], đó là sai.
isaacg

@aditsu Đã sửa lỗi.
isaacg

Vì Pyth không được ghi chép chặt chẽ (dựa trên những phát hiện của tôi), rất khó để phân biệt giữa sửa lỗi và các tính năng mới, vì vậy tôi quyết định không chọn mục này là câu trả lời chiến thắng.
Randomra

@randomra Tôi hiểu quyết định của bạn không chấp nhận câu trả lời này. Tuy nhiên, tôi chỉ muốn đề cập đến lỗi đó là gì: Sử dụng giảm ( u) bên trong một mức giảm khác là không thể. Tôi đã thay đổi 2 thành 3 ở vị trí thích hợp để giảm sẽ mất 3 đầu vào thay vì 2. Đó là tất cả.
isaacg
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.