Você é Tom Sawyer e precisa pintar uma cerca de 102400 m de comprimento. Felizmente, seus amigos decidiram ajudá-lo na troca de várias coisas. Cada amigo vai pintar L metros, a partir de S com a cor C . S , L são a quantidade inteira de metros e 1 ≤ C ≤ 97. Ficando entediado, você decide descobrir quantos metros de cada cor você tem.
Entrada
A entrada é lida a partir da entrada padrão. Cada linha contém três números S , L , C , conforme descrito acima.
Ouput
A saída é gravada na saída padrão. Para cada cor que aparece na cerca final, imprima o número da cor e o número de vezes que aparece. Encomende por cores.
Exemplos
Entrada 0
..............
0 3 1 111...........
2 4 2 112222........
1 2 3 133222........
0 4 1 111122........
7 3 5 111122.555....
Saída 0
1 4
2 2
5 3
Entrada 1
0 100 1
50 150 2
Saída 1
1 50
2 150
Entrada 2
500 1000 1
0 2000 2
Saída 2
2 2000
Mais exemplos
Aqui está um pequeno gerador:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
/* From http://en.wikipedia.org/wiki/Random_number_generation */
unsigned m_w;
unsigned m_z;
unsigned get_random()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
int main(int argc, char **argv)
{
int i;
assert(argc == 2);
m_w = 0xbabecafe;
m_z = atoi(argv[1]);
i = 10;
while (i--);
get_random();
i = atoi(argv[1]);
while (i--) {
int s = (int) ((get_random() << 8) % 102397);
int l = (int) ((get_random() << 8) % (102397 - s));
int c = (int) ((get_random() << 8) % 97 + 1);
printf("%d %d %d\n", s, l, c);
}
return 0;
}
Exemplos em execução:
$ ./gen 1 | ./paint
6 535
$ ./gen 10 | ./paint
28 82343
36 3476
41 1802
49 4102
82 1656
$ ./gen 100 | ./paint
2 2379
22 17357
24 4097
25 1051
34 55429
42 9028
45 9716
66 1495
71 196
85 640
97 706
$ ./gen 1000 | ./paint
16 719
26 29
28 24
33 1616
55 371
65 35
69 644
74 16
84 10891
86 36896
87 50832
89 19
$ ./gen 10000 | ./paint
3 800
6 5712
14 3022
17 16
26 1
29 18770
31 65372
37 387
44 40
49 37
50 93
55 11
68 278
70 19
71 64
72 170
77 119
78 6509
89 960
97 15
$ ./gen 100000 | ./paint
2 6
8 26
12 272
24 38576
26 1
34 1553
35 8
36 19505
43 2
45 11
46 2
47 9
49 27339
50 139
53 3109
69 11744
92 89
$ ./gen 1000000 | ./paint
1 1
3 4854
6 523
13 1
16 11
18 416
22 7
24 3920
25 96
31 10249
32 241
37 1135
45 10
57 758
62 2348
65 11
66 7422
78 6
85 13361
87 3833
88 187
91 46
93 7524
96 45436
Seu programa deve ser executado em um tempo razoável. Minha solução é executada em alguns segundos no último exemplo.
O menor código vence.
Inclua o tempo de execução e sua saída para o último teste.
EDIT : este problema não se destina a ser forçado a bruto, portanto, uma solução trivial não é aceitável.
Respostas:
Python, 221
239caracteresMantém
F
como uma lista não ordenada de triplos (início da corrida, final da corrida, cor) representando o estado atual da cerca. Como a pintura aleatória no gerador superpõe larguras de faixas com bastante frequência, essa lista nunca é muito longa (geralmente na faixa de 15 a 40).É executado em 37 segundos no exemplo de 1 milhão.
fonte
G+=[(a,min(b,s),d)]*(a<s)
etc. para obter o loop for em uma linhafor C in sorted(f[2] for f in F):print C,sum(b-a for a,b,c in F if c==C)
salva um par de caracteres sobre seus últimos quatro linhas, e evita a necessidade de saber o número mágico 98.sorted(set(...))
que não é mais uma melhoria.Haskell, 251
261269294caracteresAlgo não está certo sobre isso, pois leva muito tempo e pilha ... Mas produz as respostas certas:
replicate
egroup
é a maneira mais eficiente de contar a tinta e exige menos código do que a função personalizadas
max
chamadaf
fonte
Perl - 148 bytes
Parece que Perl é o melhor para brincar. fácil de codificar mais curto e mais rápido. ;)
código:
Tempo:
fonte
fonte
JavaScript, 183 caracteres, 1,3 segundos
Infelizmente, eu tive que cortar a parte stdin / out do requisito, que o JavaScript não suporta. Em vez disso, recebo a entrada de um upload de arquivo
<input>
(que não conto na minha contagem de caracteres, embora provavelmente deva).Aqui está a versão não destruída. É uma função que recebe toda a string de entrada ... todos os 14 MB! Este é o que leva 1,3 segundos; a versão golfada leva aproximadamente o dobro do tempo - mas ainda supera as outras soluções! Curiosamente, é duas vezes mais rápido no Firefox do que no Chrome. Demonstração ao vivo aqui .
E aqui está a versão do golfe.
fonte