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 1
s 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 truthy
si la chaîne est priménaire et falsy
autrement.
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 code-golf , 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.
husband
c'était valide? Ou l'un d'eux? Grand problème cependant!False
pas?0
et1
ne 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 un0
ou1
comme somme verticale. Vous devez ajouter des chaînes de 1 et 2 caractères comme cas de test.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.Réponses:
MATL, 10 octets
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.
É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
A
est appelé?
(si).la source
a
devrait être faux, mais revient1 1
? (ses colonnes ne s'additionnent pas aux nombres premiers)BtXsw!shZp
réglerait cela et serait un gagnant pour 10.Gelée ,
13 1211 octetsTryItOnline! ou tous les cas de test
Comment?
la source
05AB1E , 17 octets
Essayez-le en ligne!
la source
Gelée , 15 octets
Essayez-le en ligne! ou Vérifiez tous les cas de test..
Explication
la source
Mathematica, 75 octets
Fonction sans nom prenant une chaîne en entrée et retournant
True
ouFalse
.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 sontPrimeQ
, aplatissons la liste avecJoin@@
et prenonsAnd
toutes ces valeurs.la source
Ruby
-rprime
, 100 octetsEssayez-le en ligne!
Explication
la source
Perl,
151121111 + 3 = 114 octetsCourez 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èsF
était redondant. Un octet supplémentaire peut être supprimé (pour 112) en canalisant l'entrée viaecho -n
, mais je pense que cela ajoute techniquement plus de code, donc YMMV.Lisible:
la source
//
after-F
, et vous pouvez prendre l'entrée sans retour à la ligne final (avececho -n
) pour vous débarrasser du-l
drapeau.Python 3,
228227225 octetsPas 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.
Edit 1: remplacé
e[0]%8==0
pare[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
kappa
valide ... faites-en ce que vous voulez.la source
e[0]%8==0
poure[0]%8<1
?<1
, non<0
?Groovy,
151137 octetsPas 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.la source
Pyth , 37 octets
Essayez-le en ligne!
la source
Brachylog , 14 octets
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.
la source
O5AB1E, 12 octets
Essayez-le en ligne!
Ceci est mon premier code de golf alors allez-y doucement :)
la source
Python 3 ,
209189180171160 octetsThanx calmar pour -9 octets :)
Essayez-le en ligne!
la source
t+
la déclaration de la carte?t
a toutes les lignes, tandis que[[t[i][j]..i..]..j..]
est la transposéet
, c'est-à-dire les colonnes. S'il existe un moyen plus court de transposer la matrice, nous pouvons économiser plus d'octets :)beezz
devrait retourner faux, mais ne le fait pas. C'est parce que la vérification principale est cassée, elle revientTrue
pour 4 bits. Essayezprint(p('1111'))
. Fixé maintenant. Tous les cas de test ne couvraient pas cela, car tous les personnages utilisés sont primitifs.K (oK) ,
4033 octetsSolution:
Essayez-le en ligne!
Explication:
La moitié crée la matrice, l'autre moitié est le contrôle de primalité.
la source
PHP, 173 octets
Testez-le en ligne
la source
JavaScript, 234 octets
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.
la source
Math.pow(2,i)
peut être raccourci en(1<<i)
supposanti<32
, peut-être économiser 7 octets, peut-être pas.Clojure, 180 octets
Il pourrait y avoir un moyen plus court de générer des listes de bits et également le test de primalité.
la source
Perl 5
-MList::Util=all,sum -pF
,9692 octetsEssayez-le en ligne!
la source
Python 3, 164 octets
la source
Ruby 2.7
-rprime
, 95 octetsPas 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:
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:
la source
JavaScript (Node.js) ,
149146...134130129 octetsEssayez-le en ligne!
Explication
Comment ça marche même!?
y.charCodeAt()&2**i
y.charCodeAt()
if0 <= i < 7
et 0 sinon.i < 7
, le code fonctionne apparemment comme d'habitude.7 <= i <= 32
, puisque le bit correspondant dey.charCodeAt()
0 est de toute façon, le résultat est 0 comme prévu.32 < i < 1024
, depuisint32(2**i) == 0
, le résultat est 0 comme prévu.1024 <= i
, nous avons2**i == Infinity
, et depuisint32(Infinity) == 0
, le résultat est 0 comme prévu.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
oun % R is NaN
.n % R == 0
:R
est un facteur den
.R == 1
, alorsn
est premier parce que tous1 < R < n
ne peuvent pas se divisern
. Retourne 0 (fausse).R == -1
, alorsn == 0
. Retour -2 (véridique).R - 1
oùR - 1 > 0
(véridique).n % R is NaN
: Calcul modulaire non valide.R == 0
:n == 1
. Retour -1 (véridique).n is NaN
:R is NaN
. Retour -1 (véridique).R == 1
cette fonction peut renvoyer une valeur fausse, indiquantn
est premier.la source