Vous avez probablement vu ces panneaux sur les portes de divers magasins:
HORAIRES D'OUVERTURES
lun
-ven 0900-1800 sam-dim 1100-1530
La tâche ici est de générer un signe comme celui-ci, regroupant des jours consécutifs avec les mêmes heures d'ouverture, à partir d'une liste d'heures d'ouverture pour toute la semaine. Notez que la semaine «se déroule» pour ce qui est considéré comme consécutif.
Contribution:
- 7 éléments, représentant les heures d'ouverture pour chaque jour d'une semaine, à partir du lundi.
- Chaque élément est une chaîne, sous la forme XXXX-XXXX
Exemple d'entrée:
0900-1800 0900-1800 0930-1730 0930-1730 0900-1500 1100-1500 1100-1500
- Il est correct d'envoyer l'entrée sous forme de tableau (par exemple en tant qu'entrée vers une fonction si vous ne lisez pas depuis stdin)
Production:
- Une liste des heures d'ouverture, où les jours consécutifs avec les mêmes heures d'ouverture sont affichés sous forme de plage. Notez que le dimanche (le dernier jour) et le lundi (le premier jour) sont également des jours consécutifs.
- Un jour où le jour n'a pas d'heures d'ouverture similaires aux jours avant ou après est imprimé seul
- Les jours sont spécifiés en trois lettres minuscules: lun mar mer jeu ven sam dim
- N'oubliez pas que le premier élément de l'entrée correspond à mon, à côté de mar, etc.
- Les heures d'ouverture sont indiquées comme dans l'entrée
Deux exemples
mon-fri 0900-1800, sat-sun 1100-1500 mon-wed 1030-1530, thu 100-1800, fri-sun 1200-1630
La sortie doit être triée, les plages apparaissent donc dans l'ordre des jours de la semaine. Le lundi est préférable d'être le premier, mais il se peut que ce ne soit pas le premier dans un groupe car la semaine se termine. Donc dans ce cas, le tue est la première plage.
tue-fri 0900-1800, sat-mon 1100-1500
Ne groupez pas sauf si consécutif, ici mercredi et vendredi ont les mêmes heures d'ouverture mais sont séparés par un jeudi avec des heures d'ouverture différentes donc ils sont listés par eux-mêmes.
mon-tue 1000-1200, wed 0900-1500, thu 1000-1800, fri 0900-1500, sat-sun 1000-1500
- La sortie peut être soit séparée par des virgules comme les exemples ici, soit séparée par une nouvelle ligne comme dans l'exemple ci-dessus.
Cas de test
La première ligne est entrée, la deuxième ligne est attendue
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
Règles
Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte.
Réponses:
JavaScript (ES6),
182173170163157 157 octetsEnregistré 6 octets avec l'aide d'edc65
Prend l'entrée comme un tableau de chaînes et imprime directement le résultat sur la console:
Formaté et commenté
Cas de test
la source
D='montuewedthufrisatsun'.match(/.../g)
utiliserD
comme un tableau au lieu d'une fonction devrait économiser de l'octetD()
peut être appelé avec-1
(lorsque nous recherchons «la veille de lundi»), qui fonctionne avecsubstr()
mais ne fonctionnerait pas avec un tableau.Lot, 334 octets
Prend l'entrée en tant que paramètres de ligne de commande, génère chaque groupe sur une ligne distincte. Fonctionne en comparant les heures de chaque jour au jour précédent, en effectuant
f
le suivi comme premier jour du groupe,h
comme heures pour ce groupe,l
comme dernier jour du groupe etw
quand le dernier groupe revient au début de la semaine. Lorsqu'une incohérence est détectée, le groupe précédent est imprimé, sauf si l'habillage hebdomadaire est en vigueur. Finalement, lorsque tous les jours sont traités, le dernier groupe est ajusté pour tout emballage de semaine et si toutes les heures se sont avérées être les mêmes avant d'être sorties.0
est utilisé comme espace réservé car les chaînes vides coûtent plus d'octets à comparer dans Batch.la source
Gelée ,
87 84 8075 octets'
rapide, "plat")Je suis sûr qu'il y a une meilleure façon mais pour l'instant:
TryiItOnline
Comment?
la source
JavaScript (ES6),
171169 octetsPrend les entrées sous forme de tableau et les sorties vers la console sur des lignes distinctes. C'est presque exactement un port de ma réponse Batch;
f
maintenant par défaut à une chaîne vide bien sûr, alors que je peux aussi par défautl
etw
à'sun'
(l'utilisation d'une valeur sentinelle m'a sauvé 3 octets dans Batch car j'ai pu fusionner l'initialisation dans leset/a
).la source
BaCon ,
514496455 octetsLe programme BASIC ci-dessous est illustré avec son indentation. Mais sans l'indentation, il se compose de 455 octets.
L'idée est d'utiliser les plannings horaires comme index d'un tableau associatif. Ensuite, chaque jour représente un bit: lundi = bit 0, mardi = bit 1, mercredi = bit 2 et ainsi de suite. Les valeurs réelles des membres du tableau associatif sont calculées par les bits respectifs des jours à l'aide d'un OU binaire.
Après cela, il s'agit de vérifier le nombre de bits consécutifs présents dans les membres du tableau associatif, en commençant par le bit 0.
Dans le cas où le bit 0 et le bit 6 sont définis, il y a un retour à la semaine. Dans ce cas, commencez à rechercher le début de la prochaine séquence de bits, en mémorisant cette position de départ. Imprimez le reste des séquences et dès que le bit 6 est atteint, la plage de jours doit être terminée avec la position mémorisée plus tôt.
Utilisation des appels suivants pour appeler le SUB:
Sortie :
la source