hotti: Wieviel Ziffern brauche ich

um ein gültiges Datum darzustellen?

Hi,

empirisch ermittelt sieht das so aus (das Jahr lassen wir mal weg und auch die vorangestellten Nullen):

Die 0 brauche ich zweimal, gemessen am Datum 10.10.

Einsen brauche ich vier, das sehe ich sofort am Datum 11.11.

Zweien brauche ich nur drei, 22.12. als Beispiel. Den 22.22. gips ja garnich.

Dreien brauch ich wahrscheinlich nur zwei... und von den Rest der Ziffern bis zur Neune auch nur noch zwei.

Also: Wie raffe ich sowas in einen Algorithmus?

Viele Grüße und viel Spaß beim Knobeln,
Hotti

  1. Hi,

    Was versuchst du damit zu erreichen? Willst du Platz Sparen?
    Oder ist das einfach nur Interesse (was durchaus OK ist ;-)).

    Grüße,
    Andres Freund

    1. Hi,

      Achja: Ein Algorithmus dürfte relativ einfach sein:
      Datumsformat: jjjj-mm-dd
       - Zu jeder Stelle die Menge aller möglichen Zahlen angeben:
         {0,1,...,9}{0,1,...,9}{0,1,...,9}{0,1,...,9}-{0,1}{0,1,...,9}-{0,1}{0,1,...,9}
       - Für jede Zahl zählen, in wievielen Mengen sie vorkommt
       - Nur bei der 0 muss, je nach dem, wie die aufgabe definiert ist, noch etwas abgezogen werden. (für den mm/dd Fall von 00, den Monat gibt es ja nicht...)

      Aus lauter schlechtem gewissen über eine IRC-artige Antwort...

      Andres

      1. Moin,

        • Zu jeder Stelle die Menge aller möglichen Zahlen angeben:
             {0,1,...,9}{0,1,...,9}{0,1,...,9}{0,1,...,9}-{0,1}{0,1,...,9}-{0,1}{0,1,...,9}

        Globe hat mich darauf hingewiesen, dass copy'n paste nicht immer die beste Idee ist ;-)

        Grüße,
        Andres Freund

    2. Hi,

      Was versuchst du damit zu erreichen? Willst du Platz Sparen?

      Nein, ich muss Ziffern kaufen. Eine Ziffer kostet 1 € und das läppert sich dann schon zusammen.

      Im Prinzip hab ich die Summe ja schon ausgerechnet. Empirisch ermittelt eben. Aber als Programmierer kommen mir da schon Bedenken, ob das auch stimmt ;-)

      Viele Grüße,
      Hotte

      1. Hallo,

        Im Prinzip hab ich die Summe ja schon ausgerechnet. Empirisch ermittelt eben.

        Empirisch? Du hast einen Algorithmus verwendet.

        Aber als Programmierer kommen mir da schon Bedenken, ob das auch stimmt ;-)

        Wenn Du Deinem Verstand nicht traust, dann solltest Du auch keinem Programm und keinem Skript trauen, das Du fabrizierst.

        Tipp: KISS
        Zähl' einfach durch. Und komm mir bei maximal 366 Tagen nicht mit irgendwelcher "Effizienz".

        Grüße

        Vinzenz

        1. Hi,

          Zähl' einfach durch. Und komm mir bei maximal 366 Tagen nicht mit irgendwelcher "Effizienz".

          Aber mit Langeweile ;-) Was schon ein ganz guter Grund ist etwas nicht zu machen. Wobei es in diesem Fall von der Logik her auch ganz gut ohne geht.

          Andres

        2. Hallo,

          Zähl' einfach durch. Und komm mir bei maximal 366 Tagen nicht mit irgendwelcher "Effizienz".

          Hmm, Jein lieber Vinzenz,

          die Bemessungsgrundlagen für Berechnungen dieser Art zur Darstellung eines Datums haben mit der Anzahl der Tage eines Jahres nichts zu tun. Du bist da sozusagen in einer Sackgasse gelandet :-)

          Ne, mal im Ernst, orientieren wir uns an den Zahlen 31 und 12. Gute Ansätze gibts bereits hier im Fred.

          Viele Grüße an Alle,
          Hotte

          PS:
          Mein Partner vom Baumarkt hat die Preise korrigiert. Ich bekomme nunmehr die Ziffern 0..9 bereits für 5 € pro Packung. Da ich mindestens vier Einser brauche, macht das zsamma 20 € incl. einiger Ziffern, die ich dafür umsonst kaufen muss.

          Das sind zwei Nullen, eine Zwei und ab Drei jeweils zwei Ziffern, wenn ich mich nicht irre.

          1. Hallo,

            Zähl' einfach durch. Und komm mir bei maximal 366 Tagen nicht mit irgendwelcher "Effizienz".

            die Bemessungsgrundlagen für Berechnungen dieser Art zur Darstellung eines Datums haben mit der Anzahl der Tage eines Jahres nichts zu tun. Du bist da sozusagen in einer Sackgasse gelandet :-)

            ich nicht, sondern Du! Ich käme ja nicht auf die Idee, an meinem Verstand zu zweifeln ...

            Freundliche Grüße

            Vinzenz

      2. Hi,

        ich muss Ziffern kaufen.

        das klang im ersten Augenblick schon etwas merkwürdig... ;-) Aber klar, Anzeigetafel oder sowas.

        Im Prinzip hab ich die Summe ja schon ausgerechnet. Empirisch ermittelt eben. Aber als Programmierer kommen mir da schon Bedenken, ob das auch stimmt ;-)

        doch, das stimmt schon. Und in der kurzen Zeit, in der Du das logisch (nicht empirisch) ermittelt hast, hättest Du kaum einen Algorithmus dafür entwickeln können. Wenn Du das aus Spaß dennoch machen willst, dann betrachte jede Stelle für sich und gebe die Mindest- und Höchstziffer an.
        Also d1 d2 m1 m2:
        d1 => 1-3 =  3 € (keine führenden Nullen)
        d2 => 0-9 = 10 €
        m1 => 1   =  1 € (keine führenden Nullen)
        m2 => 0-9 = 10 €
                    ----
                    24 €
        Für die Bestellung könnte das Programm dann noch die Anzahl addieren:
        0:   2*
        1:   4*
        2+3: 3*
        4-9: 2*

        freundliche Grüße
        Ingo

      3. Hallo Hotti,

        ich versuche Dir zu erklären, was ich Dir mit meinen ersten beiden Einträgen sagen wollte. Ich hatte gehofft, Du verständest das auch ohne detaillierte Erläuterung.

        Nein, ich muss Ziffern kaufen. Eine Ziffer kostet 1 € und das läppert sich dann schon zusammen.

        Im Prinzip hab ich die Summe ja schon ausgerechnet. Empirisch ermittelt eben. Aber als Programmierer kommen mir da schon Bedenken, ob das auch stimmt ;-)

        wenn Du beim Programmieren keine Logik reinstecken willst (kannst, darfst, ...), dann nimmst Du halt "brute force". Wenn Du bei diesem Problem Logik verwenden darfst, dann erübrigt sich das Programmieren :-)

        Bringst Du bei einem allgemeinen Problem Deinem Code die zugrunde liegende Logik nicht in entsprechenden Kommentaren ein, schreibst Du miserablen Code.

        /***
         **  int anzahl_ziffern(int ziffer)
         **
         **  gibt die Mindestanzahl an Exemplaren der vorgegebenen ziffer zurück,
         **  die benötigt werden, um den Tag/Monat-Anteil eines beliebigen gültigen
         **  Datums im bei uns üblichen Kalender darzustellen. Die Darstellung
         **  erfolgt ohne führende Nullen.
         **
         **  Betrachtung (siehe auch Ingo):
         **  Maximal werden vier Stellen benötigt
         **  t1 von 1 bis 3
         **  t2 von 0 bis 9
         **  m1 nur 1
         **  m2 von 0 bis 9
         **
         **  Somit werden maximal benötigt:
         **  1        : 4
         **  2, 3     : 3
         **  4 - 9, 0 : 2 Exemplare
         **
         ** Es gibt folgende Daten:
         **  11.11. => 4 x 1
         **  22. 2  => 3 x 2
         **   3. 3. => mindestens 2 x 3
         **   4. 4. => 2 x 4
         **   5. 5. => 2 x 5
         **   6. 6. => 2 x 6
         **   7. 7. => 2 x 7
         **   8. 8. => 2 x 8
         **   9. 9. => 2 x 9
         **  10.10. => 2 x 0
         **
         **  Die einzige Möglichkeit, bei der drei 3en erforderlich wären, wäre der
         **  33. 3. (da m1 keine 3 aufweist). Dies ist kein gültiges Datum, daher
         **  werden maximal nur 2 Dreien benötigt.
         **
         **  => Damit ist genau bestimmt, wieviele Exemplare von jeder Ziffer
         **     minimal benötigt werden:
         **
         **        1        : 4
         **        2        : 3
         **        3 - 9, 0 : 2 Exemplare
         **
         **  Übergabeparameter: eine Ziffer
         **  Rückgabe:
         **    bei Übergabe von 1   : 4
         **                     2   : 3
         **    einer anderen Ziffer : 2
         **
         **  Anmerkung:
         **  Wenn der Übergabeparameter keine Ziffer ist, wird eine
         **  Eingabewertverletzung ausgelöst.
         **/

        Funktion anzahl_ziffern(Übergabe: ziffer) {
            Betrachte ziffer
                Wenn 1
                    gebe 4 zurück
                Wenn 2
                    gebe 3 zurück
                Wenn 0 oder zwischen 3 und 9 (einschließlich Grenzen)
                    gebe 2 zurück
                Sonst
                    melde eine ungültige Eingabe
            Ende Betrachtung ziffer

        /* Alternative Implementationen sind selbstverständlich möglich */

        /* Beispiel:
            ** Erstelle ein 0-basiertes Feld mit 10 Einträgen, das die Werte
            ** 2, 4, 3, 2, 2, 2, 2, 2, 2, 2
            ** enthält.
            ** Gib den Feld(ziffer) (in diversen Programmiersprachen schreibt man
            ** dies Feld[ziffer]) zurück.
            ** Eine gegebenenfalls ausgelöste Bereichsverletzung passt wunderbar.
            */

        Ende der Funktion

        Welches Problem hast Du nun damit einen "Algorithmus" zur Lösung des Problems zu finden? Wenn Du schon anfängst durchzuzählen, dann kannst Du gleich jeden einzelnen Tag zählen, jede weitere "Logik", um weniger zählen zu müssen, wäre vergeudete Zeit. [1]

        Erklärende Grüße

        Vinzenz

        [1] so wie die Zeit, die ich mir für diesen Beitrag für ein nichtexistentes
            Problem nahm.

  2. Hi hotti,

    Wie viele Ziffern brauchst Du,

    um ein gültiges Datum darzustellen?

    Zwei (nach den von Dir formulierten Bedingungen an die Darstellung). Aber genug der Haarspalterei ;-)

    Das ganze Problem ist natuerlich ausgesprochen endlich. Und es ist

    Benoetigte Anzahl der Ziffer n {
       wenn (n="1") Ausgabe = 4
       wenn (n="2") Ausgabe = 3
       sonst Ausgabe = 2
    }

    ein Algorithmus (ja, das ist ein Algorithmus), den Du an Komplexitaet wohl nicht mehr unterbieten wirst. Wenn Du den Algorithmus verifizieren willst (und vielleicht ist das eher, worum sich Deine Frage eigentlich drehte), dann ist Vinzenz' Vorschlag, einfach durchzuzaehlen, allemal die vernuenftigste Loesung.

    Denke daran: die Anzahl irgendwelcher Ziffern einer Zahl ist keine arithmetische Eigenschaft der Zahl. Es ist nur eine Eigenschaft ihrer Darstellung bezueglich eines wie auch immer gearteten Darstellungssystems. Das macht die Fragestellung fuer einen Computer etwas haarig, so dass ein derartiger Algorithmus, wenn er die Ausgabe denn explizit berechnen soll, fast unweigerlich aus laestigen Fallunterscheidungen und/oder Typkonvertierungen besteht. Es gibt m.E. ueberhaupt keinen Grund, mit so etwas bei dieser Fragestellung auch nur anzufangen.

    viele Gruesse
    der Bademeister