(не) Счастливые билеты (числа)

Я думаю вы все катались на общественном транспорте и держали в руках эти маленькие бумажки - проездные билетики. А еще, вы могли заметить, что на этих билетах есть номера. Причем на каждом билете (так же как и на денежной банкноте) должен быть уникальный номер, иначе было бы невозможно контролировать их количество и происхождение. Возможно, из-за того что в отечественном общественном транспорте довольно непросто почувствовать себя счастливым, люди начали придумывать правила "счастливых билетов". То есть правила по которым некоторые номера билетов могуться считаться счастливыми, а другие нет.

В самом простом случае мы начинаем иметь дело с номерами, которые являются четырехзначными числами. Данные числа не могут содержать одинаковых цифр, а сумма первых двух цифр должна быть равна сумме двух последних. Например, число \(6152\) как раз и является таким - все цифры различны и \(6+1=5+2\).

Хотя правила определяющие счастливость могут быть и другими. Что нам мешает считать билет счастливым если все его числа различны а сумма крайних цифр равна сумме средних, к примеру \(1324\), или такие, у которых сумма первой и третьей цифры равна сумме второй и четвертой, например \(1342\)?

Еще следует четко отличать о чем идет речь: о счастливых номерах билетов или о счастливых числах, так как номера билетов могут начинаться с цифры \(0\), а числа нет.

Далее мы будем рассматривать задачи о счастливых четырехзначных числах у которых сумма первых двух цифр равна сумме двух последних.


Сколько счастливых чисел?

Это самое обычное любопытство. Скорее всего, ответ на вопрос "Сколько?" нам ничего не даст, но все же:

In[]

N = []    #  В этот список будем помещать счастливые числа

for i in range(1000, 10000):
    
    n = str(i)    #  превращаем число в строку
    
    if len(set(n)) == 4:    #  все ли числа различны?
        
        n = [int(digit) for digit in n]    #  в генераторе, превращаем цифры-строки в числа
        
        if sum(n[:2]) == sum(n[2:]) :      #  сумма первой пары цифр равна второй?
        
            N.append(i)    #  если да, то запихиваем число в список

print(N)    #  и посмотрим на его содержимое

Out[]

[1203, 1230, 1304, 1340, 1405, 1423, 1432, 1450, 1506, 1524, 1542, 1560, 1607, 1625, 1634, 1643, 1652, 1670, 1708, 1726, 1735, 1753, 1762, 1780, 1809, 1827, 1836, 1845, 1854, 1863, 1872, 1890, 1928, 1937, 1946, 1964, 1973, 1982, 2103, 2130, 2305, 2314, 2341, 2350, 2406, 2415, 2451, 2460, 2507, 2516, 2534, 2543, 2561, 2570, 2608, 2617, 2635, 2653, 2671, 2680, 2709, 2718, 2736, 2745, 2754, 2763, 2781, 2790, 2819, 2837, 2846, 2864, 2873, 2891, 2938, 2947, 2956, 2965, 2974, 2983, 3012, 3021, 3104, 3140, 3205, 3214, 3241, 3250, 3407, 3416, 3425, 3452, 3461, 3470, 3508, 3517, 3526, 3562, 3571, 3580, 3609, 3618, 3627, 3645, 3654, 3672, 3681, 3690, 3719, 3728, 3746, 3764, 3782, 3791, 3829, 3847, 3856, 3865, 3874, 3892, 3948, 3957, 3975, 3984, 4013, 4031, 4105, 4123, 4132, 4150, 4206, 4215, 4251, 4260, 4307, 4316, 4325, 4352, 4361, 4370, 4509, 4518, 4527, 4536, 4563, 4572, 4581, 4590, 4619, 4628, 4637, 4673, 4682, 4691, 4729, 4738, 4756, 4765, 4783, 4792, 4839, 4857, 4875, 4893, 4958, 4967, 4976, 4985, 5014, 5023, 5032, 5041, 5106, 5124, 5142, 5160, 5207, 5216, 5234, 5243, 5261, 5270, 5308, 5317, 5326, 5362, 5371, 5380, 5409, 5418, 5427, 5436, 5463, 5472, 5481, 5490, 5629, 5638, 5647, 5674, 5683, 5692, 5739, 5748, 5784, 5793, 5849, 5867, 5876, 5894, 5968, 5986, 6015, 6024, 6042, 6051, 6107, 6125, 6134, 6143, 6152, 6170, 6208, 6217, 6235, 6253, 6271, 6280, 6309, 6318, 6327, 6345, 6354, 6372, 6381, 6390, 6419, 6428, 6437, 6473, 6482, 6491, 6529, 6538, 6547, 6574, 6583, 6592, 6749, 6758, 6785, 6794, 6859, 6895, 6978, 6987, 7016, 7025, 7034, 7043, 7052, 7061, 7108, 7126, 7135, 7153, 7162, 7180, 7209, 7218, 7236, 7245, 7254, 7263, 7281, 7290, 7319, 7328, 7346, 7364, 7382, 7391, 7429, 7438, 7456, 7465, 7483, 7492, 7539, 7548, 7584, 7593, 7649, 7658, 7685, 7694, 7869, 7896, 8017, 8026, 8035, 8053, 8062, 8071, 8109, 8127, 8136, 8145, 8154, 8163, 8172, 8190, 8219, 8237, 8246, 8264, 8273, 8291, 8329, 8347, 8356, 8365, 8374, 8392, 8439, 8457, 8475, 8493, 8549, 8567, 8576, 8594, 8659, 8695, 8769, 8796, 9018, 9027, 9036, 9045, 9054, 9063, 9072, 9081, 9128, 9137, 9146, 9164, 9173, 9182, 9238, 9247, 9256, 9265, 9274, 9283, 9348, 9357, 9375, 9384, 9458, 9467, 9476, 9485, 9568, 9586, 9678, 9687]

