Oh Mann, dieses Verfallsdatum schreibt die Monate nicht mit Buchstaben! Ich kann nicht sagen , ob es am 10. März auslaufenden ist oder 3. Oktober ... Bitte warten, nein, geschweige denn, das Jahr 2012 sagt (Alley-Oops Ziegel Käse in den Müll Hälfte verwendet wird, kann ein Pro mögen)
Nehmen wir für einen Moment an, Sie sind zu beschäftigt, um zu überlegen, wann dieses Glas Marinara abläuft. Sie möchten nur die Cliff Notes-Version: Wie wahrscheinlich ist es, dass sie überfällig ist? Schreiben wir einen Code!
Sie wissen, dass die Hersteller das Datum als geordnetes Dreifach von ganzen Zahlen in einem von drei Formaten drucken:
YEAR MONTH DAY
MONTH DAY YEAR
DAY MONTH YEAR
Und Sie wissen, dass einige Daten nur auf eine oder zwei Arten interpretiert werden können, nicht alle drei: Die 55 in 55-11-5
müssen ein Jahr sein, was bedeutet, dass diese spezielle Box von Twinkies am 5. November 1955 abgelaufen ist. Das Jahr wird manchmal vierstellig und angegeben Nicht zwei, die einige Optionen ausschließen können. Wenn es sich jedoch um zwei Ziffern handelt, bedeutet 50..99 1950..1999 und 0..49 2000..2049.
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die ein Array von Ganzzahlen verwendet, das in mindestens einer der obigen Interpretationen ein gültiges Datum ist, und eine prozentuale Wahrscheinlichkeit ausgibt, dass es immer noch gut ist. Die prozentuale Wahrscheinlichkeit ist einfach der Prozentsatz der gültigen Interpretationen des Datums, die am oder nach dem heutigen Datum liegen.
Das Array von Ganzzahlen ist der [Int]
Typ der Länge drei für Ihre Sprache, wenn es sich um ein Argument für eine Funktion handelt, und wird entweder als durch Bindestriche, Schrägstriche oder Leerzeichen getrennte Ganzzahlen (Sie können Ganzzahlen auswählen) angegeben, wenn sie als Eingabe für STDIN für a verwendet werden Volles Programm. *
"Heutiges Datum" kann das aktuelle Datum sein, das über eine Datumsfunktion ermittelt wurde, oder das Datum, das in einem zusätzlichen Argument für die Funktion oder einem zusätzlichen Parameter in STDIN angegeben wurde. Es kann in Unix-Epoche Sekunden sein, ein weiteres Jahr-Monat-Tag-Tripel, das auf eine der drei oben genannten Arten eingegeben wurde, oder eine andere bequemere Art und Weise.
Lassen Sie uns einige Beispiele haben! Die Eingabe des Ablaufdatums erfolgt im strichgetrennten Stil. In den folgenden Beispielen wird davon ausgegangen, dass das heutige Datum der 5. Juli 2006 ist.
14-12-14
- Beide gültigen Interpretationen (DMY und YMD) entsprechen dem Stand vom 14. Dezember 2014. Die Ausgabe beträgt 100, da dieses Produkt definitiv noch gut ist.8-2-2006
- Die letzte Zahl ist sicher ein Jahr, da sie vierstellig ist. Dies könnte entweder der 8. Februar (abgelaufen) oder der 2. August (immer noch gut) sein. Die Ausgabe ist 50 .6-7-5
- Das könnte alles sein! Die Interpretation "5. Juli 2006" ist immer noch gut (nur für einen Tag), aber die verbleibenden beiden sind beide im Jahr 2005 und sollten so schnell wie möglich geworfen werden. Die Ausgabe ist 33 .6-5-7
- Hier sind zwei von drei Interpretationen sicher. Sie können Ihre Dezimalstelle auf- oder abrunden, also sind 66 oder 67 beide in Ordnung.12-31-99
- Okay, dieser stammt eindeutig aus der Jahrhundertwende (Jahre von 50 bis 99 sind 19XX, und 31 kann unmöglich ein Monat sein). Eine große fette 0 , und Sie sollten Ihren Kühlschrank wirklich öfter ausräumen.
Sie können davon ausgehen, dass Eingaben, die den oben genannten Standards nicht entsprechen, nicht mit den oben genannten Ausgaberegeln übereinstimmen.
Keine Webanfragen oder Standardlücken. Datumsbearbeitungsbibliotheken sind zulässig. Das ist Codegolf: Möge das kürzeste Programm gewinnen.
* Wenn Sie Brainfuck oder eine ähnlich datentypbehinderte Sprache verwenden, können Sie davon ausgehen, dass die ASCII-Werte der ersten drei Zeichen in der Eingabe die Ganzzahlen für das Datum sind. Dies schließt natürlich die vierstellige Jahreslogik aus, aber ich denke, wir wären zu erstaunt, wenn wir in Brainfuck eine Lösung dafür finden würden, um Sie dafür zu beleidigen.
Antworten:
k4
(90)(88)(87)(82)Rufen Sie mit
x
of.z.D
(ein eingebautes) zum Vergleich mit dem heutigen Tag oder mit einem Datums-Literal Ihrer Wahl auf:Dies ist im Grunde eine Portierung von @ Alex-ls Python-Lösung, mit einigen zusätzlichen Golf-Tricks:
quelle
"012201210"
, da#
die Elemente zyklisch übernommen werden. In der Tat, können Sie ein zweites Zeichen auf diese Weise sparen , indem sie die beiden letzten Fällen tauschen:3 3#.:'"0122102"
.{c*(+/~d<x)%3-+/^d:{"D"$"."/:$|z,y,x+(c*19+x<50)*x<c::100}.'y@/:3 3#.:'$21020101}
.Ruby, 115 Zeichen
Dies definiert eine Funktion
f
, die zwei Argumente akzeptiert: ein Array, das die Eingabe enthält, und das "heutige" Datum.Beispiele:
quelle
Python 2.7 - 172
Ich benutze das datetime-Modul für die Gültigkeit und den Vergleich von Daten. Wenn
date
die Eingabe keine gültige Datums- / Uhrzeitangabe enthält, wird sie ausgelöstValueError
. Auf diese Weises
ergibt sich die Summe der nicht abgelaufenen Daten undt
die Gesamtzahl der gültigen Daten. Ich nutze die Tatsache, dassTrue == 1
zum Zwecke des Hinzufügens und Indizierens in Python. Ich speichere ein Zeichen auch, indem ich 25 * (76,80) anstelle von (1900,2000) verwende.Beachten Sie, dass die Zeilen in der zweiten Ebene der Einrückung ein Tabulatorzeichen und keine zwei Leerzeichen enthalten.
Fügen Sie dies zum Testen am Ende hinzu:
quelle
PowerShell,
183173168Eingabe wie
int[]
über Parameter, ztry
/ stummgeschaltetcatch
, solange ich nicht weiß, ob die Ausgabe auf stderr erlaubt ist oder nicht.+"-1"
das Datum, das interpretiert wird.AddDays(-1)
, um das aktuelle Datum um einen Tag zu verschieben, damit wir es mit dem von gestern vergleichen können (anstatt nur heute). Dies löst das Problem, dass wir ein Datum mit 0:00 als Uhrzeit erhalten, aber mit einem Datum mit der Uhrzeit von heute vergleichen müssen.quelle
R 269
Ich hatte erwartet, dass dies in R einfach sein würde, aber die einstelligen Jahre waren eine ziemlich große Kurve. Ich denke, das könnte viel besser sein als es ist.
lubridate
ist ein Paket von CRAN, mit dem Sie es möglicherweise installieren müsseninstall.packages("lubridate")
.Verwendung:
f(c(d1,d2,d3))
Woc(d1,d2,d3)
ist ein Vektor von ganzen Zahlen.zB
f(c(6,10,14))
kehrt zurück0.3333333
.Das
lubridate
Paket verfügt über eine Reihe von Wrapper-Funktionen zum Parsen von Datumsangaben in verschiedenen Reihenfolgen. Ich benutze diese, um zu sehen, welche Formate gültige Daten erzeugen, die ungültigen wegwerfen und dann sehen, welche noch nicht aufgetreten sind.quelle
Mathematica,
163153164 Bytes( Bearbeiten: feste Daten außerhalb des Bereichs von 1950 bis 2049)
Dies definiert eine Funktion, die Sie gerne aufrufen können
Derzeit ist der Prozentsatz nicht gerundet (warten, bis das OP geklärt ist).
Hier ist eine etwas längere Erklärung , die ohne Mathematica Wissen (Anmerkung , die verständlich sein sollte
&
alles links davon eine anonyme Funktion , deren Parameter macht , wird als#
,#2
,#3
...):Dies definiert eine Funktion, die 3 Parameter
a,b,c
in 3 Listen umwandelt{{a,b,c},{c,b,a},{c,a,b}
. Beachten Sie, dass dies##
nur eine Folge aller Parameter ist.Auf das Verfallsdatum angewendet, gibt dies eine Liste
{y,m,d}
für jede der drei möglichen Permutationen.Dies ist eine anonyme Funktion, die drei Parameter verwendet
a,b,c
und eine Liste der drei zurückgibt, wobei die erste gemäß den angegebenen Regeln in ein Jahr konvertiert wurde: Zahlen zwischen50
und99
(Modulo100
) werden in ein Jahr des 20. Jahrhunderts umgewandelt, Zahlen zwischen0
und49
( modulo100
) werden in ein Jahr des 21. Jahrhunderts verwandelt, alle anderen bleiben mit. Hier##2
ist eine Folge von Parametern beginnend mit dem zweiten, dhb,c
.Auf jedes der drei vorherigen Ergebnisse angewendet, kanonisiert dies nur die Jahresformate. Nennen wir dies
canonicalDates
, um den folgenden Ausdruck abzukürzen:Dadurch werden ungültige Interpretationen herausgefiltert.
DateList@d
macht eine vollständige{y,m,d,h,m,s}
Darstellung aus verschiedenen Datumsformaten. Es interpretiert Listen in der gleichen Reihenfolge, aber der Haken ist, dass Sie es weitergeben können , wie{8,2,2006}
in welchem Fall es berechnet8 years + 2 months + 2006 days
. Wir überprüfen also, ob die ersten drei Elemente der zurückgegebenen Liste mit der Eingabe identisch sind (was nur passieren kann, wenn Monat und Tag in den entsprechenden Bereichen liegen).Um die folgenden Zeilen zu verkürzen, verweise ich
validDates
ab sofort auf das Ergebnis dieses Ausdrucks :Eine weitere anonyme Funktion, die ein Datum annimmt und die Differenz in Tagen zum heutigen Tag zurückgibt (erhalten von
Date[]
).Ordnen Sie das den gültigen Datumsinterpretationen zu.
Eine weitere anonyme Funktion, die bei gegebener list (
#
) den Prozentsatz der nicht positiven Zahlen in dieser Liste zurückgibt. Das.
ist keine Multiplikation, sondern nur die Dezimalstelle, um rationale Zahlen als Ergebnis zu vermeiden (Sie würden Dinge wie100/3
anstelle von erhalten33.333
- ich weiß eigentlich nicht, ob das ein Problem ist).Bezogen auf die Liste der Datumsunterschiede ergibt dies den Anteil der Interpretationen, die noch nicht abgelaufen sind.
quelle
JavaScript (E6) 159
164 172Edit Danke an nderscore für die Hinweise und dafür, dass ich zum Nachdenken angeregt habe. Reorganisation von D unter Vermeidung von Parametern und Abschneiden von Zeichen.
Edit 2 Ein weiterer Trick von nderscore, bei dem 2 Funktionen zu 1 zusammengeführt wurden. Dann wurden zwei Klammern entfernt, um kommagetrennte Ausdrücke zu einem zusammenzuführen. Lesbarkeit in der Nähe von 0. Nebenbemerkung: Durch Nichtrunden können weitere 2 Zeichen (| 0) eingespart werden.
Test In FireFox Konsole
Ausgabe:
Ungolfed
NB D-Funktion versucht, ein Datum mit einem bestimmten Jahr, Monat oder Tag zu erstellen, gibt jedoch false zurück, wenn das Erstellungsdatum nicht der beabsichtigten Zeit entspricht (! = Tag oder Monat).
quelle
C # in LINQPad -
446408272 BytesDritte Änderung: Vielen Dank an Le Canard fou, der darauf hingewiesen hat, dass DateTime.Today korrekt ist und nicht DateTime.Now. Second Edit: Danke VisualMelon für diese clevere Lösung!
Edit: Danke an podiluska und edc65, die mir geholfen haben, den Code zu verkürzen! Ich bemerkte auch, dass meine Lösung nicht korrekt war, wenn die Eingabe für das Jahr 4 Byte lang war. Deshalb habe ich das Problem behoben. Die Punktzahl für diese Lösung beträgt 408 Bytes.
Auch wenn ich keine der vorherigen Antworten geschlagen habe, wollte ich dennoch meine C # -Lösung freigeben. Hilfe / Vorschläge sind willkommen! ;)
Formatierte und ungolfierte Version:
Ich habe versucht, eine Lösung zu finden, bei der das "DateTime.TryParse" -Teil nicht wie in dieser Lösung wiederholt wird, aber 21 Byte länger ist.
Lösung ohne Wiederholung von "DateTime.TryParse": 467 Bytes
Ungolfed-Version:
quelle
int s=0;int a=d[2];int b=d[1];int e=d[0];
->int s=0,a=d[2],b=d[1],e=d[0];
DateTime.TryParse
Anrufe war mein erster Instinkt und ersetzte es durch ein Lambda, das auch den Wert zurück in q setzte. Führen Sie auch einige andere Schritte ( Pastebin ) aus, um 328void g(int[]d){var q=new List<DateTime>();var p=".";int a=d[2],b=d[1],e=d[0],y;DateTime c;y=(a<100)?(a>49)?1900+a:2000+a:a;Action<string>z=(x)=>{if(DateTime.TryParse(x,out c))q.Add(c);};z(e+p+b+p+y);z(b+p+e+p+y);y=(e<100)?(e>49)?1900+e:2000+e:e;z(a+p+b+p+y);(q.Where(i=>i>=DateTime.Now).Count()*100/(q.Any()?q.Count:1)).Dump();}
Action<string>
vor, so konnte ich etwas von Ihnen lernen;) ich in der Lage war zu 318 Zeichen Ihre Antwort unten zu erhalten durch Ersetzenq.Where(i=>i>=DateTime.Now).Count
mitq.Count(i=>i>=DateTime.Now
. Ich habe auch die Klammern entfernt,x
damit ich 2 weitere Zeichen speichern kann!Haskell,
171165 ZeichenDer Name der Funktion lautet
%
. Führen Sie das Testdatum als Tupel in kanonischer (y, m, d) Reihenfolge mit dem tatsächlichen Jahr und dem Kartonstempel als Tupel mit drei Zahlen aus:quelle
Erlang, 146
Testfunktion wäre:
Ungolfed
Diese Lösung basiert auf Listenverständnissen. Es leiht den Modulo-Trick für das Jahr aus der Haskell-Lösung. Es wird auch verwendet
calendar:valid_date/1
, um unmögliche Daten aufgrund der Anzahl der Tage in einem bestimmten Monat zu verarbeiten (z. B. "29-2-2" kann nur im YMD-Format sein). Außerdem ist Today im Erlang-date()
Format (ein YMD-Tupel).quelle
APL (85)
Dies verwendet einige der neuen Funktionen von Dyalog APL 14, jedoch keine externen Bibliotheken. Zur Abwechslung funktioniert es auf TryAPL .
Dies ist eine Funktion, die das Array mit 3 Elementen als
⍵
Argument für die rechte Seite ( ) und das zu überprüfende Datum als⍺
Argument für die linke Seite ( ) als Ganzzahl desYYYYMMDD
Formats verwendet. Das heißt, das Datum2014-07-09
wird als Zahl dargestellt20140709
.Prüfung:
Erläuterung:
Z←(⊂⌽⍵),(⊂2⌽⍵),⊂⍵
: Verwandle das angegebene Datum in das YMD-Format, indem du(⊂⌽⍵)
es um 2 nach links drehst(⊂2⌽⍵)
oder einfach nichts tust⊂⍵
. Mindestens eines davon ist jetzt ein richtiges Datum im YMD-Format, möglicherweise mehr als eins, wenn das Datum nicht eindeutig ist.{∧/12 31≥1↓⍵}¨Z
: Testen Sie, ob jedes Datum gültig ist: Das Jahr (erstes Element) wird gelöscht, und dann darf der Monat nicht höher als 12 und der Tag nicht höher als 31 sein.Z/⍨
: Filter die gültigen Daten vonZ
.{
...}¨
: für jedes gültige Datum:⍵+(99≥⊃⍵)×3↑1900+100×50>⊃⍵
: Wenn das Jahr nicht höher als 99 ist, addieren Sie 1900 und 100, wenn das Jahr niedriger als 50 ist.(3/100)⊥
: decodiere es, als ob es eine Menge von Basis-100-Zahlen wäre. (Das Jahr ist höher als 100, aber das spielt keine Rolle, da es das erste Element ist.) Dies gibt eine Zahl für jedes gültige Datum im gleichen Format wie das linke Argument an.⍺≤
: Überprüfen Sie für jedes Datum, ob es nicht kleiner als ist⍺
. Dies ergibt einen binären Vektor, wobei 1 bedeutetOK
und 0 bedeutetspoiled
.100×(+/÷⍴)
: Teilen Sie die Summe des binären Vektors durch seine Länge und multiplizieren Sie mit 100.quelle
{100×(+/÷⍴)⍺≤((3/100)⊥⊢+(99≥⊃)×3↑1900+100×50>⊃)¨Z/⍨{∧/12 31≥1↓⍵}¨Z←(⌽⍵)(2⌽⍵)⍵}
Java: 349 Zeichen (3 ohne Leerzeichen)
Hier ist eine enthaltene Klasse, die zum Testen verwendet werden kann, einschließlich einer (leicht) entgolften Version der Methode:
Dies ist meine erste Runde Codegolf, und ich glaube, ich habe herausgefunden, warum ich normalerweise nicht sehr viele Java-Golfer sehe.
quelle
int[]
Argument als Argument akzeptieren , nicht dreiint
.C # 287 Bytes
Das erste Mal Golf spielen, auf der Suche nach Ratschlägen. Insbesondere das Entfernen von Bytes aufgrund von Namespace.
Missbrauch der Tatsache, dass nur eine Funktion erforderlich ist, kein tatsächliches Programm. Außerdem führt die Funktion immer zu einer nicht erfassten Ausnahme.
Ungolfed
quelle
Mathematica , 118
Mit dem Code von m.buettner als Ausgangspunkt habe ich ein paar Verbesserungen:
quelle