Cordes Primenary

27

Une chaîne Primenary ( binary-prime ) est une chaîne qui, lorsqu'elle est écrite sous forme de grille binaire, chaque ligne et colonne a un total premier.

C'est une explication assez vague, alors décomposons-la avec un exemple concret ...


Pour cet exemple, nous utiliserons la chaîne bunny :

Tout d'abord, trouvez le point de code ASCII de chaque caractère et sa représentation binaire:

Char | ASCII | Binary

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

Prenez ces valeurs binaires, de haut en bas, et organisez-les dans la grille (en ajoutant des zéros de tête si nécessaire):

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

Ensuite, comptez le nombre de 1s dans chaque ligne et colonne:

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

Si, et seulement si, chaque total est premier (comme ici), alors la chaîne est un nombre binaire premier valide.


Le défi

Votre tâche consiste à créer une fonction ou un programme qui, lorsqu'il reçoit une chaîne, retourne / sort truthysi la chaîne est priménaire et falsyautrement.

Règles / Détails

  • Vous pouvez supposer que les caractères de la chaîne seront toujours dans la plage ASCII 33-126(inclus).
  • La chaîne ne sera pas vide.
  • Une chaîne priménaire n'a pas besoin d'avoir une longueur première - par exemple, elle W1n*est valide, malgré 4 caractères.
  • C'est du , donc la réponse la plus courte (en octets) l'emporte - mais toutes les soumissions sont les bienvenues.
  • Les failles standard sont interdites.

Cas de test

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

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

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

Il existe également un exemple Python fonctionnel, mais incroyablement verbeux sur repl.it, sur lequel vous pouvez tester votre solution.

FlipTack
la source
Puis-je demander comment vous avez découvert que husbandc'était valide? Ou l'un d'eux? Grand problème cependant!
Gabriel Benamy
3
@GabrielBenamy Je suis content que quelqu'un ait demandé! J'ai parcouru un fichier de dictionnaire en ligne , en essayant quelques majuscules aléatoires de chaque lettre, en changeant parfois de lettres pour des chiffres, etc. Ensuite, j'ai jeté un coup d'œil à la liste en sortie et choisi quelques cas de test que j'aimais
FlipTack
Le retour de chaque entrée de 1 à 2 caractères est garanti, n'est-ce Falsepas?
mbomb007
... parce que 0et 1ne sont pas premiers, et chaque chaîne d'entrée de 1 à 2 caractères contenant uniquement des caractères dans la plage donnée est garantie de contenir au moins un 0ou 1comme somme verticale. Vous devez ajouter des chaînes de 1 et 2 caractères comme cas de test.
mbomb007
@ mbomb007 Les entrées 1 char ne peuvent pas avoir de nombres premiers dans la colonne, elles reviendront donc false. 2 entrées de caractères pourraient, mais pas dans la plage ASCII que nous utilisons, donc pour ce scénario, vous avez raison.
FlipTack

Réponses:

8

MATL, 10 octets

BtXsw!shZp

Essayez-le en ligne!

C'est la langue idéale pour le travail. C'est à peu près une translittération littérale de la spécification de défi.

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.

Étant donné que tout zéro rend un tableau MATL falsifié selon la méta , rien d'autre n'est nécessaire - fondamentalement, un implicite Aest appelé ?(si).

Sanchises
la source
adevrait être faux, mais revient 1 1? (ses colonnes ne s'additionnent pas aux nombres premiers)
FlipTack
Je pense que cela BtXsw!shZpréglerait cela et serait un gagnant pour 10.
Jonathan Allan
@ Flp.Tck J'ai complètement oublié le comportement de «tolérance» de MATLAB lors de l'utilisation de vecteurs de ligne. Je suis désolé, je l'ai réparé maintenant.
Sanchises
Fonctionne maintenant :) (vous voudrez peut-être mettre à jour le lien d'essai en ligne)
FlipTack
@ Flp.Tkc Terminé. Merci pour un beau défi!
Sanchises
4

Gelée , 13 12 11 octets

OBUZ;$S€ÆPẠ

TryItOnline! ou tous les cas de test

Comment?

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
Jonathan Allan
la source
3

Gelée , 15 octets

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

Essayez-le en ligne! ou Vérifiez tous les cas de test..

Explication

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
miles
la source
3

Mathematica, 75 octets

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

Fonction sans nom prenant une chaîne en entrée et retournant Trueou False.

ToCharacterCode@#convertit l'entrée dans la liste de ses valeurs ASCII; IntegerDigits[...,2,7]transforme chaque valeur en liste de ses bits, complétée à la longueur 7 si nécessaire. Alors maintenant, nous avons un tableau 2D et nous voulons toutes ses sommes de lignes et de colonnes; Et voilà, le caractère-spasme {+##&@@#,+##&@@@#}&@...fait exactement cela (il applique la fonction +##&"somme tous les arguments" à la liste des vecteurs dans la première coordonnée utilisant @@, et à chaque vecteur comme sa propre liste d'entiers dans la deuxième coordonnée utilisant @@@) . Ensuite, nous vérifions simplement si les résultats sont PrimeQ, aplatissons la liste avec Join@@et prenons Andtoutes ces valeurs.

Greg Martin
la source
2

Ruby -rprime , 100 octets

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

Essayez-le en ligne!

Explication

->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.)
}
Encre de valeur
la source
1

Perl, 151 121 111 + 3 = 114 octets

Courez avec -lF. Le programme ne fonctionnera correctement que pour la première entrée. Arrêtez le programme et réexécutez pour votre prochaine entrée.

Merci à @Dada de m'avoir fait savoir que l' //après Fétait redondant. Un octet supplémentaire peut être supprimé (pour 112) en canalisant l'entrée via echo -n, mais je pense que cela ajoute techniquement plus de code, donc 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

Lisible:

                                     #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.
Gabriel Benamy
la source
1
Une version qui ne fonctionne que sur la première entrée est parfaitement adaptée, vous pouvez donc mettre la version de 141 octets comme principale et suggérer l'autre à utiliser sur plusieurs entrées.
Dada
Notez également que vous pouvez omettre l' //after -F, et vous pouvez prendre l'entrée sans retour à la ligne final (avec echo -n) pour vous débarrasser du -ldrapeau.
Dada
1

Python 3, 228 227 225 octets

Pas une bonne réponse, je n'ai pas pu jouer au golf autant que je l'aurais souhaité, mais j'ai passé tellement de temps dessus que je pense que je devrais le poster. Des suggestions sur la coupe des octets seraient grandement appréciées.

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

Edit 1: remplacé e[0]%8==0par e[0]%8<1, perdre un octet. Merci Flp.Tkc!

Édition 2: remplacement de (i + 1) par - ~ i, perte de deux octets supplémentaires. Merci Erik d'avoir exposé à quel point mes connaissances au niveau du bit sont mauvaises :) En testant cette révision, j'ai découvert que c'était kappavalide ... faites-en ce que vous voulez.

FourOhFour
la source
1
pourriez-vous changer e[0]%8==0pour e[0]%8<1?
FlipTack
@ Flp.Tkc Bon endroit! Il n'y a aucune raison pour que cela ne soit pas possible.
FourOhFour
1
@ Flp.Tkc Je ne pense pas pouvoir économiser des octets en en faisant une fonction. J'aime la façon dont vous avez 404 rep btw :)
FourOhFour
C'est censé l'être <1, non <0?
Destructible Lemon
@Destructible Watermelon yep permettez-moi de corriger cela.
FourOhFour
1

Groovy, 151 137 octets

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

Pas de contrôle de primalité dans groovy ...

p={x->x<3||(2..(x**0.5)).every{x%it}}; - Fermeture pour test de primalité.

y={it.every{p(it.count("1"))}}; - Fermeture pour garantir que tous les comptes de "1" pour un tableau binaire 2D passé sont premiers.

x=it.collect{0.toString((int)it,2) as List}; - Conversion de chaîne en tableau binaire.

y(x)&&y(x.transpose()) - Pour toutes les sommes validées par les nombres premiers dans la matrice principale et la matrice transposée, assurez-vous qu'elles retournent vrai.

Urne de poulpe magique
la source
1

Pyth , 37 octets

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

Essayez-le en ligne!


                                 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> )
hakr14
la source
1

Brachylog , 14 octets

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

Essayez-le en ligne!

Sorties par succès ou échec. (En cas de succès, une liste de toutes les sommes de colonne et de ligne est disponible via la variable de sortie.

   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.
Chaîne indépendante
la source
1

O5AB1E, 12 octets

Çžy+bø€SOp¦W

Essayez-le en ligne!

Ceci est mon premier code de golf alors allez-y doucement :)

Ç              % 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
Alex Waese-Perlman
la source
Cela donne un résultat vide pour une entrée d'une seule lettre. Je ne connais pas bien O5AB1E mais si c'est une valeur de falsey, c'est ok.
Sanchises
1

Python 3 , 209 189 180 171 160 octets

Thanx calmar pour -9 octets :)

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