Иметь дело с такими большими списками приходится довольно часто, но что-бы их просмотр был удобнее можно воспользоваться модулем pprint:

In[]

import pprint    #  модуль для "красивой печати"
#  Сделаем вывод длинющего списка компактным:

pprint.pprint(N, compact = True)

Out[]

[1203, 1230, 1304, 1340, 1405, 1423, 1432, 1450, 1506, 1524, 1542, 1560, 1607,
 1625, 1634, 1643, 1652, 1670, 1708, 1726, 1735, 1753, 1762, 1780, 1809, 1827,
 1836, 1845, 1854, 1863, 1872, 1890, 1928, 1937, 1946, 1964, 1973, 1982, 2103,
 2130, 2305, 2314, 2341, 2350, 2406, 2415, 2451, 2460, 2507, 2516, 2534, 2543,
 2561, 2570, 2608, 2617, 2635, 2653, 2671, 2680, 2709, 2718, 2736, 2745, 2754,
 2763, 2781, 2790, 2819, 2837, 2846, 2864, 2873, 2891, 2938, 2947, 2956, 2965,
 2974, 2983, 3012, 3021, 3104, 3140, 3205, 3214, 3241, 3250, 3407, 3416, 3425,
 3452, 3461, 3470, 3508, 3517, 3526, 3562, 3571, 3580, 3609, 3618, 3627, 3645,
 3654, 3672, 3681, 3690, 3719, 3728, 3746, 3764, 3782, 3791, 3829, 3847, 3856,
 3865, 3874, 3892, 3948, 3957, 3975, 3984, 4013, 4031, 4105, 4123, 4132, 4150,
 4206, 4215, 4251, 4260, 4307, 4316, 4325, 4352, 4361, 4370, 4509, 4518, 4527,
 4536, 4563, 4572, 4581, 4590, 4619, 4628, 4637, 4673, 4682, 4691, 4729, 4738,
 4756, 4765, 4783, 4792, 4839, 4857, 4875, 4893, 4958, 4967, 4976, 4985, 5014,
 5023, 5032, 5041, 5106, 5124, 5142, 5160, 5207, 5216, 5234, 5243, 5261, 5270,
 5308, 5317, 5326, 5362, 5371, 5380, 5409, 5418, 5427, 5436, 5463, 5472, 5481,
 5490, 5629, 5638, 5647, 5674, 5683, 5692, 5739, 5748, 5784, 5793, 5849, 5867,
 5876, 5894, 5968, 5986, 6015, 6024, 6042, 6051, 6107, 6125, 6134, 6143, 6152,
 6170, 6208, 6217, 6235, 6253, 6271, 6280, 6309, 6318, 6327, 6345, 6354, 6372,
 6381, 6390, 6419, 6428, 6437, 6473, 6482, 6491, 6529, 6538, 6547, 6574, 6583,
 6592, 6749, 6758, 6785, 6794, 6859, 6895, 6978, 6987, 7016, 7025, 7034, 7043,
 7052, 7061, 7108, 7126, 7135, 7153, 7162, 7180, 7209, 7218, 7236, 7245, 7254,
 7263, 7281, 7290, 7319, 7328, 7346, 7364, 7382, 7391, 7429, 7438, 7456, 7465,
 7483, 7492, 7539, 7548, 7584, 7593, 7649, 7658, 7685, 7694, 7869, 7896, 8017,
 8026, 8035, 8053, 8062, 8071, 8109, 8127, 8136, 8145, 8154, 8163, 8172, 8190,
 8219, 8237, 8246, 8264, 8273, 8291, 8329, 8347, 8356, 8365, 8374, 8392, 8439,
 8457, 8475, 8493, 8549, 8567, 8576, 8594, 8659, 8695, 8769, 8796, 9018, 9027,
 9036, 9045, 9054, 9063, 9072, 9081, 9128, 9137, 9146, 9164, 9173, 9182, 9238,
 9247, 9256, 9265, 9274, 9283, 9348, 9357, 9375, 9384, 9458, 9467, 9476, 9485,
 9568, 9586, 9678, 9687]

