Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die einen Wochentagsnamen eines Datums berechnet, das ein Benutzer eingibt.
Input-Output
Die Eingabe ist eine Zeichenfolge YYYYMMDD
.
Beispiel für Eingabewerte:
20110617: 17. Juni 2011 19040229: 29. Februar 1904 06661225: 25. Dezember 666 00000101: 1. Januar 0 99991231: 31. Dezember 9999
Sie können davon ausgehen, dass alle Eingaben gültig sind. Beachten Sie, dass das Jahr Null gültig ist.
Die Ausgabe ist eine Ganzzahl zwischen 0
und 6
. Jede Ganzzahl steht für einen Wochentagsnamen. Sie können frei entscheiden, welche Ganzzahl einen Wochentagsnamen wie diesen darstellt
0: Montag 1: Dienstag 2: Mittwoch ... 6: Sonntag
(in der Reihenfolge) oder dieser
0: Montag 1: Mittwoch 2: Sonntag ... 6: Samstag
(nicht in der Reihenfolge).
Testfälle
Eingabe Wochentag Ausgabe ([0..6 -> Montag..Sonntag] wird in diesem Beispiel verwendet.) 20110617 Freitag 4 19500101 Sonntag 6 22220202 Samstag 5 19000228 Mittwoch 2 19000301 Donnerstag 3 19450815 Mittwoch 2 19040229 Montag 0 19040301 Dienstag 1 17760704 Donnerstag 3 20000228 Montag 0 20000229 Dienstag 1 20000301 Mittwoch 2 20121223 Sonntag 6 00000401 Samstag 5 66660606 Mittwoch 2 59161021 Samstag 5
Beschränkung
Sie dürfen nicht nutzen jede Art von Funktion / Klasse / ..., die Zeitstempel oder das Datum beziehen, wie Date
Klasse in Java
/ JavaScript
/ ActionScript
oder getdate
Funktion in PHP
.
Sie sollten den Gregorianischen Kalender verwenden , der jetzt von vielen Menschen verwendet wird.
Natürlich gewinnt der kürzeste Code. Wenn zwei Codes die gleiche Länge haben, gewinnt der Code mit den höchsten Stimmen.
(Fällig: Wenn es mehr als 5 Codes gibt, die mehr als (oder gleiche) +1
Stimmen haben.)
echo 4
.Antworten:
Ruby,
9592 ZeichenEinfache, unkomplizierte Ruby-Implementierung mit 0: Montag, ...
quelle
PHP -
10197103125 ZeichenCode
Hinweis
Aufgrund der dynamischen, schwachen Typisierung von PHP funktioniert der Sakamoto-Algorithmus leider nicht richtig, ohne jede Divisionsoperation explizit zu belegen.
quelle
y+y/4-y/100+y/400
.y=4
In diesem Fall wird 4 zurückgegeben, anstatt der korrekten 5 vony+y/4+y/100+y/400
(wo nur die ersten beiden Terme ins Spiel kommen). Das ist es, was meine JavaScript-Antwort plagt. Ist es möglich, dass anstelle von Ints Doubles erstellt werden? (Mein PHP ist zu schwach, um es zu wissen.)C - 129
Dies missbraucht, wie die Division zumindest auf meinem System (Linux x86) gegen Null rundet.
Die magische Konstante
86400
dient zwei Zwecken:Es ist auch die Anzahl der Sekunden pro Tag.
quelle
y+=m>2;
stattm>2?y++:0;
und rasieren Sie ein paar Bytes aus.Javascript,
126123 ZeichenVerwendung des Sakamoto-Algorithmus mit 0 = Sonntag:
Ich vermute, die Spaltungen können zusammenbrechen, aber im Moment sehe ich es nicht.
Bearbeiten: Die Unterteilungen wurden verbessert (keine Notwendigkeit,
~~
wenn Sie nur können~
).quelle
Python 2 ,
83116113109 BytesImplementiert den Sakamoto-Algorithmus . Golfvorschläge sind willkommen. Probieren Sie es online!
Edit:
Ich hätte das schon vor Ewigkeiten beheben sollen.-6 Bytes von Jonathan Allans Vorschlägen +2 Bytes, um den Code tatsächlich zu reparieren.quelle
int('032503514624'[m-1])
Paraden 6Perl - 110 Bytes
Hier ist eine Lösung, die mit perl -p source.pl ODER perl -pe 'here-is-code' ausgeführt werden kann.
Kopieren Sie einfach die Testfälle nach stdin.
Dies scheint der einzige Code ohne Variablen, String-Konstanten und Divisionen zu sein.
quelle
JavaScript (ES6), 73 Byte (nicht konkurrierend)
Versuch es
quelle