Ł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ę 1
s 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, truthy
jeśli ciąg jest pierwotny, i falsy
inaczej.
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 golf golfowy , 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.
husband
było ważne? A może któryś z nich? Ale wielki problem!False
, prawda?0
i1
nie są liczbami pierwszymi, a każdy łańcuch wejściowy 1-2 znaków zawierający tylko znaki z podanego zakresu gwarantuje co najmniej jeden0
lub1
jako sumę pionową. Powinieneś dodać 1 i 2 ciągi znaków jako przypadki testowe.false
. 2 dane wejściowe char mogą, ale nie w stosowanym przez nas zakresie ASCII, więc w tym scenariuszu masz rację.Odpowiedzi:
MATL, 10 bajtów
Wypróbuj online!
To idealny język do pracy. To dosłownie dosłowna transliteracja specyfikacji wyzwania.
Ponieważ dowolne zero powoduje fałszowanie tablicy MATL według meta , nic więcej nie jest potrzebne - w zasadzie wywoływane
A
jest niejawne?
(if).źródło
a
powinno być fałszem, ale powraca1 1
? (jego kolumny nie sumują się do liczb pierwszych)BtXsw!shZp
to naprawi i wygram 10.Galaretka ,
13 1211 bajtówTryItOnline! lub wszystkie przypadki testowe
W jaki sposób?
źródło
05AB1E , 17 bajtów
Wypróbuj online!
źródło
Galaretka , 15 bajtów
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe. .
Wyjaśnienie
źródło
Mathematica, 75 bajtów
Funkcja bez nazwy, która przyjmuje ciąg znaków jako dane wejściowe i zwraca
True
lubFalse
.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 przyjmujemyAnd
wszystkie te wartości.źródło
Rubinowy
-rprime
, 100 bajtówWypróbuj online!
Wyjaśnienie
źródło
Perl,
151121111 + 3 = 114 bajtówUruchom 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óźniejF
były zbędne. Dodatkowy bajt można usunąć (dlaecho -n
numeru 112) , przesyłając dane wejściowe przez , ale wydaje mi się, że to technicznie dodaje więcej kodu, więc YMMV.Czytelny:
źródło
//
później-F
i możesz wziąć dane wejściowe bez końcowej nowej linii (zecho -n
), aby pozbyć się-l
flagi.Python 3,
228227225 bajtówNie 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.
Edit 1: otrzymuje
e[0]%8==0
ze[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
kappa
jest to poprawne ... zrób z tego, co chcesz.źródło
e[0]%8==0
nae[0]%8<1
?<1
, nie<0
?Groovy,
151137 bajtówBrak 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.źródło
Pyth , 37 bajtów
Wypróbuj online!
źródło
Brachylog , 14 bajtów
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.
źródło
O5AB1E, 12 bajtów
Wypróbuj online!
To jest mój pierwszy kod golfowy, więc idź spokojnie :)
źródło
Python 3 ,
209189180171160 bajtówDzięki kalmary za -9 bajtów :)
Wypróbuj online!
źródło
t+
z instrukcji map?t
ma wszystkie wiersze, natomiast[[t[i][j]..i..]..j..]
jest transponowanyt
, tj. kolumny. Jeśli istnieje krótszy sposób transpozycji macierzy, możemy zapisać więcej bajtów :)beezz
powinien zwrócić wartość false, ale nie zwraca. To dlatego, że pierwsza kontrola jest zepsuta, zwracaTrue
4 bity. Spróbowaćprint(p('1111'))
. Naprawiono to teraz. Wszystkie przypadki testowe tego nie obejmowały, ponieważ wszystkie użyte znaki są pierwotne.K (oK) ,
4033 bajtówRozwiązanie:
Wypróbuj online!
Wyjaśnienie:
Połowa tworzy macierz, druga połowa to kontrola pierwotności.
źródło
PHP, 173 bajtów
Przetestuj online
źródło
JavaScript, 234 bajty
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.
źródło
Math.pow(2,i)
można skrócić do(1<<i)
założeniai<32
, może oszczędzając 7 bajtów, ale może nie.Clojure, 180 bajtów
Może istnieć krótszy sposób generowania list bitów, a także test pierwotności.
źródło
Perl 5
-MList::Util=all,sum -pF
,9692 bajtówWypróbuj online!
źródło
Python 3, 164 bajty
źródło
Ruby 2.7
-rprime
, 95 bajtówBrak łą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:
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:
źródło
JavaScript (Node.js) ,
149146...134130129 bajtówWypróbuj online!
Wyjaśnienie
Jak to w ogóle działa !?
y.charCodeAt()&2**i
y.charCodeAt()
if0 <= i < 7
i 0 w przeciwnym razie.i < 7
kod najwyraźniej działa jak zwykle.7 <= i <= 32
, ponieważ odpowiadający bity.charCodeAt()
ma wartość 0, wynik wynosi 0, zgodnie z oczekiwaniami.32 < i < 1024
od tegoint32(2**i) == 0
czasu wynik wynosi 0, zgodnie z oczekiwaniami.1024 <= i
mamy2**i == Infinity
i od tegoint32(Infinity) == 0
czasu wynik wynosi 0, zgodnie z oczekiwaniami.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
lubn % R is NaN
.n % R == 0
:R
jest współczynnikiemn
.R == 1
, ton
jest liczbą pierwszą, ponieważ wszystko1 < R < n
nie może się podzielićn
. Zwraca 0 (fałsz).R == -1
takn == 0
. Zwróć -2 (prawda).R - 1
gdzieR - 1 > 0
(prawda).n % R is NaN
: Niepoprawne obliczenie modułowe.R == 0
:n == 1
. Zwróć -1 (prawda).n is NaN
:R is NaN
. Zwróć -1 (prawda).R == 1
ta funkcja może zwrócić wartość fałszowania, wskazując, żen
jest liczbą pierwszą.źródło