Jemand hat eine wirklich schicke Uhr mit Fibonacci-Zahlen gebaut, die sehr schön aussieht, aber ziemlich unbrauchbar ist. So wie es uns gefällt! Lassen Sie uns das nachbauen.
Die Uhr besteht aus 5 Abschnitten, die den ersten fünf Fibonacci-Zahlen entsprechen, beginnend mit 1 (dh 1, 1, 2, 3, 5):
ccbeeeee
ccaeeeee
dddeeeee
dddeeeee
dddeeeee
Die Uhr kann die 12-Stunden-Zeit in Schritten von 5 Minuten anzeigen. So funktioniert das Betrachten Sie die Zeit 7:20. Die Stunde 7 kann in die angegebenen Fibonacci-Zahlen als zerlegt werden
7 = 2 + 5
Es gibt auch 4 Einheiten von fünf Minuten. Die 4 kann als zerlegt werden
4 = 2 + 1 + 1
Jetzt werden die Stunden in Rot angezeigt, die Minutenblöcke in Grün, und wenn eine Zahl für Stunden und Minuten verwendet wird, wird sie in Blau angezeigt. Wenn eine Nummer überhaupt nicht verwendet wird, bleibt sie weiß. Das obige würde also so aussehen:
BBGRRRRR
BBGRRRRR
WWWRRRRR
WWWRRRRR
WWWRRRRR
Aber warte, es gibt noch mehr. Die obigen Zerlegungen sind nicht die einzigen Möglichkeiten. Man kann auch schreiben 7 = 3 + 2 + 1 + 1
und 4 = 3 + 1
, was man davon geben würde
GGRWWWWW GGBWWWWW
GGBWWWWW GGRWWWWW
BBBWWWWW or BBBWWWWW
BBBWWWWW BBBWWWWW
BBBWWWWW BBBWWWWW
je nachdem was 1
gewählt wird. Natürlich gibt es auch andere Kombinationen. Die Uhr wählt aus allen gültigen Zerlegungen zufällig aus.
Wie ich schon sagte ... das wird vielleicht keinen Usability Award gewinnen, aber es ist auf jeden Fall schön anzusehen.
Die Herausforderung
Ihre Aufgabe ist es, eine solche Uhr zu implementieren. Ihr Programm (oder Ihre Funktion) sollte eine ASCII-Darstellung der aktuellen Zeit (abgerundet auf das letzte Vielfache von 5 Minuten) wie oben beschrieben auf STDOUT oder die nächstgelegene Alternative ausgeben. Sie können die Zeit in jedem gängigen Format als Eingabe lesen oder mit Standardfunktionen der Bibliothek abrufen. Sie dürfen nicht davon ausgehen, dass die aktuelle / angegebene Zeit durch 5 Minuten teilbar ist.
Ihre Lösung muss zufällig aus allen möglichen Darstellungen der aktuellen Zeit auswählen. Das heißt, jede Darstellung muss mit einer Wahrscheinlichkeit ungleich Null gedruckt werden.
Mitternacht und Mittag sollten als behandelt werden 0:00
(im Gegensatz zu 12:00
) behandelt werden.
Optional können Sie ein einzelnes Zeilenumbruchzeichen drucken.
Sie können anstelle von vier verschiedenen druckbaren ASCII-Zeichen (Zeichencodes 0x20 bis 0xFE) verwenden RGBW
. Bitte geben Sie in Ihrer Antwort Ihre Wahl an und verwenden Sie diese konsequent.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Antworten:
CJam, 61 Bytes
Nimmt zwei durch Leerzeichen getrennte Ganzzahlen über STDIN und verwendet
3.14
stattWRGB
. Probieren Sie es online aus .Hier ist die "vernünftige"
RGBW
Version für ein paar zusätzliche Bytes:Erläuterung
Der Algorithmus ist derselbe wie bei meiner Python-Antwort - Ablehnungsabtastung durch Erzeugen von Takten, bis wir einen erhalten, der korrekt ist.
quelle
Python 2,
194182 BytesBei dem Algorithmus handelt es sich lediglich um eine Zurückweisungsabtastung, sodass so lange Uhren generiert werden, bis die richtige gefunden wurde. Die Uhr wird gebaut, indem man mit nichts beginnt und dann 5 Mal "ein Quadrat darüber hinzufügt und im Uhrzeigersinn dreht".
Nimmt zwei durch Kommas getrennte Ganzzahlen über STDIN auf.
quelle
Python 2, 421 Bytes
Ugh, ich bin mir sicher , dass man mehr Golf spielen kann.
Testfall:
quelle
Ruby, 286 Bytes
Es mag Golf sein, wird es aber ein andermal versuchen.
Erläuterung:
quelle
(0..5).to_a
mit[*0..5]