String Primenary


27

String Primenary ( binary-prime ) adalah string yang, ketika ditulis sebagai grid biner, setiap baris dan kolom memiliki total prima.

Itu penjelasan yang tidak jelas, jadi mari kita uraikan dengan contoh yang berhasil ...


Untuk contoh ini kita akan menggunakan string bunny:

Pertama, cari titik kode ASCII dari setiap karakter dan representasi binernya:

Char | ASCII | Binary

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

Ambil nilai-nilai biner ini, dari atas ke bawah, dan atur ke dalam kisi (menambahkan nol di depan jika perlu):

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

Lalu, hitung jumlah 1s di setiap baris dan kolom:

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

Jika, dan hanya jika, setiap total tunggal adalah prima (seperti di sini) maka string tersebut adalah binary-prime yang valid.


Tantangan

Tugas Anda adalah untuk membuat fungsi atau program yang, ketika diberi string, mengembalikan / output truthyjika string tersebut adalah primer, dan falsysebaliknya.

Aturan / Detail

  • Anda dapat mengasumsikan bahwa karakter string akan selalu berada dalam rentang ASCII 33-126(inklusif).
  • String tidak akan kosong.
  • String primer tidak harus memiliki panjang prima - misalnya, W1n*valid, meskipun memiliki 4 karakter.
  • Ini adalah , jadi jawaban tersingkat (dalam byte) menang - tetapi semua pengiriman diterima.
  • Celah standar dilarang.

Uji Kasus

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

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

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

Ada juga contoh Python yang berfungsi, tetapi sangat verbose di repl.it yang bisa Anda uji solusinya.


Bisakah saya bertanya bagaimana Anda menemukan husbanditu valid? Atau salah satunya? Masalah besar!
Gabriel Benamy

3
@GabrielBenamy Saya senang ada yang bertanya! Saya
memutar

Setiap 1-2 karakter input dijamin kembali False, betul?
mbomb007

... karena 0dan 1bukan prima, dan setiap string input 1-2 karakter yang hanya berisi karakter dalam rentang yang diberikan dijamin mengandung setidaknya satu 0atau 1sebagai jumlah vertikal. Anda harus menambahkan beberapa string karakter 1 dan 2 sebagai kasus uji.
mbomb007

@ mbomb007 1 input char tidak dapat memiliki bilangan prima secara kolom, sehingga mereka akan kembali false. 2 input char bisa, tetapi tidak dalam rentang ASCII yang kami gunakan, jadi untuk skenario ini Anda benar.
FlipTack

Jawaban:


8

MATL, 10 byte

BtXsw!shZp

Cobalah online!

Ini adalah bahasa yang ideal untuk pekerjaan itu. Ini cukup banyak transliterasi literal dari spesifikasi tantangan.

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.

Karena sembarang nol membuat array MATL palsu sesuai meta , tidak ada lagi yang diperlukan - pada dasarnya, sebuah implisit Adipanggil ?(jika).


aharus palsu, tetapi kembali 1 1? (kolomnya tidak menambahkan bilangan prima)
FlipTack

Saya pikir BtXsw!shZpakan memperbaikinya dan menjadi pemenang untuk 10.
Jonathan Allan

@ Flp.Tck Benar-benar lupa tentang perilaku 'memaafkan' MATLAB ketika bekerja dengan vektor baris. Maaf, perbaiki sekarang.
Sanchises

Bekerja sekarang :) (mungkin ingin memperbarui tautannya, coba online)
FlipTack

@ Flp.Tkc Selesai. Terima kasih untuk tantangan yang menyenangkan!
Sanchises

4

Jelly , 13 12 11 byte

OBUZ;$S€ÆPẠ

TryItOnline! atau semua kasus uji

Bagaimana?

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

Jelly , 15 byte

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

Cobalah online! atau Verifikasi semua kasus uji. .

Penjelasan

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

Mathematica, 75 byte

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

Fungsi tanpa nama mengambil string sebagai input dan kembali Trueatau False.

ToCharacterCode@#mengubah input menjadi daftar nilai ASCII-nya; IntegerDigits[...,2,7]mengubah setiap nilai menjadi daftar bit-bitnya, diisi hingga 7 jika perlu. Jadi sekarang kita memiliki array 2D dan kita ingin semua jumlah baris dan jumlah kolomnya; Lihatlah, karakter-kejang {+##&@@#,+##&@@@#}&@...melakukan hal itu (itu berlaku +##&, "jumlah semua argumen", berfungsi untuk daftar vektor dalam koordinat pertama yang digunakan @@, dan untuk setiap vektor sebagai daftar bilangan bulat sendiri dalam koordinat kedua yang digunakan @@@) . Kemudian kami hanya memeriksa apakah hasilnya PrimeQ, meratakan daftar Join@@, dan mengambil Andsemua nilai tersebut.


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?}}

