21 / 29
Mar 2019

Masz rację, zrobiłem copy paste danych wejściowych ze spoj do Ideone. Ostatni enter się nie kopiuje, trzeba go zrobić ręcznie.
Potem na siłę modyfikowałem kod żeby się zgadzało ehhhh.
Thx

Lub zaznaczając obszar do kopiowania, przeciągnąć zaznaczenie do linii poniżej :wink:

6 months later

Witam serdecznie. Podpowie ktoś dlaczego na ideone nie zlicza w ogóle polskich znaków ?
Przy przykładzie z zadania zlicza do 122 kodu ASCII i na tym kończy.

Żeby zliczało Ci polskie znaki musisz zadeklarować wchar_t a nie zwykły char

Na pewno to istotne, zatem dziękuję. Zmieniłem na typ wchar_t, lecz niestety to tylko pogorszyło sprawę.

Spróbuj z takim warunkiem pętli
while((znak=getchar())!=EOF)

Dziękuję, to wszystko załatwiło. Straszne z mojej strony, że nie wpadłem na to EOF. Wydawało mi się, że to nie jest takie istotne, od teraz to na zawsze zapamiętam :slight_smile:

9 months later

Piszę w Pythonie pomoże mi ktoś zrozumieć dlaczego ten kod źle działa ?
https://ideone.com/OJcack6
dwie ostatnie cyfry nie zgadzają się z odpowiedziami ze SPOJ doszedłem do tego że to ę i ó pomoże mi ktoś zrozumieć dlaczego tak jest?

—Uwaga mogą być tutaj małe przekłamania w tym co piszę, ale idea będzie słuszna.—
To skomplikowane… Otóż litera “ę” (i inne polskie znaki) nie znajdują się w tabeli kodów ASCII. Wiele języków programowania (w tym C++), szczególnie mających początki “dawno temu” nie obsługuje standarowo kodów spoza tabei ASCII (trzeba odpowiedniego typu lub biblioteki, w zależności od języka). Python jednak domyślnie pracuje w UTF-8 i pozwala na wprowadzenie wszystkiego. Jeśli jako linię podasz coś takiego:
ϨϨϨϨϨϨ
to bez problemu wyświetli Ci, że to sześć znaków o kodzie 1000. Niemniej w kodach ASCII nie ma kodów większych niż 128 lub 255 (w zależności od tego ilo bitowy jest znak). C++ nie wyświetli “od tak”, że to 1000. Wyświetli, że jest to:
168 6
207 6
Taki też ten znak (Ϩ = 168 207) ma numer jeśli do dyspozycji mamy tylko kody ASCII. Czyli problem jest taki, że Python obsługuje domyśłnie cały Unicode (i bardzo dobrze, ale nie pomaga to w tym zadaniu).

Teraz pytanie jak to obejść? Pewnie istnieje jakiś “jeden prosty trick, programiści go nienawidzą!”. Ja go nie znam. Znam trick “na około”, a mianowicie jak zapiszesz nieszczęsny znak “Ϩ” w pliku o nazwie “some_file.txt” i zrobisz tak:

with open('some_file.txt', 'r') as file:
    my_str = file.read()
    lista = [ord(x) for x in my_str]
    print(lista)

to wyświetli Ci się [207, 168]. Teraz jak dobrze przeszukasz internet to znajdziesz jak udać, że napis (np, pobierany od użytkownika) jest plikiem (dokładnie: opakować w plik bez tworzenia go), a później odczytasz też plik tak jak powyżej. Nie jest to łatwe.