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
|
# CHECKS
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
def preChecks(L: List[int], **_):
|
def preChecks(L: List[bool], **_):
|
||||||
# TODO
|
assert sum(L) > 0, 'Mindestens ein Getränk muss vergiftet sein!';
|
||||||
|
assert sum(L) == 1, 'Höchstens ein Getränk darf vergiftet sein!';
|
||||||
return;
|
return;
|
||||||
|
|
||||||
def postChecks(L: List[int], indexes: List[int], **_):
|
def postChecks(L: List[bool], index: int, **_):
|
||||||
if sum(L) > 0:
|
assert L[index] == True, 'Der Algorithmus hat das vergiftete Getränk nicht erfolgreich bestimmt.';
|
||||||
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.';
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# ALGORITHM find poison
|
# ALGORITHM find poison
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@algorithmInfos(name='Giftsuche (O(n) Vorkoster)', outputnames='indexes', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
@algorithmInfos(name='Giftsuche (O(n) Vorkoster)', outputnames='index', checks=True, metrics=True, preChecks=preChecks, postChecks=postChecks)
|
||||||
def FindPoison(L: List[bool]) -> List[int]:
|
def FindPoison(L: List[bool]) -> int:
|
||||||
'''
|
'''
|
||||||
Inputs: L = Liste von Getränken: durch boolesche Werte wird dargestellt, ob ein Getränk vergiftet ist.
|
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.
|
NOTE: Zeitkosten hier messen nur die Anzahl der Vorkoster.
|
||||||
'''
|
'''
|
||||||
@ -55,7 +54,9 @@ def FindPoison(L: List[bool]) -> List[int]:
|
|||||||
effects = waitForEffects(L, testers);
|
effects = waitForEffects(L, testers);
|
||||||
logDebug('Effekte auswerten, um vergiftete Getränke zu lokalisieren.');
|
logDebug('Effekte auswerten, um vergiftete Getränke zu lokalisieren.');
|
||||||
poisened = evaluateEffects(testers, effects);
|
poisened = evaluateEffects(testers, effects);
|
||||||
return poisened;
|
if len(poisened) > 0:
|
||||||
|
return poisened[0];
|
||||||
|
return -1;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# ALGORITHM find poison fast
|
# ALGORITHM find poison fast
|
||||||
@ -65,7 +66,8 @@ def FindPoison(L: List[bool]) -> List[int]:
|
|||||||
def FindPoisonFast(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.
|
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.
|
NOTE: Zeitkosten hier messen nur die Anzahl der Vorkoster.
|
||||||
'''
|
'''
|
||||||
@ -75,16 +77,21 @@ def FindPoisonFast(L: List[bool]) -> List[int]:
|
|||||||
testers = [];
|
testers = [];
|
||||||
## Für jedes Bit i=0 bis p ...
|
## Für jedes Bit i=0 bis p ...
|
||||||
for i in range(p+1):
|
for i in range(p+1):
|
||||||
AddToCounter(2);
|
tester0 = [ k for k in range(n) if nthBit(number=k, digit=i) == 0 ];
|
||||||
logDebug('Füge Vorkoster hinzu, der alle Getränke k testet mit {i}. Bit = 1.'.format(i=i))
|
tester1 = [ k for k in range(n) if not (k in tester0) ];
|
||||||
testers.append([ k for k in range(n) if nthBit(number=k, digit=i) == 1 ]);
|
# 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))
|
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');
|
logDebug('Warte auf Effekte');
|
||||||
effects = waitForEffects(L, testers);
|
effects = waitForEffects(L, testers);
|
||||||
logDebug('Effekte auswerten, um vergiftete Getränke zu lokalisieren.');
|
logDebug('Effekte auswerten, um vergiftete Getränke zu lokalisieren.');
|
||||||
poisened = evaluateEffects(testers, effects);
|
poisened = evaluateEffects(testers, effects);
|
||||||
return poisened;
|
if len(poisened) > 0:
|
||||||
|
return poisened[0];
|
||||||
|
return -1;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# AUXILIARY METHOD wait for effects, evaluate effects
|
# AUXILIARY METHOD wait for effects, evaluate effects
|
||||||
|
@ -37,8 +37,6 @@ parts:
|
|||||||
description: 'Freiwilliges ÜB2, A4, Beispiel'
|
description: 'Freiwilliges ÜB2, A4, Beispiel'
|
||||||
inputs: &ref_inputs_ueb2_4
|
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, 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'
|
- command: 'algorithm-search-poison-fast'
|
||||||
description: 'Freiwilliges ÜB2, A4, Beispiel'
|
description: 'Freiwilliges ÜB2, A4, Beispiel'
|
||||||
inputs: *ref_inputs_ueb2_4
|
inputs: *ref_inputs_ueb2_4
|
||||||
|
Loading…
x
Reference in New Issue
Block a user