İlkel Dizeler


27

Bir Primenary ( binary-prime ) dizesi, bir ikili ızgara olarak yazıldığında, her satır ve sütunda bir asal toplam bulunan bir dizedir.

Bu oldukça belirsiz bir açıklama, öyleyse çalışmış bir örnekle parçalayalım ...


Bu örnek için dizeyi kullanacağız bunny:

Öncelikle, her karakterin ASCII kod noktasını ve ikili gösterimini bulun:

Char | ASCII | Binary

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

Bu ikili değerleri yukarıdan aşağıya alın ve ızgaraya yerleştirin (gerekirse baştaki sıfırları ekleyin):

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

Ardından, 1her satır ve sütundaki s sayısını sayın :

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

Eğer ve sadece eğer, her bir toplamın asal (burada olduğu gibi) ise, dize geçerli bir ikili asaldır.


Meydan okuma

Göreviniz, bir dize verildiğinde truthy, dize ilkel ise döndüren / çıktı veren bir işlev veya program oluşturmaktır falsy.

Kurallar / Detaylar

  • Dizenin karakterlerinin her zaman ASCII aralığında 33-126(dahil) olacağını varsayabilirsiniz .
  • Dize boş olmayacak.
  • Bir primenary dize gelmez değil bir başbakan uzunluğa sahip - örneğin, W1n*4 karakter olmasına rağmen geçerlidir.
  • Bu , bu yüzden en kısa cevap (bayt cinsinden) kazanır - ancak tüm bildirimler açıktır.
  • Standart boşluklar yasaklandı.

Test Kılıfları

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

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

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

Çözümünüzü test edebileceğiniz repl.it üzerinde çalışan, ancak inanılmaz derecede ayrıntılı bir Python örneği de var .


Bunun nasıl husbandgeçerli olduğunu keşfettiğinizi sorabilir miyim ? Veya bunlardan herhangi biri? Yine de büyük sorun!
Gabriel Benamy

3
@ GabrielBenamy Birinin sormasına sevindim! Bir döngülendirilen online sözlük Sonra çıktı şeklindeki listeye bir göz vardı, vb bazen her harfin rastgele birkaç kapitalizasyonları çalışıyor numaralarının harf anahtarlama, dosya ve ben sevdim test durumlarda birkaç aldı
FlipTack

Her 1-2 karakter girişinin geri dönmesi garanti edilir False, doğru mu?
mbomb007

Çünkü ... 0ve 1asal değildir ve belirli bir aralıkta tek karakter içeren her 1-2 karakter girişi dizisi en az bir içerecek şekilde garanti 0veya 1dikey bir toplamı olarak. Test durumları olarak bazı 1 ve 2 karakter dizileri eklemelisiniz.
mbomb007 21

@ mbomb007 1 char girişleri asal sayıları sütun şeklinde kullanamaz, bu yüzden geri dönerler false. 2 karakter girişi olabilir, ancak kullandığımız ASCII aralığında değil, bu nedenle bu senaryoda haklısınız.
FlipTack

Yanıtlar:


8

MATL, 10 bayt

BtXsw!shZp

Çevrimiçi deneyin!

Bu iş için ideal bir dildir. Bu hemen hemen meydan okuma şartnamesinin gerçek bir çevirisidir.

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.

Herhangi bir sıfır bir MATL dizisini meta başına göre yanlış yapar , başka hiçbir şeye gerek yoktur - temel Aolarak, ?(eğer) üzerine bir örtük çağrılır .


asahte olmalı, ancak döner 1 1mi? (sütunları
astarlara eklenmez

Sanırım BtXsw!shZpbu sorunu
Jonathan Allan

@ Flp.Tck Satır vektörleri ile çalışırken MATLAB'ın 'affetme' davranışını tamamen unuttum. Üzgünüm, şimdi düzelttim.
Sanchises,

(Deneyin tho online bağlantı güncellemek isteyebilirsiniz) :) şimdi Works
FlipTack

@ Flp.Tkc Yapıldı. Güzel bir meydan okuma için teşekkürler!
Sanchises

4

Jöle , 13 12 11 bayt

OBUZ;$S€ÆPẠ

TryItOnline! veya tüm test durumları

Nasıl?

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

Jöle , 15 bayt

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

Çevrimiçi deneyin! veya Tüm test durumlarını doğrulayın..

açıklama

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 bayt

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

Girdi ve geri dönen bir dize alarak Adsız işlev Trueveya False.

