master > master: code - genau 1 Getränk sei vergiftet

This commit is contained in:
RD 2021-10-26 14:49:42 +02:00
parent 902b7b593c
commit e583266394
2 changed files with 24 additions and 19 deletions

View File

@ -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

View File

@ -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