Python :: Aufgabe #159

5 Lösungen Lösungen öffentlich

Ist Freitag der 13. ein Unglücks- oder Glückstag?

Anfänger - Python von hollst - 26.06.2017 um 13:14 Uhr
Wir betrachten den Gregorianischen Kalender mit den üblichen 12 Monaten und Schaltjahren.

Schaltjahr ist, wenn die Jahreszahl durch 4 teilbar ist, mit Ausnahme der Jahre, die durch 100,
jedoch nicht durch 400 teilbar sind. Im Schaltjahr hat der Februar 29 Tage.

Unsere Zeitrechnung beginne mit dem 1. Januar 00.

Frage: Welcher Wochentag fällt

a) am häufigsten auf einen 13. des Monats und
b) welcher bzw. welche am wenigsten.

Lösungen:

vote_ok
von SamYoshihara (120 Punkte) - 17.07.2017 um 02:40 Uhr
Quellcode ausblenden Python-Code
# Wochentag des 13ten von Sam Yoshihara
#  Die "# print" können zur Kontrolle zugeschaltet werden.

mo, di, mi, do, fr, sa, so=0, 0, 0, 0, 0, 0, 0
a=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
b=[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
c=("Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez")
d=("Fr", "Sa", "So", "Mo", "Di", "Mi", "Do")
q, t, u, v=0, 0, 0, 0

print ("Gib das heutige Datum ein. (dd mm yyyy)")
print ()
while True:
    tag = int(input ("Tag dd    "))
    if 0 < tag < 32:
        break
    else:
        print ("Tag von 01 bis 31. Keine unmöglichen Daten!")
while True:
    monat = int(input ("Monat mm  "))
    if 0 < monat < 13:
        break
    else:
        print ("Monat von 01 bis 12. Keine unmöglichen Daten!")
jahr = int(input ("Jahr yyyy "))

while u < jahr:
    if u % 4 != 0 or u % 100 == 0 and not u % 400 == 0: 
        for i in range(12):
            r = q + 13
            q += a[i]
            s = r % 7
            if s == 0:
                fr += 1
            elif s == 1:
                sa += 1
            elif s == 2:
                so += 1
            elif s == 3:
                mo += 1
            elif s == 4:
                di += 1
            elif s == 5:
                mi += 1
            elif s == 6:
                do += 1

        t += 365
#        print ("Jahr", u, " Tage", t)   # Vorsicht, printet alle nicht Schaltjahr!
        u += 1
        
    else:
        for i in range(12):
            r = q + 13
            q += b[i]
            s = r % 7
            if s == 0:
                fr += 1
            elif s == 1:
                sa += 1
            elif s == 2:
                so += 1
            elif s == 3:
                mo += 1
            elif s == 4:
                di += 1
            elif s == 5:
                mi += 1
            elif s == 6:
                do += 1

        t += 366
        v += 1
#        print ("Jahr", u, " Tage", t, " Schaltjahre", v)
        u += 1
        
#print ()
#print (t, "Tage bis Ende", (u-1))
#print ("inkl.", v, "Schalttage")


if u == jahr:
    if u % 4 != 0 or u % 100 == 0 and not u % 400 == 0: 
        for i in range(0, monat-1):
            r = q + 13
            q += a[i]
            s = r % 7
            t += a[i]
#            print ("==", d[s], "13", c[i], "ist Tag", r)
#            print ("  ", a[i], c[i], u, "ist Tag", q)
            if s == 0:
                fr += 1
            elif s == 1:
                sa += 1
            elif s == 2:
                so += 1
            elif s == 3:
                mo += 1
            elif s == 4:
                di += 1
            elif s == 5:
                mi += 1
            elif s == 6:
                do += 1
                    
    else:
        for i in range(0, monat-1):
            r = q + 13
            q += b[i]
            s = r % 7
            t += b[i]
#            print ("++", d[s], "13", c[i], "ist Tag", r)
#            print ("  ", b[i], c[i], u, "ist Tag", q)
            if s == 0:
                fr += 1
            elif s == 1:
                sa += 1
            elif s == 2:
                so += 1
            elif s == 3:
                mo += 1
            elif s == 4:
                di += 1
            elif s == 5:
                mi += 1
            elif s == 6:
                do += 1
        if monat > 2 or monat == 2 and tag == 29:
            v += 1

    if tag > 12:
        r = q + 13
        s = r % 7
        if s == 0:
            fr += 1
        elif s == 1:
            sa += 1
        elif s == 2:
            so += 1
        elif s == 3:
            mo += 1
        elif s == 4:
            di += 1
        elif s == 5:
            mi += 1
        elif s == 6:
            do += 1
    
    t += tag
    w = t % 7

print ()
print (t, "Tage bis heute,", d[w], tag, c[monat-1], u)
print ("inkl.", v, "Schalttage")
print ()
print ("13ter ist am", "Mo =", mo)
print ("             Di =", di)
print ("             Mi =", mi)
print ("             Do =", do)
print ("             Fr =", fr)
print ("             Sa =", sa)
print ("             So =", so, "mal.")

# Wenn man eine grosse Jahreszahl eingibt, zB. 100'000, erkennt man, dass
# Freitag der häufigste Tag ist, vor So/Mi, Mo/Di und Do/Sa.
vote_ok
von 0 (0 Punkte) - 09.09.2017 um 08:44 Uhr
Quellcode ausblenden Python-Code
class Jahr():
    '''Klasse für die Liste von 12 Objekten der Klasse Monate nach dem gregorianischen Kalender,Jan,Feb,Maer,Apr,Mai,Juni,Juli,Aug,Sep,Okt,Nov,Dez'''
    Monate=['Jan','Feb','Maer','Apr','Mai','Juni','Juli','Aug','Sep','Okt','Nov','Dez']
    def __init__(self,Jahreszahl):
        
        self.Jahreszahl=int(Jahreszahl)
        self.Monatsliste=[]
        for i in self.Monate:
            monat=Monat(i,Jahreszahl)
            self.Monatsliste+=[monat]
    def getJahr(self):
        return str(self.Jahreszahl)
    def __str__(self):
        beschreibung=self.getJahr()
        for i in self.Monatsliste:
            for j in i.getTage():
                beschreibung+='\n'+str(j)
        return beschreibung

class Monat():
    '''Klasse für die Anzahl der Objekte Tag eines Monats'''
    
    def __init__(self,name,Jahreszahl):
        self.Jahreszahl=Jahreszahl
        self.name=name
        self.Tagesliste=[]
        if self.name in ['Jan','Maer','Mai','Juli','Aug','Okt','Dez']:
            for i in range(1,32):
                tag=Tag(i,name,Jahreszahl)
                self.Tagesliste+=[tag]
        elif self.name in ['Apr','Juni','Sep','Nov']:
            for i in range(1,31):
                tag=Tag(i,name,Jahreszahl)
                self.Tagesliste+=[tag]
        elif self.name in ['Feb']:
            if self.Jahreszahl==0:
                for i in range(1,30):
                    tag=Tag(i,name,Jahreszahl)
                    self.Tagesliste+=[tag]
                
            elif (self.Jahreszahl%4==0 and not (self.Jahreszahl%400!=0 and self.Jahreszahl%100==0)):
                for i in range(1,30):
                    tag=Tag(i,name,Jahreszahl)
                    self.Tagesliste+=[tag]
            else :
                for i in range(1,29):
                    tag=Tag(i,name,Jahreszahl)
                    self.Tagesliste+=[tag]
    def getTage(self):
        return self.Tagesliste
    def getName(self):
        return self.name
class Tag():
    '''Objekt Tag'''
    Tage=['Mo','Di','Mi','Do','Fr','Sa','So']
    x=0
        
    def __init__(self,i,name,Jahreszahl):
        self.Jahreszahl=Jahreszahl
        self.name=name
        self.nr=i
    
        self.day=self.Tage[self.x]
        Tag.x+=1
        if Tag.x%7==0:
            Tag.x=0
    def beginDay(begin):
        if begin in Tag.Tage:
            Tag.x=Tag.Tage.index(begin)
            return 'umgestellt'
        else:
            return 'Montag'    
    def getDay(self):
        return self.day
    def getNr(self):
        return self.nr
    def __str__(self):
        return self.getDay()+' '+str(self.getNr())+' '+self.name+' '+str(self.Jahreszahl)

def erschaffeKalender():
    text='''
Dies ist ein gregorianischer Kalender. Die Zählung startet bei Jesu Geburt am 01.01.00\n
Der Starttag des ersten Jahres kann festgelegt werden. Nach Start werden nacheinander \n
Objekte der Klasse Jahr erzeugt, bis die eingegebene Jahreszahl erreicht ist\n
    '''
    print(text)
    Ende=int(input('Bitte geben Sie die Endjahreszahl an: '))
    Jahreszahl=int(input('Bitte geben Sie die Startjahreszahl an: '))
    begin=input("Bitte geben Sie einen der Tage Mo, Di, Mi, Do, Fr, Sa, So als Start an: ")
    Tag.beginDay(begin)
    Kalender=[]
    
    while Jahreszahl<=Ende:
        jahr=Jahr(Jahreszahl)
        Kalender+=[jahr]
        Jahreszahl+=1
    moz=0
    diz=0
    miz=0
    doz=0
    frz=0
    saz=0
    soz=0
    
    for i in Kalender:
        for j in i.Monatsliste:
            for k in j.Tagesliste:
                if k.nr==13:
                    if k.day=='Mo':
                        moz+=1
                    elif k.day=='Di':
                        diz+=1
                    elif k.day=='Mi':
                        miz+=1
                    elif k.day=='Do':
                        doz+=1
                    elif k.day=='Fr':
                        frz+=1
                    elif k.day=='Sa':
                        saz+=1
                    elif k.day=='So':
                        soz+=1
    ErgFr=[(moz,'Montag'),(diz,'Dienstag'),(miz,'Mittwoch'),(doz,'Donnerstag'),(frz,'Freitag'),(saz,'Samstag'),(soz,'Sonntag')]
    ErgFr.sort()
    print("Häufigkeiten der 13. eines Monats:")
    for i in ErgFr:
        print(i)
    

                    
erschaffeKalender()
vote_ok
von maellj (190 Punkte) - 23.09.2017 um 15:35 Uhr
[CODE]
Quellcode ausblenden Python-Code
# Schaltjahr ist, wenn die Jahreszahl durch 4 teilbar ist, mit Ausnahme der Jahre, die durch 100,
# jedoch nicht durch 400 teilbar sind. Im Schaltjahr hat der Februar 29 Tage.

# Unsere Zeitrechnung beginne mit dem 1. Januar 00.

# Frage: Welcher Wochentag fällt

# a) am häufigsten auf einen 13. des Monats und
# b) welcher bzw. welche am wenigsten.
# repräsentiere Montag = 1, Dienstag = 2, ... , Sonntag = 0 mod 7

monate = [31, 'feb', 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

counter13 = [0, 0, 0, 0, 0, 0, 0]  # Wochentage

# 13.Dez 2017 Mittwoch, von da an rückwärts
tag13 = 3  # mod 7
mon13 = 0  # mod 12


def februar(jahreszahl):
    if jahreszahl % 4 != 0:
        return 28
    if jahreszahl % 100 == 0 and jahreszahl % 400 != 0:
        return 28
    else:
        return 29


for jahr in range(2017, -1, -1):
    for monat in range(11, 0, -1):
        if monate[monat] != 'feb':
            tag13 = (tag13 - monate[monat]) % 7
            counter13[tag13] += 1
        elif monate[monat] == 'feb':
            feb = februar(jahr)
            tag13 = (tag13 - feb) % 7
            counter13[tag13] += 1

gesamt = sum(counter13)
dicttage = {0: 'Sonntag', 1: 'Montag', 2: 'Dienstag', 3: 'Mittwoch', 4: 'Donnerstag', 5: 'Freitag', 6: 'Samstag'}

print('Häufigster Tag:', dicttage[counter13.index(max(counter13))])
print('Relative Häufigkeit:', max(counter13) / gesamt * 100, '%')
print('Unwahrscheinlichster Tag:', dicttage[counter13.index(min(counter13))])
print('Relative Häufigkeit:', min(counter13) / gesamt * 100, '%')
# print(counter13)

[/CODE]
vote_ok
von mangotee (60 Punkte) - 06.01.2018 um 15:48 Uhr
Quellcode ausblenden Python-Code
def erstellung_kalender():
    wochentage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
    drei_eins = (1, 3, 5, 7, 8, 10, 12)
    drei_null = (4, 6, 9, 11)
    kalender = []

    # Hinzufügen der Jahre
    for j in range(0, 2118+1):
        # Hinzufügen der Monate
        for monat in range(1, 13):
            calöndör = [str(j), str('{:02d}'.format(monat))]

            # Monate mit 30/31 Tagen
            if monat in drei_eins:
                for tag in range(1, 32):
                    calöndör = [str(j), str('{:02d}'.format(monat)), str('{:02d}'.format(tag))]
                    kalender.append(calöndör)
            if monat in drei_null:
                for tag in range(1, 31):
                    calöndör = [str(j), str('{:02d}'.format(monat)), str('{:02d}'.format(tag))]
                    kalender.append(calöndör)

            # Das Schaltjahr
            if monat == 2:
                if j % 100 == 0:
                    for tag in range(1, 29):
                        calöndör = [str(j), str('{:02d}'.format(monat)), str('{:02d}'.format(tag))]
                        kalender.append(calöndör)
                elif j % 400 == 0:
                    for tag in range(1, 30):
                        calöndör = [str(j), str('{:02d}'.format(monat)), str('{:02d}'.format(tag))]
                        kalender.append(calöndör)
                elif j % 4 == 0:
                    for tag in range(1, 30):
                        calöndör = [str(j), str('{:02d}'.format(monat)), str('{:02d}'.format(tag))]
                        kalender.append(calöndör)
                else:
                    for tag in range(1, 29):
                        calöndör = [str(j), str('{:02d}'.format(monat)), str('{:02d}'.format(tag))]
                        kalender.append(calöndör)

    #Erstellung der Wochentag
    zahl = 4
    for i in range(len(kalender)):
        zahl += 1
        kalender[i].append(wochentage[zahl])
        if zahl == 6:
            zahl = -1
            continue

    return kalender

def ergebnis(kalender,eingabe):
    auswertung=[]
    tage=[]
    wochentage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
    for p, datum in enumerate(kalender):
        tag = "".join(datum[2])
        if eingabe == tag:
            tage.append(datum[3])
            continue

    print(" ")
    for i in wochentage:
        auswertung.append(tage.count(i))
        print(i,":",tage.count(i))
    m=max(auswertung)
    n=min(auswertung)
    p_max=auswertung.index(m)
    p_min=auswertung.index(n)

    print("Am häufigsten kommt der",wochentage[p_max],"mit",m,"Tage vor!\n"
    "Am wenigsten kommt der",wochentage[p_min],"mit",n,"Tagen vor!")

#Hauptprogramm

kalender=erstellung_kalender()
eingabe=input("Eingabe des Tages: ")
ergebnis(kalender,eingabe)

vote_ok
von Gisbert5020 (3120 Punkte) - 06.08.2018 um 16:26 Uhr
Quellcode ausblenden Python-Code
# -*- coding: utf-8 -*-
# Python 3.7

import calendar
jahr = int(input("Gib ein Jahr ein: "))
wtagezaehl={'Montag':0,'Dienstag':0,'Mittwoch':0,'Donnerstag':0,'Freitag':0,'Samtag':0,'Sonntag':0}
wtage=[*wtagezaehl]
for j in range(jahr+1):
        for m in range(1,12+1):
            w=calendar.weekday(j,m,13)
            wtagezaehl[wtage[w]] +=1
werte = list(wtagezaehl.values())
print("Am häufigsten kommt der ", wtage[werte.index(max(werte))], " mit ", max(werte), " Tage vor.")
print("Am wenigsten kommt der ", wtage[werte.index(min(werte))], " mit ", min(werte), " Tage vor.")
1801209

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.