ToCharacterCode@#girişi ASCII değerleri listesine dönüştürür; IntegerDigits[...,2,7]her bir değeri, gerekirse 7 uzunluğa kadar doldurulmuş bit listesine dönüştürür. Şimdi 2B dizimiz var ve tüm satır toplamlarını ve sütun toplamlarını istiyoruz; Seyreyle, karakter-spazmı {+##&@@#,+##&@@@#}&@...(uyguladığı tam olarak bu +##&birinci kullanılarak koordinat vektörleri listesine fonksiyonu "tüm bağımsız değişkenler toplamı", @@ve tam sayılar kendi listesi olarak her vektör ikinci kullanılarak koordinat @@@) . Sonra sonuçların olup olmadığını kontrol ederiz PrimeQ, listeyi düzleştiririz Join@@ve Andtüm bu değerleri alırız .


2

Ruby -rprime , 100 bayt

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

Çevrimiçi deneyin!

açıklama

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

İle koş -lF. Program sadece ilk giriş için doğru çalışacaktır. Programı sonlandırın ve bir sonraki girişiniz için tekrar çalıştırın.

@Dada'ya, //sonrasında Fgereksiz olduğunu bildirdiğim için teşekkür ederiz . Ek bir bayt, girişi (112 için) giriş yolu ile yönlendirerek silinebilir echo -n, ancak bunun teknik olarak daha fazla kod eklediğini hissediyorum, yani 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

Okunabilir:

                                     #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
Yalnızca ilk girişte çalışan bir sürüm tamamen iyi durumdadır, bu nedenle 141 bayt sürümünü ana sürüm olarak koyabilir ve diğerini çoklu girişlerde kullanmasını önerebilirsiniz.
Dada

Ayrıca //sonrasını atlayabileceğinizi -Fve girdiyi bayraktan echo -nkurtulmak için son satırsonu olmadan (with ) alabileceğinizi unutmayın -l.
Dada

1

Python 3, 228 227 225 bayt

Harika bir cevap değil, istediğim kadar golf oynayamadım ama çok fazla zaman harcadım, göndermem gerektiğini hissediyorum. Bayt kesim önerileri büyük memnuniyetle karşılanacaktır.

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

Düzenleme 1: değiştirilen e[0]%8==0ile e[0]%8<1bir byte kaybederek. Teşekkürler Flp.Tkc!

Düzenleme 2: (i + 1) yerine iki ek bayt kaybederek - ~ ile değiştirin. Bit seviyesi bilgimin ne kadar kötü olduğunu ortaya koyan Erik'e teşekkür ederim :) Bu düzeltmeyi test ederken kappabunun geçerli olacağını keşfettim .


1
Eğer değiştirebilir e[0]%8==0için e[0]%8<1?
FlipTack

@ Flp.Tkc İyi nokta! Bunun yapılamamasının bir nedeni yok.
FourOhFour

1
@ Flp.Tkc Bir işlevi yaparak baytları kurtarabileceğimi sanmıyorum. Ben 404 rep btw :)
FourOhFour

Olması gerekiyordu <1, değil <0mi?
Yıkılabilir Limon

@ Yıkılabilir Karpuz yep düzeltmeme izin verin.
FourOhFour

1

Groovy, 151 137 bayt

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

Büyüklükte ilkel kontrol yok ...

p={x->x<3||(2..(x**0.5)).every{x%it}}; - Primallik testi için kapatma.

y={it.every{p(it.count("1"))}}; - Geçilen bir ikili 2D dizisi için tüm "1" sayımlarının asal olduğundan emin olmak için kapatma.

x=it.collect{0.toString((int)it,2) as List}; - Dizeden ikili diziye dönüşüm.

y(x)&&y(x.transpose()) - Ana matristeki ve aktarılan matristeki tüm geçerli onaylanmış toplamlar için, doğru olduklarından emin olun.


1

Pyth , 37 bayt

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

Çevrimiçi deneyin!


                                 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 bayt

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

Çevrimiçi deneyin!

Başarı veya başarısızlıktan çıktı alır. (Başarı durumunda, tüm değişkenlerin ve satır toplamlarının bir listesine çıktı değişkeni aracılığıyla ulaşılabilir.

   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 bayt

Çžy+bø€SOp¦W

Çevrimiçi deneyin!

Bu benim ilk kod golf o kadar kolay :)

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

Bu, tek bir harf girişi için boş bir sonuç verir. Ben O5AB1E de iyi değilim ama bu bir falsey değeri ise, sorun değil.
Sanchises

1

