Spoj.com Dos Date

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Mittwoch 22. Mai 2013, 20:37

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.
BlackJack

Mittwoch 22. Mai 2013, 20:43

@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.
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Mittwoch 22. Mai 2013, 21:12

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?
bords0
User
Beiträge: 186
Registriert: Mittwoch 4. Juli 2007, 20:40

Mittwoch 22. Mai 2013, 21:59

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.
BlackJack

Mittwoch 22. Mai 2013, 22:01

@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
Sirius3
User
Beiträge: 10763
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 22. Mai 2013, 22:47

106
Zuletzt geändert von Sirius3 am Mittwoch 22. Mai 2013, 23:19, insgesamt 1-mal geändert.
bords0
User
Beiträge: 186
Registriert: Mittwoch 4. Juli 2007, 20:40

Mittwoch 22. Mai 2013, 23:30

Und jetzt hat Daniel Binder 0 geschafft!
BlackJack

Donnerstag 23. Mai 2013, 00:14

@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();
nooby
User
Beiträge: 91
Registriert: Montag 12. März 2012, 20:39
Wohnort: 127.0.0.1

Donnerstag 23. Mai 2013, 05:28

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:
BlackJack

Donnerstag 23. Mai 2013, 07:33

@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
Benutzeravatar
snafu
User
Beiträge: 5963
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 23. Mai 2013, 09:27

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?
BlackJack

Donnerstag 23. Mai 2013, 09:39

@snafu: Ohne jetzt über den Laufzeitfehler nachzudenken: Die erste Zeile enthält kein Datum, sondern die Anzahl der Datumszeilen die dann folgt.
Benutzeravatar
snafu
User
Beiträge: 5963
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 23. Mai 2013, 09:46

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.
BlackJack

Donnerstag 23. Mai 2013, 16:11

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"
Antworten