Primäre Zeichenfolgen


27

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 1s 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, truthywenn der String primär ist, falsyandernfalls.

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 , 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.


Kann ich fragen, wie Sie herausgefunden haben, dass dies husbandgültig ist? Oder einer von ihnen? Tolles Problem!
Gabriel Benamy

3
@ GabrielBenamy Ich bin froh, dass jemand gefragt hat! Ich ging eine Online-Wörterbuchdatei durch , probierte ein paar zufällige Großbuchstaben aus, wechselte manchmal Buchstaben gegen Zahlen usw. Dann sah ich mir die ausgegebene Liste an und wählte ein paar Testfälle aus, die ich mochte
FlipTack

Jede Eingabe von 1-2 Zeichen wird garantiert zurückgegeben False, richtig?
mbomb007

... weil 0und 1keine Primzahlen sind und jeder 1-2-Zeichen-Eingabe-String, der nur Zeichen im angegebenen Bereich enthält, garantiert mindestens eine 0oder 1eine vertikale Summe enthält. Sie sollten 1 und 2 Zeichenketten als Testfälle hinzufügen.
mbomb007

@ mbomb007 Eingaben mit 1 Zeichen können keine spaltenweisen Primzahlen enthalten, daher werden sie zurückgegeben false. 2 Zeicheneingänge könnten, aber nicht in dem von uns verwendeten ASCII-Bereich, verwendet werden. In diesem Szenario sind Sie also richtig.
FlipTack

Antworten:


8

MATL, 10 Bytes

BtXsw!shZp

Probieren Sie es online!

Dies ist die ideale Sprache für den Job. Es ist so ziemlich eine wörtliche Transliteration der Herausforderungsspezifikation.

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.

Da eine Null ein MATL-Array gemäß Meta falsch macht , ist nichts anderes erforderlich - im Grunde wird ein Implizit Aaufgerufen ?(if).


asollte falsch sein, kehrt aber zurück 1 1? (Die Spalten ergeben keine Primzahlen)
FlipTack

Ich denke, dies BtXsw!shZpwürde korrigiert und ein Gewinner für 10 sein.
Jonathan Allan

@ Flp.Tck Das Fehlerverzeihungsverhalten von MATLAB bei der Arbeit mit Zeilenvektoren wurde komplett vergessen. Es tut mir leid, das Problem wurde behoben.
Sanchises

Funktioniert jetzt :) (Vielleicht möchten Sie den Online-Link versuchen, um zu aktualisieren)
FlipTack

@ Flp.Tkc Fertig. Danke für eine nette Herausforderung!
Sanchises

4

Jelly , 13 12 11 Bytes

OBUZ;$S€ÆPẠ

TryItOnline! oder alle Testfälle

Wie?

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

Gelee , 15 Bytes

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

Probieren Sie es online! oder Überprüfen Sie alle Testfälle. .

Erläuterung

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 Bytes

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

Unbenannte Funktion, die eine Zeichenfolge als Eingabe verwendet und Trueoder zurückgibt False.

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 Ergebnisse PrimeQvorliegen, reduzieren die Liste mit Join@@und nehmen die AndWerte.


2

Ruby -rprime , 100 Bytes

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

Probieren Sie es online!

Erläuterung

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

Laufen 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 //After Füberflüssig war. Ein zusätzliches Byte kann entfernt werden (für 112), indem die Eingabe über geleitet wird echo -n, aber ich denke, dass dies technisch gesehen mehr Code hinzufügt, also 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

Lesbar:

                                     #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
Eine Version, die nur bei der ersten Eingabe funktioniert, ist in Ordnung. Sie können also die 141-Byte-Version als Hauptversion festlegen und die andere für mehrere Eingaben vorschlagen.
Dada

Beachten Sie auch, dass Sie das //After weglassen -Fkönnen und die Eingabe ohne abschließende Newline (mit echo -n) vornehmen können, um das Flag zu entfernen -l.
Dada

1

Python 3, 228 227 225 Bytes

Keine 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.

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: ersetzt e[0]%8==0durch e[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 kappadas gültig ist ... mach daraus, was du willst.


1
ändern könnte Sie e[0]%8==0zu e[0]%8<1?
FlipTack

@ Flp.Tkc Guter Ort! Es gibt keinen Grund, warum das nicht möglich ist.
FourOhFour

1
@ Flp.Tkc Ich glaube nicht, dass ich Bytes sparen könnte, indem ich es zu einer Funktion mache. Ich mag, wie Sie 404 rep BTW haben :)
FourOhFour

Es soll <1nicht sein <0?
Destructible Lemon

@Destructible Watermelon yep lass mich das korrigieren.
FourOhFour

1

Groovy, 151 137 Bytes

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

Keine 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.


1

Pyth , 37 Bytes

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

Probieren Sie es online!


                                 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 Bytes

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

Probieren Sie es online!

Outputs durch Erfolg oder Misserfolg. (Im Erfolgsfall steht über die Ausgabevariable eine Liste aller Spalten- und Zeilensummen zur Verfügung.

   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 Bytes

Çžy+bø€SOp¦W

Probieren Sie es online!

Dies ist mein erster Code Golf so einfach gehen :)

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

Dies ergibt ein leeres Ergebnis für eine einzelne Buchstabeneingabe. Ich bin nicht gut mit O5AB1E vertraut, aber wenn das ein falscher Wert ist, ist es in Ordnung.
Sanchises

1

Python 3 , 209 189 180 171 160 Bytes

Danke Tintenfisch für -9 Bytes :)

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

Probieren Sie es online!


Es gefällt mir, wie Sie die Testfall-
Druckanweisung

Ja, ich bin ein zwanghafter Kerl, wenn es um F-Strings geht ... Ist es nicht äquivalent, wenn Sie es t+in der Map-Anweisung entfernen ?
Setzen Sie Monica

Nein, weil die Primzahlprüfung sowohl Zeilen als auch Spalten in der Bitmatrix abdecken muss. that alle Zeilen, während [[t[i][j]..i..]..j..]die transponiert ist t, dh die Spalten. Wenn es einen kürzeren Weg gibt, die Matrix zu transponieren, können wir mehr Bytes sparen :)
movatica

Es funktioniert, wenn ich es versuche. Kennen Sie eine Zeichenfolge, die es bricht?
Setzen Sie Monica

Ja. beezzsollte false zurückgeben, tut dies aber nicht. Der Grund dafür ist, dass der Prim-Check unterbrochen ist und True4 Bits zurückgibt . Versuchen Sie es print(p('1111')). Behebt es jetzt. Alle Testfälle deckten dies nicht ab, da alle verwendeten Zeichen primär sind.
Movatica

1

K (oK) , 40 33 Bytes

Lösung:

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

Probieren Sie es online!

Erläuterung:

Die Hälfte erstellt die Matrix, die andere Hälfte ist die Primalitätsprüfung.

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

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;

Testen Sie es online


0

JavaScript, 234 Bytes

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

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.


Math.pow(2,i)kann auf die (1<<i)Annahme verkürzt werden i<32, vielleicht 7 Bytes zu sparen, vielleicht aber auch nicht.
Naruyoko

0

Clojure, 180 Bytes

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

Möglicherweise gibt es eine kürzere Methode zum Generieren von Bitlisten und auch den Primalitätstest.



0

Python 3, 164 Bytes

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

Ruby 2.7 -rprime, 95 Bytes

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

Keine 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:

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

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:

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

0

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

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

Probieren Sie es online!

Erläuterung

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.

Wie funktioniert das überhaupt?

  • y.charCodeAt()&2**i
    • Wir benötigen diesen Code, um das entsprechende Bit von y.charCodeAt()if zurückzugeben0 <= i < 7 und andernfalls 0 zurückzugeben.
    • In i < 7diesem Fall funktioniert der Code anscheinend wie gewohnt.
    • Wenn 7 <= i <= 32das entsprechende Bit von y.charCodeAt()ohnehin 0 ist, ist das Ergebnis wie erwartet 0.
    • Wenn 32 < i < 1024seitdem int32(2**i) == 0das Ergebnis 0 ist, wie erwartet.
    • Wann 1024 <= i, haben wir 2**i == Infinityund seitdem int32(Infinity) == 0ist das Ergebnis 0 wie erwartet.
  • (P=r=>n%--r?P(r):~-r)(n)
    • Der Einfachheit halber lassen wir R = --r = r - 1.
    • Diese Hilfsfunktion wird beendet, wenn n % R == 0oder n % R is NaN.
      • n % R == 0: Rist ein Faktor von n.
        • Wenn ja R == 1, dann nist Primzahl, weil 1 < R < nsich nicht alle teilen können n. Rückgabe 0 (falsch).
        • Wenn ja R == -1, dann n == 0. Rückgabe -2 (wahr).
        • Ansonsten kehre zurück, R - 1wo R - 1 > 0(wahr).
      • n % R is NaN: Ungültige modulare Berechnung.
        • Wenn R == 0: n == 1. Rückgabe -1 (wahr).
        • Wenn n is NaN: R is NaN. Rückgabe -1 (wahr).
    • Infolgedessen R == 1kann diese Funktion nur dann einen falschen Wert zurückgeben, wenn angibt, dass nes sich um eine Primzahl handelt.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.