Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
>>> 100 == 100.0
True
>>> 100 == 100.00000000000001
False
>>> 100 == 99.9999999999999
False
//поиск решений задачи: из 123456789 получить target = 100
if(!window.console){ //для IE и отключенного Firebug
console = {log: function(X){
if(arguments.length <=1)
alert(X);
},
time: function(){
dat=(new Date()).getTime();
},
tmeEnd: function(){
alert((new Date()).getTime() - dat);
}
}
}
console.time('a'); //данные
s0 = '123456789';
x0 = [0,0,0,0,0,0,0,0, 4];
a = ['+','-','/','*',''];
var target = 100;
plus1 = function(x, i){ //5-ричный счётчик
if(i==null) i=0;
if(++x[i] >= 5){
x[i] =0;
if(++i >=8) return i;
return plus1(x, i);
}else return i;
}
window.sum =0; //поиск решений
var n=1, nn=0, leftPar, rightPar, wasLeftPar, wasDivide;
do{
s='sum=';
wasLeftPar = wasDivide =false;
for(var i =0; i <=8; i++){
if(x0[i]==3 && wasDivide){ //исправление приоритета деления
wasLeftPar = true;
var j = s.lastIndexOf('/') +1;
s = s.substr(0, j) +'('+ s.substr(j) + s0.charAt(i) + a[x0[i]];
}else if(wasLeftPar && x0[i] <3){
wasLeftPar = false;
s += s0.charAt(i) + ')' + a[x0[i]];
}else
s += s0.charAt(i) + a[x0[i]];
if(x0[i]==2)
wasDivide = true;
else if(x0[i] !=4)
wasDivide = false;
}
if(wasLeftPar) s+= ')';
eval(s);
if(sum > 99.999 && sum < 100.001)
console.log(++nn, n, s, sum);
if(plus1(x0) ==8) break;
}while(++n <1000000);
console.log(n);
console.timeEnd('a');
eval(s.replace(/=/,'=-'));
if(sum > 99.999 && sum < 100.001)
console.log(++nn, n, s.replace(/=/,'=-'), sum);выражение, числочисло, сколько_раз_это_число_повторяется
$nums="123456789"; $levels=$nums.length-1;
$op="","+","*","/","-";$ops=$op.count
$found=0
$powers=@()
($levels-1)..0 | %{$powers += [Math]::Pow($ops,$_)}
0..[Math]::Pow($ops,$levels) | %{
$i=$_;$str=""
0..($levels-1) | %{
$str+=$nums[$_]
$str+=$op[([Math]::floor($i/$powers[($_)]))]; $i=$i % $powers[($_)]
}
$str+=$nums[$levels]
if ([double](Invoke-Expression $str) -eq 100) {$str;++$found}
}
write "Found solutions:" $found
$nums="123456789"; $levels=$nums.length-1;
$ops="","+","*","/","-"
$a = $b = $results = New-Object System.Collections.ArrayList
$a = $nums[$levels]
($levels-1)..0 | %{
$b.Clear()
foreach ($op in $ops) { write $_
$add=$nums[$_] + $op
foreach ($obj in $a) {
$b.Add($add + $obj)|out-null
}
}
$a=$b
}
foreach ($result in $b) {
if ([double](Invoke-Expression $result) -eq 100) {$results+=$result}
}
$results
write "Found solutions:" $results.count
s = [1,2,0,2,0,1,0,0,0]; // Двоичное представление числа от 0 до 243<sup>2</sup>-1
v = [1,2,3,4,5,6,7,8,9];
g = [];
for (i=0;i<9;i++){
if(s[i]==1);
g.push("-");
else
if (s[i] ==2)
g.push("+");
g.push(v[i]);
}
result = eval(g.join(""));
-module(test).
-export([find/0]).
perms(L, 0, N) ->
L;
perms(L, K, N) ->
perms([ [X|Lx] || X <- N, Lx <- L], K-1, N).
make_str(Nums, [], Res) ->
Res;
make_str(Nums, [H_op|T_op], Res) ->
S = lists:concat(lists:zipwith(
fun(X, Y) -> lists:concat([X,Y]) end,
Nums, H_op)),
make_str(Nums, T_op, [S|Res]).
eval([], Count) ->
Count;
eval([H_exp|T_exp], Count) ->
{ok, Tokens, _} = erl_scan:string(H_exp),
{ok, [Form]} = erl_parse:parse_exprs(Tokens),
{value, Res, _} = erl_eval:expr(Form, []),
if
Res == 100 ->
io:format("~p = ~p~n", [H_exp, Res]),
eval(T_exp, Count+1);
true ->
eval(T_exp, Count)
end.
find() ->
statistics(wall_clock),
Nums = [1,2,3,4,5,6,7,8,9],
Op = ['', '-', '+', '*', '/'],
Ops = perms([['.']], 8, Op),
Expr = make_str(Nums, Ops, []),
io:format("Count: ~p~n", [eval(Expr, 0)]),
{_, Time} = statistics(wall_clock),
io:format("Time=~p~n" , [Time / 1000]).
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from __future__ import division
from itertools import product
sum_num = 100
count = 0
digits = '123456789'
signs = '', '+', '-', '*', '/'
atoms = [map(lambda x: d + x, signs) for d in digits[:8]]
for indexes in product(range(5), repeat=8):
expr = "".join( [ atoms[i][indexes[i]] for i in range(8) ] )
expr += '9'
if eval(expr) == sum_num:
print('{0} = {1}'.format(expr, sum_num))
count += 1
print 'So, {0} expressions for {1}'.format(count, sum_num)</code>
Как сделать из 123456789 число 100 или 0