Buch Cover Buch Cover Buch Cover Buch Cover

Web-Code: - Webcode Help

«Brenda Brillant»-Selection (Simulationen)

Brenda Brillant besitzt vier mit Edelsteinen besetzte Fingerringe:
Ein Achat-Ring, zwei identisch aussehende Brillant-Ringe und ein geschliffener Citrin.

Jedes Mal, wenn Brenda abends ihr Haus verlässt, schmückt sie ihre Finger mit einer anderen Kombination. Dabei trägt sie die Ringe natürlich nie am Daumen, jedoch an allen anderen Fingern mit den folgenden Einschränkungen:

* Mindestens einen Ring trägt sie immer.
* Am rechten Ringfinger ist auch immer mindestens ein Ring zu sehen.
* Pro Finger trägt sie maximal zwei Ringe.
* Da die beiden Brillant-Ringe identisch aussehen, spielt ihre Vertauschung keine Rolle.

Schreiben Sie nun ein Programm, das angibt, auf wie viele Arten Brenda ihre Ringe tragen kann. Geben Sie zudem 366 Arten explizit aus, damit Brenda für jeden Tag des Jahres eine andere Kombination tragen kann.

Tipp: Arbeiten Sie z. B. mit je einer Variable für jeden der vier Edelsteine. Die Variablenwerte bezeichnen die (nummerierten) Finger.

0 Kommentare

Bitte melde dich an um einen Kommentar abzugeben

2 Lösung(en)

package ch.programmieraufgaben.simulation;

/**
 * Augabe aus Programmieraufgaben: «Brenda-Brillant»-Selction
 * Web-Code: w8an-2nw4
 * @author Philipp Gressly (phi AT gressly DOT ch)
 */
public class BrendaBrillant {
  public static void main(String[] args) {
    new BrendaBrillant().top();
  }

  // a = achat, b = brillant, c = citrin
  // Werte: 0 = an keinem Finger
  // 1 = kleiner Finger linke Hand
  // 2 = Ringfinger linke Hand
  // ..
  // 7 = Ringfinger rechte Hand
  // 8 = kleiner Finger rechts
  //     (siehe Funktion: fingerName() )
  int a, b1, b2, c;
  int ANZAHL_FINGER = 8;
  
  void top() {
    int anzahl = 0;
    for (a  = 0; a  <= ANZAHL_FINGER;  a++) {
      for (b1 = 0; b1 <= ANZAHL_FINGER; b1++) {
        for (b2 = 0; b2 <= ANZAHL_FINGER; b2++) {
          for (c  = 0; c  <= ANZAHL_FINGER;  c++) {
            if (istGueltig()) {
              anzahl = anzahl + 1;
              if (anzahl <= 366) {
                ausgabe(anzahl);
              }
            }
          }
        }
      }
    }
    System.out.println("Es gibt insgesammt " + anzahl + " Möglichkeiten.");
  } // end top();

  boolean istGueltig() {
    // mindestens ein Ring:
    int[] fingerBesetzung = new int[ANZAHL_FINGER + 1];
    if (0 == a && 0 == b1 && 0 == b2 && 0 == c) {
      return false;
    }

    // mindestens ein Ring am rechten Ringfinger:
    if (a != 7 && b1 != 7 && b2 != 7 && c != 7) {
      return false;
    }
    fingerBesetzung[a]   = 1;
    fingerBesetzung[b1] += 1;
    fingerBesetzung[b2] += 1;
    fingerBesetzung[c]  += 1;

    // Maximal zwei Ringe pro Finger
    for (int finger = 1; finger <= ANZAHL_FINGER; finger++) {
      if (fingerBesetzung[finger] > 2) {
        return false;
      }
    }

    // Brillant Vertauschung.
    // Trägt Brillant 2 eine höhere Fingernummer als Brillant 1, so
    // ignoriere diese Vertauschung
    if (b2 > b1) {
      return false;
    }

    // Alle Ausnahmen behandelt:
    return true;
  }

  void ausgabe(int variantenNummer) {
    System.out.print("Varinte " + variantenNummer + ": ");
    for (int finger = 1; finger <= 8; finger++) {
      ausgabeFinger(finger);
    }
    System.out.println();
  }

  String fingerName(int fingerNummer) {
    String linksRechts;
    if(fingerNummer <= 4) {
      linksRechts = "linken ";
    } else {
      linksRechts = "rechten ";
    }
    if(fingerNummer >= 5) { // rechte Hand spiegeln
      fingerNummer = 9 - fingerNummer;
    }
    switch (fingerNummer) {
      case 1:
        return linksRechts + "kleinen Finger";
      case 2:
        return linksRechts + "Ringfinger"    ;
      case 3:
        return linksRechts + "Mittelfinger"  ;
      case 4:
        return linksRechts + "Zeigefinger"   ;
    }
    return "FEHLER: FINGERNUMMER " + fingerNummer + " NICHT BEKANNT";
  }

