Eine Primary - Zeichenfolge ( binäre Primzahl ) ist eine Zeichenfolge, bei der jede Zeile und Spalte eine Primzahlsumme aufweist, wenn sie als binäres Gitter geschrieben wird.
Das ist eine ziemlich vage Erklärung, also lasst es uns mit einem ausgearbeiteten Beispiel aufschlüsseln ...
In diesem Beispiel verwenden wir die Zeichenfolge bunny
:
Ermitteln Sie zunächst den ASCII-Codepunkt jedes Zeichens und seine Binärdarstellung:
Char | ASCII | Binary
b 98 1100010
u 117 1110101
n 110 1101110
n 110 1101110
y 121 1111001
Nehmen Sie diese Binärwerte von oben nach unten und ordnen Sie sie in einem Raster an (fügen Sie gegebenenfalls führende Nullen hinzu):
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
Zählen Sie dann die Anzahl von 1
s in jeder Zeile und Spalte:
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
Wenn und nur wenn jede einzelne Summe eine Primzahl ist (wie hier), dann ist die Zeichenfolge eine gültige Binärprimzahl.
Die Herausforderung
Ihre Aufgabe ist es, eine Funktion oder ein Programm zu erstellen, die bzw. das bei Angabe eines Strings zurückgibt / ausgibt, truthy
wenn der String primär ist, falsy
andernfalls.
Regeln / Details
- Sie können davon ausgehen, dass die Zeichen der Zeichenfolge immer im ASCII-Bereich
33-126
(einschließlich) liegen. - Die Zeichenfolge wird nicht leer sein.
- Ein Primary-String muss keine Primlänge haben - ist beispielsweise
W1n*
gültig, obwohl er 4 Zeichen hat. - Das ist Code-Golf , also gewinnt die kürzeste Antwort (in Bytes) - aber alle Einsendungen sind willkommen.
- Standardlücken sind verboten.
Testfälle
'husband' -> True
'HOTJava' -> True
'COmPaTIBILE' -> True
'AuT0HACk' -> True
'PPCW' -> False
'code-golf' -> False
'C++' -> False
'/kD' -> False
'HI' -> False
'A' -> False
Es gibt auch ein funktionierendes, aber unglaublich ausführliches Python-Beispiel für repl.it , anhand dessen Sie Ihre Lösung testen können.
husband
gültig ist? Oder einer von ihnen? Tolles Problem!False
, richtig?0
und1
keine Primzahlen sind und jeder 1-2-Zeichen-Eingabe-String, der nur Zeichen im angegebenen Bereich enthält, garantiert mindestens eine0
oder1
eine vertikale Summe enthält. Sie sollten 1 und 2 Zeichenketten als Testfälle hinzufügen.false
. 2 Zeicheneingänge könnten, aber nicht in dem von uns verwendeten ASCII-Bereich, verwendet werden. In diesem Szenario sind Sie also richtig.Antworten:
MATL, 10 Bytes
Probieren Sie es online!
Dies ist die ideale Sprache für den Job. Es ist so ziemlich eine wörtliche Transliteration der Herausforderungsspezifikation.
Da eine Null ein MATL-Array gemäß Meta falsch macht , ist nichts anderes erforderlich - im Grunde wird ein Implizit
A
aufgerufen?
(if).quelle
a
sollte falsch sein, kehrt aber zurück1 1
? (Die Spalten ergeben keine Primzahlen)BtXsw!shZp
würde korrigiert und ein Gewinner für 10 sein.Jelly ,
13 1211 BytesTryItOnline! oder alle Testfälle
Wie?
quelle
05AB1E , 17 Bytes
Probieren Sie es online!
quelle
Gelee , 15 Bytes
Probieren Sie es online! oder Überprüfen Sie alle Testfälle. .
Erläuterung
quelle
Mathematica, 75 Bytes
Unbenannte Funktion, die eine Zeichenfolge als Eingabe verwendet und
True
oder zurückgibtFalse
.ToCharacterCode@#
konvertiert die Eingabe in die Liste ihrer ASCII-Werte;IntegerDigits[...,2,7]
verwandelt jeden Wert in eine Liste seiner Bits, die bei Bedarf auf Länge 7 aufgefüllt werden. Jetzt haben wir also ein 2D-Array und wollen alle seine Zeilen- und Spaltensummen. siehe da, der Zeichenspasmus{+##&@@#,+##&@@@#}&@...
macht genau das (er wendet die+##&
Funktion "alle Argumente summieren" auf die Liste der Vektoren in der ersten Koordinate mit@@
und auf jeden Vektor als seine eigene Liste von Ganzzahlen in der zweiten Koordinate mit an@@@
) . Dann prüfen wir nur, ob die ErgebnissePrimeQ
vorliegen, reduzieren die Liste mitJoin@@
und nehmen dieAnd
Werte.quelle
Ruby
-rprime
, 100 BytesProbieren Sie es online!
Erläuterung
quelle
Perl,
151121111 + 3 = 114 BytesLaufen Sie mit
-lF
. Das Programm funktioniert nur bei der ersten Eingabe korrekt. Beenden Sie das Programm und führen Sie es für Ihre nächste Eingabe erneut aus.Vielen Dank an @Dada, der mich darüber informiert hat, dass das
//
AfterF
überflüssig war. Ein zusätzliches Byte kann entfernt werden (für 112), indem die Eingabe über geleitet wirdecho -n
, aber ich denke, dass dies technisch gesehen mehr Code hinzufügt, also YMMV.Lesbar:
quelle
//
After weglassen-F
können und die Eingabe ohne abschließende Newline (mitecho -n
) vornehmen können, um das Flag zu entfernen-l
.Python 3,
228227225 BytesKeine gute Antwort, ich konnte nicht so viel Golf spielen, wie ich wollte, aber ich habe so viel Zeit damit verbracht, dass ich das Gefühl hatte, ich sollte es veröffentlichen. Vorschläge zum Schneiden von Bytes wären sehr dankbar.
Edit 1: ersetzt
e[0]%8==0
durche[0]%8<1
, ein Byte geht verloren. Danke Flp.Tkc!Edit 2: Ersetze (i + 1) durch - ~ i und verliere zwei zusätzliche Bytes. Vielen Dank an Erik, dass er enthüllt hat, wie schlecht meine Kenntnisse auf Bitebene sind :) Beim Testen dieser Revision habe ich festgestellt, dass
kappa
das gültig ist ... mach daraus, was du willst.quelle
e[0]%8==0
zue[0]%8<1
?<1
nicht sein<0
?Groovy,
151137 BytesKeine Primalitätsprüfung in Groovy ...
p={x->x<3||(2..(x**0.5)).every{x%it}};
- Verschluss für Primärtests.y={it.every{p(it.count("1"))}};
- Schließen, um sicherzustellen, dass alle Zählungen von "1" für ein übergebenes binäres 2D-Array Primzahlen sind.x=it.collect{0.toString((int)it,2) as List};
- Überlagerung von String zu binärem Array.y(x)&&y(x.transpose())
- Vergewissern Sie sich, dass für alle mit Primzahlen validierten Summen in der Hauptmatrix und der transponierten Matrix der Wert true zurückgegeben wird.quelle
Pyth , 37 Bytes
Probieren Sie es online!
quelle
Brachylog , 14 Bytes
Probieren Sie es online!
Outputs durch Erfolg oder Misserfolg. (Im Erfolgsfall steht über die Ausgabevariable eine Liste aller Spalten- und Zeilensummen zur Verfügung.
quelle
O5AB1E, 12 Bytes
Probieren Sie es online!
Dies ist mein erster Code Golf so einfach gehen :)
quelle
Python 3 ,
209189180171160 BytesDanke Tintenfisch für -9 Bytes :)
Probieren Sie es online!
quelle
t+
in der Map-Anweisung entfernen ?t
hat alle Zeilen, während[[t[i][j]..i..]..j..]
die transponiert istt
, dh die Spalten. Wenn es einen kürzeren Weg gibt, die Matrix zu transponieren, können wir mehr Bytes sparen :)beezz
sollte false zurückgeben, tut dies aber nicht. Der Grund dafür ist, dass der Prim-Check unterbrochen ist undTrue
4 Bits zurückgibt . Versuchen Sie esprint(p('1111'))
. Behebt es jetzt. Alle Testfälle deckten dies nicht ab, da alle verwendeten Zeichen primär sind.K (oK) ,
4033 BytesLösung:
Probieren Sie es online!
Erläuterung:
Die Hälfte erstellt die Matrix, die andere Hälfte ist die Primalitätsprüfung.
quelle
PHP, 173 Bytes
Testen Sie es online
quelle
JavaScript, 234 Bytes
Wir erhalten die horizontalen Werte, indem wir die Zahl in eine Binärzahl umwandeln, die Nullen durch einen String-Ersatz entfernen und dann die Einsen zählen. Die vertikalen Summen werden durch Schleifen von 1 bis 7 und Verwenden eines bitweisen UND erhalten, wobei 2 auf die n-te Potenz angehoben wird.
quelle
Math.pow(2,i)
kann auf die(1<<i)
Annahme verkürzt werdeni<32
, vielleicht 7 Bytes zu sparen, vielleicht aber auch nicht.Clojure, 180 Bytes
Möglicherweise gibt es eine kürzere Methode zum Generieren von Bitlisten und auch den Primalitätstest.
quelle
Perl 5
-MList::Util=all,sum -pF
,9692 BytesProbieren Sie es online!
quelle
Python 3, 164 Bytes
quelle
Ruby 2.7
-rprime
, 95 BytesKeine TiO-Verbindung, da TiO weiterhin Ruby 2.5.5 ausführt. 😭
Erläuterung
Ziemlich einfach. In der ersten Zeile werden die Binärziffern jedes Zeichens als Array mit sieben Ziffern aufgefüllt, was eigentlich einfacher sein sollte:
Schauen Sie sich den nummerierten Blockparameter (
@1
) und die anfangslose Bereichshitze (..6
) an .Die zweite Zeile summiert die Zeilen und Spalten und prüft, ob sie alle Primzahlen sind:
quelle
JavaScript (Node.js) ,
149146...134130129 BytesProbieren Sie es online!
Erläuterung
Wie funktioniert das überhaupt?
y.charCodeAt()&2**i
y.charCodeAt()
if zurückzugeben0 <= i < 7
und andernfalls 0 zurückzugeben.i < 7
diesem Fall funktioniert der Code anscheinend wie gewohnt.7 <= i <= 32
das entsprechende Bit vony.charCodeAt()
ohnehin 0 ist, ist das Ergebnis wie erwartet 0.32 < i < 1024
seitdemint32(2**i) == 0
das Ergebnis 0 ist, wie erwartet.1024 <= i
, haben wir2**i == Infinity
und seitdemint32(Infinity) == 0
ist das Ergebnis 0 wie erwartet.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
odern % R is NaN
.n % R == 0
:R
ist ein Faktor vonn
.R == 1
, dannn
ist Primzahl, weil1 < R < n
sich nicht alle teilen könnenn
. Rückgabe 0 (falsch).R == -1
, dannn == 0
. Rückgabe -2 (wahr).R - 1
woR - 1 > 0
(wahr).n % R is NaN
: Ungültige modulare Berechnung.R == 0
:n == 1
. Rückgabe -1 (wahr).n is NaN
:R is NaN
. Rückgabe -1 (wahr).R == 1
kann diese Funktion nur dann einen falschen Wert zurückgeben, wenn angibt, dassn
es sich um eine Primzahl handelt.quelle