Ermitteln Sie anhand eines Jahres und eines Monats den Prozentsatz der Arbeitstage in diesem Monat. Die Arbeitstage sind Montag bis Freitag, ohne Rücksicht auf Feiertage oder andere besondere Dinge. Der Gregorianische Kalender wird verwendet.
Eingang
Ein Jahr und ein Monat im ISO 8601-Format (JJJJ-MM). Das Jahr hat immer vier Ziffern, der Monat hat immer zwei Ziffern. Das angegebene Jahr wird nicht vor 1582 liegen.
Ausgabe
Die Ausgabe ist der Prozentsatz der Arbeitstage (gemäß obiger Definition) im angegebenen Monat, gerundet auf eine ganze Zahl. Es folgen keine Prozentzeichen oder Bruchstellen.
Probe 1
Input Output
2010-05 68
Probe 2
Input Output
2010-06 73
Probe 3
Input Output
1920-10 68
Probe 4
Input Output
2817-12 68
Eine Woche ist vergangen, eine Antwort wurde angenommen. Für die Neugierigen, die Größe der Einsendungen, die wir in unserem Wettbewerb erhalten haben:
129-Z-Schale
174-VB.NET
222-C
233-C
300-C
Sowie unsere eigenen (nicht eingestuften) Lösungen:
75 - PowerShell
93 - Ruby
112 - Bourne-Shell
echo 100
Antworten:
64-Bit-Perl, 67
68Perl 5.10 oder höher mit
perl -E 'code here'
oder ausführenperl -M5.010 filename
Zugeständnisse an die Codegröße:
date
Ausgabe nicht mit einem Großbuchstaben S beginnt.LC_ALL=C
Im Zweifelsfall unterlaufen.2> /dev/null
sind.Aus irgendeinem Grund betrachtet meine Version vonBenötigt einen 64-Bit-Builddate
2817-12 einen ungültigen Monat. Wer wusste, GNU neue Apokalypse ist fällig!date
für Daten nach 2038. (Danke Joey)quelle
PHP - 135
Ich habe es in PHP gemacht, weil ich vor ein paar Tagen ein ähnliches Problem zu behandeln hatte.
(Etwas) Lesbarer und ohne Hinweise darauf, dass Konstanten als Zeichenfolgen verwendet werden:
Dies wird durch einen sehr einfachen Algorithmus ermöglicht, mit dem die Anzahl der Arbeitstage in einem Monat berechnet werden kann: Überprüfen Sie den Wochentag des 29., 30. und 31. (falls diese Daten vorhanden sind) und addieren Sie 20.
quelle
-R
kann dieser Ansatz auf 86 Bytes (63,7%) reduziert werden:$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
Siehe die<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 Zeichen
quelle
Bash + Coreutils, 82 Bytes
quelle
Windows PowerShell, 80
quelle
[int]
wirklich Runden gibt? Ich würde eher glauben, dass es Fußböden sind.[int]1.5
und[int]2.5
nachgeben2
. Dieses genaue Verhalten verursacht häufig Probleme bei Aufgaben, bei denen eine Aufteilung des Bodens erforderlich ist (was dann eine zusätzliche Aufteilung erfordert[Math]::Floor()
). In diesem Fall tut es jedoch nicht weh und gilt nur für Zahlen, deren Ende.5
hier nicht möglich ist.[int]
in PowerShell ist normalerweise eher eine Konvertierung als eine Besetzung :-). Dinge wie[int[]][char[]]'abc'
auch Arbeit, die Sie in vielen anderen Sprachen nicht arbeiten können.$input
->$args
speichert ein Byte.D: 186 Zeichen
Lesbarer:
quelle
Python - 142
Danke an fR0DDY für das Kalenderbit.
quelle
Ruby,
124119111Benötigt Ruby 1.9, da das Jahr und der Monat vor dem Argument -1 "Tag" und
?-
für"-"
. Für Ruby 1.8 müssen wir 2 Zeichen hinzufügen:Bearbeiten : Rasiere fünf Zeichen basierend auf @ Dogberts Hilfe.
Bearbeiten : Rasieren Sie acht weitere Zeichen basierend auf der Hilfe von @ steenslag.
quelle
'-'
könnte geschrieben werden wie?-
in Ruby 1.9PHP 5.2, 88 Bytes
Obwohl ich die Lösung von zneak bereits auf 85 Bytes reduziert habe (ich habe gerade noch eine gefunden), ist hier meine eigene: Ich bezweifle, dass ich hier draußen noch drei Bytes herauspressen
kann.
nimmt Eingabe von STDIN entgegen: Ausführen mit
echo <yyyy>-<mm> | php -nR '<code>'
.Die Zeichenfolge
$a
ordnet Tage pro Monat (date(t)
) und Wochentag des ersten Tages des Monats (date(N)
: Montag = 1, Sonntag = 7) dem Prozentsatz der Arbeitstage-67 zu.strtotime
konvertiert die Eingabe in einen UNIX-Zeitstempel; Der Rest des Codes erledigt das Hashing.+1 Byte für älteres PHP 5: Ersetzen
N
durchw
und$a=_...;
durch$a="..."
.weitere +3 Bytes für PHP 4: Einfügen
.-1
nach$argn
.-5 Bytes für PHP 5.5 oder höher (nach dem Datum der Herausforderung):
Entfernen Sie alles vorher
echo
und ersetzen Sie es$a
durch"4444444255555236666304777411"
.quelle
%7
statt%28
.Rebol -
118113Ungolfed:
quelle
C #, 158 Bytes
Anonyme Methode, die den erforderlichen Prozentsatz zurückgibt.
Vollständiges Programm mit ungolfed, kommentierten Methoden und Testfällen:
Alternative Funktion, die der Anzahl der Arbeitstage negative Werte hinzufügt und das Vorzeichen in der Rückgabe ohne zusätzliche Bytekosten ändert:
quelle
Oracle SQL, 110 Byte
Es wird davon ausgegangen, dass Eingabedaten unter Verwendung des Datentyps in einer Tabelle gespeichert werden
date
, zquelle
APL (Dyalog Unicode) , 55 Byte SBCS
Anonyme stillschweigende Präfixfunktion.
⊂
Geben Sie das Datum an, um es als Ganzes zu behandeln(2 5)2{
…}¨
Wenden Sie die folgende Funktion an, jedoch mit den linken Argumenten[2,5]
und2
:⎕CY'dfns'
Kopieren Sie die Bibliothek "dfns"⍵⊣
Verwerfen Sie den Bericht zugunsten des Datums' '@5⊢
Ersetzen Sie das 5. Zeichen (-
) durch ein Leerzeichen⍎
Führen Sie dies aus, um eine Liste mit zwei Elementen zu erhaltencal
Rufen Sie dazu die Kalenderfunktion auf' ',
Stellen Sie dem eine Spalte mit Leerzeichen voran¯2⌽
Drehen Sie die letzten beiden Spalten (Samstag) nach vorne⍺↓
Löschen Sie die Anzahl der Zeilen (2, Überschriften) und Spalten mit dem linken Argument (falls angegeben; 5 = Sa + So).↓
Matrix in Zeilenliste aufteilen⍕
Format (wird durch Einfügen von Doppelabständen abgeflacht)⍎
Ausführen (verwandelt verbleibende Tagesnummern in eine flache numerische Liste)≢
zählen diese2÷/
Teilen Sie jedes Paar (es gibt nur eines)100×
mit hundert multiplizieren.5+
füge eine Hälfte hinzu⌊
FußbodenProbieren Sie es online aus!
quelle
Perl 6 , 78 Bytes
Probieren Sie es online aus!
quelle