Essayez-le en ligne!

movatica
la source
J'aime la façon dont vous avez réécrit la déclaration d'impression du
scénario de
Ouais, je suis un petit obsessionnel compulsif à propos des f-strings ... De plus, n'est-ce pas équivalent si vous supprimez t+la déclaration de la carte?
Rétablir Monica le
Non, car la vérification principale doit couvrir à la fois les lignes et les colonnes de la matrice binaire. ta toutes les lignes, tandis que [[t[i][j]..i..]..j..]est la transposée t, c'est-à-dire les colonnes. S'il existe un moyen plus court de transposer la matrice, nous pouvons économiser plus d'octets :)
movatica
Ça marche quand je l'essaye , connaissez-vous une chaîne qui la casse?
Rétablir Monica le
Oui. beezzdevrait retourner faux, mais ne le fait pas. C'est parce que la vérification principale est cassée, elle revient Truepour 4 bits. Essayez print(p('1111')). Fixé maintenant. Tous les cas de test ne couvraient pas cela, car tous les personnages utilisés sont primitifs.
movatica
1

K (oK) , 40 33 octets

Solution:

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

Essayez-le en ligne!

Explication:

La moitié crée la matrice, l'autre moitié est le contrôle de primalité.

&/{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
streetster
la source
0

PHP, 173 octets

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;

Testez-le en ligne

Crypto
la source
0

JavaScript, 234 octets

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

Nous obtenons les valeurs horizontales en convertissant le nombre en binaire, en supprimant les zéros à l'aide d'un remplacement de chaîne, puis en comptant les 1. Les sommes verticales sont obtenues en bouclant 1 à 7 et en utilisant un ET au niveau du bit avec 2 élevé à la nième puissance.

Grax32
la source
Math.pow(2,i)peut être raccourci en (1<<i)supposant i<32, peut-être économiser 7 octets, peut-être pas.
Naruyoko
0

Clojure, 180 octets

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

Il pourrait y avoir un moyen plus court de générer des listes de bits et également le test de primalité.

NikoNyrh
la source
0

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

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

Essayez-le en ligne!

Xcali
la source
0

Python 3, 164 octets

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))]))
Zulfiqaar
la source
0

Ruby 2.7 -rprime, 95 octets

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

Pas de lien TiO car TiO exécute toujours Ruby 2.5.5. 😭

Explication

Assez simple. La première ligne obtient les chiffres binaires de chaque caractère sous la forme d'un tableau composé de sept chiffres, ce qui devrait vraiment être plus facile:

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

Vérifiez que le paramètre de bloc numéroté ( @1) et la plage de beginless ( ..6) Hotness .

La deuxième ligne additionne les lignes et les colonnes et teste si elles sont toutes premières:

(a.map(&:sum) + a.transpose.map(&:sum)).all?(&:prime?)
Jordan
la source
0

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

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

Essayez-le en ligne!

Explication

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.

Comment ça marche même!?

  • y.charCodeAt()&2**i
    • Nous avons besoin de ce code pour renvoyer le bit correspondant de y.charCodeAt() if0 <= i < 7 et 0 sinon.
    • Quand i < 7 , le code fonctionne apparemment comme d'habitude.
    • Quand 7 <= i <= 32 , puisque le bit correspondant dey.charCodeAt() 0 est de toute façon, le résultat est 0 comme prévu.
    • Quand 32 < i < 1024 , depuisint32(2**i) == 0 , le résultat est 0 comme prévu.
    • Quand 1024 <= i, nous avons 2**i == Infinity, et depuis int32(Infinity) == 0, le résultat est 0 comme prévu.
  • (P=r=>n%--r?P(r):~-r)(n)
    • Pour plus de simplicité, nous laissons R = --r = r - 1 .
    • Cette fonction d'assistance se termine lorsque n % R == 0ou n % R is NaN.
      • n % R == 0: Rest un facteur den .
        • Si R == 1, alors nest premier parce que tous 1 < R < nne peuvent pas se divisern . Retourne 0 (fausse).
        • Si R == -1, alorsn == 0 . Retour -2 (véridique).
        • Sinon, retournez R - 1R - 1 > 0 (véridique).
      • n % R is NaN: Calcul modulaire non valide.
        • Si R == 0 :n == 1. Retour -1 (véridique).
        • Si n is NaN: R is NaN. Retour -1 (véridique).
    • Par conséquent, ce n'est que lorsque R == 1cette fonction peut renvoyer une valeur fausse, indiquant nest premier.
Shieru Asakoto
la source