|
Задачка: Сколько счастливых билетов | ☑ | ||
---|---|---|---|---|
0
Ведущий
03.11.21
✎
06:18
|
Дано: число знаков в трамвайном билете, четное число n
Найти: Сколько номеров счастливых билетов возможно с таким количеством знаков Нужно написать программу на том ЯП, который знаете. Я написал на JS, вроде работает. Правда говнокод, но это не важно. Главное что быстро. |
|||
1
Ведущий
03.11.21
✎
06:19
|
Что такое счастливый билет, надеюсь, не нужно объяснять.
|
|||
2
Вася Теркин
03.11.21
✎
06:31
|
(1) Пощади, не объясняй... Пусть будет интрига.
|
|||
3
Вася Теркин
03.11.21
✎
06:32
|
Ещё одна задача: почему эта задача в секции Админ?
|
|||
4
Обработка
03.11.21
✎
06:38
|
Нет четкого определение счастливых номеров и чисел. У всех народов свои.
|
|||
5
Ведущий
03.11.21
✎
06:59
|
(3) Вроде эта секция ближе всего к программированию.
|
|||
6
Ведущий
03.11.21
✎
07:16
|
(4) Будем решать задачу для русского народа.
|
|||
7
pechkin
03.11.21
✎
07:32
|
Перебором небось делал?
|
|||
8
Малыш Джон
03.11.21
✎
08:30
|
Лет в 12 писал программку (джаваскриптов тогда не было, поэтому на паскале) по вычислению такой херни, но мне было интересно распределение счастливых билетов.
P.S. как и ожидалось распределяются хаотично. |
|||
9
acht
03.11.21
✎
08:43
|
||||
10
acht
03.11.21
✎
08:46
|
(6) Минимум 2 системы.
Вот поэтому надо сначала читать документацию, а потом бросаться говнокодить и публиковать "задачки". Хотя тебе, Пашенько, это не понять. |
|||
11
Ненавижу 1С
гуру
03.11.21
✎
08:59
|
Интереснее задача - отрывается от ленты билет и надо определить по его номеру сколько ещё следует оторвать билетов, чтобы добраться до счастливого
|
|||
12
Вася Теркин
03.11.21
✎
09:06
|
(11) Сколько минимум или сколько вообще? Вообще ответ 1000
|
|||
13
Asmody
03.11.21
✎
09:06
|
a = [f"{x:3}{y:3}" for x in range(1000) for y in range(1000) if (x // 100 + x // 10 % 10 + x % 10) == (y // 100 + y // 10 % 10 + y % 10)]
не благодари |
|||
14
Ненавижу 1С
гуру
03.11.21
✎
10:42
|
(12) от конкретного билета зависит
|
|||
15
Волшебник
модератор
03.11.21
✎
10:46
|
(1) Это суеверия.
|
|||
16
acht
03.11.21
✎
10:50
|
(15) "Девять миллиардов имён Бога", Артур Кларк =)
|
|||
17
Михаил Козлов
03.11.21
✎
11:23
|
Число счастливых билетов (6 цифр) равно числу решения уравнения: X1+...+X6 = 27.
Для этого уравнения производящей функцией (число решений) будет F(z) = (1+z+z^2+...+z^9)^6 (в F(z) коэффициент при z^K - число решений с правой частью = K). Осталось раскрыть скобки и привести подобные члены. Примерно 55262. Формулы в (9) означают, по сути, то же самое. |
|||
18
pechkin
03.11.21
✎
11:26
|
почему X1+...+X6 = 27 ?
билет 100001 счастливый. сумма равна 2 |
|||
19
Михаил Козлов
03.11.21
✎
11:38
|
(18) Каждому билету (X1,...,X6) соответствует ((X1,X2,X3,9-X4,9-X5,9-X6). Для счастливого у соответствующего сумма цифр = 27.
(11) Если уметь считать лексикографическое расстояние от точки до плоскости, наверное, можно. |
|||
20
Kassern
03.11.21
✎
11:40
|
(0) ограничение для N какое?
|
|||
21
trad
03.11.21
✎
11:54
|
(20) n=2k, где k - натуральное (без нуля)
|
|||
22
Ведущий
03.11.21
✎
15:36
|
(17) Как будет выглядеть конечная формула?
|
|||
23
Ведущий
03.11.21
✎
15:37
|
(20) Чем больше, тем лучше.
|
|||
24
Ведущий
03.11.21
✎
15:39
|
Я сначала сделал рекурсивно, тупить комп начинал при n=20.
Добавил кеширование, при n=600 результат готов за секунду. Сейчас думаю переделать без рекурсии, на циклах. Должно быть быстрее, но менее красиво. |
|||
25
Ведущий
03.11.21
✎
16:04
|
Переделал без рекурсии. Неплохо получилось, довольно быстро
|
|||
26
Ведущий
03.11.21
✎
16:05
|
На 1000 знаках считат за секунду примерно
|
|||
27
Ведущий
03.11.21
✎
16:05
|
43915377631485458833479195230066153719286944334482728752374053320838115549858215565208114024962581615271402777015308860811212191792925923420969245129026328855876283838950018847412261224256990261761381820882172258736944579430682988506846775667343870902385081283670699609193547885848109732716362746796153011795708348022666029193500283564418807759271551081373779123257867610692495382036284602470373148913167119989269217875645654027776769033062343309789310407588134130712945050743818476141567323017123825020605494271348234384993864889467972164682730612464880147233546856797400639562612752002615437076311121391023596317082847329014317458804619697148653887797581910156879691294695939406480408606191910521233273911227547281809981945968861084523355380408980835668951165580638949544820954513675253429624139383129988263577066141033310554019420957933562781195853828346312316335609433523730382740220073818131409728591308797936951756784792808940315669316877274638709352719988179534188996183873338261211951586180
Вот такой ответ для 1000-значных чисел. |
|||
28
acht
03.11.21
✎
16:13
|
||||
29
Ведущий
03.11.21
✎
16:25
|
(n => {
const cache = [[1n]]; for (let n2 = 1; n2 < n / 2 + 1; n2++) { cache[n2] = []; for (let i = 0; i < n2 * 9 + 1; i++) { cache[n2][i] = 0n; for (let i2 = i; i2 >= 0 && i2 > i - 10; i2--) { cache[n2][i] += cache[n2 - 1][i2] || 0n; } } } let sum = 0n; for (let i = 0; i < n * 9 / 2 + 1; i++) { sum += cache[n / 2][i] ** 2n; } return sum; })(1000) |
|||
30
Ведущий
03.11.21
✎
16:27
|
(29) Это мой код, можно запускать прямо в консоли браузера.
Думаю, можно оптимизировать если использовать математические формулы. Михаил Козлов, как там твое уравнение решается? |
|||
31
vova1122
03.11.21
✎
17:06
|
(26) Вот это быстродействие. 1С тоже самое будет считать годами............
|
|||
32
Kassern
03.11.21
✎
17:16
|
(31) зачем это считать на 1с?
|
|||
33
Ведущий
03.11.21
✎
17:22
|
(31) Что есть, то есть. Удобная штука, когда нужно что-то по быстрому просчитать. И браузер есть на любом компе, просто пишешь в консоли скрипт, запускаешь, и получаешь что хотел, без установки всяких платформ 1С или интерпретаторов питонов или джава-машин.
|
|||
34
Михаил Козлов
03.11.21
✎
17:25
|
(30) Раскрываешь скобки, приводя подобные члены. Получится число решений для любой правой части. Трудоемкость линейная по N.
|
|||
35
Ведущий
03.11.21
✎
17:41
|
(34) Должна быть функция от n, а в твоем выражении нет нигде n. Не понятно куда ее ставить. Покажи пример.
|
|||
36
Михаил Козлов
03.11.21
✎
18:19
|
Писал для 2N=6. В общем случае F(z) = (1+z+z^2+...+z^9)^2N.
Всего членов в F(z) после раскрытия скобок и приведения подобных (это будет полином) = 1+9*2N. Это и будет трудоемкость. Для 1 уравнения A1*X1+...+Ak*Xk = B, 0<=Xk<=Pk, Xk - целое, F(z) = (1+z+z^2+...+z^P1)*(1+z+z^2+...+z^P2)*...*(1+z+z^2+...+z^Pk) - производящая функция числа решений уравнения. В этом случае трудоемкость примерно P1+P2+...+Pk. Можно производящую функцию написать и для нескольких уравнений. Трудоемкость будет примерно ПРОИЗВЕДЕНИЕ (по уравнениям) СУММ коэффициентов уравнения. |
|||
37
Ведущий
03.11.21
✎
18:22
|
(36) У меня трудоемкость где-то n^2 получилась.
|
|||
38
Михаил Козлов
03.11.21
✎
18:48
|
(37) При раскрытии скобок если считать промежуточные операции, наверное, n^2.
|
|||
39
Ведущий
03.11.21
✎
20:18
|
(38) Козлов молодец, хоть без программы, остальным по двойке.
|
|||
40
Конструктор1С
03.11.21
✎
20:20
|
>>вроде работает. Правда говнокод, но это не важно. Главное что быстро
Это прям девиз Г1Сов |
|||
41
Ведущий
03.11.21
✎
20:23
|
(40) Тут критично быстродействие. Если переделывать покрасивше, без циклов, без переменных, то получится в разы медленнее. Поэтому из двух зол выбираем меньшее, это мой девиз.
|
|||
42
Конструктор1С
03.11.21
✎
21:44
|
(41) ерунда. Нормальный код не угроза производительности
|
|||
43
Конструктор1С
03.11.21
✎
21:47
|
(41) и собсно, быстродействие критично для кого? Преждевременная оптимизация, да ещё и с угроблением сопровождаемости кода... ой-вэй, вот же кому-то работничек достанется
|
|||
44
Ведущий
03.11.21
✎
21:47
|
(42) Как же нет если да
|
|||
45
Ведущий
03.11.21
✎
21:50
|
(43) Ты с чем-то перепутал, наверное. Какая же она преждевременная, если конечная? И какое нафиг сопровождение, если оно не требуется? Ты наверное так и работаешь, прочитал что-то где-то, не понял как применять, и применяешь где надо и где не надо. Головой думай в первую очередь
|
|||
46
Asmody
03.11.21
✎
22:34
|
как-то так. для 6 цифр
[m=[], [...Array(1000)].forEach((_, i) => [...Array(i+1)].map((_, j)=>j).filter((j)=>((Math.floor(i/100) + Math.floor(i/10)%10 + i%10) == (Math.floor(j/100) + Math.floor(j/10)%10 + j%10))).forEach((j) => {if (i+j>0) { m.push(i*1000+j); if (j!=i) m.push(j*1000+i);}}))][0] |
|||
47
Ведущий
03.11.21
✎
22:38
|
(46) Вот это высший класс!
На 20 цифрах долго выполняется? |
|||
48
Конструктор1С
04.11.21
✎
08:41
|
(45) подрастешь и поймёшь, что такое бездумная оптимизация и почему её стоит избегать. Про код, который не требует сопровождения, бабушкам будешь рассказывать. С вероятностью 95% в говнокоде сидит труднодиагностируемая ошибка. В говнокоде всегда есть место ошибкам, они ходят рука об руку. Со временем ошибка обнаружится. Уже другой человек, насилуя свой мозг и с трудом здерживая рвотный рефлекс, полезет исправлять эту ошибку. Но не тут-то было, следом вылезет другой сюрприз говнокода - исправление в одном месте ведёт к поломкам в другом месте
|
|||
49
Asmody
04.11.21
✎
11:14
|
(48) просто надо писать без ошибок. сразу и в гранит!
|
|||
50
rphosts
04.11.21
✎
11:28
|
(48) сижу ковыряю упп... Переписанное не так чтобы в хлам, но дописок 3 вагона... По комментам не менее 6 чел писало... Ух и жесть местами... И ведь и мой код кто-то будет хаять.
PS кому-то рекурсия норм - кто-то всегда ее низводит до цикла... Кого-то будет бесить одно - кого-то другое... Дело вкуса. |
|||
51
Ненавижу 1С
гуру
04.11.21
✎
11:31
|
Полный перебор не интересен, да
|
|||
52
Конструктор1С
04.11.21
✎
12:26
|
(49) ну, это не про любителей овнокода. Они пишут до первого "вроде заработало" и потом смело в продакшн
(50) свой код всегда кажется лучше и понятнее |
|||
53
Ненавижу 1С
гуру
04.11.21
✎
12:28
|
(52) >>свой код всегда кажется лучше и понятнее
пока ему не исполнится пару лет ))) |
|||
54
Garykom
гуру
04.11.21
✎
12:32
|
https://ru.wikipedia.org/wiki/Счастливый_билет
"Счастливым считается полученный в общественном транспорте билет, в шестизначном номере которого сумма первых трёх цифр совпадает с суммой трёх последних" И да там по ссылке формулы есть |
|||
55
Garykom
гуру
04.11.21
✎
12:33
|
(9) сорри лень было все читать
|
|||
56
Конструктор1С
04.11.21
✎
12:47
|
(53) ну и это тоже)
|
|||
57
Asmody
04.11.21
✎
14:26
|
вообще, задача сводится к нахождению для каждого N от 0 до P^(K/2) множества наборов (x[1], x[2] .. x[K/2]): ∑(x[i]) = N, x[1] <= x[2] <= ... <=x[K/2].
потом дополняем множество наборов перестановками с сохранением уникальности, и делаем декартово произведение. где: P - система счисления, К - количество цифр: K % 2 == 0 |
|||
58
mistеr
04.11.21
✎
15:12
|
(57) Основная часть это эффективный генератор перестановок. В свое время это давали на олимпиадах городского уровня.
|
|||
59
Ведущий
04.11.21
✎
15:31
|
(48) Твои теории тут совсем не к месту. Понятно что ты это только что узнал и хочешь всем рассказать. Но не тут тему выбрал для этого.
|
|||
60
Asmody
04.11.21
✎
15:57
|
(58) Да, и там как раз фигурирует факториал
|
|||
61
Конструктор1С
04.11.21
✎
16:34
|
(59) уже много лет в разработке, мне не в первой сталкиваться с говнокодом и его последствиями. Так что я знаю, о чём говорю
|
|||
62
Classic
04.11.21
✎
16:39
|
И все-таки где определение счастливого билета?
|
|||
63
Ведущий
04.11.21
✎
18:13
|
(61) Молодец, раз много лет в разработке, то знаешь говнокод. Мы это уже поняли, можешь не повторять. Оффтоп потому что.
|
|||
64
Ведущий
04.11.21
✎
18:13
|
(62) В Википедии, писали выше: https://ru.wikipedia.org/wiki/Счастливый_билет
|
|||
65
Ведущий
04.11.21
✎
18:16
|
Но счастливый - это мелочи. Мне один раз попался несчастливый, причем пятизначный, на междугороднем автобусе. Там был номер 66613. Еще бы место попалось 13, я бы вообще офигел.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |