Pull to refresh

Как сделать из шести цифр число 100

В детстве один случайный знакомый познакомил меня с упражнением для тренировки ума: из шести цифр билетика путём арифметических операция требовалось получить число 100. Сам знакомый меня поражал своей скоростью — вообще он на досуге занимался такими делами со своим преподавателем математики.

Учиться начал я в блокноте — выдумывал случайные цифры, потом пытался найти решение. Примерно за год довольно неплохо стал считать в уме.

Однако, лет через 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


Прошу сильно не пинать за первый пост.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.