Una cadena primaria ( binaria-prima ) es aquella que, cuando se escribe como una cuadrícula binaria, cada fila y columna tiene un total primo.
Esa es una explicación bastante vaga, así que analicemos con un ejemplo trabajado ...
Para este ejemplo usaremos la cadena bunny
:
Primero, encuentre el punto de código ASCII de cada carácter y su representación binaria:
Char | ASCII | Binary
b 98 1100010
u 117 1110101
n 110 1101110
n 110 1101110
y 121 1111001
Tome estos valores binarios, de arriba a abajo, y organícelos en cuadrícula (agregando ceros a la izquierda si es necesario):
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
Luego, cuente el número de 1
s en cada fila y columna:
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, y solo si, cada total es primo (como aquí), entonces la cadena es un primo binario válido.
El reto
Su tarea es crear una función o programa que, cuando se le da una cadena, devuelve / emite truthy
si la cadena es primaria, y de lo falsy
contrario.
Reglas / Detalles
- Puede suponer que los caracteres de la cadena siempre estarán en el rango ASCII
33-126
(inclusive). - La cadena no estará vacía.
- Una cadena primaria no tiene que tener una longitud principal; por ejemplo,
W1n*
es válida, a pesar de tener 4 caracteres. - Este es el código de golf , por lo que gana la respuesta más corta (en bytes), pero todas las presentaciones son bienvenidas.
- Las lagunas estándar están prohibidas.
Casos de prueba
'husband' -> True
'HOTJava' -> True
'COmPaTIBILE' -> True
'AuT0HACk' -> True
'PPCW' -> False
'code-golf' -> False
'C++' -> False
'/kD' -> False
'HI' -> False
'A' -> False
También hay un ejemplo de Python que funciona, pero increíblemente detallado en repl.it con el que puede probar su solución.
husband
era válido? O alguno de ellos? ¡Gran problema, sin embargo!False
, ¿correcto?0
y1
no son primos, y se garantiza que cada cadena de entrada de caracteres 1-2 que contiene solo caracteres en el rango dado contiene al menos uno0
o1
como una suma vertical. Debe agregar algunas cadenas de caracteres 1 y 2 como casos de prueba.false
. 2 entradas de caracteres podrían, pero no en el rango ASCII que estamos usando, por lo que para este escenario está en lo correcto.Respuestas:
MATL, 10 bytes
Pruébalo en línea!
Este es el lenguaje ideal para el trabajo. Es más o menos una transcripción literal de la especificación de desafío.
Dado que cualquier cero hace que una matriz MATL sea falsa según el meta , no se necesita nada más, básicamente,
A
se llama a un implícito?
(if).fuente
a
debería ser falso, pero vuelve1 1
? (sus columnas no se suman a los números primos)BtXsw!shZp
que solucionaría esto y sería un ganador para 10.Jalea ,
13 1211 bytesTryItOnline! o todos los casos de prueba
¿Cómo?
fuente
05AB1E , 17 bytes
Pruébalo en línea!
fuente
Jalea , 15 bytes
Pruébalo en línea! o Verificar todos los casos de prueba. .
Explicación
fuente
Mathematica, 75 bytes
Función sin nombre que toma una cadena como entrada y devuelve
True
oFalse
.ToCharacterCode@#
convierte la entrada en la lista de sus valores ASCII;IntegerDigits[...,2,7]
convierte cada valor en la lista de sus bits, rellenado a la longitud 7 si es necesario. Así que ahora tenemos una matriz 2D y queremos todas sus sumas de filas y sumas de columnas; he aquí, el carácter-espasmo{+##&@@#,+##&@@@#}&@...
hace exactamente eso (aplica la función+##&
"sumar todos los argumentos" a la lista de vectores en la primera coordenada usando@@
, y a cada vector como su propia lista de enteros en la segunda coordenada usando@@@
) . Luego, solo verificamos si los resultados sonPrimeQ
, aplanamos la listaJoin@@
y tomamosAnd
todos esos valores.fuente
Ruby
-rprime
, 100 bytesPruébalo en línea!
Explicación
fuente
Perl,
151121111 + 3 = 114 bytesCorre con
-lF
. El programa solo funcionará correctamente para la primera entrada. Termine el programa y vuelva a ejecutarlo para su próxima entrada.Gracias a @Dada por dejarme saber que los
//
despuesF
fueron redundantes. Se puede eliminar un byte adicional (para 112) conectando la entrada a través de viaecho -n
, pero creo que técnicamente está agregando más código, por lo que YMMV.Legible:
fuente
//
después-F
y puede tomar la entrada sin una nueva línea final (conecho -n
) para deshacerse de la-l
bandera.Python 3,
228227225 bytesNo es una gran respuesta, no pude jugar al golf tanto como me hubiera gustado, pero pasé tanto tiempo en él que creo que debería publicarlo. Las sugerencias sobre el corte de bytes serían muy apreciadas.
Edición 1: reemplazado
e[0]%8==0
pore[0]%8<1
, perdiendo un byte. Gracias Flp.Tkc!Edición 2: reemplazo (i + 1) con - ~ i, perdiendo dos bytes adicionales. Gracias Erik por exponer cuán malo es mi conocimiento de nivel de bits :) Al probar esta revisión, descubrí que
kappa
es válida ... haz de eso lo que quieras.fuente
e[0]%8==0
ae[0]%8<1
?<1
,<0
¿ no ?Groovy,
151137 bytesSin verificación de primalidad en groovy ...
p={x->x<3||(2..(x**0.5)).every{x%it}};
- Cierre para pruebas de primalidad.y={it.every{p(it.count("1"))}};
- Cierre para garantizar que todos los recuentos de "1" para una matriz 2D binaria aprobada sean primos.x=it.collect{0.toString((int)it,2) as List};
- Coversion de cadena a matriz binaria.y(x)&&y(x.transpose())
- Para todas las sumas con validación principal en la matriz principal y la matriz transpuesta, asegúrese de que devuelvan verdadero.fuente
Pyth , 37 bytes
Pruébalo en línea!
fuente
Brachylog , 14 bytes
Pruébalo en línea!
Salidas por éxito o fracaso. (En el caso de éxito, una lista de todas las sumas de columnas y filas está disponible a través de la variable de salida.
fuente
O5AB1E, 12 bytes
Pruébalo en línea!
Este es mi primer código de golf, así que ve fácil :)
fuente
Python 3 ,
209189180171160 bytesCalamar Thanx para -9 bytes :)
Pruébalo en línea!
fuente
t+
la declaración del mapa?t
tiene todas las filas, mientras que[[t[i][j]..i..]..j..]
se transponet
, es decir, las columnas. Si hay una forma más corta de transponer la matriz, podemos guardar más bytes :)beezz
debería devolver falso, pero no lo hace. Es porque la verificación principal está rota, regresaTrue
por 4 bits. Tratarprint(p('1111'))
. Lo arregló ahora. Todos los casos de prueba no cubrieron eso, porque todos los caracteres utilizados son primarios.K (oK) ,
4033 bytesSolución:
Pruébalo en línea!
Explicación:
La mitad es crear la matriz, la otra mitad es la verificación de primalidad.
fuente
PHP, 173 bytes
Pruébelo en línea
fuente
JavaScript, 234 bytes
Obtenemos los valores horizontales al convertir el número a binario, eliminando los ceros usando un reemplazo de cadena y luego contando los 1s. Las sumas verticales se obtienen haciendo un bucle de 1 a 7 y usando un bit Y con 2 elevado a la enésima potencia.
fuente
Math.pow(2,i)
se puede acortar a(1<<i)
suponeri<32
, tal vez guardar 7 bytes, tal vez no.Clojure, 180 bytes
Puede haber una forma más corta de generar listas de bits y también la prueba de primalidad.
fuente
Perl 5
-MList::Util=all,sum -pF
,9692 bytesPruébalo en línea!
fuente
Python 3, 164 bytes
fuente
Ruby 2.7
-rprime
, 95 bytesNo hay enlace de TiO porque TiO todavía ejecuta Ruby 2.5.5. 😭
Explicación
Bastante simple. La primera línea obtiene los dígitos binarios de cada carácter como una matriz rellenada con siete dígitos, lo que realmente debería ser más fácil:
Salida que numerada parámetro de bloque (
@1
) y rango beginless (..6
) picor .La segunda línea suma las filas y columnas y prueba si todas son primas:
fuente
JavaScript (Node.js) ,
149146...134130129 bytesPruébalo en línea!
Explicación
¿Cómo funciona?
y.charCodeAt()&2**i
y.charCodeAt()
if0 <= i < 7
, y 0 de lo contrario.i < 7
, el código aparentemente funciona como de costumbre.7 <= i <= 32
, dado que el bit correspondiente dey.charCodeAt()
es 0 de todos modos, el resultado es 0 como se esperaba.32 < i < 1024
, desde entoncesint32(2**i) == 0
, el resultado es 0 como se esperaba.1024 <= i
, tenemos2**i == Infinity
, y desde entoncesint32(Infinity) == 0
, el resultado es 0 como se esperaba.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
on % R is NaN
.n % R == 0
:R
es un factor den
.R == 1
, entoncesn
es primo porque no todos1 < R < n
pueden dividirsen
. Devuelve 0 (falso).R == -1
, entoncesn == 0
. Regresar -2 (verdad).R - 1
dondeR - 1 > 0
(verdad).n % R is NaN
: Cálculo modular no válido.R == 0
:n == 1
. Regreso -1 (verdad).n is NaN
:R is NaN
. Regreso -1 (verdad).R == 1
esta función puede devolver un valor falso, indicando quen
es primo.fuente