Welche Woche ist es?

8

Der Wochentag und der Monat des Jahres scheinen viel Aufmerksamkeit zu bekommen, aber niemand scheint sich um die Woche des Jahres zu kümmern. Ich glaube, es ist Zeit, dies zu ändern. Ihre Aufgabe ist es also, ein Programm oder eine Funktion zu schreiben, die bei Angabe eines Datums eine Ganzzahl zwischen 1 und 53 ausgibt, die der aktuellen Woche des Jahres entspricht.

Für die Zwecke dieser Herausforderung werden wir sagen, dass der erste Sonntag des Jahres den Beginn des Jahres markiert. Der einzige Fall, in dem der 1. Januar als Woche 1 betrachtet wird, ist, wenn er auf einen Sonntag fällt.

  • Die Eingabe kann ein beliebiges Datumsformat sein, das die Wochennummer (geben Sie einfach das Format in Ihrer Antwort an) für Daten zwischen 1JAN1900und nicht explizit enthält 31DEC2100.
  • Die Ausgabe ist eine Ganzzahl zwischen 1 und 53
  • Sie können alle Standardmethoden zur Bereitstellung von Eingabe / Ausgabe verwenden.

Testfälle

17MAY2017 -> 20

3JAN2013 -> 53

1JAN2017 -> 1

17MAY1901 -> 19

31DEC2100 -> 52

7JUL2015 -> 27
  • Dies ist daher gelten alle Standard-Golfregeln, und der kürzeste Code (in Bytes) gewinnt.
J_Lard
quelle
5
ISO-Wochen wären mehr Standard; IIRC basieren sie auf dem ersten Donnerstag in einem Jahr.
Neil
Können wir andere Datumseingabeformate verwenden (dh 07/07/2015)? Kann 7JUL2015sein 07JUL2015?
Stephen
@ StephenS Ja, das ist in Ordnung. 7/7/2015, 2015-07-07Sind auch gültig.
J_Lard
2
@Neil: Nicht genau mit der Standarddefinition übereinzustimmen ist hier eine gute Sache, es macht es weniger wahrscheinlich, dass das Problem nur über ein eingebautes gelöst werden kann, während es nicht schwieriger ist, es ohne zu lösen.
4
Hinweis für %UBenutzer: Wie @J_Lard hervorhebt, müssen Sie darauf achten, ob Woche 0 Woche 52 oder 53 des Vorjahres ist. Es ist Woche 53 in 2001, 2007, 2013, 2018, 2024, 2029 und wiederholt sich in einem 28-Jahres-Zyklus. Andere Jahre ist Woche 52.
Neil

Antworten:

2

Ohm , 12 33 Bytes

BEARBEITEN : Die Randfälle für "% U" wurden korrigiert .

IΩDÖ?┼╓y≤s"-12-31"C"%F"╓₧Ω
"%U"╓&

Angenommen, die Eingabe kann ein Zeitstempel sein. Erklärung zu kommen.

Probieren Sie es online aus!

Nick Clifford
quelle
1
Woche 0 ist in Jahren wie 1995 und 2023 anders.
Neil
@Neil Das stimmt, aber die Herausforderung besagt, dass die Antwort zwischen 1 und 53 liegen muss, und ich mache im Grunde das Gleiche wie alle anderen Antworten.
Nick Clifford
Entschuldigung, ich habe meine Jahre durcheinander gebracht. Wie auch immer, es ist 52 in einigen Jahren und 53 in anderen.
Neil
@Neil Los geht's.
Nick Clifford
1
In der Tat gibt dies korrekte Antworten für zB 1. Januar 2018 und 2019.
Neil
6

MATL , 50 Bytes

Vielen Dank an @Neil und @NickClifford für den Hinweis auf einen Fehler, der jetzt korrigiert wurde

ZO1)TThXJYOXIGYO&:8XO!s310=sJ4B-YOIq&:8XO!s310=sX\

Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .

Erläuterung

Dies verwendet die drei Datums- / Zeitkonvertierungsfunktionen, die es in MATL gibt:

  • XO: Datum und Uhrzeit in Zeichenfolgenformat konvertieren;
  • YO: Datum und Uhrzeit in Seriennummer umwandeln;
  • ZO: Konvertieren Sie Datum und Uhrzeit in den Vektor der Komponenten.

Die Bestimmung, ob Woche "0" 52 oder 53 werden soll, war kostspielig, da MATL keine aufrufbaren Funktionen zur Wiederverwendung des 8XO!s310=sTeils definieren kann. Die Wiederverwendung mittels einer Schleife mit einem Zweig spart nur ein Byte und erschwert die Erklärung, so dass es sich wahrscheinlich nicht lohnt.

Es könnte auch etwas gewonnen werden, wenn das Datum als Array [Jahr, Monat, Tag] eingegeben wird. aber das würde ich nicht alle drei datumsfunktionen nutzen :-)

Betrachten Sie die Eingabe '17MAY2017'als Beispiel.

       % Implicit input
       % STACK: '17MAY2017'
ZO     % Convert to date vector
       % STACK: [2017 5 17]
1)     % Get first entry: year
       % STACK: 2017
TTh    % Append [1 1]
       % STACK: [2017 1 1]
XJ     % Copy to clipboard J
YO     % Convert to date number
       % STACK: 736696
XI     % Copy to clipboard I
GYO    % Push input again. Convert to date number
       % STACK: [736696 736832]
&:     % Binary range
       % STACK: [736696 736697 736698 ... 736832]
8XO    % Convert to date string with format 'ddd': day of week
       % STACK: ['Sun'; 'Mon'; 'Tue'; ... ; 'Wed']
!s     % Sum of each row (chars are interpreted as code points)
       % STACK: [310 298 302 ...  288]
310=   % Compare with 310 (sum of 'Sun')
       % STACK: [1 0 0 ... 0]
s      % Sum of array. If is 0, it needs to be transformed into 52 or 53,
       % depending on the number of Sundays the previous year contains.
       % STACK: 20
J      % Paste from clipboard J
       % STACK: 20, [2017 1 1]
4B-    % Push [1 0 0] and subtract element-wise
       % STACK: 20, [2016 1 1]
YO     % COnvert to date number
       % STACK: 20, 736330
I      % Paste from clipboard I
       % STACK: 20, 736330, 736696
q      % Subtract 1
       % STACK: 20, 736330, 736695
&:     % Binary range
       % STACK: 20, [736330 736331 736332 ... 736695]
8XO    % Convert to date string with format 'ddd': day of week
       % STACK: 20, ['Fri'; 'Sat'; 'Sun'; ... ; 'Sat']
!s     % Sum of each row (chars are interpreted as code points)
       % STACK: 20, [289 296 310 ... 296]
310=   % Compare with 310 (sum of 'Sun')
       % STACK: 20, [0 0 1 ... 0]
s      % Sum of array
       % STACK: 20, 52
X\     % 1-based modulo
       % STACK: 20
       % Implicit display
Luis Mendo
quelle
2
Herzlichen Glückwunsch zu 50k! Ich bin direkt hinter dir :)
Digitales Trauma
1
Noch 2 Punkte ... und boom! Glückwunsch!
Jonathan Allan
Funktioniert dies mit den von Neil hervorgehobenen Randfällen? Ich weiß, dass es nicht verwendet wird %U, aber ich möchte nur sicher gehen.
Nick Clifford
Dies scheint zu denken, dass der 1. Januar 2019 in Woche 53 ist, aber es ist nur in Woche 52.
Neil
@Neil Ja, du bist richtig. Interessanterweise sind die anderen Testfälle korrekt.
J_Lard
4

JavaScript (ES6), 82 80 Byte

Nimmt Eingabe als (year,month,day).

let f =

(y,m,d)=>-~((((x=new Date(y,m-1,d))-new Date(y,0,1))/864e5+372-x.getDay())/7%53)

console.log(f(2017, 5,17)) // 20
console.log(f(2013, 1, 3)) // 53
console.log(f(2017, 1, 1)) // 1
console.log(f(1901, 5,17)) // 19
console.log(f(2100,12,31)) // 52
console.log(f(2015, 7, 7)) // 27

Arnauld
quelle
4

JavaScript (Firefox 34+), 70 Byte

with(new Date())y.value=getFullYear(),m.value=getMonth()+1,d.value=getDate()+1
f=
(y,m,d)=>new Date(y,--m,d-new Date(y,m,d).getDay()).toLocaleFormat`%U`
<div oninput=w.value=f(y.value,m.value,d.value)><input id=y type=number><input id=m type=number min=1 max=12><input id=d type=number min=1 max=31><input id=w readonly placeholder=Output>

Funktioniert, indem der erste Wochentag mit dem angegebenen Datum und dann die Wochennummer des Tages (die niemals Null ist) ermittelt werden.

Neil
quelle
+1 für with. Immer +1 für with!
Shaggy
2

Python 2, 70 64 Bytes

Eingabe => (year,month,day)

from datetime import*;lambda*v:int(date(*v).strftime('%U'))or 53

print(f(2017, 5,17)) #20
print(f(2013, 1, 3)) #53
print(f(2017, 1, 1)) #1
print(f(1901, 5,17)) #19
print(f(2100,12,31)) #52
print(f(2015, 7, 7)) #27

-6 Bytes, danke an @ovs

Wondercricket
quelle
2

JavaScript (nur Firefox), 77 Byte

Nimmt Datum als Zeichenfolge: dh Jan 1, 2017

s=>+new Date(s)[k='toLocaleFormat']`%U`||new Date(s.slice(-4)-1,11,31)[k]`%U`
powelles
quelle
Netter Versuch, aber "Woche 0" ist nicht immer dieselbe Woche (1995 und 2023 sind unterschiedlich).
Neil
Entschuldigung, falsche Testfälle. Ich sollte einen richtigen Kommentar zu der Frage abgeben.
Neil
@Neil Es sollte korrigiert werden.
Powelles
2

C #, 138 123 121 Bytes

namespace System.Globalization{d=>CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d,(CalendarWeekRule)1,(DayOfWeek)0);}

Es stellt sich heraus, dass es ein eingebautes dafür gibt, obwohl es ziemlich groß ist ...

namespace System.Globalization
{
    Func<DateTime, int> f = d =>
        CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(d, (CalendarWeekRule)1, (DayOfWeek)0);
 }
TheLethalCoder
quelle
1

Powershell, 260 + 8 = 268 Bytes

+8 Bytes wegen des -DateTimeFlags


Akzeptiert Argumente als "day month year"Format.

function W([datetime]$DateTime = (Get-Date)) {
$cultureInfo = [System.Globalization.CultureInfo]::CurrentCulture
$cultureInfo.Calendar.GetWeekOfYear($DateTime,$cultureInfo.DateTimeFormat.CalendarWeekRule,$cultureInfo.DateTimeFormat.FirstDayOfWeek)
}

Kein Powershell-Experte, kann nicht Golf spielen


Testfall

>W -DateTime "11 March 2015"
11
stevefestl
quelle