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!
1-4 9-2
?149 150 151 152 153 154 155 156 157 178 159 160
?19-9
para19,20,...,29
e não19-29
como o texto implica. Então, o que está correto?Respostas:
LabVIEW, 97 * 0,8 * 0,75 * 0,5 = 29,1 Primitivas do LabVIEW
isso funciona contando para cima se os elemts sucessivos estiverem separados por 1 e, em seguida, criar uma string a partir do módulo número e número - count 10 e alguma multiplicação, pois os negativos são uma cadela.
O gif mostra uma entrada
8,9,10,11
e uma saída8-1
. Para entrada-5,-4,-3,1,3,4,5
-5--3,1,3-5
sai.fonte
C ++ 11, 451 * 80% * 75% * 50% = 135,3 bytes
Guardado 9 bytes graças a @ kirbyfan64sos.
Economizou 19 bytes graças a @JosephMalle e @cat.
Economizou 11 bytes graças a @ pinkfloydx33.
Isso se qualifica para todos os bônus.
Exemplo de teste e resultado da amostra:
fonte
int
vez deunsigned int
? Salva 9 bytes.gcc
deu:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
-std=c++11
; > = 5.0 tem por padrão (na verdade é-std=gnu11
, mas perto o suficiente).Ruby,
120118 * 0,8 * 0,75 * 0,5 = 35,4 bytesRecebe argumentos da linha de comando como entrada (vírgulas são válidas); imprime um intervalo por linha na saída padrão.
Com espaço em branco / comentários:
Casos de teste
Recursos não cobertos por casos de teste
Entradas não ordenadas e intervalos de elemento único:
Intervalos negativos (não é possível abreviar o número maior com estes):
Abreviação de números arbitrários de dígitos (expansão bash comum usada para a entrada aqui):
fonte
((n=c.shift-1)>m)
porm<n=c.shift-1
Javascript ES6, 229 * 80% * 75% * 50% = 68,7 bytes
Entrada de teste
Estou usando os seguintes dados de teste:
Básico: 229 bytes
Esta versão atende aos requisitos da pergunta (a) com todos os bônus (c, d, e), mas fica em uma única página. Ele também pode manipular duplicatas (f). Ele lida com páginas negativas de até -10.000, o que pode ser facilmente aumentado com (grande) perda de velocidade.
(A saída acima mostra espaços em vez de novas linhas reais, por questões de concisão)
Páginas únicas: 233 bytes
Essa versão um pouco mais longa também satisfaz (e) e exibe páginas únicas como um intervalo com limites inferior e superior iguais
fonte
GAP , 355 bytes * 0,8 * 0,75 * 0,5 = 106,5
Isso satisfaz todos os bônus. Custou-me quase 100 bytes extras para fazer tudo funcionar bem. Esta função omite apenas os dígitos iniciais se o espaço não exceder o número colocado uma vez. Por exemplo
9 10 11
saídas,9-1
mas9 10 11 12 .. 20 21
saídas9-21
.Se o GAP fosse um pouco menos detalhado, eu poderia ter ficado tão curto (também poderia ter economizado muitos bytes se não seguisse a sintaxe exata). Provavelmente tentarei jogar um pouco mais difícil amanhã. Veja abaixo os casos de teste.
ungolfed:
Observe que na sintaxe GAP,
[a..b]
é equivalente a[a,a+1,...,b]
. Acredito que esses casos de teste demonstrem que este programa atende a todos os requisitos. Se algo estiver errado, me avise.fonte
Lua, 322 * 80% * 75% * 50% = 96,6 bytes
Finalmente concluído com os 3 desafios, Pontuações abaixo de 100 bytes: D
Golfe
Ungolfed
Você pode testar o lua online , para ver como ele se comporta nos casos de teste, copiar e colar a função, seguida por este código:
fonte
Java, 252 * 80% * 75% * 50% = 75,6 bytes
Eu decidi ir para um método (é muito menor em Java), aqui está a versão golfed:
Golfe
E aqui está a versão legível:
Quando testados, estes são os resultados:
Saída:
Atualizar:
Agora ele também pode lidar com números negativos, aumentando o bônus.
fonte
p=s=c=0;c--;
parap=s=0;c=-1;
?c=~(p=s=0)
pontos de estilo.Japt, 127 bytes * 80% * 75% * 50% = 38,1
Uau, esse foi um desafio enorme para incluir todos os bônus. Provavelmente poderia ser reduzido.
Experimente online!
Como funciona
A explicação é muito grosseira; não hesite em fazer qualquer pergunta que possa ter.
fonte
R, 167 bytes x 80% x 75% x 50% -> 50,1
Recuado, com novas linhas:
Casos de teste:
Funciona com o bônus de -50%:
Aceita entrada não classificada:
Aceita números negativos:
fonte
sh, 135 * .8 * .75 * .5 = 40,5
script de shell
script awk
onde
s
é o início da sequência atual eo
é o valor de entrada anterior.fonte
-31, -30, -29, -28
aumentos no lugar dos 10s de-3
para-2
e, portanto, devem ser condensados em-31-8
. Eu também vejo a ambiguidade que ela cria, mas é isso que é solicitado.