|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
[Vari] Contest 13: Date
Quanti lunedi' ci sono in tutti i Febbraio tra gli anni il 1900 e il 2100 compresi?
Occhio ai bisestili, che sono tutti gli anni divisibili per 4. Ma non quelli che terminano per 00 Ma se invece il numero che termina per 00 e' divisibile per 400, allora e' di nuovo bisestile (Come il 2000).
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
811
Segue il codice usato per la soluzione: Codice:
#light open System let countMondays year = [1..DateTime.DaysInMonth(year,2)] |> Seq.filter(fun d -> DateTime(year, 2, d).DayOfWeek = DayOfWeek.Monday) |> Seq.length [1900..2100] |> Seq.map(countMondays) |> Seq.fold(+) 0 Ultima modifica di !k-0t1c! : 12-05-2009 alle 01:16. Motivo: aggiornato per usare gli helpers di DateTime |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
cut
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
puoi spiegarmi quel "cut"?
Se ho sbagliato a postare pubblicamente la soluzione chiedo scusa e spero di aver fatto ammenda in tempo utile, diversamente dimmelo e ripristinerò il post sopra. |
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
C'è già un contest 12:
Contest 12 Se è un questione di superstizione, puoi fare come D'Annunzio: Tratto da "1912 + 1" di Leonardo Sciascia: Quote:
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Soluzione quick'n'dirty in factor...non è proprio il massimo dell'eleganza, ma stasera sono pigro...
Codice:
USING: math math.ranges make sequences kernel calendar fry locals
prettyprint ;
IN: contest12
:: get-timestamps ( year -- seq )
year 2 1 <date> days-in-month
[ [ 1+ year 2 pick <date> , drop ] each ] { } make ;
: how-many-mondays? ( seq -- n )
[ day-of-week day-name "Monday" = ] filter length ;
: contest12 ( -- )
1900 2100 [a,b]
[ get-timestamps how-many-mondays? ] map sum . ;
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
|
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jan 2007
Messaggi: 189
|
Aggiungo una soluzione in ruby
Codice:
require 'date'
def is_leap?(year)
((year % 4 == 0) && ((year % 400 == 0) || !(year % 100 == 0)))
end
def mondays(start_y, end_y)
mondays = (end_y-start_y+1)*4
start_y.step(end_y){|year| mondays += 1 if (is_leap?(year) && Date.new(year,2,1).wday == 1)}
mondays
end
puts mondays(1900, 2100)
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jul 2008
Messaggi: 237
|
Sì, F#
Non è niente male, corre veloce quanto C# e si integra alla perfezione con .NET No, perché DateTime.IsLeapYear avrebbe ritornato true per 1900 e 2100 mentre nella definizione di bisestile data dal problema solo per nessuno di quei due andava considerato tale (lo so, ai fini della soluzione è irrilevante visto che ciascuno ha comunque 4 lunedì in febbraio, tuttavia per scrupolo ho preferito implementare la specifica). |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Mannaggia, se passa qualcuno a correggere in Contest 13...
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1524
|
che bello un problema che riesco a risolvere anche io!!!!!!
Codice:
For i = inizio To fine
If i Mod 400 = 0 Then
Dim data As Date = "01/02/" & i
If data.DayOfWeek = DayOfWeek.Monday Then
conta += 1
End If
ElseIf Right(i.ToString, 2) = "00" Then
ElseIf i Mod 4 = 0 Then
Dim data As Date = "01/02/" & i
If data.DayOfWeek = DayOfWeek.Monday Then
conta += 1
End If
End If
conta += 4
Next
cmq ho paura che arrivi un inghippo per cui le nostre soluzioni diventano obsolete... bio |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Se la IsLeapYear e' implementata correttamente dovrebbe tornare false per 1900 e 2100
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Per ora in C# butto cosi'.
Codice:
static void Main(string[] args)
{
var mondays = Enumerable.Range(1900, 2100 - 1900 + 1)
.Sum(year =>
Enumerable.Range(1, DateTime.DaysInMonth(year, 2))
.Count(day => new DateTime(year, 2, day).DayOfWeek == DayOfWeek.Monday)
);
Console.Write(mondays);
Console.ReadKey();
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1524
|
Quote:
il mio codice varia in: Codice:
For i = inizio To fine
If DateTime.IsLeapYear(i) Then
Dim data As Date = "01/02/" & i
If Data.DayOfWeek = DayOfWeek.Monday Then conta += 1
End If
conta += 4
Next
devo dire che a complicarti la vita fai paura bio Ultima modifica di bio82 : 12-05-2009 alle 01:04. |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ma è giusto 811?
a me esce un pò di meno..
__________________
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Anche a me salta fuori 811.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Codice:
static void Main(string[] args)
{
var mon = from year in Enumerable.Range(1900, 2100 - 1900 + 1)
let DaysInFeb = DateTime.DaysInMonth(year, 2)
from day in Enumerable.Range(1, DaysInFeb)
let dayday = new DateTime(year, 2, day)
where dayday.DayOfWeek == DayOfWeek.Monday
select dayday;
int nums = mon.Count();
Console.WriteLine(nums);
Console.ReadKey();
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Hai incluso il 2100?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:41.




















