POLSKI SPOJ

Problem hidden
This problem was hidden by Editorial Board member probably because it has incorrect language version or invalid test data, or description of the problem is not clear.

Zadanie w systemie SPOJ (srednie)

4801. Konwersja dat

Kod zadania: WI_DATY

Różnych sposobów zapisu daty i czasu (o czym wielokrotnie się wszyscy przekonywaliśmy) jest całe mnóstwo i nierzadko z tego powodu można popaść z zupełnie niespodziewane kłopoty. Weźmy pod uwagę choćby taki aspekt problemu – Polacy zwykli zapisywać daty w naturalnej dla nich kolejności DD.MM.RR (w tej konwencji zapis 01.05.09 oznacza pierwszy maja roku 2009). Amerykanie czynią to zupełnie inaczej, stosując formę MM.DD.RR (a więc ten sam zapis dla Amerykanina oznaczać będzie piąty stycznia). Międzynarodowa norma ISO 8601 zaleca, aby daty (niezależnie od zwyczajów i konwencji lokalnych) zapisywać w konwencji RRRR-MM-DD i takiego też sposobu będziemy używać w naszym zadaniu.

Systemy komputerowe mogą wprowadzać jeszcze bardziej skomplikowane konwencje, służące np. minimalizacji rozmiaru pamięci potrzebnej do przechowywania daty.

Przyjrzyjmy się bliżej sposobowi (nazwijmy go roboczo standardem DOSFAT), w jaki poczciwy system DOS z systemem plików FAT przechowuje datę modyfikacji pliku. Używa się do tego celu jedynie szesnastu bitów i czyni się to w sposób następujący:

  • pierwszych 7 bitów koduje liczbę lat począwszy od roku 1980 (oczywistym jest, że pomysłodawcy tego rozwiązania nie przewidywali konieczności pamiętania dat sprzed tego roku, ale musieli zapewne domyślać się, że po roku 2107 cały ten wynalazek stanie się bezużyteczny)

  • kolejne 4 bity kodują numer miesiąca (tu nie ma niespodzianek – 0001 to styczeń, a 1100 to grudzień

  • ostatnie 5 bitów to numer dnia miesiąca (tu również nie natkniemy się cokolwiek niespodziewanego)

 

W tej konwencji data 18 września 2009 roku będzie więc zapisana następującym ciągiem bitów:

0011101100110010

Polecenie: napisz program, który wczyta ze standardowego wejścia datę zapisaną w konwencji DOSFAT (ciąg 16 cyfr binarnych) lub ISO8601 (ciąg 10 znaków) i wypisze odpowiadającą jej datę zapisaną w konwencji przeciwnej. Jeśli przekształcenie takie jest z jakichkolwiek powodów niemożliwe, należy wypisać słowo ERROR.

Dane wejściowe: na standardowym wejściu może pojawić się jedna z poniższych danych:

  • ciąg 16 znaków, złożony wyłącznie z cyfr 0 i 1 (data DOSFAT)

  • ciąg 10 znaków, złożony kolejno z czterech cyfr dziesiętnych, znaku minus, dwóch cyfr dziesiętnych, znaku minus i dwóch cyfr dziesiętnych (data ISO8601)

Dane wyjściowe: ciąg 10 lub 16 znaków reprezentujący datę w konwencji przeciwnej do tej, która została odczytana ze standardowego wejścia albo słowo ERROR, jeśli taka data nie istnieje.

Przykład:

Wejście:

0011101100110010

Wyjście:

2009-09-18

 

Wejście:

2009-09-18

Wyjście:

0011101100110010

 

Wejście:

0000000000000000

Wyjście:

ERROR


Dodane przez:Sławomir Wernikowski
Data dodania:2009-09-12
Limit czasu wykonania programu:1s
Limit długości kodu źródłowego50000B
Języki programowania:DOC C C# C++ 4.0.0-8 C99 strict JAVA PAS fpc PAS gpc PDF PS
Pochodzenie:Konkurs o nagrodę Dziekana WI ZUT w Szczecinie (2009)

ukryj komentarze
2011-05-18 11:19:18 Vladyslav Fedoniuk
Dziwne zadanie;)
1)Zmieniłem scanf()/printf() na cin/cout - z 30 na 90;
2) Wczytuje tylko jeden test - z 90 na 100 punktów.
2011-01-04 16:02:52 Piotr Kąkol
@Krzysztof_O - Zawsze pozostaje Ci forum. ;-)
2011-01-04 13:24:47 Krzysztof_O
To zadanie to killer :P Wprowadziłem wszystkie możliwe warunki, na ograniczenia lat, ograniczone wartości miesięcy i dni, liczby dni w poszczególnych miesiącach, lata przestępne...i dostaję 80. Z testami coś chyba jest nie tak, bo nie zwykłem mieć takich problemów z tak mało skomplikowanym zadaniem.

Ostatnio edytowany: 2011-01-04 13:27:41
2010-10-04 08:19:33 Piotr Kąkol
No to jestem w szoku. ;-)
A tym resetowaniem, to mało prawdopodobne, a co do testów, to myślę, że jednak są one stałe i Twój program coś szwankuje (bez urazy ;-) ).
2010-10-04 06:51:16 Mieszko Kamyczek
@Piotr Kąkol
Poważnie raz dostaje 80 a raz 90. Wcześniej wydawało mi się że 100 dostał.. Czy ktoś mi coś przeresetował? ;>
2010-10-03 18:38:17 Piotr Kąkol
@Mieszko Kamyczek - Jesteś pewien? Sprawdź może te programy diffem albo Winmergem. (chyba, że używasz funkcji typu rand - wtedy się nie dziwię ;-P )
2010-10-03 13:02:46 Mieszko Kamyczek
Co to za testy?

To samo rozwiązanie dostało raz 90pkt, raz 80pkt, raz 90pkt, aż w końcu 100pkt.

To chyba nie wina mojego kodu..
2010-07-02 17:36:28 Michał Woś
przez luty męczyłem sie pół dnia z tym xD

Ostatnio edytowany: 2010-07-02 17:37:14
2010-02-22 20:50:23 Tomasz Bińczycki
słabe te testy...
2010-01-28 20:55:37 Piotr Stawarski
@Autor zadania / testow:
W tresci jest napisane ze format danych jest DOSFAT lub ISO8601, wiec nie ma mowy o zlych danych, aczkolwiek w testach sie pojawiaja - to o czym mowil Dominik. Troszke to glupie...
SPOJ System © 2012 Sphere Research Labs | Projekty informatyczne i aplikacje na zamówienie. All Rights Reserved.