В детстве один случайный знакомый познакомил меня с упражнением для тренировки ума: из шести цифр билетика путём арифметических операция требовалось получить число 100. Сам знакомый меня поражал своей скоростью — вообще он на досуге занимался такими делами со своим преподавателем математики.
Учиться начал я в блокноте — выдумывал случайные цифры, потом пытался найти решение. Примерно за год довольно неплохо стал считать в уме.
Однако, лет через 15 отсутствия практики оказалось что навыки уже не те — иногда вообще не могу найти подходящее решение. Для того, чтобы перепроверить себя, решил написать приложение, да к тому же попрактиковаться в PowerShell.
Пост решился написать после статьи «Как сделать из 123456789 число 100 или 0», которая разбудила во мне описанные выше воспоминания.
Алгоритм вышел довольно топорный и не универсальный:
1. Запускаем вложенные циклы – по числу цифр.
1.1. Первый цикл производит перебор операций перед первой цифрой (есть небольшие ограничения: допустимы только минус и точка).
1.2. Последующие циклы перебирают все доступные символы операций.
1.3. Для обозначения отсутствия операции (цифры пишутся слитно), используем пустой символ ''.
2. Проверяем наличие десятичного разделителя по бока одной цифры.
3. В лоб вставляем символы операций между цифрами.
4. Перехватываем деление на ноль.
5. Выводим результаты.
Собственно, код:
Прошу сильно не пинать за первый пост.
Учиться начал я в блокноте — выдумывал случайные цифры, потом пытался найти решение. Примерно за год довольно неплохо стал считать в уме.
Однако, лет через 15 отсутствия практики оказалось что навыки уже не те — иногда вообще не могу найти подходящее решение. Для того, чтобы перепроверить себя, решил написать приложение, да к тому же попрактиковаться в PowerShell.
Пост решился написать после статьи «Как сделать из 123456789 число 100 или 0», которая разбудила во мне описанные выше воспоминания.
Алгоритм вышел довольно топорный и не универсальный:
1. Запускаем вложенные циклы – по числу цифр.
1.1. Первый цикл производит перебор операций перед первой цифрой (есть небольшие ограничения: допустимы только минус и точка).
1.2. Последующие циклы перебирают все доступные символы операций.
1.3. Для обозначения отсутствия операции (цифры пишутся слитно), используем пустой символ ''.
2. Проверяем наличие десятичного разделителя по бока одной цифры.
3. В лоб вставляем символы операций между цифрами.
4. Перехватываем деление на ноль.
5. Выводим результаты.
Собственно, код:
Настоятельно рекомендуется открывать только лицам с устойчивой психикой
#region constants
$first = '', '-', '.'
$second = '', '-', '+', '/', '*', '.'
$ticket='111111'
$total=0
$i=0
#endregion
function find-combinations($string){
foreach ($c0 in $first) {
foreach ($c1 in $second) {
foreach ($c2 in $second) {
foreach ($c3 in $second) {
foreach ($c4 in $second) {
foreach ($c5 in $second) {
if($c0 -eq '.' -and $c1 -eq '.'){continue}
if($c1 -eq '.' -and $c2 -eq '.'){continue}
if($c2 -eq '.' -and $c3 -eq '.'){continue}
if($c3 -eq '.' -and $c4 -eq '.'){continue}
if($c4 -eq '.' -and $c5 -eq '.'){continue}
$z=`
$c0+$string[0]+`
$c1+$string[1]+`
$c2+$string[2]+`
$c3+$string[3]+`
$c4+$string[4]+`
$c5+$string[5]
try {
$res=Invoke-Expression $z
if ($res -eq 100) {$z; $total++}
}
catch [System.DivideByZeroException] {
}
catch {
throw
}
}
}
}
}
}
}
'======'
$total
}
find-combinations $ticket
Прошу сильно не пинать за первый пост.