Dây nguyên thủy


27

Chuỗi Primenary ( binary-Prime ) là một chuỗi mà khi được viết dưới dạng lưới nhị phân, mỗi hàng và cột có tổng số nguyên tố.

Đó là một lời giải thích khá mơ hồ, vì vậy hãy phá vỡ nó bằng một ví dụ hoạt động ...


Trong ví dụ này, chúng tôi sẽ sử dụng chuỗi bunny:

Đầu tiên, tìm điểm mã ASCII của mỗi ký tự và biểu diễn nhị phân của nó:

Char | ASCII | Binary

b      98      1100010
u      117     1110101
n      110     1101110
n      110     1101110
y      121     1111001

Lấy các giá trị nhị phân này, từ trên xuống dưới và sắp xếp chúng thành lưới (thêm các số 0 đứng đầu nếu cần):

1 1 0 0 0 1 0
1 1 1 0 1 0 1
1 1 0 1 1 1 0
1 1 0 1 1 1 0
1 1 1 1 0 0 1

Sau đó, đếm số 1s trong mỗi hàng và cột:

1 1 0 0 0 1 0   > 3
1 1 1 0 1 0 1   > 5
1 1 0 1 1 1 0   > 5
1 1 0 1 1 1 0   > 5
1 1 1 1 0 0 1   > 5

v v v v v v v

5 5 2 3 3 3 2

Nếu và chỉ khi, mỗi tổng số là số nguyên tố (chẳng hạn như ở đây) thì chuỗi là số nguyên tố nhị phân hợp lệ.


Các thách thức

Nhiệm vụ của bạn là tạo ra một hàm hoặc chương trình, khi được cung cấp một chuỗi, trả về / đầu ra truthynếu chuỗi đó là nguyên thủy, và falsynếu không.

Quy tắc / Chi tiết

  • Bạn có thể cho rằng các ký tự của chuỗi sẽ luôn nằm trong phạm vi ASCII 33-126(đã bao gồm).
  • Chuỗi sẽ không trống.
  • Một chuỗi nguyên thủy không nhất thiết phải có độ dài nguyên tố - ví dụ, W1n*là hợp lệ, mặc dù có 4 ký tự.
  • Đây là , vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng - nhưng tất cả các bài nộp đều được chào đón.
  • Sơ hở tiêu chuẩn bị cấm.

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

'husband'     -> True
'HOTJava'     -> True
'COmPaTIBILE' -> True
'AuT0HACk'    -> True

'PPCW'        -> False
'code-golf'   -> False
'C++'         -> False
'/kD'         -> False

'HI'          -> False
'A'           -> False

Ngoài ra còn có một ví dụ Python hoạt động nhưng vô cùng dài dòng trên repl.it mà bạn có thể kiểm tra giải pháp của mình.


Tôi có thể hỏi làm thế nào bạn phát hiện ra husbandlà hợp lệ? Hoặc bất kỳ trong số họ? Vấn đề lớn, mặc dù!
Gabriel Benamy

3
@GabrielBenamy Tôi rất vui khi có người hỏi! Tôi đã lặp qua một tệp từ điển trực tuyến , thử một vài chữ viết hoa ngẫu nhiên của mỗi chữ cái, đôi khi chuyển đổi các chữ cái cho các số, v.v. Sau đó, tôi đã xem qua danh sách xuất ra và chọn một vài trường hợp thử nghiệm mà tôi thích
FlipTack

Mỗi đầu vào 1-2 ký tự được đảm bảo để trả về False, đúng không?
mbomb007

... bởi vì 01không phải là số nguyên tố, và mỗi 1-2 chuỗi đầu vào char chỉ chứa các ký tự trong phạm vi đã cho được đảm bảo chứa ít nhất một 0hoặc 1dưới dạng tổng dọc. Bạn nên thêm một số chuỗi ký tự 1 và 2 làm trường hợp thử nghiệm.
mbomb007

@ mbomb007 1 đầu vào char không thể có số nguyên tố theo cột, vì vậy chúng sẽ trả về false. 2 đầu vào char có thể, nhưng không nằm trong phạm vi ASCII mà chúng tôi đang sử dụng, vì vậy với kịch bản này, bạn đã đúng.
FlipTack

