Pierwotne struny

27

Łańcuch Primenary ( binary-prime ) to taki, który zapisany jako siatka binarna ma każdy pierwszy wiersz i kolumnę.

To dość niejasne wyjaśnienie, więc podzielmy to na działający przykład ...


W tym przykładzie użyjemy ciągu bunny:

Najpierw znajdź punkt kodowy ASCII każdego znaku i jego reprezentację binarną:

Char | ASCII | Binary

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

Weź te wartości binarne, od góry do dołu i ustaw je w siatce (w razie potrzeby dodając zera na początku):

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

Następnie policz liczbę 1s w każdym wierszu i kolumnie:

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

Jeśli i tylko jeśli każda suma jest liczbą pierwszą (jak tutaj), to ciąg jest poprawną liczbą pierwszą binarną.


Wyzwanie

Twoim zadaniem jest stworzenie funkcji lub programu, który otrzyma ciąg znaków, który zwróci / wyprowadzi, truthyjeśli ciąg jest pierwotny, i falsyinaczej.

Zasady / Szczegóły

  • Możesz założyć, że znaki ciągu będą zawsze w zakresie ASCII 33-126(włącznie).
  • Ciąg nie będzie pusty.
  • Pierwotny ciąg nie musi mieć liczby pierwszej - na przykład W1n*jest prawidłowy, mimo że ma 4 znaki.
  • To jest , więc wygrywa najkrótsza odpowiedź (w bajtach) - ale wszystkie zgłoszenia są mile widziane.
  • Standardowe luki są zabronione.

Przypadki testowe

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

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

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

Istnieje również działający, ale niezwykle szczegółowy przykład Pythona na repl.it , na którym możesz przetestować swoje rozwiązanie.

FlipTack
źródło
Czy mogę zapytać, w jaki sposób odkryłeś, że to husbandbyło ważne? A może któryś z nich? Ale wielki problem!
Gabriel Benamy,
3
@GabrielBenamy Cieszę się, że ktoś zapytał! Przeszukałem plik słownika online , próbując kilka przypadkowych wielkich liter każdej litery, czasami zamieniając litery na cyfry itp. Potem przejrzałem listę wyników i wybrałem kilka przypadków testowych, które mi się podobały
FlipTack
Gwarantowane jest zwrócenie co 1–2 znaków False, prawda?
mbomb007
... ponieważ 0i 1nie są liczbami pierwszymi, a każdy łańcuch wejściowy 1-2 znaków zawierający tylko znaki z podanego zakresu gwarantuje co najmniej jeden 0lub 1jako sumę pionową. Powinieneś dodać 1 i 2 ciągi znaków jako przypadki testowe.
mbomb007,
@ mbomb007 Dane wejściowe 1 char nie mogą zawierać liczb pierwszych kolumnowych, więc zostaną zwrócone false. 2 dane wejściowe char mogą, ale nie w stosowanym przez nas zakresie ASCII, więc w tym scenariuszu masz rację.
FlipTack,

Odpowiedzi:

8

MATL, 10 bajtów

BtXsw!shZp

Wypróbuj online!

To idealny język do pracy. To dosłownie dosłowna transliteracja specyfikacji wyzwania.

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.

Ponieważ dowolne zero powoduje fałszowanie tablicy MATL według meta , nic więcej nie jest potrzebne - w zasadzie wywoływane Ajest niejawne ?(if).

Sanchises
źródło
apowinno być fałszem, ale powraca 1 1? (jego kolumny nie sumują się do liczb pierwszych)
FlipTack
Myślę, że BtXsw!shZpto naprawi i wygram 10.
Jonathan Allan,
@ Flp.Tck Całkowicie zapomniałem o zachowaniu „wybaczającym” MATLAB podczas pracy z wektorami wierszy. Przepraszam, naprawiłem to teraz.
Sanchises
Działa teraz :) (może chcesz zaktualizować link do wypróbowania online)
FlipTack
@ Flp.Tkc Gotowe. Dzięki za miłe wyzwanie!
Sanchises
4

Galaretka , 13 12 11 bajtów

OBUZ;$S€ÆPẠ

TryItOnline! lub wszystkie przypadki testowe

W jaki sposób?

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
źródło
3

Galaretka , 15 bajtów

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

Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe. .

Wyjaśnienie

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
mile
źródło
3

Mathematica, 75 bajtów

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

Funkcja bez nazwy, która przyjmuje ciąg znaków jako dane wejściowe i zwraca Truelub False.