Cobalah online!

Penjelasan

->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

Jalankan dengan -lF. Program hanya akan berfungsi dengan benar untuk input pertama. Hentikan program dan jalankan kembali untuk masukan Anda selanjutnya.

Terima kasih kepada @Dada karena memberi tahu saya bahwa //setelah Fitu mubazir. Byte tambahan dapat dihapus (untuk 112) dengan memipet input melalui echo -n, tapi saya merasa bahwa secara teknis menambahkan lebih banyak kode, jadi 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

Dapat dibaca:

                                     #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
Versi yang hanya berfungsi pada input pertama sangat baik, sehingga Anda dapat menempatkan versi 141 byte sebagai yang utama, dan menyarankan yang lain untuk digunakan pada beberapa input.
Dada

Perhatikan juga bahwa Anda dapat menghilangkan //setelah -F, dan Anda dapat mengambil input tanpa baris baru (dengan echo -n) untuk menghilangkan -lflag.
Dada

1

Python 3, 228 227 225 byte

Bukan jawaban yang bagus, saya tidak bisa bermain golf sebanyak yang saya inginkan, tetapi saya menghabiskan begitu lama untuk itu saya merasa saya harus mempostingnya. Saran untuk memotong byte akan sangat dihargai.

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))

Sunting 1: diganti e[0]%8==0dengan e[0]%8<1, kehilangan satu byte. Terima kasih Flp.Tkc!

Sunting 2: mengganti (i +1) dengan - ~ i, kehilangan dua byte tambahan. Terima kasih Erik karena mengungkap betapa buruknya pengetahuan tingkat bit saya :) Saat menguji revisi ini, saya menemukan bahwa kappaitu valid ... buat apa yang Anda mau.


1
Anda bisa mengubah e[0]%8==0ke e[0]%8<1?
FlipTack

@ Flp.Tkc Tempat yang bagus! Tidak ada alasan mengapa itu tidak bisa dilakukan.
FourOhFour

1
@ Flp.Tkc Saya tidak berpikir saya bisa menyimpan byte dengan membuatnya berfungsi. Saya suka bagaimana Anda mendapatkan 404 rep btw :)
FourOhFour

Seharusnya begitu <1, bukan <0?
Destructible Lemon

@ Semangka Dapat Dihancurkan ya biarkan saya memperbaiki itu.
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())}

Tidak ada pemeriksaan primitas di ...

p={x->x<3||(2..(x**0.5)).every{x%it}}; - Penutupan untuk pengujian primality.

y={it.every{p(it.count("1"))}}; - Penutupan untuk memastikan bahwa semua jumlah "1" untuk array 2D biner yang disahkan adalah prima.

x=it.collect{0.toString((int)it,2) as List}; - Coversion dari string ke array biner.

y(x)&&y(x.transpose()) - Untuk semua jumlah yang divalidasi perdana dalam matriks utama dan matriks yang ditransformasikan, pastikan semuanya kembali benar.


1

Pyth , 37 byte

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

Cobalah online!


                                 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+ᵐṗᵐ

Cobalah online!

Keluaran melalui keberhasilan atau kegagalan. (Dalam hal keberhasilan, daftar semua jumlah kolom dan baris tersedia melalui variabel output.

   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

Cobalah online!

Ini golf kode pertamaku jadi mudah :)

Ç              % 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

Ini menghasilkan hasil kosong untuk input satu huruf. Saya tidak berpengalaman dalam O5AB1E tetapi jika itu adalah nilai falsey, tidak apa-apa.
Sanchises

1

Python 3 , 209 189 180 171 160 byte

Squid Thanx untuk -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)]))

Cobalah online!


Saya suka bagaimana Anda menulis ulang pernyataan cetak test case :)
movatica

Ya saya agak kompulsif obsesif tentang f-string ... Juga, bukankah itu setara jika Anda menghapus t+dalam pernyataan peta?
Pasang kembali Monica

