Sie haben wahrscheinlich diese Schilder an den Türen verschiedener Geschäfte gesehen:
ÖFFNUNGSZEITEN
Mo
-Fr 9.00-18.00 Uhr Sa -So 11.00-15.30 Uhr
Die Aufgabe hier ist es, ein solches Zeichen zu generieren, das aufeinanderfolgende Tage mit denselben Öffnungszeiten aus einer Liste von Öffnungszeiten für die ganze Woche gruppiert. Beachten Sie, dass die Woche für das, was als aufeinanderfolgend angesehen wird, "umläuft".
Eingang:
- 7 Elemente, die die Öffnungszeiten für jeden Tag in einer Woche darstellen, beginnend mit Montag.
- Jedes Element ist eine Zeichenfolge in der Form XXXX-XXXX
Beispiel Eingabe:
0900-1800 0900-1800 0930-1730 0930-1730 0900-1500 1100-1500 1100-1500
- Es ist in Ordnung, die Eingabe als Array zu senden (zum Beispiel als Eingabe für eine Funktion, wenn Sie nicht aus stdin lesen).
Ausgabe:
- Eine Liste der Öffnungszeiten, wobei aufeinanderfolgende Tage mit denselben Öffnungszeiten als Bereich angezeigt werden. Beachten Sie, dass Sonntag (letzter Tag) und Montag (erster Tag) auch aufeinanderfolgende Tage sind.
- Ein Tag, an dem der Tag keine ähnlichen Öffnungszeiten wie die Tage davor oder danach hat, wird von selbst gedruckt
- Tage werden in drei Kleinbuchstaben angegeben: Mo Di Mi Do Fr Sa So
- Denken Sie daran, dass das erste Element in der Eingabe mon, neben tue usw. entspricht.
- Öffnungszeiten werden wie in der Eingabe angezeigt
Zwei Beispiele
mon-fri 0900-1800, sat-sun 1100-1500 mon-wed 1030-1530, thu 100-1800, fri-sun 1200-1630
Die Ausgabe sollte sortiert sein, damit Bereiche in der Reihenfolge angezeigt werden, in der die Tage in der Woche liegen. Montag ist der erste Tag, aber es kann vorkommen, dass er nicht der erste in einer Gruppe ist, weil die Woche vorüber ist. In diesem Fall ist Di der erste Bereich.
tue-fri 0900-1800, sat-mon 1100-1500
Keine Gruppe, es sei denn, dies ist aufeinanderfolgend. Hier haben Mittwoch und Freitag die gleichen Öffnungszeiten, sind jedoch durch einen Donnerstag mit unterschiedlichen Öffnungszeiten getrennt, sodass sie für sich aufgelistet sind.
mon-tue 1000-1200, wed 0900-1500, thu 1000-1800, fri 0900-1500, sat-sun 1000-1500
- Die Ausgabe kann hier entweder durch Kommas oder durch eine neue Zeile wie im obigen Beispiel getrennt werden.
Testfälle
Erste Zeile wird eingegeben, zweite Zeile wird ausgegeben
0900-1800 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
mon-fri 0900-1800, sat-sun 1100-1500
0900-1800 0900-1800 0900-1800 0930-1700 0900-1800 1100-1500 1100-1500
mon-wed 0900-1800, thu 0930-1700, fri 0900-1800, sat-sun 1100-1500
1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
tue-fri 0900-1800, sat-mon 1100-1500
1100-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
wed-sat 0900-1800, sun-tue 1100-1500
1200-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
mon 1200-1500, tue 1100-1500, wed-sat 0900-1800, sun 1100-1500
Regeln
Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
Antworten:
JavaScript (ES6),
182173170163157 Byte6 Bytes mit Hilfe von edc65 gespeichert
Nimmt Eingaben als ein Array von Zeichenfolgen und druckt das Ergebnis direkt auf die Konsole:
Formatiert und kommentiert
Testfälle
quelle
D='montuewedthufrisatsun'.match(/.../g)
Die VerwendungD
eines Arrays anstelle einer Funktion sollte einige Bytes speichernD()
mit aufgerufen werden-1
(wenn wir nach 'den Tag vor Montag' suchen), wassubstr()
mit einem Array funktioniert, aber nicht funktionieren würde.Batch, 334 Bytes
Übernimmt Eingaben als Befehlszeilenparameter und gibt jede Gruppe in einer separaten Zeile aus. Vergleicht die Stunden eines jeden Tages mit dem vorherigen Tag und protokolliert dabei
f
den ersten Tag in der Gruppe,h
die Stunden dieser Gruppe,l
den letzten Tag in der Gruppe und denw
Zeitpunkt, zu dem die letzte Gruppe auf den Beginn der Woche zurückgeht. Wenn eine Nichtübereinstimmung festgestellt wird, wird die vorherige Gruppe gedruckt, es sei denn, der Wochenumbruch ist aktiviert. Wenn schließlich alle Tage verarbeitet sind, wird die letzte Gruppe für einen Wochenumbruch angepasst und ob sich herausgestellt hat, dass alle Stunden gleich sind, bevor sie ausgegeben werden.0
wird als Platzhalter verwendet, da leere Zeichenfolgen mehr Byte kosten, um sie in Batch zu vergleichen.quelle
Jelly ,
87 84 8075 Bytes'
schnellen "Flat" benutzt habe)Ich bin mir ziemlich sicher, dass es einen besseren Weg gibt, aber im Moment:
TryiItOnline
Wie?
quelle
JavaScript (ES6),
171169 ByteÜbernimmt die Eingabe als Array und gibt sie in separaten Zeilen an die Konsole aus. Dies ist fast genau ein Port meiner Batch-Antwort;
f
jetzt standardmäßig auf eine leere Zeichenfolge natürlich, während ich auch Standard kannl
undw
auf'sun'
(unter Verwendung eines Sentinel - Wert gespeichert me 3 Bytes in Batch , weil ich in der Lage war , die Initialisierung in die verschmelzenset/a
).quelle
BaCon ,
514496455 BytesDas folgende BASIC-Programm wird mit seinem Einzug angezeigt. Ohne Einrückung besteht es jedoch aus 455 Bytes.
Die Idee ist, die Zeitpläne als Indizes für ein assoziatives Array zu verwenden. Dann steht jeder Tag für ein Bit: Montag = Bit 0, Dienstag = Bit 1, Mittwoch = Bit 2 und so weiter. Die tatsächlichen Werte für die Mitglieder des assoziativen Arrays werden durch die jeweiligen Bits der Tage unter Verwendung eines binären ODER berechnet.
Danach muss überprüft werden, wie viele aufeinanderfolgende Bits in den assoziativen Array-Elementen vorhanden sind, beginnend mit Bit 0.
Falls Bit 0 und auch Bit 6 gesetzt sind, erfolgt ein Wochenumbruch. Suchen Sie in diesem Fall nach dem Beginn der nächsten Bitfolge und speichern Sie diese Startposition. Drucken Sie den Rest der Sequenzen aus und sobald Bit 6 erreicht ist, sollte der Tagesbereich mit der gespeicherten Position früher beendet werden.
Verwenden Sie die folgenden Aufrufe, um den SUB aufzurufen:
Ausgabe :
quelle