Python 3 , 209 189 180 171 160 bayt

-9 bayt için Thanx kalamar :)

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

Çevrimiçi deneyin!


Sana test durumu baskı deyimi :) yeniden yazdım hoşuma
movatica

Evet, f-dizgileri konusunda zorlayıcı bir saplantıyım ... Ayrıca t+harita ifadesinde kaldırırsanız eşdeğer değil mi?
Monica

Hayır, çünkü birincil kontrolün bit matrisindeki hem satır hem de sütunları kapsaması gerekir. ttüm satırlara sahip, [[t[i][j]..i..]..j..]aktarılmış halde t, yani sütunlarda. Matrisi transpoze etmenin daha kısa bir yolu varsa, daha fazla bayt tasarrufu yapabiliriz :)
movatica

Denediğimde çalışıyor , kıran bir ipten haberiniz var mı?
Monica

Evet. beezzfalse döndürmeli, ancak dönmemelidir. Bunun nedeni, ana kontrolün bozulduğundan, True4 bitlik bir değer olarak geri dönmesidir. Dene print(p('1111')). Şimdi düzeltildi. Tüm test senaryoları bunu kapsamıyordu çünkü kullanılan karakterlerin tümü ilkel.
movatica

1

K (oK) , 40 33 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

Yarısı matris yaratıyor, diğer yarısı ilkellik kontrolü.

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

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;

Çevrimiçi olarak test edin


0

JavaScript, 234 bayt

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

Sayıyı ikiliye dönüştürerek, bir dize değiştirme kullanarak sıfırları kaldırarak ve ardından 1leri sayarak yatay değerleri alırız. Dikey toplamlar, 1 ila 7 ilmekle ve bit gücüne AND 2 yükseltilmiş olarak bitsel AND kullanılarak elde edilir.


Math.pow(2,i)(1<<i)varsaymakla kısaltılabilir i<32, belki 7 byte tasarruf, belki de olmayabilir.
Naruyoko

0

Clojure, 180 bayt

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

Bit listeleri oluşturmanın daha kısa bir yolu ve ayrıca ilkellik testi olabilir.



0

Python 3, 164 bayt

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

Yakut 2.7 -rprime, 95 bayt

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

TiO bağlantısı yok, çünkü TiO hala Ruby 2.5.5 kullanıyor. 😭

açıklama

Oldukça basit. İlk satır, her karakterin ikili rakamlarını yedi basamaktan oluşan bir dizi olarak alır, ki bu gerçekten daha kolay olmalı:

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

Numaralı blok parametresinin ( @1) ve acısız aralık ( ..6) sıcaklığının kontrol edilmesi .

İkinci satır, satırları ve sütunları toplar ve hepsi asal olup olmadığını sınar:

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

0

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

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

Çevrimiçi deneyin!

açıklama

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.

Nasıl çalışır?

  • y.charCodeAt()&2**i
    • Biz karşılık gelen bit dönmek için bu kodu gerekir y.charCodeAt()eğer0 <= i < 7 , aksi takdirde 0 .
    • Ne zaman i < 7 , kod görünüşte her zamanki gibi çalışır.
    • Ne zaman 7 <= i <= 32, karşılık gelen bity.charCodeAt() zaten 0'dır beklendiği gibi sonuç 0'dır.
    • Ne 32 < i < 1024zamandan beriint32(2**i) == 0 , sonuç beklendiği gibi 0'dır.
    • Ne zaman 1024 <= i, biz 2**i == Infinityve bu yana int32(Infinity) == 0sonuç beklendiği gibi 0'dır.
  • (P=r=>n%--r?P(r):~-r)(n)
    • Sadelik için biz izin R = --r = r - 1 .
    • Bu yardımcı işlev n % R == 0veya olduğunda sona erer n % R is NaN.
      • n % R == 0: Rbir faktördürn .
        • Eğer R == 1öyleyse n, asal olan çünkü herkes 1 < R < nbölünemezn . 0 döndür (sahte).
        • Eğer R == -1öyleyse n == 0. Geri dönüş -2 (truthy).
        • Aksi takdirde, geri R - 1burada R - 1 > 0(truthy).
      • n % R is NaN: Geçersiz modüler hesaplama.
        • Eğer R == 0:n == 1. -1 döndürün (truthy).
        • Eğer n is NaN: R is NaN. -1 döndürün (truthy).
    • Sonuç olarak, R == 1bu işlev ne zaman sahte bir değer döndürürse n, asal olduğunu gösterir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.