Tidak, karena pemeriksaan prima perlu mencakup baris dan kolom dalam matriks bit. tmemiliki semua baris, sedangkan [[t[i][j]..i..]..j..]transposisi t, yaitu kolom. Jika ada cara yang lebih pendek untuk mengubah urutan matriks, kita dapat menghemat lebih banyak byte :)
movatica

Ini berfungsi ketika saya mencobanya , apakah Anda tahu string yang merusaknya?
Pasang kembali Monica

Iya nih. beezzharus mengembalikan false, tetapi tidak. Itu karena cek utama rusak, ia mengembalikan Trueuntuk 4 bit. Coba print(p('1111')). Perbaiki sekarang. Semua kasus uji tidak mencakup hal itu, karena semua karakter yang digunakan adalah data awal.
movatica

1

K (oK) , 40 33 byte

Larutan:

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

Cobalah online!

Penjelasan:

Setengah menciptakan matriks, setengah lainnya adalah pemeriksaan primality.

&/{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

PHP, 173 byte

for($r=1;$b=substr_count($t[$i]=sprintf('%07b',ord($argv[1][$i++])),1);)$r&=$b==2|$b%2&$b>2;for(;$k++<7;){for($b=$j=0;$t[++$j];$b+=$t[$j][$k-1]);$r&=$b==2|$b%2&$b>2;}echo$r;

Uji secara online


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))

Kami mendapatkan nilai horizontal dengan mengubah angka menjadi biner, menghapus nol menggunakan penggantian string, dan kemudian menghitung 1s. Jumlah vertikal diperoleh dengan mengulang 1 sampai 7 dan menggunakan bitwise AND dengan 2 dinaikkan ke daya n.


Math.pow(2,i)dapat disingkat dengan (1<<i)asumsi i<32, mungkin menghemat 7 byte, mungkin tidak sekalipun.
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))))

Mungkin ada cara yang lebih pendek untuk menghasilkan daftar bit dan juga tes primality.


0

Perl 5 -MList::Util=all,sum -pF , 96 92 byte

$_=all{//;all{$'%$_}2..$_-1}(map{$_=sprintf'%07b',ord;y/1//}@F),map{sum map{s/.//;$&}@F}0..6

Cobalah online!


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?)}

Tidak ada tautan TiO karena TiO masih menjalankan Ruby 2.5.5. 😭

Penjelasan

Cukup mudah. Baris pertama mendapat digit biner dari masing-masing karakter sebagai array melangkah keluar untuk tujuh digit, yang benar-benar seharusnya menjadi lebih mudah:

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

Lihat parameter blok bernomor itu (@1 ) dan jangkauan beginless ( ..6) hotness .

Baris kedua merangkum baris dan kolom dan tes jika semuanya prima:

(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))

Cobalah online!

Penjelasan

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.

Bagaimana cara kerjanya !?

  • y.charCodeAt()&2**i
    • Kami membutuhkan kode ini untuk mengembalikan bit y.charCodeAt()jika0 <= i < 7 , dan 0 sebaliknya.
    • Kapan i < 7 , kode itu tampaknya berfungsi seperti biasa.
    • Kapan 7 <= i <= 32, karena bit yang sesuaiy.charCodeAt() adalah 0, hasilnya adalah 0 seperti yang diharapkan.
    • 32 < i < 1024Sejak kapanint32(2**i) == 0 , hasilnya adalah 0 seperti yang diharapkan.
    • Kapan 1024 <= i, kami sudah 2**i == Infinity, dan sejak int32(Infinity) == 0, hasilnya adalah 0 seperti yang diharapkan.
  • (P=r=>n%--r?P(r):~-r)(n)
    • Untuk kesederhanaan kami izinkan R = --r = r - 1 .
    • Fungsi pembantu ini berakhir ketika n % R == 0ataun % R is NaN .
      • n % R == 0: Radalah faktorn .
        • Jika R == 1, maka nadalah yang utama karena semua 1 < R < ntidak dapat membagin . Return 0 (falsy).
        • Jika R == -1demikian n == 0. Kembali -2 (benar).
        • Kalau tidak, kembalikan ke R - 1mana R - 1 > 0(benar).
      • n % R is NaN: Perhitungan modular tidak valid.
        • Jika R == 0: n == 1. Return -1 (truthy).
        • Jika n is NaN: R is NaN. Return -1 (truthy).
    • Akibatnya, hanya ketika R == 1fungsi ini dapat mengembalikan nilai falsy, menunjukkan nprima.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.