Câu trả lời:


8

MATL, 10 byte

BtXsw!shZp

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

Đây là ngôn ngữ lý tưởng cho công việc. Đó là khá nhiều phiên âm theo nghĩa đen của đặc tả thách thức.

Bt % Converts input to binary matrix, duplicate
Xs  % Sum columns (alternative X version to prevent defaulting to sum along first non-singleton dimension, thanks @Jonathan Allan)
w! % Get the duplicate to the top of the stack, transpose
s  % Sum again
h  % Concatenate horizontally
Zp % Check primality element-wise. Display implicitly.

Vì bất kỳ số 0 nào cũng tạo ra một mảng MATL giả mạo theo meta , nên không có gì khác là cần thiết - về cơ bản, một ẩn Ađược gọi là ?(nếu).


aCó nên giả, nhưng trả lại 1 1? (các cột của nó không thêm vào số nguyên tố)
FlipTack

Tôi nghĩ BtXsw!shZpsẽ khắc phục điều này và trở thành người chiến thắng trong 10.
Jonathan Allan

@ Flp.Tck Hoàn toàn quên mất hành vi 'tha thứ' của MATLAB khi làm việc với các vectơ hàng. Tôi xin lỗi, đã sửa nó ngay.
Sanchise

Hoạt động ngay bây giờ :) (có thể muốn cập nhật liên kết dùng thử trực tuyến tho)
FlipTack

@ Flp.Tkc Xong. Cảm ơn cho một thử thách tốt đẹp!
Chiếm

4

Thạch , 13 12 11 byte

OBUZ;$S€ÆPẠ

Dùng thử trực tuyến! hoặc tất cả các trường hợp thử nghiệm

Làm sao?

OBUZ;$S€ÆPẠ - Main link: word                  e.g. ha!
O           - cast to ordinals                 e.g. [104,97,33]
 B          - convert to binary                e.g. [[1,1,0,1,0,0,0],[1,1,0,0,0,0,1],[1,0,0,0,0,1]]
  U         - reverse each entry (say "b")     e.g. [[0,0,0,1,0,1,1],[1,0,0,0,0,1,1],[1,0,0,0,0,1]]
     $      - last two links as a monad
   Z        - transpose                        e.g. [[0,1,1],[0,0,0],[0,0,0],[1,0,0],[0,0,0],[1,1,1],[1,1]]
    ;       - concatenate with "b"             e.g. [[0,1,1],[0,0,0],[0,0,0],[1,0,0],[0,0,0],[1,1,1],[1,1],[0,0,0,1,0,1,1],[1,0,0,0,0,1,1],[1,0,0,0,0,1]]
      S€    - sum €ach                         e.g. [2,0,0,1,0,3,2,3,3,2]
        ÆP  - is prime (1 if prime, 0 if not)  e.g. [1,0,0,0,0,1,1,1,1,1]
          Ạ - all truthy?                      e.g. 0


3

Thạch , 15 byte

O+⁹Bṫ€3µS€;SÆPP

Hãy thử trực tuyến! hoặc Xác minh tất cả các trường hợp thử nghiệm. .

Giải trình

O+⁹Bṫ€3µS€;SÆPP  Main link. Input: string z
O                Ordinal, get ASCII value of each char
  ⁹              Nilad representing 256
 +               Add 256 to each ordinal value
   B             Binary digits of each
    ṫ€3          Tail, take each list of digits from the 3rd value to the end
                 These are the last seven digits of each
       µ         Start a new monadic chain
        S€       Sum each list of digits by rows
           S     Sum by column
          ;      Concatenate
            ÆP   Test if each is prime, 1 if true else 0
              P  Product

3

Toán học, 75 byte

And@@Join@@PrimeQ@{+##&@@#,+##&@@@#}&@IntegerDigits[ToCharacterCode@#,2,7]&

Hàm không tên lấy một chuỗi làm đầu vào và trả về Truehoặc False.

ToCharacterCode@#chuyển đổi đầu vào thành danh sách các giá trị ASCII của nó; IntegerDigits[...,2,7]biến mỗi giá trị thành danh sách các bit của nó, được đệm thành chiều dài 7 nếu cần thiết. Vì vậy, bây giờ chúng tôi có một mảng 2D và chúng tôi muốn tất cả các tổng hàng và tổng cột; lo và kìa, co thắt ký tự {+##&@@#,+##&@@@#}&@...thực hiện chính xác điều đó (nó áp dụng hàm +##&"tổng tất cả các đối số" cho danh sách các vectơ trong tọa độ đầu tiên bằng cách sử dụng @@và cho mỗi vectơ như danh sách các số nguyên của chính nó trong tọa độ thứ hai bằng cách sử dụng @@@) . Sau đó, chúng tôi chỉ kiểm tra xem các kết quả có PrimeQ, làm phẳng danh sách với Join@@và lấy Andtất cả các giá trị đó hay không.


2

Ruby -rprime , 100 byte

->s{a=s.bytes.map{|b|b.digits 2}
a.all?{|r|r.sum.prime?}&([0]*7).zip(*a).all?{|c|c.count(1).prime?}}

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

Giải trình

->s{
    a=s.bytes                       # Get byte values from string
             .map{|b|b.digits 2}    # For each, map it to its binary digits
                                    #   (least significant digits first)
a.all?{|r|r.sum.prime?}             # Each character has a prime number of 1's?
    &                               # Bit-and (because it saves bytes here)
    ([0]*7).zip(*a)                 # Zip bit array with an all-zero array
                                    #   (If we don't, then uneven array lengths
                                    #   cause some columns to not be returned.)
    .all?{|c|c.count(1).prime?}     # All columns have a prime number of 1's?
                                    #   (We use count instead of sum here because
                                    #   zip pads columns with trailing nils, which
                                    #   can't be added to numbers via sum.)
}

1

Perl, 151 121 111 + 3 = 114 byte

Chạy với -lF. Chương trình sẽ chỉ hoạt động chính xác cho đầu vào đầu tiên. Chấm dứt chương trình và chạy lại cho đầu vào tiếp theo của bạn.

Cảm ơn @Dada đã cho tôi biết //sau Fđó là dư thừa. Một byte bổ sung có thể được loại bỏ (đối với 112) bằng cách chuyển đầu vào qua echo -n, nhưng tôi cảm thấy rằng về mặt kỹ thuật đó là thêm nhiều mã hơn, vì vậy YMMV.

for$c(@a=map{sprintf"%07b",ord}@F){$b[$_].=substr$c,$_,1 for 0..6}s/0//g,$d|=/^1?$|^(11+?)\1+$/ for@a,@b;say!$d

Có thể đọc được

                                     #Implicitly split input into characters in @F array
for$c(@a=map{sprintf"%07b",ord}@F)  #Convert @F to 7-bit binary as @a, then loop through it                        
    $b[$_].=substr$c,$_,1 for 0..6   #Transpose @a's bits into @b
}
s/0//g,$d|=/^1?$|^(11+?)\1+$/ for@a,@b; #Remove any zeros, then run through composite regex
say!$d                          #If all composite regex checks fail, then it's fully prime.

1
Một phiên bản chỉ hoạt động trên đầu vào đầu tiên là hoàn toàn tốt, vì vậy bạn có thể đặt phiên bản 141 byte làm phiên bản chính và đề xuất phiên bản khác sử dụng cho nhiều đầu vào.
Dada

Cũng lưu ý rằng bạn có thể bỏ qua phần //sau -Fvà bạn có thể lấy đầu vào mà không có dòng mới cuối cùng (có echo -n) để thoát khỏi -lcờ.
Dada

1

Con trăn 3 228 227 225 byte

Không phải là một câu trả lời hay, tôi đã không thể chơi nó nhiều như tôi muốn, nhưng tôi đã dành quá nhiều thời gian cho nó, tôi cảm thấy mình nên đăng nó. Đề xuất về việc cắt byte sẽ được đánh giá rất cao.

r=range
n=[format(ord(c),"08b")for c in input()]
n=map(lambda s:s.count("1"),n+["".join([f[1]for f in filter(lambda e:e[0]%8<1,enumerate("X"*-~i+"".join(n)))][1:])for i in r(8)])
print(all(all(s%d for d in r(2,s))for s in n))

