Uma string Primenary ( binary-prime ) é aquela que, quando escrita como uma grade binária, cada linha e coluna tem um total primo.
Essa é uma explicação bastante vaga, então vamos descrevê-la com um exemplo bem trabalhado ...
Neste exemplo, usaremos a string bunny
:
Primeiro, encontre o ponto de código ASCII de cada caractere e sua representação binária:
Char | ASCII | Binary
b 98 1100010
u 117 1110101
n 110 1101110
n 110 1101110
y 121 1111001
Pegue esses valores binários, de cima para baixo, e organize-os na grade (adicionando zeros à esquerda, se necessário):
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
Em seguida, conte o número de 1
s em cada linha e coluna:
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
Se, e somente se, todo total for primo (como aqui), a sequência será um primo binário válido.
O desafio
Sua tarefa é criar uma função ou programa que, quando recebe uma string, retorna / sai truthy
se a string for primenária ou falsy
não.
Regras / Detalhes
- Você pode assumir que os caracteres da string sempre estarão no intervalo ASCII
33-126
(inclusive). - A cadeia não estará vazia.
- Uma sequência primária não precisa ter um comprimento primo - por exemplo,
W1n*
é válida, apesar de ter 4 caracteres. - Isso é código-golfe , então a resposta mais curta (em bytes) vence - mas todos os envios são bem-vindos.
- As brechas padrão são proibidas.
Casos de teste
'husband' -> True
'HOTJava' -> True
'COmPaTIBILE' -> True
'AuT0HACk' -> True
'PPCW' -> False
'code-golf' -> False
'C++' -> False
'/kD' -> False
'HI' -> False
'A' -> False
Há também um exemplo de Python funcional, mas incrivelmente detalhado, no repl.it, no qual você pode testar sua solução.
husband
era válido? Ou algum deles? Grande problema, no entanto!False
, correto?0
e1
não são primos, e cada string de entrada de 1-2 caracteres contendo apenas caracteres no intervalo especificado tem a garantia de conter pelo menos um0
ou1
como uma soma vertical. Você deve adicionar algumas cadeias de caracteres de 1 e 2 como casos de teste.false
. 2 entradas de char poderiam, mas não no intervalo ASCII que estamos usando, portanto, para este cenário, você está correto.Respostas:
MATL, 10 bytes
Experimente online!
Esta é a linguagem ideal para o trabalho. É praticamente uma transliteração literal da especificação do desafio.
Como qualquer zero faz com que uma matriz MATL seja falsa conforme a meta , nada mais é necessário - basicamente, um implícito
A
é chamado?
(if).fonte
a
deve ser falso, mas retorna1 1
? (suas colunas não somam primos)BtXsw!shZp
iria corrigir isso e ser um vencedor para 10.Geléia ,
13 1211 bytesTryItOnline! ou todos os casos de teste
Quão?
fonte
05AB1E , 17 bytes
Experimente online!
fonte
Gelatina , 15 bytes
Experimente online! ou Verifique todos os casos de teste. .
Explicação
fonte
Mathematica, 75 bytes
Função sem nome pegando uma string como entrada e retornando
True
ouFalse
.ToCharacterCode@#
converte a entrada na lista de seus valores ASCII;IntegerDigits[...,2,7]
transforma cada valor na lista de seus bits, preenchida com o comprimento 7, se necessário. Então agora temos uma matriz 2D e queremos todas as suas somas de linha e coluna; eis que o espasmo de caractere{+##&@@#,+##&@@@#}&@...
faz exatamente isso (aplica a função+##&
"somar todos os argumentos", à lista de vetores na primeira coordenada usando@@
e a cada vetor como sua própria lista de números inteiros na segunda coordenada usando@@@
) . Depois, apenas verificamos se os resultados sãoPrimeQ
, achatamos a listaJoin@@
e obtemosAnd
todos esses valores.fonte
Ruby
-rprime
, 100 bytesExperimente online!
Explicação
fonte
Perl,
151121111 + 3 = 114 bytesCorra com
-lF
. O programa funcionará apenas corretamente para a primeira entrada. Encerre o programa e execute novamente para sua próxima entrada.Agradeço a @Dada por me informar que o
//
depoisF
era redundante. Um byte adicional pode ser removido (para 112), canalizando a entrada viaecho -n
, mas eu sinto que isso é tecnicamente adicionando mais código, então YMMV.Legível:
fonte
//
depois-F
e podeecho -n
usar a entrada sem a nova linha final (com ) para se livrar da-l
sinalização.Python 3,
228227225 bytesNão é uma ótima resposta, não fui capaz de jogar tanto quanto gostaria, mas passei tanto tempo nisso que acho que devo postar. Sugestões sobre o corte de bytes seriam muito apreciadas.
Editar 1: substituído
e[0]%8==0
pore[0]%8<1
, perdendo um byte. Obrigado Flp.Tkc!Edição 2: substituindo (i + 1) por - ~ i, perdendo dois bytes adicionais. Obrigado Erik por expor o quão ruim é meu conhecimento em nível de bit :) Ao testar esta revisão, descobri que
kappa
é válido ... faça disso o que quiser.fonte
e[0]%8==0
parae[0]%8<1
?<1
, não é<0
?Groovy,
151137 bytesNenhuma verificação de primalidade no groovy ...
p={x->x<3||(2..(x**0.5)).every{x%it}};
- Fechamento para teste de primalidade.y={it.every{p(it.count("1"))}};
- Fechamento para garantir que todas as contagens de "1" para uma matriz 2D binária passada sejam primárias.x=it.collect{0.toString((int)it,2) as List};
- Coversion de string para array binário.y(x)&&y(x.transpose())
- Para todas as somas validadas pelo prime na matriz principal e na matriz transposta, verifique se elas retornam verdadeiras.fonte
Pitão , 37 bytes
Experimente online!
fonte
Braquilog , 14 bytes
Experimente online!
Saídas por sucesso ou fracasso. (No caso de êxito, uma lista de todas as somas de colunas e linhas está disponível através da variável de saída.
fonte
O5AB1E, 12 bytes
Experimente online!
Este é o meu primeiro código de golfe, então vá com calma :)
fonte
Python 3 ,
209189180171160 bytesLula Thanx por -9 bytes :)
Experimente online!
fonte
t+
na declaração do mapa?t
tem todas as linhas, enquanto[[t[i][j]..i..]..j..]
é a transpostat
, ou seja, as colunas. Se houver uma maneira mais curta de transpor a matriz, podemos salvar mais bytes :)beezz
deve retornar false, mas não. É porque o cheque principal está quebrado, ele retornaTrue
para 4 bits. Tenteprint(p('1111'))
. Corrigido agora. Todos os casos de teste não cobriram isso, porque todos os caracteres usados são primários.K (oK) ,
4033 bytesSolução:
Experimente online!
Explicação:
Metade está criando a matriz, a outra metade é a verificação de primalidade.
fonte
PHP, 173 bytes
Teste on-line
fonte
JavaScript, 234 bytes
Obtemos os valores horizontais convertendo o número em binário, removendo os zeros usando uma substituição de cadeia e depois contando os 1s. As somas verticais são obtidas pelo loop de 1 a 7 e usando um AND bit a bit com 2 elevados à enésima potência.
fonte
Math.pow(2,i)
pode ser reduzido para(1<<i)
supori<32
, talvez economizando 7 bytes, talvez não.Clojure, 180 bytes
Pode haver uma maneira mais curta de gerar listas de bits e também o teste de primalidade.
fonte
Perl 5
-MList::Util=all,sum -pF
,9692 bytesExperimente online!
fonte
Python 3, 164 bytes
fonte
Ruby 2.7
-rprime
, 95 bytesNenhum link de TiO porque o TiO ainda executa o Ruby 2.5.5. 😭
Explicação
Bem simples. A primeira linha obtém os dígitos binários de cada caractere como uma matriz preenchida com sete dígitos, o que realmente deve ser mais fácil:
Confira esse parâmetro bloco numerado (
@1
) e gama beginless (..6
) gostosura .A segunda linha soma as linhas e colunas e testa se todas são primos:
fonte
JavaScript (Node.js) ,
149146...134130129 bytesExperimente online!
Explicação
Como isso funciona !?
y.charCodeAt()&2**i
y.charCodeAt()
if0 <= i < 7
e 0 caso contrário.i < 7
, aparentemente, o código funciona normalmente.7 <= i <= 32
, desde que o bit correspondentey.charCodeAt()
seja 0, o resultado será 0 conforme o esperado.32 < i < 1024
, desde entãoint32(2**i) == 0
, o resultado é 0 como esperado.1024 <= i
, temos2**i == Infinity
e, desde entãoint32(Infinity) == 0
, o resultado é 0 como esperado.(P=r=>n%--r?P(r):~-r)(n)
R = --r = r - 1
.n % R == 0
oun % R is NaN
.n % R == 0
:R
é um fator den
.R == 1
, entãon
é primo, porque1 < R < n
nem todos podem dividirn
. Retorno 0 (falso).R == -1
entãon == 0
. Retorno -2 (verdade).R - 1
ondeR - 1 > 0
(verdade).n % R is NaN
: Cálculo modular inválido.R == 0
:n == 1
. Retorno -1 (verdade).n is NaN
:R is NaN
. Retorno -1 (verdade).R == 1
essa função pode retornar um valor falso, indicando quen
é primo.fonte