ToCharacterCode@#konwertuje dane wejściowe na listę wartości ASCII; IntegerDigits[...,2,7]zamienia każdą wartość na listę swoich bitów, w razie potrzeby dopełnianą do długości 7. Mamy teraz tablicę 2D i chcemy wszystkich sum wierszy i sum kolumn; oto spazm znaków {+##&@@#,+##&@@@#}&@...dokładnie to robi (stosuje funkcję +##&„sumuj wszystkie argumenty” do listy wektorów w pierwszej współrzędnej za pomocą @@i do każdego wektora jako własnej listy liczb całkowitych w drugiej współrzędnej za pomocą @@@) . Następnie sprawdzamy, czy wyniki są PrimeQ, spłaszczamy listę Join@@i przyjmujemy Andwszystkie te wartości.

Greg Martin
źródło
2

Rubinowy -rprime , 100 bajtów

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

Wypróbuj online!

Wyjaśnienie

->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.)
}
Wartość tuszu
źródło
1

Perl, 151 121 111 + 3 = 114 bajtów

Uruchom z -lF. Program będzie działał poprawnie tylko dla pierwszego wejścia. Zakończ program i uruchom ponownie dla następnego wejścia.

Dzięki @Dada za poinformowanie mnie, że //później Fbyły zbędne. Dodatkowy bajt można usunąć (dla echo -nnumeru 112) , przesyłając dane wejściowe przez , ale wydaje mi się, że to technicznie dodaje więcej kodu, więc 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

Czytelny:

                                     #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
źródło
1
Wersja, która działa tylko na pierwszym wejściu, jest całkowicie w porządku, więc możesz ustawić 141-bajtową wersję jako główną i zasugerować drugą na wielu wejściach.
Dada,
Zauważ też, że możesz pominąć //później -Fi możesz wziąć dane wejściowe bez końcowej nowej linii (z echo -n), aby pozbyć się -lflagi.
Dada,
1

Python 3, 228 227 225 bajtów

Nie jest to świetna odpowiedź, nie byłem w stanie zagrać w golfa tak bardzo, jak bym chciał, ale spędziłem na tym tak długo, że czuję, że powinienem to opublikować. Sugestie dotyczące cięcia bajtów byłyby bardzo mile widziane.

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: otrzymuje e[0]%8==0z e[0]%8<1, tracąc bajt. Dzięki Flp.Tkc!

Edycja 2: zamieniając (i + 1) na - ~ i, tracąc dwa dodatkowe bajty. Dzięki Erikowi za ujawnienie, jak zła jest moja wiedza na poziomie bitów :) Podczas testowania tej wersji odkryłem, że kappajest to poprawne ... zrób z tego, co chcesz.

FourOhFour
źródło
1
czy mógłbyś się zmienić e[0]%8==0na e[0]%8<1?
FlipTack,
@ Flp.Tkc Dobre miejsce! Nie ma powodu, dla którego nie można tego zrobić.
FourOhFour,
1
@ Flp.Tkc Nie sądzę, żebym mógł zapisać bajty, czyniąc z tego funkcję. Podoba mi się, jak masz 404 powtórzeń btw :)
FourOhFour
Tak ma być <1, nie <0?
Zniszczalna cytryna,
@ Destructible Watermelon tak, pozwól mi to naprawić.
FourOhFour,
1

Groovy, 151 137 bajtów

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

Brak kontroli pierwotności w groovy ...

p={x->x<3||(2..(x**0.5)).every{x%it}}; - Zamknięcie do badania pierwotności.

y={it.every{p(it.count("1"))}}; - Zamknięcie zapewniające, że wszystkie liczby „1” dla przekazanej binarnej tablicy 2D są liczbą pierwszą.

x=it.collect{0.toString((int)it,2) as List}; - Coversion od łańcucha do tablicy binarnej.

y(x)&&y(x.transpose()) - W przypadku wszystkich sum zweryfikowanych pierwotnie w matrycy głównej i macierzy transponowanej upewnij się, że zwracają one wartość true.

Urna Magicznej Ośmiornicy
źródło
1

Pyth , 37 bajtów

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

Wypróbuj 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> )
hakr14
źródło
1

Brachylog , 14 bajtów

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

Wypróbuj online!

Wyprowadza poprzez sukces lub porażkę. (W przypadku powodzenia lista wszystkich sum kolumn i wierszy jest dostępna za pośrednictwem zmiennej wyjściowej.

   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.
Niepowiązany ciąg
źródło
1

O5AB1E, 12 bajtów

Çžy+bø€SOp¦W

Wypróbuj online!

To jest mój pierwszy kod golfowy, więc idź spokojnie :)

Ç              % 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
źródło
Daje to pusty wynik dla wprowadzania jednej litery. Nie znam się dobrze na O5AB1E, ale jeśli jest to wartość falsey, to jest w porządku.
Sanchises
1

Python 3 , 209 189 180 171 160 bajtów

Dzięki kalmary za -9 bajtów :)

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

Wypróbuj online!

