AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein
Thema durchsuchen
Ansicht
Themen-Optionen

Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

Ein Thema von hoika · begonnen am 22. Feb 2016 · letzter Beitrag vom 24. Feb 2016
Antwort Antwort
Seite 2 von 4     12 34      
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#11

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 22. Feb 2016, 20:13
Ah so: elegant und trotzdem leserlich sollte es sein.
Dann
Delphi-Quellcode:
w:=0;
if B1 then inc(w,1);
if B2 then inc(w,1);
if B3 then inc(w,1);
bok:=W=1;
Gruß
K-H
als assembler code und
Delphi-Quellcode:
{Assembler-Code macht folgendes:
w:=0;
if B1 then inc(w,1);
if B2 then inc(w,1);
if B3 then inc(w,1);
bok:=W=1;}
drüber
Philip
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 22. Feb 2016, 20:48
bOK := B1 xor B2 xor B3;
Ergibt für 3mal True wieder True
Das kann man ja mit einer einfachen if-Abfrage vorher prüfen.
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#13

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 22. Feb 2016, 21:01
Das kann man ja mit einer einfachen if-Abfrage vorher prüfen.
oder
bOK := (B1 xor B2 xor B3) and not (B1 and B2 and B3);
Benjamin
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#14

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 22. Feb 2016, 22:51
Das kann man ja mit einer einfachen if-Abfrage vorher prüfen.
oder
bOK := (B1 xor B2 xor B3) and not (B1 and B2 and B3);
Das ist elegant! So etwas suchte ich auch, fand es aber auf die Schnelle nicht. Zwar werden die drei Variablen zweimal miteinander verknüft (soweit war ich noch(?) nicht), jedoch verbleibt die Lösung des Problems auf dem Niveau boolescher bzw. logischer Operationen (die Addition ist pragmatisch und korrekt, hat aber den zwangsläufigen Nimbus einer Bastelei). Außerdem ist augenblicklich klar, daß diese Funktion für beliebig viele Operanden erweiter- bzw. anwendbar ist (beliebig großes boolesches Array).

Meine Anerkennung!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#15

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 23. Feb 2016, 07:43
Außerdem ist augenblicklich klar, daß diese Funktion für beliebig viele Operanden erweiter- bzw. anwendbar ist (beliebig großes boolesches Array).
Wie würde man das denn jetzt auf vier boolsche Variablen erweitern?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 23. Feb 2016, 07:52
Eventuell so?
Delphi-Quellcode:
function IsOneOfThree( const B1, B2, B3: Boolean ): Boolean;
begin
  Result := ( B1 xor B2 xor B3 ) and not ( B1 and B2 and B3 );
end;

function IsOneOfFour( const B1, B2, B3, B4: Boolean ): Boolean;
begin
  Result := IsOneOfThree( IsOneOfThree( B1, B2, B3 ), B4, False );
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#17

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 23. Feb 2016, 08:20
...
oder
bOK := (B1 xor B2 xor B3) and not (B1 and B2 and B3);
Das ist elegant! So etwas suchte ich auch, fand es aber auf die Schnelle nicht. Zwar werden die drei Variablen zweimal miteinander verknüft (soweit war ich noch(?) nicht), jedoch verbleibt die Lösung des Problems auf dem Niveau boolescher bzw. logischer Operationen (die Addition ist pragmatisch und korrekt, hat aber den zwangsläufigen Nimbus einer Bastelei). Außerdem ist augenblicklich klar, daß diese Funktion für beliebig viele Operanden erweiter- bzw. anwendbar ist (beliebig großes boolesches Array).

Meine Anerkennung!
Dem schließe ich mich an.
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#18

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 23. Feb 2016, 09:43
Für die beliebige Anzahl an Bool-Werten (Array) würde mir jetzt eher so etwas vorschweben:

Delphi-Quellcode:
function IsOnlyOneTrue(const BoolArr: TArray<Boolean>): Boolean;
var
  I: Integer;
begin
  Result := False;
  for I := Low(BoolArr) to High(BoolArr) do
    if BoolArr[I] then
      if Result then
        Exit(False)
      else
        Result := True;
end;
Sebastian
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 23. Feb 2016, 10:10
Hallo,

nachdem ich den Code gezeigt habe, wurde mir gesagt
"Falsch!", der erste True-Wert wird genommen, egal wie viele True sind


Heiko
Heiko
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#20

AW: Elegante Lösung gesucht, 3 Boolean-Werte, nur einer darf gesetzt sein

  Alt 23. Feb 2016, 10:25
Außerdem ist augenblicklich klar, daß diese Funktion für beliebig viele Operanden erweiter- bzw. anwendbar ist (beliebig großes boolesches Array).
Wie würde man das denn jetzt auf vier boolsche Variablen erweitern?
Ganz schwierig:

bOK := (B1 xor B2 xor B3 xor B4) and not (B1 and B2 and B3 and B4)

vermutlich aber falsch, wie mir jetzt dämmert, weil das Zwischenergebnis der xor-Operationen ständig alterniert (ich bin jetzt auf die Schnelle zu bequem zum Denken oder Probieren). Es kommt also darauf an, daß die Anzahl der Operanden (un)gerade bleibt. Bei 5 Operanden

bOK := (B1 xor B2 xor B3 xor B4 xor B5) and not (B1 and B2 and B3 and B4 and B5)

sollte es aber wieder stimmen.

Edit: Asche auf mein Haupt, es klappt weder mit 4en noch mit 5en. Ist wohl doch nicht verallgemeinerbar. Schade.

Geändert von Delphi-Laie (23. Feb 2016 um 10:35 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz