Australier lieben Feiertage und trinken gerne. Der 26. Januar war gestern in Australien ein Feiertag. Ich war froh, gestern nicht auf der Arbeit zu sein und gespannt darauf, wann ich das nächste Mal einen Feiertag habe! Leider hatte ich etwas zu viel zu trinken, und ich kann es nicht selbst herausfinden.
Schreiben Sie ein Programm, das ein Datum in australischer Datums- / Zeitnotation (TT / MM) als Eingabe verwendet und die Anzahl der Tage bis zum nächsten Feiertag ausgibt. Da ich in Queensland (QLD) wohnhaft bin, interessiere ich mich nur für Feiertage, die Queensländer betreffen :
25/03 | Karfreitag
26/03 | Ostersamstag
28/03 | Ostermontag
25/04 | Anzac Day
02/05 | Tag der Arbeit
03/10 | Geburtstag der Königin
25/12 | Weihnachtstag
26/12 | Weihnachtstag
27/12 | Weihnachtstag Urlaub
Beachten Sie auf der Website Folgendes:
Weihnachtstag Urlaub
Ein zusätzlicher Feiertag, der hinzugefügt wird, wenn der Neujahrstag, der Weihnachtstag oder der Boxtag auf ein Wochenende fallen.
Da der Weihnachtstag am Sonntag ist, gibt es einen zusätzlichen gesetzlichen Feiertag. Der Weihnachtstag ist immer noch ein Feiertag.
Da ich eine Morgenperson bin, sollten Sie das aktuelle Datum als Tag angeben (da dies die wahrscheinlichste Zeit ist, an der ich Ihr Programm für den nächsten Feiertag überprüfe). Das heißt, wenn das Datum eines Feiertags eingegeben wird, sollte Ihre Ausgabe sein 0
; Wenn der Tag vor einem Feiertag eingegeben wird, wird Ihre Ausgabe sein 1
.
Ich interessiere mich nur für Daten zwischen jetzt (dem 27/01) bis zum Ende des Jahres. Das letzte Datum, das Sie berücksichtigen müssen, ist der 31.12., An dem Ihre Ausgabe erfolgt 1
(für den Neujahrstag).
Standardlücken sind verboten.
Eingang
- Die Eingabe erfolgt immer aus 5 Zeichen: 4 Buchstaben, die durch einen Bindestrich
-
oder einen Schrägstrich getrennt sind/
- Die Eingabe erfolgt nur zwischen dem 27.01. Und dem 31.12
Ausgabe
- Die Anzahl der Tage bis zum nächsten Feiertag in Queensland, Australien, einschließlich des Eingabedatums: sollte eine Zahl zwischen
0
und sein153
(die längste Lücke). - Keine neuen Zeilen oder Fehler
Beispiele
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Hoffentlich ist das klar und nichts wird vermisst; Dies ist jedoch meine zweite Frage. Ich freue mich über jegliches Feedback und werde mein Bestes tun, um Probleme so schnell wie möglich zu beheben.
Antworten:
Pyth ,
98846267 BytesUpdate: 14 Bytes wurden gespeichert, indem die Liste der Tageszählung für alle 12 Monate für die Berechnung der Tagesanzahl gekürzt wurde. Habe noch keine gute Möglichkeit gefunden, die andere Liste zu komprimieren!
Update2: Weitere 22 Bytes wurden gespeichert, indem die Liste der Tageszahlen als base256-Zeichenfolge endcodiert wurde.
Probieren Sie es online!
Gleicher Algorithmus wie in meiner Python-Antwort. Und kein eingebautes Gerät, um den Tag des Jahres zu bekommen, also musste ich es selbst machen. Das Erstellen dieser 2 Listen für die Berechnung des Tages des Jahres und für die Tage der Feiertage ist ziemlich kostspielig. Schauen Sie sich das noch einmal an und versuchen Sie, sie in weniger Bytes zu generieren.
quelle
Visual Basic für Applikationen, 155 oder 118 Bytes
Version 1 - Gebietsschemaunabhängig, 155 Byte
Version 2 - abhängig vom Gebietsschema, 118 Byte
Die Byteanzahl gilt für die endgültige .BAS-Datei, einschließlich der Zeilenvorschubzeichen. Wird außerhalb des Standard-VBA-Editors bearbeitet (da zusätzliche Leerzeichen und ausführliche Formulare einiger Schlüsselwörter erforderlich sind). Importiert und funktioniert jedoch problemlos in jeder Office-Anwendung (zum Testen von Text, z. B.
? h("10/08")
in einem unmittelbaren Fenster oder in Excel, direkt in einer Zellenformel).(BEARBEITET) Ursprünglich habe ich mich dafür entschieden
DateSerial
, die Funktion für das Gebietsschema sicher zu machen (Version 1). Da ich in Brasilien lebe und mein System so konfiguriert ist, dass es das Format "TT / MM / JJ" für Datumsangaben verwendet (genau wie in Australien), könnte ichCDate
stattdessen eine noch kleinere Version schreiben (Version 2).CDate
Verwendet Informationen zum Systemgebietsschema, um Text in Datum zu konvertieren. Ich habe in dieser Version auch angenommen, dass der Code nur im Jahr 2016 ausgeführt wird (wenn das Jahr weggelassen wird (-6 Byte)CDate
, wird das aktuelle Jahr gemäß der Systemuhr angenommen).Die Nummer 42454 in der dritten Zeile ist die Summe von 42450, die die numerische Darstellung von 01/01/2016 in VBA darstellt, und 84, die den Tag des Jahres für den ersten Feiertag darstellt. Das Array enthält den Tag des Jahres für jeden Feiertag (einschließlich 01.01.2017), versetzt um -84, da dies einige Stellen kostet. Bei Verwendung von 16 anstelle von 2016 werden
DateSerial
zwei weitere Bytes entfernt.Neunmaliges Erstellen eines identischen Arrays innerhalb der Iteration ist "fehlerhafter" Code, funktioniert jedoch und speichert 3 weitere Bytes (eines für den Arraynamen und eines für das Gleichheitszeichen außerhalb der Schleife und eines für den Verweis auf das Array innerhalb der Schleife).
Die "fehlenden" Leerzeichen zwischen 0 und dem folgenden Schlüsselwort in der zweiten und vierten Zeile sind nicht erforderlich, da sie von VBE beim Import des Moduls automatisch wieder eingefügt werden. Verwendet veraltet, aber bytegünstig
If <...> Goto <linenumber>
, um die Schleife zu verlassen (beidesIf <...> Then Exit For
undIf <...> Then Exit Function
mehr Zeichen).Es wurde auch die Tatsache ausgenutzt, dass sich der Funktionsname in VBA als lokale Variable verhält und sein Wert am Ende der Ausführung automatisch von der Funktion zurückgegeben wird.
quelle
JavaScript (ES6),
131128 ByteErläuterung
Verwendet den integrierten JavaScript-
Date
Konstruktor, um die Eingabezeichenfolge in eine Anzahl von Millisekunden seit der Epoche zu konvertieren, und vergleicht diese dann mit der Anzahl von Millisekunden für jeden Feiertag.Dazu werden die Feiertage in einem Array als Anzahl der Tage seit einem Bezugsdatum gespeichert. Ich habe mich
2016-01-29
für das Referenzdatum entschieden, da die Anzahl der Millisekunden seit der Epoche für dieses Datum am kürzesten ist. Eine beliebige Anzahl von Millisekunden zwischen diesem und dem nächsten Tag funktioniert, da das Ergebnis abgerundet ist und die mittlere Zahl keine Sommerzeiteffekte verursacht (obwohl die Zeitzone des OP keine Sommerzeit hat). Die Zahl dieses Tages ist1453986000000
und aufrunden1454000000000
(Hinzufügen von ein paar Stunden) bedeutet, dass es als geschrieben werden kann1454e9
.Prüfung
Diese Lösung ist abhängig von der Zeitzone des Benutzers. Dies funktioniert in der Zeitzone des OP (und meiner) (GMT +1000). Wenn Sie wollen , dass es in einer anderen Zeitzone zu testen, das Hinzufügen
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
zum Stichtag Nummer sollte funktionieren. (zB GMT + 0430 wäre-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Code-Snippet anzeigen
quelle
separated with a hyphen - or slash /
ein bisschen ambitioniert ist. Für mich bedeutet das, dass wir uns um beides kümmern müssen, aber ich kann definitiv Ihre Seite sehen. Ich denke, das OP sollte das klarstellen.T-SQL,
210,206, 194 Bytes(Erster Beitrag hier, hoffe das ist ok, aber bitte sei nett :)
Die Eingabe
@i
erfolgt für beide/
und-
als Trennzeichen. Ich bin in Australien und habe das gleiche Datumsformat wie @TasUpdate
varchar
zuchar
sparen 3 Byte plus entfernt , um einen Raum :)Update 2 deklarieren
@c
und ohne Auswahl zuweisenquelle
T-SQL, 296 Bytes
Erstellt als Tabellenwertfunktion
Wird auf folgende Weise verwendet
Eine kurze Erklärung
quelle
JavaScript (ES6), 134 Byte
user81655 hat mich immer noch um 3 Bytes geschlagen, aber ich kann nirgendwo anders etwas finden, um hier rauszuquetschen. Berechnet die Anzahl der verstrichenen Tage, anstatt das Datum zu verwenden, und vergleicht es dann mit einer Reihe von Urlaubsversätzen.
quelle
Python 2,
204185165166 BytesUpdate: Ich habe es um ~ 20 Bytes reduziert, indem ich den Tag des Jahres selbst berechnet habe. Keine Notwendigkeit für die langen Importe mehr :)
Update 2: Weitere 20 Bytes weniger, wenn ich feststelle, dass ich Silvester genauso wie Tag 367 behandeln und einige andere kleine Anpassungen vornehmen kann.
Probieren Sie es online!
Ungolfed:
Speichert die Anzahl der Feiertage am Tag des Jahres in einer Liste, filtert diejenigen heraus, die vor dem angegebenen Datum liegen, nimmt das erste Element in dieser gefilterten Liste und subtrahiert den Tag des Jahres, der wurde aus der Eingabe berechnet.
quelle
PHP, 116 Bytes
Ziemlich direkter Ansatz. Es speichert die Tage des Jahres für die Feiertage und zeigt sie an, solange sie in der Vergangenheit liegen. Schließlich wird der gewünschte Tag des Jahres abgezogen.
Hinter allen Testfällen. Wird über die Befehlszeile ausgeführt und akzeptiert die Eingabe mit einem Bindestrich wie folgt:
quelle
Ruby 1.9.3,
155153 BytesNach den Weihnachtsferien brauchen wir unseren Super-Spezial-Tag 366! Ähnlich wie bei @DenkerAffe.
Verwendung:
quelle
05AB1E , 45 Bytes
Es ist vielleicht nicht mehr 2016, aber wie auch immer.;) Ich gehe immer noch davon aus, dass das Jahr 2016 ist, um ein Schaltjahr
29
für den Februar zu werden.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E an (Abschnitte Wie komprimiere ich große Ganzzahlen? Und Wie komprimiere ich Ganzzahlenlisten? ) , Um zu verstehen, warum dies so
•9JRt€ª´Q®Ië•
ist10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
ist[85,86,88,116,123,277,360,361,362,367]
; und•Σ₁t•
ist5354545
.quelle