movatica
źródło
Podoba mi się to, jak przepisałeś instrukcję drukowania przypadku testowego :)
movatica
Tak, jestem trochę obsesyjnie kompulsywny wobec f-stringów ... Czy to nie jest równoważne, jeśli usuniesz t+z instrukcji map?
Przywróć Monikę
Nie, ponieważ pierwsza kontrola musi obejmować zarówno wiersze, jak i kolumny w macierzy bitów. tma wszystkie wiersze, natomiast [[t[i][j]..i..]..j..]jest transponowany t, tj. kolumny. Jeśli istnieje krótszy sposób transpozycji macierzy, możemy zapisać więcej bajtów :)
movatica
Działa, kiedy próbuję. Czy znasz ciąg, który go łamie?
Przywróć Monikę
Tak. beezzpowinien zwrócić wartość false, ale nie zwraca. To dlatego, że pierwsza kontrola jest zepsuta, zwraca True4 bity. Spróbować print(p('1111')). Naprawiono to teraz. Wszystkie przypadki testowe tego nie obejmowały, ponieważ wszystkie użyte znaki są pierwotne.
movatica
1

K (oK) , 40 33 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Połowa tworzy macierz, druga połowa to kontrola pierwotności.

&/{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
źródło
0

PHP, 173 bajtów

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;

Przetestuj online

Crypto
źródło
0

JavaScript, 234 bajty

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

Otrzymujemy wartości poziome, przekształcając liczbę na binarną, usuwając zera za pomocą zamiany łańcucha, a następnie zliczając jedynki. Sumy pionowe są uzyskiwane przez zapętlenie 1 do 7 i użycie bitowego AND z 2 podniesionym do n-tej potęgi.

Grax32
źródło
Math.pow(2,i)można skrócić do (1<<i)założenia i<32, może oszczędzając 7 bajtów, ale może nie.
Naruyoko
0

Clojure, 180 bajtów

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

Może istnieć krótszy sposób generowania list bitów, a także test pierwotności.

NikoNyrh
źródło
0

Perl 5 -MList::Util=all,sum -pF , 96 92 bajtów

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

Wypróbuj online!

Xcali
źródło
0

Python 3, 164 bajty

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
źródło
0

Ruby 2.7 -rprime, 95 bajtów

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

Brak łącza TiO, ponieważ TiO nadal działa w Ruby 2.5.5. 😭

Wyjaśnienie

Dość proste. Pierwszy wiersz zawiera cyfry binarne każdego znaku, gdy tablica jest uzupełniona do siedmiu cyfr, co naprawdę powinno być łatwiejsze:

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

Sprawdź, które policzone parametr bloku ( @1) i beginless zakres ( ..6) gorąca .

Drugi wiersz sumuje wiersze i kolumny oraz testy, jeśli wszystkie są pierwsze:

(a.map(&:sum) + a.transpose.map(&:sum)).all?(&:prime?)
Jordania
źródło
0

JavaScript (Node.js) , 149 146 ... 134 130 129 bajtów

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

Wypróbuj online!

Wyjaśnienie

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.

Jak to w ogóle działa !?

  • y.charCodeAt()&2**i
    • Potrzebujemy tego kodu, aby zwrócić odpowiedni bit y.charCodeAt()if 0 <= i < 7i 0 w przeciwnym razie.
    • Kiedy i < 7kod najwyraźniej działa jak zwykle.
    • Gdy 7 <= i <= 32, ponieważ odpowiadający bit y.charCodeAt()ma wartość 0, wynik wynosi 0, zgodnie z oczekiwaniami.
    • Gdy 32 < i < 1024od tego int32(2**i) == 0czasu wynik wynosi 0, zgodnie z oczekiwaniami.
    • Kiedy 1024 <= imamy 2**i == Infinityi od tego int32(Infinity) == 0czasu wynik wynosi 0, zgodnie z oczekiwaniami.
  • (P=r=>n%--r?P(r):~-r)(n)
    • Dla uproszczenia pozwalamy R = --r = r - 1.
    • Ta funkcja pomocnicza kończy się, gdy n % R == 0lub n % R is NaN.
      • n % R == 0: Rjest współczynnikiem n.
        • Jeśli R == 1, to njest liczbą pierwszą, ponieważ wszystko 1 < R < nnie może się podzielić n. Zwraca 0 (fałsz).
        • Jeśli R == -1tak n == 0. Zwróć -2 (prawda).
        • W przeciwnym razie zwróć R - 1gdzie R - 1 > 0(prawda).
      • n % R is NaN: Niepoprawne obliczenie modułowe.
        • Jeśli R == 0: n == 1. Zwróć -1 (prawda).
        • Jeśli n is NaN: R is NaN. Zwróć -1 (prawda).
    • W rezultacie tylko wtedy, gdy R == 1ta funkcja może zwrócić wartość fałszowania, wskazując, że njest liczbą pierwszą.
Shieru Asakoto
źródło