Теперь можем узнать сколько же всего этих самых счастливых чисел:

In[]

len(N)

Out[]

368

Сколько счастливых билетов?

Счастливый номер билета и счастливое число это не одно и тоже. Ведь билет с номером "0918" - вполне счастливый. Давайте напишем другой скрипт, что бы узнать, количество счастливых номеров.

Если номер будет начинаться с "00", то он точно не будет счастливым, поэтому нас интересуют только те, которые начинаются с одного нуля. Если подумать то второй цифрой может быть толко "3", иначе мы снова не сможем получить счастливого билета. В общем, мы можем долго ломать голову над тем, как улучшить скрипт. Но на самом деле нас до сих пор волнует только один вопрос - "Сколько?". Так что нам в принципе вообще без разницы каким будет наш скрипт, лишь бы он давал точный ответ.

In[]

N = []

for i in range(10000):
    i = '{:0>4}'.format(str(i))    #  форматируем... дополняем короткие числа нулями слева,
                                   #  превращая их в строки
    if len(set(i)) == 4:
        n = [int(k) for k in i]
        if sum(n[:2]) == sum(n[2:]) :
            N.append(i)
print(N)
print('-'*40)
print('Количествоо счастливых четырехзначных билетов -', len(N))

Out[]

['0312', '0321', '0413', '0431', '0514', '0523', '0532', '0541', '0615', '0624', '0642', '0651', '0716', '0725', '0734', '0743', '0752', '0761', '0817', '0826', '0835', '0853', '0862', '0871', '0918', '0927', '0936', '0945', '0954', '0963', '0972', '0981', '1203', '1230', '1304', '1340', '1405', '1423', '1432', '1450', '1506', '1524', '1542', '1560', '1607', '1625', '1634', '1643', '1652', '1670', '1708', '1726', '1735', '1753', '1762', '1780', '1809', '1827', '1836', '1845', '1854', '1863', '1872', '1890', '1928', '1937', '1946', '1964', '1973', '1982', '2103', '2130', '2305', '2314', '2341', '2350', '2406', '2415', '2451', '2460', '2507', '2516', '2534', '2543', '2561', '2570', '2608', '2617', '2635', '2653', '2671', '2680', '2709', '2718', '2736', '2745', '2754', '2763', '2781', '2790', '2819', '2837', '2846', '2864', '2873', '2891', '2938', '2947', '2956', '2965', '2974', '2983', '3012', '3021', '3104', '3140', '3205', '3214', '3241', '3250', '3407', '3416', '3425', '3452', '3461', '3470', '3508', '3517', '3526', '3562', '3571', '3580', '3609', '3618', '3627', '3645', '3654', '3672', '3681', '3690', '3719', '3728', '3746', '3764', '3782', '3791', '3829', '3847', '3856', '3865', '3874', '3892', '3948', '3957', '3975', '3984', '4013', '4031', '4105', '4123', '4132', '4150', '4206', '4215', '4251', '4260', '4307', '4316', '4325', '4352', '4361', '4370', '4509', '4518', '4527', '4536', '4563', '4572', '4581', '4590', '4619', '4628', '4637', '4673', '4682', '4691', '4729', '4738', '4756', '4765', '4783', '4792', '4839', '4857', '4875', '4893', '4958', '4967', '4976', '4985', '5014', '5023', '5032', '5041', '5106', '5124', '5142', '5160', '5207', '5216', '5234', '5243', '5261', '5270', '5308', '5317', '5326', '5362', '5371', '5380', '5409', '5418', '5427', '5436', '5463', '5472', '5481', '5490', '5629', '5638', '5647', '5674', '5683', '5692', '5739', '5748', '5784', '5793', '5849', '5867', '5876', '5894', '5968', '5986', '6015', '6024', '6042', '6051', '6107', '6125', '6134', '6143', '6152', '6170', '6208', '6217', '6235', '6253', '6271', '6280', '6309', '6318', '6327', '6345', '6354', '6372', '6381', '6390', '6419', '6428', '6437', '6473', '6482', '6491', '6529', '6538', '6547', '6574', '6583', '6592', '6749', '6758', '6785', '6794', '6859', '6895', '6978', '6987', '7016', '7025', '7034', '7043', '7052', '7061', '7108', '7126', '7135', '7153', '7162', '7180', '7209', '7218', '7236', '7245', '7254', '7263', '7281', '7290', '7319', '7328', '7346', '7364', '7382', '7391', '7429', '7438', '7456', '7465', '7483', '7492', '7539', '7548', '7584', '7593', '7649', '7658', '7685', '7694', '7869', '7896', '8017', '8026', '8035', '8053', '8062', '8071', '8109', '8127', '8136', '8145', '8154', '8163', '8172', '8190', '8219', '8237', '8246', '8264', '8273', '8291', '8329', '8347', '8356', '8365', '8374', '8392', '8439', '8457', '8475', '8493', '8549', '8567', '8576', '8594', '8659', '8695', '8769', '8796', '9018', '9027', '9036', '9045', '9054', '9063', '9072', '9081', '9128', '9137', '9146', '9164', '9173', '9182', '9238', '9247', '9256', '9265', '9274', '9283', '9348', '9357', '9375', '9384', '9458', '9467', '9476', '9485', '9568', '9586', '9678', '9687']
----------------------------------------
Количествоо счастливых четырехзначных билетов - 400

