Walidacja wypełnienia PKCS # 7

25

W kryptografii dopełnianie PKCS # 7 to schemat dopełniania, który dodaje liczbę bajtów N ≥ 1, gdzie wartość każdego dodanego bajtu jest równa N.

Na przykład, Hello, World!który ma 13 bajtów, ma postać szesnastkową:

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

Jeśli zdecydujemy się na pad PKCS # 7 do długości 16, wówczas wynik będzie:

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 03 03 03

A jeśli wybierzemy pad do długości 20, wynik będzie:

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 07 07 07 07 07 07 07

Zauważ, że w pierwszym przykładzie dodajemy trzy 03bajty, aw drugim - siedem 07bajtów.

Twoim zadaniem będzie sprawdzenie, czy łańcuch (lub tablica liczb całkowitych) ma poprawne wypełnienie PKCS # 7. Oznacza to, że jeśli ostatnim bajtem ciągu wejściowego jest N, to twój program powinien sprawdzić, czy ostatnie N bajtów ciągu jest równe N.

Wkład

Pojedynczy niepusty ciąg ASCII zawierający znaki między punktami kodowymi 1 i 127 włącznie. Jeśli chcesz, możesz zamiast tego wprowadzić dane jako tablicę liczb całkowitych.

Wydajność

Truthy wartość jeśli ciąg wejściowy posiada ważne dopełnienie PKCS # 7, w przeciwnym razie wartość falsy.

Zarówno funkcje, jak i pełne programy są dopuszczalne. To jest , więc celem jest zminimalizowanie liczby bajtów w kodzie.

Przypadki testowe

Prezentowana jest wersja danych wejściowych w postaci liczb całkowitych - wersja łańcuchowa zawierałaby znaki niedrukowalne w wielu z następujących przypadków testowych:

Prawda:

[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]
Sp3000
źródło
Czy to [1 2 3 3 3 3]prawda czy falsey? Myślę, że to powinna być prawda, ale nie jestem pozytywny.
DJMcMayhem
@DJMcMayhem Truthy
Jakube
@DJMcMayhem Truthy (to paralela z prawdą, przypadek testowy kończący się na 7s). Możesz myśleć o tym jak po rozebraniu się [1 2 3].
Sp3000,
Na pewno chciałeś wstawić przecinek po Cześć. (Jest na heksie.)
rici
@rici Dziękujemy za zauważenie, naprawiono!
Sp3000,

Odpowiedzi:

8

Python, 47 34 33 bajtów

lambda s:s[-1:]*s[-1]==s[-s[-1]:]

s[-1]jest ostatnim członkiem listy s. Sprawdza, czy ostatnie s[-1]elementy tablicy wejściowej ssą takie same jak tablica s[-1]powtórzona wiele razy.

Pobiera dane wejściowe jako tablicę liczb całkowitych. To jest wyrażenie lambda; go używać, przypisać go poprzedzając lambdaz f=.

Wypróbuj na Ideone!

Testować:

>>> f=lambda s:s[-1:]*s[-1]==s[-s[-1]:]
>>> f([27, 33, 54, 65, 97, 33, 52, 55, 60, 1, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
True
>>> f([50, 39, 94, 105, 49, 29, 74, 102, 2, 106, 44, 7, 7, 7, 7, 7, 7])
False

Zaoszczędź 13 bajtów dzięki Leaky Nun!

Oszczędność bajtu dzięki Dennisowi!

Miedź
źródło
def f(s)=jest bajt krótszy.
ThreeFx
2
@ ThreeFx musisz zwrócić?
Leaky Nun
@ThreeFx Tak, ale potem muszę pisać return. lambdaWersja 7 bajtów krótszy.
Miedzi
Masz rację. Przepraszam.
ThreeFx
lambda s:[s[-1]]*s[-1]=s[-s[-1]:]
Leaky Nun
7

Brachylog , 14 bajtów

~c[A:B]t#=h~lB

Wypróbuj online!

~c[A:B]t#=h~lB
~c[A:B]                input is concatenation of A and B
       t               B
        #=             has all equal elements
          h~lB         the first item of B is the length of B
Leaky Nun
źródło
7

Pyth, 5 bajtów

gFer8

RLE na wejściu, weź ostatnią parę i sprawdź, czy liczba powtórzeń jest większa czy równa wartości.

Wypróbuj online: pakiet demonstracyjny lub testowy

Jakube
źródło
7

Galaretka , 5 bajtów

ŒgṪṫṪ

Dane wejściowe to tablica punktów kodowych, dane wyjściowe to niepusta tablica (prawda) lub pusta tablica (fałsz).

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ŒgṪṫṪ  Main link. Argument: A (array)

Œg     Group all runs of consecutive, equal integers.
  Ṫ    Tail; yield the last run. It should consist of n or more occurrences of n.
    Ṫ  Tail; yield n, the last element of A.
   ṫ   Dyadic tail; discard everything after the n-th element of the last run.
       If the last run was long enough, this will yield a non-empty array (truthy);
       if not, the result will be an empty array (falsy).
Dennis
źródło
6

CJam, 9 8 bajtów

Dzięki Sp3000 za oszczędność 1 bajtu.

{e`W=:/}

Pobiera na wejściu listę liczb całkowitych i zwraca 0(fałsz) lub liczbę całkowitą dodatnią (prawda).

Zestaw testowy.

Wyjaśnienie

e`   e# Run-length encoding, yielding pairs of run-length R and value V.
W=   e# Get the last pair.
:/   e# Compute R/V, which is positive iff R ≥ V. Works, because V is guaranteed
     e# to be non-zero.
Martin Ender
źródło
6

05AB1E , 9 bajtów

Brak kodowania długości przebiegu dla osabie :(

¤sR¬£¬QOQ

Wyjaśnienie:

¤           # Get the last element of the array
 s          # Swap the two top elements
  R         # Reverse the array
   ¬        # Get the first element
    £       # Substring [0:first element]
     ¬      # Get the first element
      Q     # Check if they are equal
       OQ   # Sum up and check if equal

Na przykład:

¤           # [5, 6, 5, 3, 3, 3]  3
 s          # 3  [5, 6, 5, 3, 3, 3]
  R         # 3  [3, 3, 3, 5, 6, 5]
   ¬        # 3  [3, 3, 3, 5, 6, 5]  3
    £       # 3  [3, 3, 3]
     ¬      # 3  [3, 3, 3]  3
      Q     # 3  [1, 1, 1]
       OQ   # 3==3 which results into 1

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Adnan
źródło
5

MATL , 10 bajtów

Dziękujemy @Adnan za zauważenie problemu z wcześniejszą wersją kodu

P0hG0):)&=

Gdy wejście ma poprawne wypełnienie, wynikiem jest tablica zawierająca tylko te, co jest prawdą . Gdy ma niepoprawne wypełnienie, wynikiem jest tablica zawierająca co najmniej zero, podobnie jak fałsz .

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

P     % Implicitly take numeric array as input. Reverse the array
0h    % Append a 0. This ensures falsy output if input array is too short
G0)   % Push input again. Get its last element
:     % Range from 1 to that
)     % Apply as index into the array
&=    % 2D array of all pairwise equality comparisons. Implicitly display
Luis Mendo
źródło
@Adnan Pracuje teraz
Luis Mendo
Fajnie, wygląda dobrze :)
Adnan
2
Gratulujemy również 25k! : 3
Adnan
4

Mathematica, 29 bajtów

#&@@#<=Length@#&@*Last@*Split

Podziel dane wejściowe na przebiegi równych elementów, wyodrębnij ostatni i sprawdź, czy jego pierwszy element jest mniejszy lub równy długości tego przebiegu.

Martin Ender
źródło
3

Haskell, 50 bajtów

import Data.List
((>=)<$>head<*>length).last.group

Pobiera tablicę liczb całkowitych jako danych wejściowych.

