Siła hasła

0

Rozwiązuję sobie w wolnej chwili zadania ze SPOJ.com, i z tym: http://pl.spoj.com/problems/FR_05_02/ nie potrafię sobie poradzić. Napisałem taki kod w C:

#include <stdio.h>
#include <ctype.h>

#define MAX 1002

#define IS_UPPER 1
#define IS_LOWER 2
#define IS_DIGIT 4
#define IS_OTHER 8

void password_check(const char* pass) {
  const char *p = pass;

  int status = 0;
  int length = 0;

  while (!(status == 0xf && length > 7) && !iscntrl(*pass)) {
    if(islower(*pass))
      status |= IS_LOWER;
    else if(isupper(*pass))
      status |= IS_UPPER;
    else if(isdigit(*pass))
      status |= IS_DIGIT;
    else
      status |= IS_OTHER;
    ++pass;
    ++length;
  }
  if (length > 7 && status == 0xf) {
    printf("%s", p);
  }
}

int main(void) {
  int n = 1;
  char pass[MAX];

  scanf("%d", &n);
  fflush(stdin);

  for(int i = 0; i < n; ++i) {
    fgets(pass, MAX - 1, stdin);

    password_check(pass);
  }
  return 0;
}
 

i taki w pythonie:

#-*- coding: utf-8 -*-

import sys

IS_DIGIT = 0x01
IS_UPPER = 0x02
IS_LOWER = 0x04
IS_OTHER = 0x08


def check_password(password):
    if len(password) < 8:
        return
    else:
        status = 0
        for letter in password:
            if letter.isdigit():
                status |= IS_DIGIT
            elif letter.isupper():
                status |= IS_UPPER
            elif letter.islower():
                status |= IS_LOWER
            elif letter.isprintable():
                status |= IS_OTHER
        if status == IS_DIGIT | IS_UPPER | IS_LOWER | IS_OTHER:
            sys.stdout.write(password+'\n')


if __name__ == '__main__':
    n = int(sys.stdin.readline())
    for i in range(0, n, 1):
        p = sys.stdin.readline()
        check_password(p)

Ale w obu przypadkach dostaję błędną odpowiedź. Oczywiście, to że w obu przypadkach dostaję błąd, mnie dziwi, bo algorytmy wykorzystują te same filtry, ale próbowałem już różnych, i zawsze dostaję błąd.

0

Wklej tu wynik, jaki zwraca twój program dla jakichś testowych danych (trochę "silnych" i trochę "słabych" haseł).

0

W kodzie w C ten else jest błędny bo nie każdy pozostały znak się zalicza. Możesz dostać bajt który nie będzie printable.
W kodzie w pythonie czytasz wejscie razem ze znakiem nowej linii \n na końcu. Ten znak niby jest printable ale nie w rozumieniu tego zadania, więc warunek u ciebie zawsze będzie spełniony przez ten znak, a nie powinien.

0

W Pythonie zmieniłem na:

p = sys.stdin.readline().rstrip()

I teraz odkryłem, że dostaję tam błąd wykonania (NZEC) :/ Choć w moim IDE działa.

Co do kodu w C, to czy przypadkiem isnctrl() nie załatwia mi, że sprawdzane będą tylko znaki printable? I tu się też zastanawia, czy w haśle mogą być tabulacje :D.

1

Jak masz hasło ze spacjami na końcu, po użyciu rstrip() zostaną usunięte
Aby usunąć tylko "\n" z końca stringa użyj rstrip("\n")

>>> "enjfkjewnfkjn    \n".rstrip()
'enjfkjewnfkjn'
>>> "enjfkjewnfkjn    \n".rstrip("\n")
'enjfkjewnfkjn    '
1

Używaj pythona 2.7 na spoju, poniżej diff z twojego i zaakceptowanego rozwiązania

C:\spoj\FR_05_02>diff good.py wrong.py
22c22
<             else:
---
>             elif letter.isprintable():
31c31
<         p = sys.stdin.readline().rstrip("\n")
---
>         p = sys.stdin.readline()

1 użytkowników online, w tym zalogowanych: 0, gości: 1