Có phải là một bán kết?


26

Đáng ngạc nhiên, tôi không nghĩ rằng chúng ta có một câu hỏi để xác định xem một số có phải là bán thời gian hay không .

Một nửa số là một số tự nhiên là tích của hai số nguyên tố (không nhất thiết phải khác biệt).

Đủ đơn giản, nhưng một khái niệm đặc biệt quan trọng.

Cho một số nguyên dương, xác định xem đó có phải là bán chính xác không. Đầu ra của bạn có thể ở bất kỳ dạng nào miễn là nó cho cùng một đầu ra cho bất kỳ giá trị trung thực hoặc falsey nào. Bạn cũng có thể cho rằng đầu vào của mình đủ nhỏ để hiệu suất hoặc tràn không phải là vấn đề.

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

input -> output
1     -> false
2     -> false
3     -> false
4     -> true
6     -> true
8     -> false
30    -> false   (5 * 3 * 2), note it must be EXACTLY 2 (non-distinct) primes
49    -> true    (7 * 7)      still technically 2 primes
95    -> true
25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784406918290641249515082189298559149176184502808489120072844992687392807287776735971418347270261896375014971824691165077613379859095700097330459748808428401797429100642458691817195118746121515172654632282216869987549182422433637259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133844143603833904414952634432190114657544454178424020924616515723350778707749817125772467962926386356373289912154831438167899885040445364023527381951378636564391212010397122822120720357
      -> true, and go call someone, you just cracked RSA-2048

Đây là , vì vậy các quy tắc tiêu chuẩn được áp dụng!


4
@WheatWizard Có một sự khác biệt nhỏ ở chỗ người ta yêu cầu 3 số nguyên tố (không phải là một sự khác biệt lớn đối với hầu hết tất cả các ngôn ngữ) và nó chỉ dành cho các số nguyên tố riêng biệt (khá khác nhau đối với một số ngôn ngữ). Tôi có thể thảo luận với bạn trong trò chuyện nếu bạn muốn tiếp tục thảo luận chi tiết hơn.
HyperNeutrino

2
@WheatWizard Bạn nêu lên một điểm tốt, nhưng tương tự, chúng tôi đã có rất nhiều loại câu hỏi, và mặc dù, trái ngược với những gì bạn thể hiện, hầu hết chúng đều đóng góp đáng kể vào khu vực của họ, câu hỏi này có đủ sự khác biệt rằng tôi sẽ tin rằng nó đảm bảo một câu hỏi / bài riêng biệt.
HyperNeutrino

2
@hyperneutrino nhìn vào câu trả lời cho cả hai thử thách, có vẻ như sự khác biệt là một con số duy nhất trong mã nguồn, 2 vs 3. Tôi khó có thể gọi đó là một sự khác biệt lớn.
Thuật sĩ lúa mì

2
@WheatWizard Ngoài ra còn có "khác biệt" so với "không khác biệt" ...
HyperNeutrino

3
@LordFarquaad Chỉ vì bản sao của nó không có nghĩa là nó xấu. Trong tâm trí tôi là một bản sao là một điều tốt, điều đó có nghĩa là bạn đang hỏi một điều mà cộng đồng thấy đủ thú vị để hỏi về nó.
Thuật sĩ lúa mì

Câu trả lời:


19

Brachylog , 2 byte

Về cơ bản là một cổng từ câu trả lời của Fatalize cho thách thức số Sphenic.

ḋĊ

Hãy thử trực tuyến!

Làm sao?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple

1
Đúng ngôn ngữ cho công việc thực sự: P
HyperNeutrino

2
@Uriel Ċthực sự là một danh sách tích hợp gồm hai biến; là một ngôn ngữ khai báo, theo mặc định, đầu ra là một thử nghiệm cho sự hài lòng (ví dụ: chính nó sẽ xuất ra true.các số nguyên không âm).
Jonathan Allan

Làm thế nào là 2 byte này?
harold

1
@harold Tôi vừa cập nhật để tạo "byte" trong liên kết tiêu đề đến trang mã của Brachylog. Một bãi chứa hex sẽ là c6 eb.
Jonathan Allan


8

Toán học, 16 byte

PrimeOmega@#==2&

PrimeOmega đếm số lượng các thừa số nguyên tố, tính bội số.


1
Dang, có tích hợp không?
JungHwan Min

1
@JungHwanMin Nếu chỉ cóSemiprimeQ
ngenisis

Tốt đẹp. Tôi không biết vềPrimeOmega
DavidC


7

Python 3 , 54 byte

lambda n:0<sum((n%x<1)+(x**3==n)for x in range(2,n))<3

Hãy thử trực tuyến!

Các verson trước có một số vấn đề làm tròn số khối lớn ( 125, 343v.v.)
Điều này sẽ tính toán số lượng ước (không chỉ các số nguyên tố), nếu nó có 1hoặc 2nó trả về True.
Ngoại lệ duy nhất là khi một số có nhiều hơn hai thừa số nguyên tố nhưng chỉ có hai ước. Trong trường hợp này, nó là một khối hoàn hảo của một số nguyên tố (ước số của nó là căn bậc ba và căn bậc ba của nó bình phương). x**3==nsẽ bao gồm trường hợp này, thêm một vào mục nhập khối lập phương sẽ đẩy tổng số lên tới 3 và dừng dương tính giả. cảm ơn Jonathan Allan đã viết với lời giải thích tuyệt đẹp này


