Seite 1 von 2

Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 20:37
von nooby
Hallo liebes Forum

Ich habe mich auf Spoj.com an der Aufgabe Dos Date versucht.http://www.spoj.com/problems/DDATE/
Auf meinem Rechner funktioniert auch alles, aber beim einschicken kriege ich ein NZEC Error. Das bedeutet doch, das Python eine Exception wirft und keine Null zurückgegeben wird.
Könnt ihr mir helfen?

Code: Alles auswählen

date = []
month_name = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 6:"June", 7:"July", 8:"August", 9:"September", 10:"Oktober", 11:"November", 12:"December"}

anzahl = int(input().split())
for i in range(1, anzahl+1):
    number = int(input().split())
    number = bin(number)
    year = int(str(number[2:13]), 2)
    month = int(str(number[13:17]), 2)
    day = int(str(number[17:]), 2)
    date.append([day, month_name[month], year])
    #print(number)
for i in date:
    print i[0], i[1], i[2]

Ach ja, hier verwende ich Python 2.7, da 3.3 nicht zur Verfügung steht.

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 20:43
von BlackJack
@nooby: Lass das doch einfach mal bei Dir auf dem Rechner laufen. Das funktioniert so weder mit Python 2.7 noch mit Python 3.3. Aber so überhaupt nicht. Selbst wenn Du die Stellen korrigierst die jeweils für Ausnahmen sorgen, liefert das nicht die richtigen Ergebnisse.

Edit: Das hier passiert bei Python 2:

Code: Alles auswählen

$ python forum7.py < test.txt
Traceback (most recent call last):
  File "forum7.py", line 4, in <module>
    anzahl = int(input().split())
AttributeError: 'int' object has no attribute 'split'
Und das hier bei Python 3:

Code: Alles auswählen

$ python3 forum7.py < test.txt
  File "forum7.py", line 14
    print i[0], i[1], i[2]
          ^
SyntaxError: invalid syntax
Und wenn man den Syntaxfehler behebt:

Code: Alles auswählen

$ python3 forum7.py < test.txt
Traceback (most recent call last):
  File "forum7.py", line 4, in <module>
    anzahl = int(input().split())
TypeError: int() argument must be a string or a number, not 'list'
Wenn das bei Dir läuft, hast Du einen *sehr* eigenartigen Python-Interpreter.

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 21:12
von nooby
Ne so läufts natürlich nicht...
Das split() ist noch von einer anderen Version, habe es aus dem Kopf geschrieben :?
Aber weisst du, wie ich den NZEC Fehler beheben kann?

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 21:59
von bords0
nooby hat geschrieben:Ne so läufts natürlich nicht...
Das split() ist noch von einer anderen Version, habe es aus dem Kopf geschrieben :?
Aber weisst du, wie ich den NZEC Fehler beheben kann?
Es wäre leichter, dir zu helfen, wenn du das tatsächliche Programm angeben würdest, und nicht eines, das du aus dem Kopf aufgeschrieben hast, das sicher nicht das tatsächliche ist.

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 22:01
von BlackJack
@nooby: In dem Du eine Version einreichst die keine Ausnahme auslöst‽

Ich habe übrigens gerade gesehen, dass es eine Codegolf-Aufgabe ist. Aus dem Stand habe ich in Python 2 128 Bytes geschafft, und die auf 121 drücken können. Sogar mit Einhalten von unter 80 Zeichen pro Zeile. :-)

Edit: Neulich übrigens erst festgestellt, dass die Bash Bitzeuchs kann:

Code: Alles auswählen

#!/usr/bin/bash
MONTH_NAMES=(January February March April May June July August September\
    October November December)
read N
for (( i = 0; i < $N; i++ )); do
    read encoded_date
    day=$(( $encoded_date & ((1 << 5) - 1) ))
    month=$(( ($encoded_date >> 5) & ((1 << 4) - 1) ))
    year=$(( ($encoded_date >> 9) & ((1 << 14) - 1) ))
    echo "$day ${MONTH_NAMES[$month - 1]} $year"
done

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 22:47
von Sirius3
106

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 23:11
von BlackJack
84 

Re: Spoj.com Dos Date

Verfasst: Mittwoch 22. Mai 2013, 23:30
von bords0
Und jetzt hat Daniel Binder 0 geschafft!

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 00:14
von BlackJack
@bords0: Verdammt, wenn ich früher submittet hätte, dann wäre ich auf Platz 1. Sirius3 und ich haben Bytes angegeben und nicht das Ergebnis bei Spoj. (Also zumindest ich habe immer Bytes angegeben.)

Und eine Lösung in JavaScript:

Code: Alles auswählen

'use strict';
var readline = require('readline');

var MONTH_NAMES = [
    'January', 'February', 'March', 'April', 'May', 'June', 'July',
    'August', 'September', 'October', 'November', 'December'
];

var main = function () {
    var reader = readline.createInterface(process.stdin, null, null, false);
    reader.once('line', function (line) {
        var n = parseInt(line);
        reader.on('line', function (line) {
            var encodedDate = parseInt(line);
            var day = encodedDate & 31;
            var month = encodedDate >> 5 & 15;
            var year = encodedDate >> 9;
            console.log('%d %s %d', day, MONTH_NAMES[month - 1], year);
        });
    });
};

main();

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 05:28
von nooby
In dem Du eine Version einreichst die keine Ausnahme auslöst‽
Und wie mach ich das?
Auf Ideone.com funktionierts ohne Probleme....
Sorry bin noch ein Anfänger :oops:

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 07:33
von BlackJack
@nooby: Du lässt einfach den Fehler weg, in dem Quelltext, den Du uns anscheinend nicht zeigen willst. Der ist in Zeile Nummer … äh, ja richtig, wir kennen den Quelltext ja nicht. :roll:

Wenn es auf Ideone mit Python 2.7 funktioniert, sollte es auch bei Spoj funktionieren. Zum Programmieren praktischer wäre es aber wirklich wenn Du Dir Python auf Deinem Rechner installierst, dann kannst Du auch interaktiv herum probieren, statt immer erst Quelltext an einen Webserver schicken zu müssen, damit er ausgeführt wird.

Edit: Haskell:

Code: Alles auswählen

import Data.Bits

monthNames = ["January", "February", "March", "April", "May", "June", "July",
    "August", "September", "October", "November", "December"]

decodeDate d = unwords [day, month, year]
  where day = show $ d .&. 31
        month = monthNames !! (shiftR d 5 .&. 15 - 1)
        year = show $ shiftR d 9

process (x:xs) = map decodeDate $ take x xs

numbers = map read . lines

main = interact $ unlines . process . numbers

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 09:27
von snafu
SPOJ packt die Eingabe doch in `stdin`, oder? Bekomme nen Runtime-Error, den ich mir nicht erklären kann. Mit folgendem Code (Länge 104):

Code: Alles auswählen

import calendar,sys
for d in map(int,sys.stdin):print'%d %s %d'%(d&31,calendar.month_name[d>>5&15],d>>9)
Was mache ich falsch?

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 09:39
von BlackJack
@snafu: Ohne jetzt über den Laufzeitfehler nachzudenken: Die erste Zeile enthält kein Datum, sondern die Anzahl der Datumszeilen die dann folgt.

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 09:46
von snafu
Ok, ich sollte die Aufgabenstellung genauer lesen... :oops:

(hatte die 5 aus dem Beispiel für nen Tippfehler gehalten :mrgreen:)

EDIT: Dann letztlich mit 108 Zeichen in Python geschafft.

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 16:11
von BlackJack
Boah, wie schnell man doch vergisst wie eklig Zeichenketten und Arrays in Forth sein können:

Code: Alles auswählen

variable month-names 12 cells 2* allot

: month-name! ( addr count i -- )
    1- cells 2* month-names +   \ turn index into address
    here 2 pick rot 2!          \ store target address and character count
    tuck here swap cmove        \ copy string to dictionary
    allot ;

s" January" 1 month-name!
s" February" 2 month-name!
s" March" 3 month-name!
s" April" 4 month-name!
s" May" 5 month-name!
s" June" 6 month-name!
s" July" 7 month-name!
s" August" 8 month-name!
s" September" 9 month-name!
s" October" 10 month-name!
s" November" 11 month-name!
s" December" 12 month-name!

: month-name@ ( n -- c-addr count )
    1- cells 2* month-names + 2@ ;

: decode-date ( n -- )
    dup 31 and .
    dup 5 rshift 15 and month-name@ type space
    9 rshift . ;

: input-number ( -- n )
    0. pad 10 stdin read-line 2drop pad swap >number 2drop drop ;

: main
    input-number 0 ?do
        input-number decode-date cr
    loop ;

main
bye
Da ist CBM BASIC V2 direkt eine Wohltat:

Code: Alles auswählen

10 DIM M$(12):FOR I=1 TO 12:READ M$(I):NEXT
20 INPUT D:T=INT(D/32):PRINT D-T*32;M$(T AND 15);INT(D/512):GOTO 20
30 DATA "JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE"
40 DATA "JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 16:46
von nooby
@Blackjack: Es ist nicht so, dass ich den Quelltext nicht mit euch teilen will...Ich hatte ihn auf dem Computer von dem ich die Frage gestellt habe nicht zur Verfügung.
Hier der Original Source. Auf Ideone.ocm funktioniert er mit dem Beispiel.

Code: Alles auswählen

date = []
month_name = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 6:"June", 7:"July", 8:"August", 9:"September", 10:"Oktober", 11:"November", 12:"December"}

anzahl = int(input())
for i in range(1, anzahl+1):
    number = int(input())
    number = bin(number)
    year = int(str(number[2:13]), 2)
    month = int(str(number[13:17]), 2)
    day = int(str(number[17:]), 2)
    date.append([day, month_name[month], year])
    #print(number)
for i in date:
    print i[0], i[1], i[2]


Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 17:04
von BlackJack
@nooby: Ja, mit den Beispielen. Aber nicht mit allen erlaubten Eingaben. Versuch mal den hier: 482337, da sollte '1 January 942' heraus kommen, Dein Programm gibt aber '1 February 1884' statt dessen aus. Und beim '1 Januar 1' also der Eingabe 545 steigt Dein Programm mit einer Ausnahme aus.

Edit: Kein einziger der `str()`-Aufrufe macht übrigens Sinn. Und zwei `int()`-Aufrufe auch nicht. Die würden Sinn machen wenn das Programm sauber programmiert wäre und `raw_input()` anstelle von `input()` verwenden würde.

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 18:26
von nooby
@BlackJack:
Ok...
Liegt es daran, dass nicht alle eingaben gleich lang sind(in Bits)?

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 22:32
von nomnom
nooby hat geschrieben:@BlackJack:
Ok...
Liegt es daran, dass nicht alle eingaben gleich lang sind(in Bits)?
Die Eingaben können eine unterschiedlich lang sein, wie es der Spielraum von 23 Bits eben zuläßt. Tag und Monat haben immer dieselbe „Länge“ (in Bits), aber das Jahr nicht unbedingt. Eine Lösung mit Bitweisen Operatoren (insbesondere & und >>) wäre schöner und effizienter.

Re: Spoj.com Dos Date

Verfasst: Donnerstag 23. Mai 2013, 23:10
von nomnom
Hm, wie bekommt man denn einen Score von 0 hin? Man kann doch nicht einfach eine leere Datei abschicken! :shock: