RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1131876
Accepted
Andorey Rich
Andorey Rich
Asked:2020-05-27 01:13:20 +0000 UTC2020-05-27 01:13:20 +0000 UTC 2020-05-27 01:13:20 +0000 UTC

如何从任何其他六位数字中生成数字 100

  • 772

请告诉我如何构建一个算法来处理一个六位数的数字,以便可以通过数学运算找出它所包含的数字是否为100?
示例:
050500 ---> (0 + 50 + 50 + 0) == 100
595545 ---> (5 + ((9 * 5) + (5 + 45))) = 100
093342 ---> (0 + ((9 / (3 / 34)) - 2)) = 100
231357 ---> (2 - (3 * (((1 / 3) - 5) * 7))) = 100
...
我发现一篇关于 Habr 的文章 ( https://habr.com/ru/post/339654/ ),其中给出了一个类似的例子。

将 6 位数字转换为数字数组不是问题。
例如:a = 123456;
然后 String(a).split('').map(e => +e) // 输出 ---> [1,2,3,4,5,6]

但是如何进一步排列符号(+,-,/,*)并正确放置括号,这辈子我都想不起来:(我已经为这个任务苦苦挣扎了一个月。我想按照 Habr 的文章中描述的那样做(见上文),但我不知道如何在 java 脚本中实现这一点,甚至有可能在 JS 中创建这样的“动态”公式,还是你需要事先为动作指定模板,然后在其中替换数字???

请给我一个思考的方向。

javascript
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. lijil
    2020-05-27T11:44:16Z2020-05-27T11:44:16Z

    一个没有括号的例子。

         let num = '231357'. split ('');
         let opr = ['*','+','/','-'];
         for(let i = 0 ; i < 32 ; i ++ ){
             let part = i . toString ( 2 )
             . padStart ( 5 , '0')
             . split ('')
             . reduce (( s , v , i , a , j = ++ i )=>{ 
                 return + v ? `${ s }${ num [ j ]}` 
                     : `${ s }λ${ num [ j ]}`;
             }, num [ 0 ])
             . replace (/(\D|^)0*(\d)/g,'$1$2');
             for(let i = 0 ; i < Math . pow ( 4 , part . split (/\D/). length - 1 ) ; i ++ ){
                 let mask = i . toString ( 4 ). padStart ( 5 ,'0');
                 let math = part 
                 . replace ('λ', opr [ mask [ 4 ]])
                 . replace ('λ', opr [ mask [ 3 ]])
                 . replace ('λ', opr [ mask [ 2 ]])
                 . replace ('λ', opr [ mask [ 1 ]])
                 . replace ('λ', opr [ mask [ 0 ]])
                 let result = eval (`(function(){return ${ math }})()`);
                 if( result === 100 ){
                     console .  log ('%s === %s', math , result );
                 }
             }
         }
    

    代码运行但并非在所有浏览器中运行,我收到两个错误:

    EvalError:<br/> "call to eval() blocked by CSP" 
    

    和

    (function(){return 0*0*0*0*00})() SyntaxError: Octal literals are not allowed in strict mode.
    

    告诉我可以用这个做什么,我做错了什么?


    关于第二个:

    . replace (/(\D|^)0*(\d)/,'$1$2');
    

    这里有一个错误。这部分将“073”替换为“73”,因为 073 === 59. 在“使用严格”中,这种数字的八进制表示是错误的。没有 'g' 标志,只有第一个匹配被替换。strict 的明显好处,没有它就没有错误,结果不正确 =)

    • 8
  2. Best Answer
    IvaMuxa
    2020-05-30T17:03:49Z2020-05-30T17:03:49Z

    //let num = '093342'.split('');
    let num = prompt().replace(/(\D*)/g,'').split('').slice(0, 6);;
    console.log(num.join(""));
    let e = [];
    
    for (let i = 0; i < Math.pow(2, num.length - 1); i++) {
      let part = i.toString(2)
        .padStart(num.length-1, '0')
        .split('')
        .reduce((s, v, i, a) => {
          return +v ? `${ s }${ num [ i+1 ]}` :
            `${ s }|${ num [ i+1 ]}`;
        }, num[0]).replace (/(\D|^)0*(\d)/g,'$1$2').split('|');
      let ao = co(part.length-1);
      for (let i = 0; i < Math.pow(4, part.length - 1); i++) {
        let mask = i.toString(4).padStart(part.length - 1, '0').split('');
        ao.forEach(order => {
          let math = or(order.slice(), part.slice(), mask.slice());
          if(100==eval (`(function(){return ${ math }})()`)&& !e.find((s)=>{return s==math})){
            e.push(math);
            document.writeln (`${math} = 100<br/>`);
          }
        });
      }
    }
    console.log(`найдено ${e.length} вариантов`); 
     
    function or(order, nums, funcs){
      order.reduce((s, v, i, a) => {
            let br = (i == a.length-1)?false:true; 
            nums[v] = op(nums[v], nums[v+1], funcs[v], br);
            nums.splice(v+1, 1);
            funcs.splice(v,1);
            for(let iii = i; iii<a.length; iii++){if(a[iii]>v)a[iii]--;}
      },"")
      return nums[0];
    }
    
    function op(a,b,o,p){
      let r = "";
      switch(o){
        case "0":
          r = `${a}+${b}`;
          break;
        case "1":
          r = `${a}-${b}`;
          break;
        case "2":
          r = `${a}*${b}`;
          break;
        case "3":
          r = `${a}/${b}`;
          break;
      }
      
      return (p?`(${r})`:`${r}`);
    }
    
    function co(l) {
      if (l <= 1) return [];
      let os = [];
    
      let oo = [];
      while (l) {
        l--;
        oo.push(l);
      }
    
      for (let i = 0; i < fc(oo.length); i++) {
        let o = oo.slice();
        os[i] = [];
        let ii = i;
        while (o.length) {
          let ff = fc(o.length-1);
          let ix = Math.floor(ii / ff );
          ii -= ix*ff;
          os[i].push(o.splice(ix, 1)[0]);
        }
      }
      return os;
    }
    
    function fc(x) {
      let r = 1;
      for (let i = 1; i <= x; ++i) {
        r *= i;
      }
      return r;
    }

    现在排除了具有不同执行顺序的视觉相同的解决方案

    • 5
  3. kvit_ko
    2020-06-01T09:44:26Z2020-06-01T09:44:26Z
    function makeHudred(n) {
      const variants = [];
      for (let split of makeSplits('' + n)) {
        for (let operations of makeOperations(split)) {
          for (let order of makeOrders(operations)) {
            variants.push(makeExpression(split, operations, order));
          }
        }
      }
      console.log('Variants in array:', variants.length);
      const filteredVariants = [...new Set(variants)]
      console.log('Variants in filtered array:', filteredVariants.length);
      filteredVariants.forEach(variant => check(variant, 100));
    }
    
    function makeSplits(str) {
      const res = [];
      for (let i = 0; i < 2 ** (str.length - 1); i++) {
        const mask = i.toString(2).padStart(str.length - 1, '0');
        const maskArr = [...mask];
    
        const arr = [str[0]];
        for (let i = 0; i < maskArr.length; i++) {
          if (maskArr[i] == 0) {
            arr[arr.length - 1] += str[i + 1];
          } else {
            arr.push(str[i + 1]);
          }
        }
        res.push(arr);
      }
      return res;
    }
    
    function makeOperations(split) {
      const len = split.length - 1;
      const res = [];
      for (let i = 0; i < (len ? 4 ** len : 0); i++) {
        const mask = i.toString(4).padStart(len, '0');
        const maskArr = [...mask];
        res.push(maskArr.map(getSymbol));
      }
      return res;
    
      function getSymbol(n) {
        switch (+n) {
          case 0: return '+';
          case 1: return '-';
          case 2: return '*';
          case 3: return '/';
        }
      }
    };
    
    function makeOrders(operation) {
      const len = operation.length;
      const arr = new Array(len).fill(0).map((_, i) => i);
      return permute(arr);
    }
    
    function makeExpression(split, operations, order) {
      const splitC = split.slice(),
        operationsC = operations.slice(),
        orderC = order.slice();
      for (let el of new Array(orderC.length).fill(0).map((_, i) => i)) {
        i = orderC.findIndex(n => n === el);
        splitC[i] = `(${splitC[i]}${operationsC[i]}${splitC[i + 1]})`
    
        splitC.splice(i + 1, 1)
        operationsC.splice(i, 1)
        orderC.splice(i, 1)
      }
    
      return splitC.pop();
    }
    
    function permute(arr) {
      const res = [];
    
      const permute = (arr, m = []) => {
        if (!arr.length) return res.push(m);
        for (let i = 0; i < arr.length; i++) {
          const cur = arr.slice();
          const next = cur.splice(i, 1);
          permute(cur.slice(), m.concat(next))
        }
      }
    
      permute(arr);
      return res;
    }
    
    function check(expr, n) {
      const res = eval(expr);
      if (res == n) {
        console.log(`${expr} = ${n}`);
      }
    }
    

    我遇到了这个解决方案

    • 2

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5