Их ровно 400... любопытненько... у нас всего десять цифр, может количество счастливых номеров, начинающихся с одной цифры всегда одинаково?

In[]

for i in range(10):
    L = []    #  Сдесь будут билеты начинающиеся с одинаковой цифры
    for n in N:
        if n[0] == str(i):
            L.append(n)
    print('-'*50)
    print('Количество счастливых билетов, начинающихся с ' + str(i) + 
         ' равно', len(L))
    print('Собственно, вот все эти билеты:')
    pprint.pprint(L, compact = True)

Out[]

--------------------------------------------------
Количество счастливых билетов, начинающихся с 0 равно 32
Собственно, вот все эти билеты:
['0312', '0321', '0413', '0431', '0514', '0523', '0532', '0541', '0615', '0624',
 '0642', '0651', '0716', '0725', '0734', '0743', '0752', '0761', '0817', '0826',
 '0835', '0853', '0862', '0871', '0918', '0927', '0936', '0945', '0954', '0963',
 '0972', '0981']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 1 равно 38
Собственно, вот все эти билеты:
['1203', '1230', '1304', '1340', '1405', '1423', '1432', '1450', '1506', '1524',
 '1542', '1560', '1607', '1625', '1634', '1643', '1652', '1670', '1708', '1726',
 '1735', '1753', '1762', '1780', '1809', '1827', '1836', '1845', '1854', '1863',
 '1872', '1890', '1928', '1937', '1946', '1964', '1973', '1982']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 2 равно 42
Собственно, вот все эти билеты:
['2103', '2130', '2305', '2314', '2341', '2350', '2406', '2415', '2451', '2460',
 '2507', '2516', '2534', '2543', '2561', '2570', '2608', '2617', '2635', '2653',
 '2671', '2680', '2709', '2718', '2736', '2745', '2754', '2763', '2781', '2790',
 '2819', '2837', '2846', '2864', '2873', '2891', '2938', '2947', '2956', '2965',
 '2974', '2983']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 3 равно 44
Собственно, вот все эти билеты:
['3012', '3021', '3104', '3140', '3205', '3214', '3241', '3250', '3407', '3416',
 '3425', '3452', '3461', '3470', '3508', '3517', '3526', '3562', '3571', '3580',
 '3609', '3618', '3627', '3645', '3654', '3672', '3681', '3690', '3719', '3728',
 '3746', '3764', '3782', '3791', '3829', '3847', '3856', '3865', '3874', '3892',
 '3948', '3957', '3975', '3984']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 4 равно 44
Собственно, вот все эти билеты:
['4013', '4031', '4105', '4123', '4132', '4150', '4206', '4215', '4251', '4260',
 '4307', '4316', '4325', '4352', '4361', '4370', '4509', '4518', '4527', '4536',
 '4563', '4572', '4581', '4590', '4619', '4628', '4637', '4673', '4682', '4691',
 '4729', '4738', '4756', '4765', '4783', '4792', '4839', '4857', '4875', '4893',
 '4958', '4967', '4976', '4985']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 5 равно 44
Собственно, вот все эти билеты:
['5014', '5023', '5032', '5041', '5106', '5124', '5142', '5160', '5207', '5216',
 '5234', '5243', '5261', '5270', '5308', '5317', '5326', '5362', '5371', '5380',
 '5409', '5418', '5427', '5436', '5463', '5472', '5481', '5490', '5629', '5638',
 '5647', '5674', '5683', '5692', '5739', '5748', '5784', '5793', '5849', '5867',
 '5876', '5894', '5968', '5986']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 6 равно 44
Собственно, вот все эти билеты:
['6015', '6024', '6042', '6051', '6107', '6125', '6134', '6143', '6152', '6170',
 '6208', '6217', '6235', '6253', '6271', '6280', '6309', '6318', '6327', '6345',
 '6354', '6372', '6381', '6390', '6419', '6428', '6437', '6473', '6482', '6491',
 '6529', '6538', '6547', '6574', '6583', '6592', '6749', '6758', '6785', '6794',
 '6859', '6895', '6978', '6987']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 7 равно 42
Собственно, вот все эти билеты:
['7016', '7025', '7034', '7043', '7052', '7061', '7108', '7126', '7135', '7153',
 '7162', '7180', '7209', '7218', '7236', '7245', '7254', '7263', '7281', '7290',
 '7319', '7328', '7346', '7364', '7382', '7391', '7429', '7438', '7456', '7465',
 '7483', '7492', '7539', '7548', '7584', '7593', '7649', '7658', '7685', '7694',
 '7869', '7896']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 8 равно 38
Собственно, вот все эти билеты:
['8017', '8026', '8035', '8053', '8062', '8071', '8109', '8127', '8136', '8145',
 '8154', '8163', '8172', '8190', '8219', '8237', '8246', '8264', '8273', '8291',
 '8329', '8347', '8356', '8365', '8374', '8392', '8439', '8457', '8475', '8493',
 '8549', '8567', '8576', '8594', '8659', '8695', '8769', '8796']
--------------------------------------------------
Количество счастливых билетов, начинающихся с 9 равно 32
Собственно, вот все эти билеты:
['9018', '9027', '9036', '9045', '9054', '9063', '9072', '9081', '9128', '9137',
 '9146', '9164', '9173', '9182', '9238', '9247', '9256', '9265', '9274', '9283',
 '9348', '9357', '9375', '9384', '9458', '9467', '9476', '9485', '9568', '9586',
 '9678', '9687']

Как видим нет, но присутствует какая-то симметрия в их количестве. А сколько может быть счатливых шестизначных номеров???

In[]

N_6 = []

for i in range(1000000):
    i = '{:0>6}'.format(str(i))
    if len(set(i)) == 6:
        n = [int(k) for k in i]
        if sum(n[:3]) == sum(n[3:]) :
            N_6.append(i)
print('-'*40)
print('Количествоо счастливых шестизначных билетов -', len(N_6))

Out[]

----------------------------------------
Количествоо счастливых шестизначных билетов - 6480

Ну это уже не так любопытно. Зато мы можем узнать что вероятнее: найти четырехзначный или шестизначный счастливый номер билета:

In[]

print('p_4 =', 400/10000)
print('p_6 =', 6480/1000000)

Out[]

p_4 = 0.04
p_6 = 0.00648

На кой ляд мы все это делали??? А как иначе понять с чем мы имеем дело? Сейчас мы знаем, что в самом простом случае (четырехзначных чисел), нам придется иметь дело всего с 400 сотнями счастливых номеров. А если принять во внимание, что мы будем работать не с номерами, а числами, то их будет всего 368. Теперь они все у нас "на ладони" и мы можем изучить их вдоль и поперек. А заодно прикинуть, что можно сделать с ними на экзамене, не имея компьютера.