master > master: code - genau 1 Getränk sei vergiftet
This commit is contained in:
parent
902b7b593c
commit
e583266394
@ -21,26 +21,25 @@ from code.algorithms.methods import *;
|
||||
# CHECKS
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
def preChecks(L: List[int], **_):
|
||||
# TODO
|
||||
def preChecks(L: List[bool], **_):
|
||||
assert sum(L) > 0, 'Mindestens ein Getränk muss vergiftet sein!';
|
||||
assert sum(L) == 1, 'Höchstens ein Getränk darf vergiftet sein!';
|
||||
return;
|
||||
|
||||
def postChecks(L: List[int], indexes: List[int], **_):
|
||||
if sum(L) > 0:
|
||||
assert [ k for k in range(len(L)) if L[k] == True ] == indexes, 'Der Algorithmus hat die vergifteten Getränke nicht erfolgreich bestimmt.';
|
||||
else:
|
||||
assert len(indexes) == 0, 'Der Algorithmus sollte erkennen, dass Gift nicht vorhanden ist.';
|
||||
def postChecks(L: List[bool], index: int, **_):
|
||||
assert L[index] == True, 'Der Algorithmus hat das vergiftete Getränk nicht erfolgreich bestimmt.';
|
||||
return;
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ALGORITHM find poison
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@algorithmInfos(name='Giftsuche (O(n) Vorkoster)', outputnames='indexes', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
||||
def FindPoison(L: List[bool]) -> List[int]:
|
||||
@algorithmInfos(name='Giftsuche (O(n) Vorkoster)', outputnames='index', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
||||
def FindPoison(L: List[bool]) -> int:
|
||||
'''
|
||||
Inputs: L = Liste von Getränken: durch boolesche Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
||||
Outputs: Die Liste aller Indexes i mit L[i] == true, was den vergifteten Getränken entspricht.
|
||||
Annahme: Genau ein Getränk sei vergiftet.
|
||||
Outputs: Der Index des vergifteten Getränks, falls es eines gibt, ansonsten -1.
|
||||
|
||||
NOTE: Zeitkosten hier messen nur die Anzahl der Vorkoster.
|
||||
'''
|
||||
@ -55,7 +54,9 @@ def FindPoison(L: List[bool]) -> List[int]:
|
||||
effects = waitForEffects(L, testers);
|
||||
logDebug('Effekte auswerten, um vergiftete Getränke zu lokalisieren.');
|
||||
poisened = evaluateEffects(testers, effects);
|
||||
return poisened;
|
||||
if len(poisened) > 0:
|
||||
return poisened[0];
|
||||
return -1;
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ALGORITHM find poison fast
|
||||
@ -65,7 +66,8 @@ def FindPoison(L: List[bool]) -> List[int]:
|
||||
def FindPoisonFast(L: List[bool]) -> List[int]:
|
||||
'''
|
||||
Inputs: L = Liste von Getränken: durch boolesche Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
||||
Outputs: Die Liste aller Indexes i mit L[i] == true, was den vergifteten Getränken entspricht.
|
||||
Annahme: Genau ein Getränk sei vergiftet.
|
||||
Outputs: Der Index des vergifteten Getränks, falls es eines gibt, ansonsten -1.
|
||||
|
||||
NOTE: Zeitkosten hier messen nur die Anzahl der Vorkoster.
|
||||
'''
|
||||
@ -75,16 +77,21 @@ def FindPoisonFast(L: List[bool]) -> List[int]:
|
||||
testers = [];
|
||||
## Für jedes Bit i=0 bis p ...
|
||||
for i in range(p+1):
|
||||
AddToCounter(2);
|
||||
logDebug('Füge Vorkoster hinzu, der alle Getränke k testet mit {i}. Bit = 1.'.format(i=i))
|
||||
testers.append([ k for k in range(n) if nthBit(number=k, digit=i) == 1 ]);
|
||||
tester0 = [ k for k in range(n) if nthBit(number=k, digit=i) == 0 ];
|
||||
tester1 = [ k for k in range(n) if not (k in tester0) ];
|
||||
# NOTE: tester1 ist virtuell: aus den Effekten auf tester0 und den Annahmen lassen sich die Effekte auf tester0 erschließen.
|
||||
# Darum zählen wir nicht 2 sondern 1 Vorkoster.
|
||||
AddToCounter(1);
|
||||
logDebug('Füge Vorkoster hinzu, der alle Getränke k testet mit {i}. Bit = 0.'.format(i=i))
|
||||
testers.append([ k for k in range(n) if nthBit(number=k, digit=i) == 0 ]);
|
||||
testers.append(tester0);
|
||||
testers.append(tester1);
|
||||
logDebug('Warte auf Effekte');
|
||||
effects = waitForEffects(L, testers);
|
||||
logDebug('Effekte auswerten, um vergiftete Getränke zu lokalisieren.');
|
||||
poisened = evaluateEffects(testers, effects);
|
||||
return poisened;
|
||||
if len(poisened) > 0:
|
||||
return poisened[0];
|
||||
return -1;
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# AUXILIARY METHOD wait for effects, evaluate effects
|
||||
|
@ -37,8 +37,6 @@ parts:
|
||||
description: 'Freiwilliges ÜB2, A4, Beispiel'
|
||||
inputs: &ref_inputs_ueb2_4
|
||||
L: [ false, false, false, false, false, false, false, false, true, false, false, false, false, false ]
|
||||
# L: [ false, false, false, false, false, false, false, false, true, false, false, false, true, false ]
|
||||
# L: [ false, false, false, false, false, false, false, false, false, false, false, false, false, false ]
|
||||
- command: 'algorithm-search-poison-fast'
|
||||
description: 'Freiwilliges ÜB2, A4, Beispiel'
|
||||
inputs: *ref_inputs_ueb2_4
|
||||
|
Loading…
x
Reference in New Issue
Block a user