Na criptografia, o preenchimento PKCS # 7 é um esquema de preenchimento que adiciona um número de bytes N ≥ 1, em que o valor de cada byte adicionado é igual a N.
Por exemplo, Hello, World!
com 13 bytes, é o seguinte em hexadecimal:
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Se optarmos pelo PKCS # 7 no comprimento 16, o resultado será:
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 03 03 03
E se optarmos pelo comprimento 20, o resultado será:
48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 07 07 07 07 07 07 07
Observe que no primeiro exemplo adicionamos três 03
bytes e no segundo adicionamos sete 07
bytes.
Sua tarefa será validar se uma sequência de caracteres (ou matriz inteira) possui o preenchimento PKCS # 7 correto. Ou seja, se o último byte da string de entrada for N, seu programa deverá verificar se os últimos N bytes da string são iguais a N.
Entrada
Uma única sequência ASCII não vazia contendo caracteres entre os pontos de código 1 e 127, inclusive. Se desejar, você pode usar a entrada como uma matriz de números inteiros.
Saída
Um valor verdadeiro se a sequência de entrada tiver preenchimento PKCS # 7 válido, caso contrário, um valor falso.
Ambas as funções e programas completos são aceitáveis. Isso é código-golfe , então o objetivo é minimizar o número de bytes no seu código.
Casos de teste
A versão do array inteiro das entradas é apresentada aqui - a versão da string teria caracteres não imprimíveis para muitos dos seguintes casos de teste:
Verdade:
[1]
[1, 1]
[2, 1]
[2, 2]
[5, 6, 5, 3, 3, 3]
[1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2]
[95, 115, 80, 32, 71, 7, 122, 49, 13, 7, 7, 7, 7, 7, 7, 7, 7]
[27, 33, 54, 65, 97, 33, 52, 55, 60, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
[15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15]
Falsy:
[2]
[1, 2]
[5, 5, 5, 5]
[5, 6, 5, 4, 4, 4]
[3, 3, 3, 94, 3, 3]
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 127]
[50, 39, 94, 105, 49, 29, 74, 102, 2, 106, 44, 7, 7, 7, 7, 7, 7]
[26, 27, 59, 25, 122, 110, 20, 30, 114, 6, 9, 62, 121, 42, 22, 60, 33, 12]
[1 2 3 3 3 3]
verdade ou falsey? Eu acho que deveria ser verdade, mas não sou positivo.7
s). Você pode pensar nisso como, depois de retirar, você acabaria com[1 2 3]
.Respostas:
Python,
473433 bytess[-1]
é o último membro da listas
. Verifica se os últimoss[-1]
membros da matriz de entradas
são iguais a uma matrizs[-1]
repetida várias vezes.Recebe a entrada como uma matriz de números inteiros. Esta é uma expressão lambda; para usá-lo, atribua-o prefixando
lambda
comf=
.Experimente no Ideone!
Testar:
Economizou 13 bytes graças a Leaky Nun!
Guardado um byte graças a Dennis!
fonte
def f(s)=
é um byte mais curto.return
. Alambda
versão é 7 bytes mais curta.lambda s:[s[-1]]*s[-1]=s[-s[-1]:]
Braquilog , 14 bytes
Experimente online!
fonte
Pitão, 5 bytes
RLE na entrada, pegue o último par e verifique se o número de repetições é maior ou igual ao valor.
Experimente on-line: Demonstration or Test Suite
fonte
Gelatina , 5 bytes
A entrada é uma matriz de pontos de código, a saída é uma matriz não vazia (verdade) ou uma matriz vazia (falsy).
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
CJam,
98 bytesAgradecimentos ao Sp3000 por economizar 1 byte.
Pega uma lista inteira como entrada e retorna
0
(falso) ou um número inteiro positivo (verdade).Suíte de teste.
Explicação
fonte
05AB1E , 9 bytes
Nenhuma codificação de execução para osabie :(
Explicação:
Com um exemplo:
Usa a codificação CP-1252 . Experimente online!
fonte
MATL , 10 bytes
Agradecemos a @Adnan por perceber um problema com uma versão anterior do código
Quando a entrada possui preenchimento correto, a saída é uma matriz contendo apenas um, que é verdadeiro . Quando possui preenchimento incorreto, a saída é uma matriz que contém pelo menos um zero e, portanto, é falso .
Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Mathematica, 29 bytes
Divida a entrada em execuções de elementos iguais, extraia o último e verifique se o primeiro elemento é menor ou igual ao comprimento dessa execução.
fonte
Haskell, 50 bytes
Toma uma matriz de números inteiros como entrada.
fonte
J, 13 bytes
Pega a lista como um argumento único e produz,
1
se for verdade e0
se for falsa.Uso
Explicação
fonte
3 4 3 3 3
teria~.
como3 4
que a última linha de=
é0 1 0 0 0
. Eu acho que operar no reverso como{:*/@{.0{=@|.
deve funcionar, mas acaba com 13 bytes também.Brain-Flak , 54 bytes
Entrada é uma lista de números inteiros, a saída é 1 para verdade e vazia para falsey.
Explicação
O loop não termina imediatamente quando um valor que resultaria em um retorno falsey é encontrado. Em vez disso, é alternado para a outra pilha que está vazia e gasta o restante de suas iterações comparando 0 e 0.
fonte
Lote, 101 bytes
Pega a entrada como parâmetros da linha de comando, faz um loop sobre todos eles para que ele possa inserir o último, faz um
n
loop sobre todos novamente para contar a sequência den
s à direita , finalmente imprimindo1
se a contagem for pelo menos igual an
. Como alternativa, se a impressão0
ou um valor diferente de zero for aceitável, altere a última linha para 93 bytes para 93 bytes@cmd/cset/ac/n
.fonte
Haskell, 49 bytes
Experimente em Ideone.
Versão mais curta que retorna
True
por verdade eFalse
ou uma exceção por falsidade:fonte
Dyalog APL , 10 bytes
⊃
É o primeiro∧.=
all-igual⊃
o primeiro↑
n retirado⊢
o⌽
argumento inverso?TryAPL online!
fonte
Javascript (ES6),
514741 bytesExemplos:
fonte
C 91 Bytes
Entrada: um ponteiro para uma matriz terminada em nulo.
Saída: retorna
0
para preenchimento inválido e diferente de zero para válido (o último elemento na matriz)Exemplos:
Dá:
Isso depende de comportamento indefinido. Se o preenchimento for válido, não há declaração de retorno, mas usar
gcc -std=c99
isso retorna o último elemento da matriz que foi passada (pelo menos na minha máquina).fonte
Perl 5 , 30 bytes
Inclui
+1
para-p
Experimente online!
fonte
Braquilog , 6 bytes
Experimente online!
Resultados através do predicado sucesso ou fracasso, como faz a resposta Brachylog v1 da Leaky Nun. Também adota uma abordagem semelhante, mas sai muito mais curta.
Braquilog , 6 bytes
Experimente online!
Uma versão alternativa que sai da mesma extensão que se inspira na resposta de Dennis 'Jelly.
fonte
Retina , 34 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Entrada é uma lista de números inteiros separados por avanço de linha. Imprime
0
ou1
.Experimente online! (A primeira linha habilita um conjunto de testes, onde há um caso de teste separado por espaço.)
Uma ideia alternativa que termina em 35 bytes e imprime
0
ou um número inteiro positivo:fonte
Pyke, 7 bytes
Experimente aqui!
fonte
Javascript (ES5), 89 bytes
Ungolfed:
fonte
Brain-Flak 84 bytes
100000000 me derrotou aqui
Experimente Online!
Recebe entrada como matriz de números inteiros.
Explicação para vir.
Aqui está uma versão de 64 bytes que gera o não da resposta:
fonte