Chỉnh sửa 1: thay thế e[0]%8==0bằng e[0]%8<1, mất một byte. Cảm ơn Flp.Tkc!

Chỉnh sửa 2: thay thế (i + 1) bằng - ~ i, mất hai byte bổ sung. Cảm ơn Erik đã tiết lộ kiến ​​thức cấp độ bit của tôi tệ đến mức nào :) Trong khi thử nghiệm bản sửa đổi này, tôi phát hiện ra rằng kappanó hợp lệ ... hãy làm điều đó theo ý bạn.


1
bạn có thể đổi e[0]%8==0thành e[0]%8<1?
FlipTack

@ Flp.Tkc Điểm tốt! Không có lý do tại sao điều đó không thể được thực hiện.
FourOhFour

1
@ Flp.Tkc Tôi không nghĩ mình có thể lưu byte bằng cách biến nó thành hàm. Tôi thích cách bạn có 404 rep btw :)
FourOhFour

Nó được cho là <1, phải không <0?
Lemon phá hủy

@ Dưa hấu dưa hấu hãy để tôi sửa điều đó.
FourOhFour

1

Groovy, 151 137 byte

{p={x->x<3||(2..(x**0.5)).every{x%it}};y={it.every{p(it.count("1"))}};x=it.collect{0.toString((int)it,2) as List};y(x)&&y(x.transpose())}

Không có kiểm tra nguyên thủy trong Groovy ...

p={x->x<3||(2..(x**0.5)).every{x%it}}; - Đóng cửa để thử nghiệm nguyên thủy.

y={it.every{p(it.count("1"))}}; - Đóng để đảm bảo rằng tất cả các số "1" cho một mảng 2D nhị phân đã qua là số nguyên tố.

x=it.collect{0.toString((int)it,2) as List}; - Bao gồm từ chuỗi đến mảng nhị phân.

y(x)&&y(x.transpose()) - Đối với tất cả các khoản tiền được xác thực trong ma trận chính và ma trận chuyển vị, đảm bảo rằng chúng trả về đúng.


1

Bình thường , 37 byte

L.AmP_sdb=sMM.[L\0lh.MlZQ=.BMQ&yZy.TZ

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


                                 Code | Explanation
--------------------------------------+----------------------------------------------------------------
L.AmP_sdb=sMM.[L\0lh.MlZQ=.BMQ&yZy.TZ | Full code
L                                     | Define function y(b):
   m    b                             |   For each d in b:
    P_sd                              |     Is the sum of the elements of the list prime?
 .A                                   |   Return whether all elements of the resulting list are truthy
                         =   Q        | Assign the following to Q:
                          .BMQ        |   The list of binary strings for each character in the input
         =             Z              | Assign the following to Z:
               L             Q        |   For every element in Q:
             .[ \0                    |     Pad with 0 on the left
                  lh.MlZQ             |     To the length of the longest element in Q
            M                         |   For each element in the resulting list:
          sM                          |     Convert each character to an integer
                              &yZ     | Print y(Z) AND
                                 y.TZ |   y( <Transpose of Z> )

1

Brachylog , 14 byte

ạḃᵐB↔ᵐz₁,B+ᵐṗᵐ

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

Đầu ra thông qua thành công hay thất bại. (Trong trường hợp thành công, một danh sách tất cả các tổng cột và hàng có sẵn thông qua biến đầu ra.

   B              The variable B is
ạ                 the codepoints of the input
 ḃᵐ               converted to lists of binary digits,
    ↔ᵐ            which with each list reversed
      z₁          then zipped without cycling
        ,B        and concatenated with B
          +ᵐ      has elements which all sum to
            ṗᵐ    prime numbers.

1

O5AB1E, 12 byte

Çžy+bø€SOp¦W

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

Đây là mã golf đầu tiên của tôi để đi dễ dàng :)

Ç              % Converts the implicit input into ascii values
 žy+           % Adds 128 to each value, inspired by Emigna as a way to pad zeros
    b          % Convert all values into bits
     ø         % Transpose
      €SO      % Sum each string of binary digits created
         p¦    % Check if each element is prime and cut the first element out (adding 128 makes it equal to the number of characters)
           W   % Take the minimum value to effectively "and" all the elements

Điều này mang lại một kết quả trống cho một đầu vào chữ cái. Tôi không rành về O5AB1E nhưng nếu đó là giá trị chim ưng thì không sao.
Sanchises

1

Python 3 , 209 189 180 171 160 byte

Mực Thanx cho -9 byte :)

def p(s):n=s.count('1');return(n>1)*all(n%i for i in range(2,n))
def f(s):t=[f'{ord(c):07b}'for c in s];return all(map(p,t+[[u[j]for u in t]for j in range(7)]))

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


Tôi thích cách bạn viết lại câu lệnh in trường hợp thử nghiệm :)
Movatica

Vâng, tôi là một người nghiện ám ảnh về chuỗi f ... Ngoài ra, nó không tương đương nếu bạn xóa t+trong tuyên bố bản đồ?
Phục hồi

Không, bởi vì kiểm tra chính cần bao gồm cả hàng và cột trong ma trận bit. tcó tất cả các hàng, trong khi [[t[i][j]..i..]..j..]được chuyển đổi t, tức là các cột. Nếu có một cách ngắn hơn để hoán đổi ma trận, chúng ta có thể tiết kiệm nhiều byte hơn :)
Movatica

Nó hoạt động khi tôi thử nó , bạn có biết một chuỗi phá vỡ nó không?
Phục hồi

Vâng. beezznên trả lại sai, nhưng không. Đó là vì kiểm tra chính bị hỏng, nó trả về True4 bit. Hãy thử print(p('1111')). Đã sửa nó ngay. Tất cả các trường hợp thử nghiệm không bao gồm điều đó, bởi vì tất cả các ký tự được sử dụng là nguyên thủy.
Movatica

1

K (oK) , 40 33 byte

Dung dịch:

&/{2=+/d=_d:x%!x}'+/'m,+m:(7#2)\'

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

Giải trình:

Một nửa là tạo ma trận, nửa còn lại là kiểm tra tính nguyên thủy.

&/{2=+/d=_d:x%!x}'+/'m,+m:(7#2)\' / the solution
                                ' / apply to each (')
                               \  / decode
                          (   )   / do this together
                           7#2    / 7#2 => 2 2 2 2 2 2 2
                        m:        / save as m
                       +          / transpose
                     m,           / append to m
                  +/'             / sum (+/) each (')
                 '                / apply to each
  {             }                 / lambda taking implicit x
              !x                  / range 0..x
            x%                    / x divided by ...
          d:                      / save as d
         _                        / floor
       d=                         / equal to d?
     +/                           / sum (+/)
   2=                             / equal to 2?
&/                                / minimum


0

JavaScript, 234 byte

f=z=>(z=[...z].map(v=>v.charCodeAt(0))).map(v=>v.toString(2).replace(/0/g,"").length).every((p=v=>{for(i=2;i<v;i++){if(v%i===0){return 0}};return v>1}))&&[...""+1e6].map((v,i)=>z.reduce((a,e)=>!!(e&Math.pow(2,i))+a,0)).every(v=>p(v))

Chúng tôi nhận được các giá trị theo chiều ngang bằng cách chuyển đổi số thành nhị phân, loại bỏ các số 0 bằng cách sử dụng thay thế chuỗi và sau đó đếm 1s. Các tổng thẳng đứng có được bằng cách lặp 1 đến 7 và sử dụng bit AND với 2 được nâng lên công suất thứ n.


Math.pow(2,i)có thể rút ngắn để (1<<i)giả sử i<32, có thể tiết kiệm 7 byte, có thể không.
Naruyoko

0

Clojure, 180 byte

#(let[S(for[i %](for[j[1 2 4 8 16 32 64]](min(bit-and(int i)j)1)))A apply](not-any?(fn[i](or(= i 1)(seq(for[d(range 2 i):when(=(mod i d)0)]d))))(into(for[s S](A + s))(A map + S))))

Có thể có một cách ngắn hơn để tạo danh sách bit và kiểm tra tính nguyên thủy.



0

Python 3, 164 byte

import numpy;a=numpy.array([list(f'{ord(_):07b}')for _ in input()]).astype(int);print(all([(v>1)*all(v%i for i in range(2,v))for v in set(a.sum(0))|set(a.sum(1))]))

0

Ruby 2.7 -rprime, 95 byte

->s{a=s.bytes.map{[*@1.digits(2),0][..6]}
(a.map(&:sum)+a.transpose.map(&:sum)).all?(&:prime?)}

Không có liên kết TiO vì TiO vẫn chạy Ruby 2.5.5. 😭

Giải trình

Khá đơn giản. Dòng đầu tiên lấy các chữ số nhị phân của mỗi ký tự dưới dạng một mảng được đệm thành bảy chữ số, điều này thực sự phải dễ dàng hơn:

a = s.bytes.map { [*@1.digits(2), 0][..6] }

Kiểm tra độ nóng của tham số khối ( @1) và độ bắt đầu phạm vi ( ..6) .

Dòng thứ hai tính tổng các hàng và cột và kiểm tra nếu chúng đều là số nguyên tố:

(a.map(&:sum) + a.transpose.map(&:sum)).all?(&:prime?)

0

JavaScript (Node.js) , 149 146 ... 134 130 129 byte

x=>[...x].map(y=>a=[...a.map(n=>y.charCodeAt()&2**i++?++z&&-~n:n,z=i=0),z],a=[...Array(7)])&&!a.some(n=>(P=r=>n%--r?P(r):~-r)(n))

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

Giải trình

x=>                        // Main function:
 [...x].map(               //  For each y in x:
  y=>
   a=[...a.map(            //   For each i in range(0, len(a)):
    n=>                   
     y.charCodeAt()&2**i++ //    If y AND 2**i is not zero:
     ?++z&&-~n:n,          //     z = z + 1; a[i] = a[i] + 1 (1 if a[i] is undefined)
    z=i=0                  //   Initially z = 0
   ),z],                   //   Then push z at the end of a
  a=[...Array(7)]          //  Initially a = [undefined] * 7
 )&&!a.some(               //  Then for each n in a:
  n=>(
   P=r=>                   //   Composite function:
    n%--r?                 //    If n % (r - 1) == 0 or r == 1:
     P(r)                  //     Return P(r - 1)
    :~-r                   //    Else: Return r - 2
  )(n)                     //   Starting from r = n
 )                         //  Return whether the composite function returns 0 for all n.

Làm thế nào mà nó thậm chí hoạt động!?

  • y.charCodeAt()&2**i
    • Chúng ta cần mã này để trả về bit tương ứng của y.charCodeAt()if 0 <= i < 7và 0 nếu không.
    • Khi i < 7, mã rõ ràng hoạt động như bình thường.
    • Khi 7 <= i <= 32, vì bit tương ứng y.charCodeAt()là 0 dù sao, kết quả là 0 như mong đợi.
    • Khi 32 < i < 1024, kể từ đó int32(2**i) == 0, kết quả là 0 như mong đợi.
    • Khi nào 1024 <= i, chúng ta có 2**i == Infinityvà kể từ đó int32(Infinity) == 0, kết quả là 0 như mong đợi.
  • (P=r=>n%--r?P(r):~-r)(n)
    • Để đơn giản, chúng tôi cho phép R = --r = r - 1.
    • Hàm trợ giúp này chấm dứt khi n % R == 0hoặc n % R is NaN.
      • n % R == 0: Rlà một yếu tố của n.
        • Nếu R == 1, thì đó nlà số nguyên tố vì tất cả 1 < R < nkhông thể phân chia n. Trả về 0 (giả).
        • Nếu R == -1, sau đó n == 0. Trả về -2 (trung thực).
        • Nếu không, trở về R - 1nơi R - 1 > 0(sự thật).
      • n % R is NaN: Tính toán mô-đun không hợp lệ.
        • Nếu R == 0: n == 1. Trả về -1 (trung thực).
        • Nếu n is NaN: R is NaN. Trả về -1 (trung thực).
    • Kết quả là, chỉ khi R == 1hàm này có thể trả về giá trị giả, biểu thị nlà số nguyên tố.
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.