Tweakers dev challenge writeup - 13

Door Boudewijn op donderdag 1 oktober 2015 00:13 - Reacties (0)
Categorie: Tweakers dev challenge, Views: 950

Tsja ik vond dit de minste opgave van deze challenge, niet vanwege de technische uitdagingen of het gebrek eraan maar vanwege de ambigue opgave.
Het zou enorm schelen als de logica duidelijker en eenduidiger was opgeschreven, nu was het een groot vragenfestijn. Daar is best wat discussie over geweest.

Sterker nog, ik draai net de code die ik ingecheckt heb en het spel zoekt een ander antwoord. Ik weet vrij zeker dat mijn antwoord kloppend was; ik heb na dit gedoe weinig zin gehad om nog een keer te gaan proberen en pielen. Maar, your mileage may vary. Als mensen een implementatie hebben die nu goed wordt gerekend wil ik deze graag hier delen, uiteraard met bronvermelding.

Goed, de vraagstelling:
De zombie apocalypse heeft toegeslagen. Patient zero is besmet geraakt nadat hij was gebeten door een mier tijdens het nachtelijk wildplassen. Precies om 0:00 zelfs.

De volgende waarden zijn van toepassing

*Op het moment van de besmetting van patient zero zijn er 7.000.000.000 mensen niet besmet.

*Elke zombie valt 2 mensen aan per uur tussen 8:00 en 22:00. In de nachtelijke uren is dit er 1 per uur.

*Elk uur raakt per 5 aanvallen afgerond naar beneden gemiddeld 1 lichaam van een gezond persoon te zwaar beschadigd om opnieuw op te staan. Deze persoon kan dus geen anderen infecteren.

*Vanaf 8:00 op de eerste dag heeft de mensheid door wat er aan de hand is en weet vanaf dan elk uur per drie aanvallen één aanval af te slaan en daarbij aan de zombie te ontsnappen.

*Omdat we uitgaan van gemiddelden, beginnen we elk uur opnieuw met het tellen van beschadigde lichamen en afgeweerde zombies.

Na hoeveel uren is het menselijk ras uitgestorven?
Je ziet hier wel al wat logica naar voren komen, maar het kan veel duidelijker. User gammuts heeft het hier heel veel beter verwoord:
Ik doe een poging tot herschrijven van vraag 13 - Zombie Nation:

De zombie-apocalypse heeft toegeslagen. Patient zero is besmet geraakt nadat hij was gebeten door een mier tijdens het nachtelijk wildplassen. Hij is gebeten tussen 00:00 en 00:59. Wanneer precies weten we niet en het boeit ons ook niet. Z'n eerste aanval komt toch tussen 01:00 en 02:00 (02:00 niet meegerekend, want dat is alweer het volgende uur). Precies om 00:00 zelfs. Daarom kan ie z'n eerste aanval nog gewoon doen tussen 00:00 en 01:00.


De volgende waarden zijn van toepassing:
Voor de besmetting zijn er 7.000.000.001 mensen. Na de besmeting zijn er dus 7.000.000.000 gezonde mensen en is er 1 actieve zombie.
Standaard valt elke zombie elk uur 1x aan. Van 08:00 tot 22:00 schijnt de zon en is elke zombie actiever: elke zombie valt dan elk uur 2x aan. (08:00-08:59 is het eerste uur, 21:00-21:59 is het laatste uur)
Nederland vergrijst nogal snel. 1 op de 5 heeft daarom een kunstgebit, is blind of doof of whatever. In ieder geval zal 1 op 5 nieuwe zombies zelf nooit anderen infecteren aanvallen (en daarom ook niet infecteren). Decimale mensen of zombies kennen we niet. Het aantal nieuwe zombies dat zelf niet kan infecteren aanvallen, ronden we af naar beneden. Ergo: het aantal nieuwe zombies dat zelf wel kan infecteren aanvallen, ronden we naar boven af.
Om 07:59:59 op de eerste dag heeft de mensheid door wat er aan de hand is en weet vanaf dan elk uur 1 op de 3 aanvallen af te slaan en daarbij de zombie uit te schakelen. Bij een afgeslagen aanval blijft de gezonde mens een gezond mens. Een uitgeschakelde zombie is nooit meer in staat om iemand te infecteren. Op de eerste dag is het eerste uur dat de mens aanvallen pareert het uur tussen 08:00 en 09:00. Afgeslagen aanvallen afronden naar beneden, geslaagde aanvallen naar boven afronden.
Vreemd genoeg lijkt een uur in een atomaire flits voorbij te gaan.
De oudjes hebben net zo veel kans om een aanval te pareren als enig ander mens; die gebeurtenissen hebben geen relatie.
Na hoeveel uren is het menselijk ras uitgestorven?
Goed, mijn toenmalig werkende implementatie:

https://github.com/boudew.../tweakers-challenge/13.py

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import math

mensen=7000000000
tijd=0
zombies=1


    
    
    
while mensen > 0:
    tijd+=1
    uur = tijd % 24 
    aanvallen_per_uur=1 
    # aanvallen...
    if uur >=8 and uur < 22 : 
        aanvallen_per_uur=2
    aanvallen_per_uur*=zombies
    
    # de te zwaar gewonde persoons
    #mensen-= math.ceil(aanvallen_per_uur*0.2)

    if tijd > 8:
        aanvallen_per_uur=math.ceil(aanvallen_per_uur*0.6666666666666666666666666666666666)
        
    mensen-=aanvallen_per_uur
    zombies+=aanvallen_per_uur    
        
    print ("Tijd: "+str(tijd)+ " \t Uur: "+str(uur)+"  \tAanvallen per uur: "+str(aanvallen_per_uur)+" \tMensen "+str(mensen)+"\t Zombies: "+str(zombies))



Na deze draak van een opgave snel naar de webwinkel op: Boudewijns blog

Volgende: Tweakers dev challenge writeup - 14 10-'15 Tweakers dev challenge writeup - 14
Volgende: Tweakers dev challenge writeup - 12 10-'15 Tweakers dev challenge writeup - 12

Reacties

Er zijn nog geen reacties op deze post


Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)

Voer de code van onderstaand anti-spam plaatje in: