Isenção de responsabilidade: enquanto eu estiver neste site para fins de entretenimento há algum tempo, esta é minha primeira pergunta.
fundo
Ao nos atribuir a lição de casa, meu professor é realmente irritante e escreve todos os problemas que temos que fazer individualmente. Como tal, levo uma eternidade para copiar quais problemas eu tenho que fazer. Eu pensei que, para facilitar minha vida, enviaria a ele um programa que poderia fazer com que a lista de problemas ocupasse menos espaço.
Ao escrever uma lista de números de páginas ou problemas, usamos um traço para indicar um intervalo. Por exemplo, 19-21
torna-se 19, 20, 21
. Se houver um intervalo entre eles, dois intervalos separados por vírgula são usados: 19-21, 27-31
torna - se 19, 20, 21, 27, 28, 29, 30, 31
.
Agora, você provavelmente está pensando: "isso parece bastante trivial". De fato, isso já foi respondido aqui e aqui .
No entanto, há um porém. Se tivermos um intervalo com dígitos consecutivos iguais, os dígitos repetidos podem ser deixados de fora. Por exemplo: 15, 16, 17
torna - se 15-7
e 107, 108, 109
torna - se 107-9
. Para um bônus, se o último dígito igual consecutivo for 1 maior e o último dígito do limite superior for menor ou igual ao inferior, o seguinte poderá ser omitido (desculpe se isso soou confuso; talvez alguns exemplos o esclareçam) . 109-113
torna-se109-3
, como um último dígito mais baixo implica aumentar o lugar dos 10s.
Desafio
Seu programa deve receber uma lista de números inteiros via entrada (qualquer que seja o padrão para o seu idioma ou função). Você pode decidir se essa lista é separada por vírgulas, separada por espaço ou como uma lista / matriz real.
Saída da maneira mais curta (primeiro classificada por número de intervalos, depois a soma dos caracteres incluídos nos intervalos) para representar essa lista usando essa notação. Cada intervalo tracejado deve estar na mesma linha, mas os intervalos podem ser separados por vírgulas ou novas linhas (novas linhas ou vírgulas à direita são permitidas). Esses intervalos devem estar em ordem.
Como o Wi-Fi da nossa escola é terrível , tenho que tornar o arquivo o menor possível para enviá-lo a ele. O código mais curto (em bytes) vence.
Bónus
Meu professor é desleixado, então existem algumas coisas que o ajudariam. Vários bônus são acumulados através da multiplicação, por exemplo, um bônus de -10% (x 90%) e um bônus de -25% (x 75%) = 90% * 75% = x 67,5% (bônus de -32,5%).
- Às vezes, ele os coloca na ordem errada (ele não é um professor de matemática). Receba um bônus de -20% se o seu programa puder aceitar números inteiros que não são classificados da menor para a maior.
- Nosso livro é estranho e cada seção começa a contar os problemas em -10. Se o seu programa puder aceitar números negativos, pegue -25%.
- Se ele aceitar o bônus de um último dígito mais baixo, aumentando o lugar dos 10, por exemplo,
25-32
reduzindo para25-2
, receba um bônus de -50%.
Casos de teste
In: 1, 2, 3, 4, 5
Out: 1-5
In: 3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12
In: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60
In: 1 2 3 4
Out: 1-4
For bonuses:
In: 109, 110, 111, 112, 113
Out: 109-3
In: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9
In: -3, -2, -1, 0, 1, 2
Out: -3-2
In: -3, -2, -1
Out: -3--1
Uma resposta será aceita no sábado, 19 de dezembro de 2015.
GLHF!
149 150 151 152 153 154 155 156 157 178 159 160
?
19-9
para 19,20,...,29
e não 19-29
como o texto implica. Então, o que está correto?
1-4 9-2
?