ThreeFx
źródło
Musisz zaimportować Data.List, chyba że jesteś w REPL.
xnor
2

J, 13 bajtów

#~@{:-:{:{.|.

1Traktuje listę jako pojedynczy argument i wypisuje ją, jeśli jest prawdziwa i 0jeśli falsey.

Stosowanie

   f =: #~@{:-:{:{.|.
   f 5 6 5 3 3 3
1
   f 5 6 5 4 4 4
0

Wyjaśnienie

#~@{:-:{:{.|.  Input: array A
           |.  Reverse A
       {:      Get the last value in A
         {.    Take that many values from the reverse of A
   {:          Get the last value in A
#~@            Make a list with that many copies of the last value
     -:        Test if the list of copies matches the sublist of A and return
mile
źródło
@randomra przypadku takim jak 3 4 3 3 3miałby ~.jak 3 4tak, że ostatni wiersz =jest 0 1 0 0 0. Myślę, że operacja odwrotna {:*/@{.0{=@|.powinna działać, ale kończy się również na 13 bajtach.
mil
Racja, niezły chwyt. Tęsknie za tym.
randomra
2

Brain-Flak , 54 bajty

(({})[()]){({}[()]<({}[({})]){<>}{}>)}{}{<>(<(())>)}{}

Wejście to lista liczb całkowitych, wyjście to 1 dla prawdy i puste dla falsey.

Wyjaśnienie

(({})[()]){ Loop a number of times equal to the last integer in the input - 1
    ({}[()] Handle loop counter
        < Silently...
            ({}[({})]) Replace the last code point in the string with its difference with the code point before it
            {<>} If the difference is not zero then switch stacks
            {} Discard the difference
        > End silently
    ) Handle loop counter
} End loop
{} Discard the loop counter
{<>(<(())>)} If the top of the current stack is not 0 (which means we have not switched stacks push 0 then 1
{} Discard the top of the stack (either nothing if falsey or 0 if truthy)

Pętla nie kończy się natychmiast po napotkaniu wartości, która spowodowałaby powrót falsey. Zamiast tego jest przełączany na inny stos, który jest pusty i spędza resztę iteracji na porównywaniu 0 i 0.

0 '
źródło
1
Och, hej, miło cię tu widzieć! Witamy na stronie!
DJMcMayhem
1

Partia, 101 bajtów

@for %%a in (%*)do @set/an=%%a,c=0
@for %%a in (%*)do @set/ac+=1,c*=!(n-%%a)
@if %c% geq %n% echo 1

Pobiera dane wejściowe jako parametry wiersza poleceń, zapętla je wszystkie, aby mógł dostać się do ostatniego n, zapętla je wszystkie ponownie, aby zliczyć liczbę ostatnich ns, w końcu drukuje, 1jeśli liczba jest co najmniej równa n. Alternatywnie, jeśli 0dopuszczalne jest drukowanie lub niezerowa wartość, to dla 93 bajtów zmień ostatni wiersz na@cmd/cset/ac/n .

Neil
źródło
1

Haskell, 49 bajtów

f s|x<-(==last s)=x.length.fst.span x.reverse$s

Wypróbuj na Ideone.

Krótsza wersja, która zwraca Trueprawdę i / Falselub wyjątek dla fałszu:

((==).head>>=all).(head>>=take).reverse
Laikoni
źródło
1

Dyalog APL , 10 bajtów

(⊃∧.=⊃↑⊢)⌽

Jest to pierwszy
∧.=całkowicie równa
pierwszej
n pobranej z
tej
odwróconej argumentu?

Wypróbuj APL online!

Adám
źródło
2
Ile bajtów?
Conor O'Brien
@ ConorO'Brien Przepraszamy, zapomniałem wypełnić płytę grzewczą.
Adám
1

JavaScript (ES6), 51 47 41 bajtów

a=>(r=k=>a.pop()^n?k<2:r(k-1))(n=a.pop())

Przykłady:

let f =
a=>(r=k=>a.pop()^n?k<2:r(k-1))(n=a.pop())

console.log(f([5, 6, 5, 3, 3, 3]))
console.log(f([5, 6, 5, 4, 4, 4]))

Arnauld
źródło
1

C 91 bajtów

int f(int*l){int n;for(n=0;l[++n];);l+=n-1;for(int i=*l;i;)if(l[-i--+1]^*l||n<*l)return 0;}

Dane wejściowe: wskaźnik do tablicy zakończonej znakiem null.
Dane wyjściowe: zwraca 0niepoprawne wypełnienie i niezerowe dla poprawnego (ostatni element w tablicy)

Przykłady:

int a[] = {5, 6, 5, 3, 3, 3, 0};
printf("%d\n", f(&a[5], 6));

int b[] = {1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0};
printf("%d\n", f(&b[11],12 ));

int m[] = {5, 6, 5, 4, 4, 4, 0};
printf("%d\n", f(&m[5], 6));

int n[] = {3, 3, 3, 94, 3, 3, 0};
printf("%d\n", f(&n[5], 6));

Daje:

3
2
0
0

Polega to na niezdefiniowanym zachowaniu. Jeśli wypełnienie jest poprawne, nie ma instrukcji return, ale użycie gcc -std=c99tej wartości zwraca ostatni element tablicy, który został przekazany (przynajmniej na moim komputerze).

Riley
źródło
1

Brachylog , 6 bajtów

a₁=.l∈

Wypróbuj online!

Wyprowadza poprzez sukces lub porażkę predykatu, jak robi to odpowiedź Brachylog v1 Leaky Nun. Ma również podobne podejście, ale wychodzi znacznie krócej.

a₁        There exists a suffix of the input
  =       the elements of which are all equal
   .      which is the output variable
    l     the length of which
     ∈    is an element of
          the output variable.

Brachylog , 6 bajtów

ḅt.l≥∈

Wypróbuj online!

Alternatywna wersja, która wychodzi na tę samą długość, która czerpie inspirację z galaretki Dennisa.

 t        The last
ḅ         block of consecutive equal elements of the input
  .       is the output variable
   l      the length of which
    ≥     is greater than or equal to
     ∈    an element of
          the output variable.
Niepowiązany ciąg
źródło
0

Retina , 34 bajty

Liczba bajtów zakłada kodowanie ISO 8859-1.

.+
$*
\b(1(1)*)(?<-2>¶\1)*$(?(2)!)

Dane wejściowe to lista liczb całkowitych oddzielonych od linii. Odbitki 0lub 1.

Wypróbuj online!(Pierwszy wiersz włącza zestaw testów, w którym przypada jeden rozdzielony spacjami przypadek testowy na wiersz).

Alternatywny pomysł, który kończy się na 35 bajtach i wydrukach 0lub dodatniej liczbie całkowitej:

.+
$*
\b(?=(1+)(¶\1)*$)(?<-2>1)*1\b
Martin Ender
źródło
0

JavaScript (ES5), 89 bajtów

function(b){for(var d=b[b.length-1],c=0;c<d;c++)if(b[b.length-c-1]!=d)return!1;return!0};

Nie golfowany:

function a(arr){
var b=arr[arr.length-1];
for(var i=0;i<b;i++){
    if(arr[arr.length-i-1]!=b)return false;
}
return true;
}
Paul Schmitz
źródło
0

Brain-Flak 84 bajty

100000000 pobił mnie tutaj

Wypróbuj online!

((({}))){({}[()]<(({})<([{}]{}<>)<>>)>)}<>([])({<{}>{}<([])>}{}<(())>){((<{}{}>))}{}

Pobiera dane wejściowe jako tablicę liczb całkowitych.

Wyjaśnienie, które nastąpi.

Oto 64-bajtowa wersja, w której nie ma odpowiedzi:

((({}))){({}[()]<(({})<([{}]{}<>)<>>)>)}<>([])({<{}>{}<([])>}{})
Kreator pszenicy
źródło