2016-04-03 6 views
1

Das einzige, was in diesem Code falsch ist, ist die Rückkehr: PWie viele Freitag 13. in einem Jahr?

Wie würden Sie anzeigen, wie viele Freitag 13. dort in einem Jahr?

def unlucky_days(year) 
    require 'date' 

    start_date = Date.new(year) 
    end_date = Date.new(year+1) 
    my_fridays = [4] 
    thirteen = "13" 
    result = (start_date..end_date).to_a.select {|k| my_fridays.include?(k.wday) && thirteen.include?(k.strftime('%d'))} 

    result.length 


end 
+1

Was meinen Sie mit "Das einzige, was in diesem Code falsch ist, ist die Rückkehr"? Du gibst "result.length" zurück, also wirst du eine Nummer bekommen. Haben Sie versucht, 'result' zurückzuliefern? –

+0

Entschuldigung! Aktualisierte Beschreibung, um das Problem besser zu beschreiben. Wollte die Gesamtzahl der 13. in einem Jahr. –

+0

Erstens, Freitags wday Nummer ist 5, nicht 4. Zweitens, warum machst du 'Array # include?' Und 'String # include?' Statt nur einen einfachen Gleichheitstest? –

Antwort

2

Ihr Code ist in einigen Punkten falsch.

  1. Freitag Wochentag Nummer 5, nicht 4.
  2. Warum [4].include?(n) statt nur n==4?
  3. "13".include?("#{n}") ist nicht nur seltsam, aber falsch, da es für 1 und 3 sowie 13.

Sie befinden sich auf der Ebene der Brute-Force bei einem Blick auf die zwölf 13ths abgeholzt gehen kann true zurück und das Zählen, wie viele sind freitags, anstatt auf der Suche auf allen 365 bzw. 366 Tage und sehen, welche von ihnen sind beide 13. die und freitags, wie in @ tokland Antwort, reproduziert hier:

def unlucky_days(year) 
    (1..12).count { |month| Date.new(year, month, 13).friday? } 
end 

oder, da es nur 14 Möglichkeiten, könnten Sie auch nur eine vorgefertigte Tabelle verwenden:

# number of Friday the 13ths in a given year is given by 
# UnluckyDays[weekday of Jan 1][0 if common, 1 if leap] 
UnluckyDays = [ [2,3], [2,2], [2,1], [1,2], [3,2], [1,1], [1,1] ] 
def unlucky_days(year) 
    UnluckyDays[Date.new(year,1,1).wday][Date.leap?(year) ? 1 : 0 ] 
end 
4

würde ich schreiben:

require 'date' 
(1..12).count { |month| Date.new(year, month, 13).friday? } 
2

+1 bis @ MarkReed Kommentare. Warum rufen Sie auch .to_a auf einen Bereich, und warum Variablen verwenden, wenn die Date class in Ruby bereits Methoden wie .day und .friday hat? Hier ist, wie ich es tun würde:

def unlucky_days(year) 
    s = Date.new(year, 1, 1) 
    e = Date.new(year, 12, 31) 
    ((s...e).select {|d| d.friday? && d.day == 13 }).count 
end 
+0

Erstaunlich! Wie Sie vielleicht sehen können, bin ich wirklich neu (pures Hobby), aber jeden Tag bin ich einfach überwältigt von der Flexibilität und Eleganz des Codes !!!! : D danke –

1

Dies ist eine Variante von @ Tokland's Antwort.

require 'date' 

def count_em(year) 
    d = Date.new(year, 1, 13) << 1 
    12.times.count { (d >>= 1).friday? } 
end 

(2010..2016).each { |y| puts "%d Friday the 13ths in %s" % [count_em(y), y] } 
    # 1 Friday the 13ths in 2010 
    # 1 Friday the 13ths in 2011 
    # 3 Friday the 13ths in 2012 
    # 2 Friday the 13ths in 2013 
    # 1 Friday the 13ths in 2014 
    # 3 Friday the 13ths in 2015 
    # 1 Friday the 13ths in 2016 

Wenn diese Berechnung (oder ein ähnliches) wurde oft getan und Leistung war wichtig, zwei Hashes konstruiert werden könnten, ein für Schaltjahre, die andere für Nicht-Schaltjahre, mit den Tasten des Tag der Woche auf was der erste Tag des Jahres ist und die Werte die Zahl von Freitag den 13. in solchen Jahren.

Verwandte Themen