  void ausgabeFinger(int fingerNummer) {
    String fingerName = fingerName(fingerNummer);
    if (a   == fingerNummer) {
      ausgabeRing("Achat"          , fingerName);
    }
    if ((b1 == fingerNummer && b2 != fingerNummer) || (b2 == fingerNummer && b1 != fingerNummer)) {
      ausgabeRing("Brillant"       , fingerName);
    }
    if (b1  == fingerNummer && b2 == fingerNummer) {
      ausgabeRing("zwei Brillanten", fingerName);
    }
    if (c   == fingerNummer) {
      ausgabeRing("Citrin"         , fingerName);
    }
  }
  
  void ausgabeRing(String edelstein, String fingerName) {
      System.out.print(edelstein + " am " + fingerName + "; ");
  }
    
} // end of class BrendaBrillant
                

Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

#!/usr/bin/ruby
# -*- coding: utf-8 -*-

# @autor Philipp Gressly Freimann
# 10. Okt. 2013
#
# Aufgabe http://www.programmieraufgaben.ch / http://www.programmieren-lernen.ch
# Brenda Brillant Selection

MAX_FINGER = 8 # An welchem Finger (7=rechter Ringfinger)
ANZ_RINGE  = 4
RINGE      = 0, 0, 0, 0
$total     = 0
$soll 

def hauptprogramm() 
  print "Dieses Programm gibt alle gültigen Möglichkeiten aus (auch mehr als 366).\n"
  while(nextSelection()):
    if(gueltig()):
      ausgabe()
    end
  end
end


def gueltig() 
  #####################
  # mindestens ein Ring
  #####################
  # Muss nicht geprüft werden, da nach
  #   "nextSelection()" automatisch
  # 1, 0, 0, 0 folgt

  ####################
  # Mindestens einer am rechten Ringfinger
  ####################
  if 7!=RINGE[0] && 7!=RINGE[1] && 7!=RINGE[2] && 7!=RINGE[3]:
    return false
  end

  ###################
  # Brillanten sind identisch
  ###################
  # Nur gelten lassen, wenn Pos Diamant [2] >= Pos Diamant [1]
  if RINGE[1] < RINGE[2]:
    return false
  end

  ##################
  # Maximal zwei Ringe pro Finger
  ##################
  # Sobald ein Finger mehr als 2 Mal vorkommt: verwirf die Lösung
  #
  $f = 1
  while $f < 9:
    if vorkommen($f) > 2:
      return false
    end
    $f = $f + 1
  end
  
  ##
  # Keine Einschränkung gefunden. Also gültig:
  ##
  return true
end

def vorkommen(fingerNummer) 
  vorkommen = 0
  ringNr    = 0
  while ringNr < ANZ_RINGE:
    if RINGE[ringNr] == fingerNummer:
      vorkommen = vorkommen + 1
    end
    ringNr = ringNr + 1
  end
  return vorkommen
end

def ausgabe()
  $total = $total + 1
  print "#{$total}. Variante: "
  if(RINGE[0] > 0):
    print "Achat an "    , fingerName(RINGE[0]) , "; "
  end
  if(RINGE[1] > 0):
    print "Brillant an " , fingerName(RINGE[1]) , "; "
  end
  if(RINGE[2] > 0):
    print "Brillant an " , fingerName(RINGE[2]) , "; "
  end
  if(RINGE[3] > 0):
    print "Citrin an "   , fingerName(RINGE[3]) , "\n"
  end
end


def fingerName(fingerNummer)
  if(1 == fingerNummer): return "linkem kleinen Finger"  end
  if(2 == fingerNummer): return "linkem Ringfinger"      end 
  if(3 == fingerNummer): return "linkem Mittelfinger"    end
  if(4 == fingerNummer): return "linkem Zeigefinger"     end

  if(5 == fingerNummer): return "rechtem Zeigefinger"    end
  if(6 == fingerNummer): return "rechtem Mittelfinger"   end 
  if(7 == fingerNummer): return "RECHTEM RINGFINGER(!)"  end
  if(8 == fingerNummer): return "rechtem kleinen Finger" end
end


def nextSelection() 
  pos = 0;
  while pos < ANZ_RINGE:
    if MAX_FINGER == RINGE[pos]:
      RINGE[pos] = 0 # reset
      pos = pos + 1;
    else
      RINGE[pos] = RINGE[pos] + 1
      return true
    end
  end 
  return false
end

## MAIN ##

hauptprogramm()

##### END  #####
                

Lösung von: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Verifikation/Checksumme:

Es gibt 1295 Varianten, welche Brenda akzeptiert.

Aktionen

Bewertung

Durchschnittliche Bewertung:

Eigene Bewertung:
Bitte zuerst anmelden

Meta

Zeit: 1
Schwierigkeit: Mittel
Webcode: w8an-2nw4
Autor: Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch)

Download PDF

Download ZIP

Zu Aufgabenblatt hinzufügen