Você provavelmente já viu estas placas nas portas de várias lojas:
HORÁRIO DE ABERTURA
segunda-feira 0900-1800
sáb-dom 1100-1530
A tarefa aqui é gerar um sinal como esse, agrupando dias consecutivos com o mesmo horário de funcionamento, a partir de uma lista de horários de funcionamento para toda a semana. Observe que a semana "termina" pelo que é considerado consecutivo.
Entrada:
- 7 elementos, representando o horário de funcionamento de cada dia em uma semana, começando na segunda-feira.
- Cada elemento é uma sequência, no formato XXXX-XXXX
Exemplo de entrada:
0900-1800 0900-1800 0930-1730 0930-1730 0900-1500 1100-1500 1100-1500
- Não há problema em enviar a entrada como uma matriz (por exemplo, como entrada para uma função se você não ler a partir de stdin)
Saída:
- Uma lista de horários de funcionamento, em que dias consecutivos com o mesmo horário de funcionamento são mostrados como um intervalo. Observe que domingo (o último dia) e segunda-feira (o primeiro dia) também são dias consecutivos.
- Um dia em que o dia não tem horário de funcionamento semelhante aos dias anteriores ou posteriores é impresso por si só
- Os dias são especificados como três letras minúsculas: segunda a quarta a sexta
- Lembre-se de que o primeiro elemento na entrada corresponde a seg, próximo a ter etc.
- O horário de funcionamento é mostrado como na entrada
Dois exemplos
mon-fri 0900-1800, sat-sun 1100-1500 mon-wed 1030-1530, thu 100-1800, fri-sun 1200-1630
A saída deve ser classificada, para que os intervalos apareçam na ordem dos dias da semana. É preferível segunda-feira para ser o primeiro, mas pode acontecer que não seja o primeiro de um grupo porque a semana termina. Portanto, neste caso, ter é o primeiro intervalo.
tue-fri 0900-1800, sat-mon 1100-1500
Não agrupe a menos que seja consecutivo. Aqui, quarta e sexta-feira têm o mesmo horário de funcionamento, mas são separadas por uma quinta-feira com horários diferentes, para que sejam listados sozinhos.
mon-tue 1000-1200, wed 0900-1500, thu 1000-1800, fri 0900-1500, sat-sun 1000-1500
- A saída pode ser separada por vírgula como os exemplos aqui, ou separada por uma nova linha, como no exemplo na parte superior.
Casos de teste
Primeira linha é entrada, segunda linha é saída esperada
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
Regras
Isso é código-golfe, então a resposta mais curta em bytes vence.
Respostas:
JavaScript (ES6),
182173170163157 bytesEconomizou 6 bytes com a ajuda de edc65
Recebe a entrada como uma matriz de seqüências de caracteres e imprime diretamente o resultado no console:
Formatado e comentado
Casos de teste
fonte
D='montuewedthufrisatsun'.match(/.../g)
utilizandoD
como uma matriz em vez de uma função deve poupar algum byteD()
pode ser chamado com-1
(quando procuramos 'o dia antes de segunda-feira'), que funciona com,substr()
mas não funcionaria, com uma matriz.Lote, 334 bytes
Recebe a entrada como parâmetros da linha de comando e gera cada grupo em uma linha separada. Funciona comparando as horas de cada dia com o dia anterior, rastreando
f
como o primeiro dia do grupo,h
como as horas desse grupo,l
como o último dia do grupo ew
para quando o último grupo volta ao início da semana. Quando uma incompatibilidade é encontrada, o grupo anterior é impresso, a menos que o empacotamento semanal esteja em vigor. Finalmente, quando todos os dias são processados, o último grupo é ajustado para qualquer quebra de semana e se todas as horas foram iguais antes de serem exibidas.0
é usado como um espaço reservado porque cadeias vazias custam mais bytes para comparar no lote.fonte
Geléia ,
87 84 8075 bytes'
quick, "flat")Certeza de que existe uma maneira melhor, mas por enquanto:
TryiItOnline
Quão?
fonte
JavaScript (ES6),
171169 bytesRecebe a entrada como uma matriz e gera para o console em linhas separadas. Esta é quase exatamente uma porta da minha resposta em lote;
f
agora o padrão é uma seqüência vazia, claro, enquanto eu também pode usar como padrãol
ew
para'sun'
(usando um valor de sentinela me salvou 3 bytes em Batch porque eu era capaz de mesclar a inicialização noset/a
).fonte
Bacon ,
514496455 bytesO programa BASIC abaixo é mostrado com seu recuo. Mas sem o recuo, ele consiste em 455 bytes.
A idéia é usar os horários como índices para uma matriz associativa. Então, cada dia representa um pouco: segunda-feira = bit 0, terça-feira = bit 1, quarta-feira = bit 2 e assim por diante. Os valores reais para os membros da matriz associativa são calculados pelos respectivos bits dos dias usando um OR binário.
Depois disso, é uma questão de verificar quantos bits consecutivos estão presentes nos membros da matriz associativa, começando com o bit 0.
Caso o bit 0 e também o bit 6 estejam configurados, há uma quebra de semana. Nesse caso, comece a procurar o início da próxima sequência de bits, memorizando esta posição inicial. Imprima o restante das seqüências e, assim que o bit 6 for atingido, o intervalo de dias deverá terminar com a posição memorizada anteriormente.
Usando as seguintes chamadas para chamar o SUB:
Saída :
fonte