Вы Том Сойер, и вам нужно нарисовать забор длиной 102400 м. К счастью, ваши друзья решили помочь вам в обмене различными вещами. Каждый друг покрасят L метров, начиная с S с цветом C . S , L - целое число метров, а 1 ≤ C ≤ 97. Вам скучно, и вы решаете узнать, сколько метров каждого цвета у вас есть.
вход
Ввод читается из стандартного ввода. Каждая строка содержит три числа S , L , C, как описано выше.
Ouput
Вывод записывается в стандартный вывод. Для каждого цвета, который появляется на последнем ограждении, выведите номер цвета и количество раз, когда оно появится. Заказ по цветам.
Примеры
Вход 0
..............
0 3 1 111...........
2 4 2 112222........
1 2 3 133222........
0 4 1 111122........
7 3 5 111122.555....
Выход 0
1 4
2 2
5 3
Вход 1
0 100 1
50 150 2
Выход 1
1 50
2 150
Вход 2
500 1000 1
0 2000 2
Выход 2
2 2000
Больше примеров
Вот небольшой генератор:
#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;
}
Бегущие примеры:
$ ./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
Ваша программа должна работать в разумные сроки. Мое решение запускается через несколько секунд на последнем примере.
Самый короткий код выигрывает.
Включите время выполнения и ваш вывод для последнего теста.
РЕДАКТИРОВАТЬ : Эта проблема не предназначена для грубого, так что тривиальное решение не является приемлемым.
Ответы:
Питон, 221
239символовСохраняет
F
как неупорядоченный список троек (начало, конец, цвет), представляющих текущее состояние ограждения. Так как случайное рисование в генераторе перекрашивает большие участки довольно часто, этот список никогда не бывает слишком длинным (обычно в диапазоне 15-40).Работает за 37 секунд на примере 1M.
источник
G+=[(a,min(b,s),d)]*(a<s)
и т.д., чтобы получить цикл for в одной строкеfor C in sorted(f[2] for f in F):print C,sum(b-a for a,b,c in F if c==C)
сохраняет пару символов в последних четырех строках и избавляет от необходимости знать магическое число 98.sorted(set(...))
что больше не является улучшением.Haskell, 251
261269294символовЧто-то не так в этом, так как это занимает слишком много времени и стека ... Но это дает правильные ответы:
replicate
иgroup
является таким же эффективным способом подсчета краски, и требует меньше кода, чем пользовательская функцияs
max
звонитьf
источник
Perl - 148 байт
Кажется, с Perl лучше всего играть. легко кодировать короче и быстрее. ;)
код:
время:
источник
источник
JavaScript, 183 символа, 1,3 секунды
К сожалению, мне пришлось сократить часть требования stdin / out, которую JavaScript не поддерживает. Вместо этого я получаю входные данные из файла загрузки
<input>
вместо этого (который я не считаю в моем счетчике символов, хотя я, вероятно, должен).Вот версия без гольфа. Это функция, которая принимает всю строку ввода ... всего 14 МБ! Это тот, который занимает 1,3 секунды; версия для игры в гольф занимает в два раза больше времени, но все же превосходит другие решения! Интересно, что в Firefox это в два раза быстрее, чем в Chrome. Живая демо здесь .
А вот и версия для гольфа.
источник