Biorąc pod uwagę rok i miesiąc, sprawdź procent dni roboczych w tym miesiącu. Dni robocze są od poniedziałku do piątku bez względu na święta lub inne specjalne rzeczy. Używany jest kalendarz gregoriański.
Wejście
Rok i miesiąc w formacie ISO 8601 (RRRR-MM). Rok zawsze ma cztery cyfry, miesiąc zawsze ma dwie cyfry. Dany rok nie będzie wcześniejszy niż 1582.
Wynik
Wyjście to procent dni roboczych (zgodnie z powyższą definicją) w danym miesiącu, w zaokrągleniu do liczby całkowitej. Nie następuje znak procentu ani cyfry ułamkowe.
Próbka 1
Input Output
2010-05 68
Próbka 2
Input Output
2010-06 73
Próbka 3
Input Output
1920-10 68
Próbka 4
Input Output
2817-12 68
Minął tydzień, odpowiedź została zaakceptowana. Dla ciekawskich rozmiary zgłoszeń, które otrzymaliśmy w naszym konkursie:
129 - Z shell
174 - VB.NET
222 - C
233 - C
300 - C
Jak również nasze własne (nierankingowe) rozwiązania:
75 - PowerShell
93 - Ruby
112 - Powłoka Bourne'a
echo 100
Odpowiedzi:
64-bitowy Perl, 67
68Perl 5.10 lub nowszy, uruchom z
perl -E 'code here'
lubperl -M5.010 filename
Koncesje na rozmiar kodu:
date
produkcja nie zaczyna się od dużej litery S. WLC_ALL=C
razie wątpliwości należy przejść poniżej .2> /dev/null
jeśli są zdenerwowane.z jakiegoś powodu moja wersjaWymaga 64-bitowej wersjidate
uważa 2817-12 za nieprawidłowy miesiąc. Kto wiedział, nadchodzi nowa apokalipsa GNU!date
dla dat po 2038 r. (Dzięki Joey)źródło
PHP - 135
Zrobiłem to w PHP, ponieważ kilka dni temu miałem podobny problem do rozwiązania .
(Trochę) Bardziej czytelnie i bez powiadomienia o stałych używanych jako łańcuchy:
Jest to możliwe dzięki bardzo prostemu algorytmowi obliczania liczby dni roboczych w miesiącu: sprawdź dni tygodnia 29, 30 i 31 (jeśli te daty istnieją) i dodaj 20.
źródło
-R
tego podejścia, można zastosować golf do 86 bajtów (63,7%):$a="2333211";echo.5+min(-8+$m=date(t,$t=strtotime($argn)),20+$a[date(w,$t)])/$m*100|0;
Zobacz etapy gry w golfa.<?=.5+min(-8+$m=date(t,$t=strtotime($argn)),20+(5886>>date(w,$t)*2&3))/$m*100|0;
Python 152 znaków
źródło
Bash + coreutils, 82 bajty
źródło
Windows PowerShell, 80
źródło
[int]
naprawdę się kręcisz? Chciałbym wierzyć, że to podłogi.[int]1.5
i[int]2.5
wydaj2
. To dokładne zachowanie często powoduje problemy w zadaniach, w których konieczne jest dzielenie zmiennoprzecinkowe (co następnie wymaga dodatkowego[Math]::Floor()
), ale w tym przypadku nie boli, a „zaokrąglenie do parzystości” dotyczy tylko liczb, których koniec.5
nie może się tutaj zdarzyć.[int]
w PowerShell jest zwykle bardziej konwersją niż obsadą :-). Rzeczy takie jak[int[]][char[]]'abc'
praca, których nie można dostać do pracy w wielu innych językach.$input
->$args
zapisuje bajt.D: 186 znaków
Bardziej czytelnie:
źródło
Python - 142
Dzięki fR0DDY za bit kalendarza.
źródło
Ruby,
124119111Wymaga Ruby 1.9 z powodu rozpryskiwania się rok i miesiąc przed argumentem -1 „dzień” i
?-
dla"-"
. W Ruby 1.8 musimy dodać 2 znaki:Edycja : Ogol pięć znaków na podstawie pomocy @ Dogberta.
Edycja : Ogol osiem kolejnych znaków na podstawie pomocy @ steenslag.
źródło
'-'
można napisać jak?-
w Ruby 1.9PHP 5.2, 88 bajtów
Chociaż już grałem w golfa rozwiązanie zajadłego do 85 bajtów (właśnie znalazłem jeszcze jeden), oto moje własne:
wątpię, czy uda mi się wycisnąć tutaj jeszcze trzy bajty.
pobiera dane wejściowe z STDIN: Uruchom z
echo <yyyy>-<mm> | php -nR '<code>'
.Ciąg
$a
odwzorowujedate(t)
liczbę dni w miesiącu ( ) i dzień tygodnia pierwszego dnia miesiąca (date(N)
: poniedziałek = 1, niedziela = 7) na procent dni roboczych-67;strtotime
konwertuje dane wejściowe na znacznik czasu UNIX; reszta kodu robi haszowanie.+1 bajt dla starszych PHP 5: Wymień
N
sięw
i$a=_...;
z$a="..."
.kolejne +3 bajty dla PHP 4: wstaw
.-1
po$argn
.-5 bajty dla PHP w wersji 5.5 lub nowszej (późniejsza wyzwanie):
usunąć wszystko przed
echo
i wymienić$a
z"4444444255555236666304777411"
.źródło
%7
zamiast%28
.Rebol -
118113Nie golfowany:
źródło
C #, 158 bajtów
Anonimowa metoda, która zwraca wymagany procent.
Pełny program z niepoznaną, komentowaną metodą i przypadkami testowymi:
Alternatywna funkcja, która dodaje wartości ujemne do liczby dni roboczych, zmieniając znak w zwrocie bez dodatkowych kosztów bajtu:
źródło
Oracle SQL, 110 bajtów
Działa przy założeniu, że dane wejściowe są przechowywane w tabeli przy użyciu
date
typu danych, npźródło
APL (Dyalog Unicode) , 55 bajtów SBCS
Anonimowa ukryta funkcja prefiksu.
⊂
dołącz datę, aby traktować ją jako całość(2 5)2{
…}¨
Zastosuj do tego następującą funkcję, ale z lewymi argumentami[2,5]
i2
:⎕CY'dfns'
skopiuj bibliotekę „dfns”⍵⊣
odrzuć raport na korzyść daty' '@5⊢
zamień 5. znak (-
) na spację⍎
wykonaj to, aby uzyskać listę dwóch elementówcal
w tym celu wywołać funkcję kalendarza' ',
dodaj do tego kolumnę spacji¯2⌽
obróć dwie ostatnie kolumny (sobota) do przodu⍺↓
upuść lewy argument liczby wierszy (2, nagłówki) i kolumn (jeśli podano; 5 = Sat + Sun)↓
podziel macierz na listę linii⍕
format (spłaszcza się z wstawieniem podwójnych odstępów)⍎
wykonaj (zamienia pozostałe liczby dni w płaską listę numeryczną)≢
zliczyć te2÷/
podziel każdą parę (jest tylko jedna)100×
pomnóż przez sto.5+
dodaj połowę⌊
piętroWypróbuj online!
źródło
Perl 6 , 78 bajtów
Wypróbuj online!
źródło