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 1
s 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 truthy
jika string tersebut adalah primer, dan falsy
sebaliknya.
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 kode-golf , 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.
husband
itu valid? Atau salah satunya? Masalah besar!False
, betul?0
dan1
bukan prima, dan setiap string input 1-2 karakter yang hanya berisi karakter dalam rentang yang diberikan dijamin mengandung setidaknya satu0
atau1
sebagai jumlah vertikal. Anda harus menambahkan beberapa string karakter 1 dan 2 sebagai kasus uji.false
. 2 input char bisa, tetapi tidak dalam rentang ASCII yang kami gunakan, jadi untuk skenario ini Anda benar.Jawaban:
MATL, 10 byte
Cobalah online!
Ini adalah bahasa yang ideal untuk pekerjaan itu. Ini cukup banyak transliterasi literal dari spesifikasi tantangan.
Karena sembarang nol membuat array MATL palsu sesuai meta , tidak ada lagi yang diperlukan - pada dasarnya, sebuah implisit
A
dipanggil?
(jika).sumber
a
harus palsu, tetapi kembali1 1
? (kolomnya tidak menambahkan bilangan prima)BtXsw!shZp
akan memperbaikinya dan menjadi pemenang untuk 10.Jelly ,
13 1211 byteTryItOnline! atau semua kasus uji
Bagaimana?
sumber
05AB1E , 17 byte
Cobalah online!
sumber
Jelly , 15 byte
Cobalah online! atau Verifikasi semua kasus uji. .
Penjelasan
sumber
Mathematica, 75 byte
Fungsi tanpa nama mengambil string sebagai input dan kembali
True
atauFalse
.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 hasilnyaPrimeQ
, meratakan daftarJoin@@
, dan mengambilAnd
semua nilai tersebut.sumber
Ruby
-rprime
, 100 byteCobalah online!
Penjelasan
sumber
Perl,
151121111 + 3 = 114 byteJalankan 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
//
setelahF
itu mubazir. Byte tambahan dapat dihapus (untuk 112) dengan memipet input melaluiecho -n
, tapi saya merasa bahwa secara teknis menambahkan lebih banyak kode, jadi YMMV.Dapat dibaca:
sumber
//
setelah-F
, dan Anda dapat mengambil input tanpa baris baru (denganecho -n
) untuk menghilangkan-l
flag.Python 3,
228227225 byteBukan 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.
Sunting 1: diganti
e[0]%8==0
dengane[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
kappa
itu valid ... buat apa yang Anda mau.sumber
e[0]%8==0
kee[0]%8<1
?<1
, bukan<0
?Groovy,
151137 byteTidak 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.sumber
Pyth , 37 byte
Cobalah online!
sumber
Brachylog , 14 byte
Cobalah online!
Keluaran melalui keberhasilan atau kegagalan. (Dalam hal keberhasilan, daftar semua jumlah kolom dan baris tersedia melalui variabel output.
sumber
O5AB1E, 12 byte
Cobalah online!
Ini golf kode pertamaku jadi mudah :)
sumber
Python 3 ,
209189180171160 byteSquid Thanx untuk -9 byte :)
Cobalah online!
sumber
t+
dalam pernyataan peta?t
memiliki semua baris, sedangkan[[t[i][j]..i..]..j..]
transposisit
, yaitu kolom. Jika ada cara yang lebih pendek untuk mengubah urutan matriks, kita dapat menghemat lebih banyak byte :)beezz
harus mengembalikan false, tetapi tidak. Itu karena cek utama rusak, ia mengembalikanTrue
untuk 4 bit. Cobaprint(p('1111'))
. Perbaiki sekarang. Semua kasus uji tidak mencakup hal itu, karena semua karakter yang digunakan adalah data awal.K (oK) ,
4033 byteLarutan:
Cobalah online!
Penjelasan:
Setengah menciptakan matriks, setengah lainnya adalah pemeriksaan primality.
sumber
PHP, 173 byte
Uji secara online
sumber
JavaScript, 234 byte
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.
sumber
Math.pow(2,i)
dapat disingkat dengan(1<<i)
asumsii<32
, mungkin menghemat 7 byte, mungkin tidak sekalipun.Clojure, 180 byte
Mungkin ada cara yang lebih pendek untuk menghasilkan daftar bit dan juga tes primality.
sumber
Perl 5
-MList::Util=all,sum -pF
,9692 byteCobalah online!
sumber
Python 3, 164 byte
sumber
Ruby 2.7
-rprime
, 95 byteTidak 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:
Lihat parameter blok bernomor itu (
@1
) dan jangkauan beginless (..6
) hotness .Baris kedua merangkum baris dan kolom dan tes jika semuanya prima:
sumber
JavaScript (Node.js) ,
149146...134130129 byteCobalah online!
Penjelasan
Bagaimana cara kerjanya !?
y.charCodeAt()&2**i
y.charCodeAt()
jika0 <= i < 7
, dan 0 sebaliknya.i < 7
, kode itu tampaknya berfungsi seperti biasa.7 <= i <= 32
, karena bit yang sesuaiy.charCodeAt()
adalah 0, hasilnya adalah 0 seperti yang diharapkan.32 < i < 1024
Sejak kapanint32(2**i) == 0
, hasilnya adalah 0 seperti yang diharapkan.1024 <= i
, kami sudah2**i == Infinity
, dan sejakint32(Infinity) == 0
, hasilnya adalah 0 seperti yang diharapkan.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
ataun % R is NaN
.n % R == 0
:R
adalah faktorn
.R == 1
, makan
adalah yang utama karena semua1 < R < n
tidak dapat membagin
. Return 0 (falsy).R == -1
demikiann == 0
. Kembali -2 (benar).R - 1
manaR - 1 > 0
(benar).n % R is NaN
: Perhitungan modular tidak valid.R == 0
:n == 1
. Return -1 (truthy).n is NaN
:R is NaN
. Return -1 (truthy).R == 1
fungsi ini dapat mengembalikan nilai falsy, menunjukkann
prima.sumber