xnor

n**(1/3)%1>0<sum...nên làm việc.
Dennis

1
@xnor đã sửa nó.
Rod

Thực hiện một chỉnh sửa nhỏ (ví dụ 6 khối có nhiều ước số hơn)
Jonathan Allan

6

Ruby , 56 48 byte

->x{r=c=2;0while x%r<1?(x/=r;c-=1):x>=r+=1;c==0}

Hãy thử trực tuyến!

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

->x{                    # Lambda function
    r=c=2;              # Starting from r=2, c=2
    0 while             # Repeat (0 counts as a nop)
        x%r<1? (        # If x mod r == 0
            x/=r:       # Divide x by r
            c-=1        # decrease c
        ):              # else
            x>=r+=1     # increase r, terminate if r>x 
    );
    c==0                # True if we found 2 factors
}

Cảm ơn Ink Ink vì ý tưởng đã lưu 8 byte.


Tại sao không chỉ cbắt đầu từ 0 và đếm lên, thay vì biến nó thành một mảng mà bạn thêm tất cả các yếu tố vào? Bằng cách đó, bạn sẽ loại bỏ nhu cầu sử dụng sizeở cuối
Ink Ink

Bạn nói đúng, đó là vì tôi đã viết hàm nhân tố cho một thử thách khác và tôi đã sử dụng lại nó ở đây.
GB


4

Neim , 4 byte

𝐏𝐥δ𝔼

Hãy thử trực tuyến!


Bạn có thể giải thích làm thế nào đây là 4 byte không? ... Tôi hoàn toàn bối rối.
Ông Xcoder

Tôi vừa mới có cái này
HyperNeutrino

@ Mr.Xcoder Neim có một trang mã tùy chỉnh
JungHwan Min

@ Mr.Xcoder Sử dụng bảng mã Neim, đây là 𝐏, 𝐥, δ, và 𝔼như single-byte.
HyperNeutrino

@HyperNeutrino Tôi chỉ làm xáo trộn 2 chút thôi, và bây giờ đây là câu trả lời duy nhất không có 2 :)
Okx

4

Python 2 , 67 byte

lambda k:f(k)==2
f=lambda n,k=2:n/k and(f(n,k+1),1+f(n/k,k))[n%k<1]

Hãy thử trực tuyến!

-10 byte nhờ @Jonathan ALLan!

Tín dụng cho thuật toán nhân tố Prime được chuyển đến Dennis (trong phiên bản ban đầu)


Bạn đã sử dụng mã từ câu trả lời của Dennis ? Nếu vậy, bạn nên cung cấp tín dụng.
hoàn toàn là

1
@totallyhuman ơi, xin lỗi. Tôi đã sử dụng nó trong 2 câu trả lời khác nhau ngày hôm nay và tôi đã cho anh ta tín dụng vào một trong số họ, nhưng tôi đã quên làm điều đó ở đây một lần nữa. Cảm ơn vì đã phát hiện ra điều đó!
Ông Xcoder


@Jonathan ALLan Wow, cảm ơn rất nhiều!
Ông Xcoder


4

JavaScript (ES6), 47 byte

Trả về một boolean.

n=>(k=1)==(d=n=>++k<n?n%k?d(n):d(n/k--)+1:0)(n)

Bản giới thiệu


4

Toán học 32 byte

Nhờ ngenesis cho 1 byte được lưu

Tr@FactorInteger[#][[;;,2]]==2&

1
Lưu một byte bằng cách sử dụng ;;thay vì All.
ngenisis





3

APL Dyalog, 18 byte

⎕CY'dfns'
2=≢3pco⎕

Hãy thử trực tuyến!

Làm sao?

⎕CY'dfns' - nhập khẩu pco

3pco⎕ - chạy pco trên đầu vào với đối số bên trái 3 (thừa số nguyên tố)

2=≢ - chiều dài = 2?


3

Gaia , 4 byte

ḍl2=

4 byte dường như là một độ dài phổ biến, tôi tự hỏi tại sao ...: P

Hãy thử trực tuyến!

Giải trình

ḍ     Prime factors
 l    Length
  2=  Equals 2?

4 byte dường như là một độ dài phổ biến, tôi tự hỏi tại sao ... - Có lẽ bởi vì tất cả các câu trả lời là các thừa số nguyên tố, độ dài, bằng 2?
Ông Xcoder

@MrXcoder Yep, chính xác
Business Cat

4 trong số đó là BTW của tôi> _>
Ông Xcoder

4 cũng là bán kết đầu tiên. Ma quái!
Neil




2

Java 8, 69 61 byte

n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}

-8 byte nhờ @Nevay .

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


1
Bạn có thể xóa câu lệnh khác (có thể else++r;) để lưu 8 byte n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}.
Nevay


1

C #, 112 byte

n=>{var r=Enumerable.Range(2,n);var l=r.Where(i=>r.All(x=>r.All(y=>y*x!=i)));return l.Any(x=>l.Any(y=>y*x==n));}

Với định dạng được áp dụng:

n =>
{
    var r = Enumerable.Range (2, n);
    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
    return l.Any (x => l.Any (y => y * x == n));
}

Và như chương trình thử nghiệm:

using System;
using System.Linq;


namespace S
{
    class P
    {
        static void Main ()
        {
            var f = new Func<int, bool> (
                n =>
                {
                    var r = Enumerable.Range (2, n);
                    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
                    return l.Any (x => l.Any (y => y * x == n));
                }
            );

            for (var i = 0; i < 100; i++)
                Console.WriteLine ($"{i} -> {f (i)}");
            Console.ReadLine ();
        }
    }
}

Mà có đầu ra:

0 -> False
1 -> False
2 -> False
3 -> False
4 -> True
5 -> False
6 -> True
7 -> False
8 -> False
9 -> True
10 -> True
11 -> False
12 -> False
13 -> False
14 -> True
15 -> True
16 -> False
17 -> False
18 -> False
19 -> False
20 -> False
21 -> True
22 -> True
23 -> False
24 -> False
25 -> True
26 -> True
27 -> False
28 -> False
29 -> False
30 -> False
31 -> False
32 -> False
33 -> True
34 -> True
35 -> True
36 -> False
37 -> False
38 -> True
39 -> True
40 -> False
41 -> False
42 -> False
43 -> False
44 -> False
45 -> False
46 -> True
47 -> False
48 -> False
49 -> True
50 -> False
51 -> True
52 -> False
53 -> False
54 -> False
55 -> True
56 -> False
57 -> True
58 -> True
59 -> False
60 -> False
61 -> False
62 -> True
63 -> False
64 -> False
65 -> True
66 -> False
67 -> False
68 -> False
69 -> True
70 -> False
71 -> False
72 -> False
73 -> False
74 -> True
75 -> False
76 -> False
77 -> True
78 -> False
79 -> False
80 -> False
81 -> False
82 -> True
83 -> False
84 -> False
85 -> True
86 -> True
87 -> True
88 -> False
89 -> False
90 -> False
91 -> True
92 -> False
93 -> True
94 -> True
95 -> True
96 -> False
97 -> False
98 -> False
99 -> False


1

Võng mạc , 45 byte

.+
$*
^(11+)(\1)+$
$1;1$#2$*
A`\b(11+)\1+\b
;

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

.+
$*

Chuyển đổi sang unary.

^(11+)(\1)+$
$1;1$#2$*

Cố gắng tìm hai yếu tố.

A`\b(11+)\1+\b

Đảm bảo cả hai yếu tố là nguyên tố.

;

Đảm bảo hai yếu tố đã được tìm thấy.


1

Python 2, 90 byte

def g(x,i=2):
 while x%i:i+=1
 return i
def f(n,l=0):
 while 1%n:l+=1;n/=g(n)
 return l==2

flấy một số nguyên nlớn hơn hoặc bằng 1, trả về boolean.

Hãy thử trực tuyến!

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

>>> f(1)
False
>>> f(2)
False
>>> f(3)
False
>>> f(4)
True
>>> f(6)
True
>>> f(8)
False
>>> f(30)
False
>>> f(49)
True
>>> f(95)
True

1

J , 6 byte

5 byte sẽ hoạt động như một lần:

   2=#q: 8
0
   2=#q: 9
1

Tôi tin rằng tôi cần sáu khi tôi xác định chức năng:

   semiprime =. 2=#@q:
   (,. semiprime) 1 + i. 20
 1 0
 2 0
 3 0
 4 1
 5 0
 6 1
 7 0
 8 0
 9 1
10 1
11 0
12 0
13 0
14 1
15 1
16 0
17 0
18 0
19 0
20 0


1

Japt , 6 5 byte

k ʥ2

Kiểm tra nó trực tuyến


Giải trình

Có khá giống với hầu hết các câu trả lời khác: klấy mảng các thừa số nguyên tố, Êlấy độ dài của nó và ¥kiểm tra sự bằng nhau 2.


÷k o)jcũng hoạt động, thật không may, nó có cùng độ dài :-(
ETHproductions

0

Perl 6 , 43 byte

{my \f=first $_%%*,2..$_;?f&&is-prime $_/f}

Hãy thử trực tuyến!

flà hệ số nhỏ nhất lớn hơn 1 của đối số đầu vào $_hoặc Nilnếu $_là 1. Giá trị trả về của hàm là true nếu fđúng (nghĩa là không phảiNil ) VÀ đối số đầu vào chia cho thừa số là số nguyên tố.

Nếu $_chính nó là số nguyên tố, thì nó fsẽ bằng $_$_ / flà 1, không phải là số nguyên tố, vì vậy công thức cũng hoạt động trong trường hợp đó.

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.