Javascript題庫第五題

        最後來介紹最簡單的加減乘除吧。

        範例:
        var j=8;
        var k=0;
        for (var i = 0; i < 10; i++ , j += 4) 
        {
            k+=j/2+j;
        }
        會輸出28
        
        題目:
        圓周率近似值約等於3.14159265359
        這個題目要產生一個函數,回傳自己計算出來的圓周率。
        公式為:π/4≈1-1/3+1/5-1/7+1/9-1/11...
        我們從一開始計算,減掉三分之一、加上五分之一、減掉七分一...算完之後乘以四。
        此程式將使用迴圈跑五百萬次,讓它計算的更為精確。

        請在文字框中輸入程式碼,讓函數回傳圓周率。
        驗證標準:a > 3.141591 && a < 3.141593
        限制:不能直接指派常數或是使用跟題目規定無關的方法
        function New()
        {
            var a = 1;
            var j = 3.0;
            for (var i = 0; i < 5000000; i++ , j += 4.0) {
                
            }
            a*=4;
            return a;
        }
        

6 則留言:

  1. 解答 (鑽漏洞方法): "if(a=Math.PI/4,!i)break;"

    回覆刪除
    回覆
    1. 好難得,自這個題庫在2019/8/1建立以來,竟然有人來這個頁面留言(說不定是認識的人)。

      在此感謝您的回饋,漏洞我就不修正了,當作紀念。

      刪除
    2. 哈囉~我回來了! 時隔一年突然又回到這裡。😂
      你應該不認識我啦(畢竟我今年才大一)。

      在此提供另一個鑽漏洞方法:
      a=!i||Math.PI/4;
      經過檢查你的原始碼,我發現你只檢查第一次迴圈的值,所以利用短路求值檢查是否為第一次迴圈就可以繞過了。

      此題正解:
      a-=1/j-1/(j+2);

      刪除
    3. 如果你要修正漏洞的話:

      var workerCode = `self.onmessage = function(e) {
      var error = "";
      var result = -1;
      try {
      const userAnswerCode = e.data.userCode;
      var a = 1;
      var oa = a;
      var j = 3.0;

      if (userAnswerCode.includes("random")) throw new Error("偵測到違規動作或作弊行為");
      if (userAnswerCode.includes("return")) throw new Error("偵測到違規動作或作弊行為");
      if (userAnswerCode.split(";").length-1>=2) throw new Error("語法出錯");
      const userLogic = new Function('a', 'j', 'i', userAnswerCode + ";\\nreturn a;");

      for (var i = 0; i < 5000000; i++, j += 4.0) {
      try {
      a = userLogic(a, j, i);
      } catch (e) {
      throw new Error("語法出錯: " + e.message);
      }

      if (a > 3.141591/4 && a < 3.141593/4 && a === oa) {
      throw new Error("偵測到違規動作或作弊行為");
      }
      oa = a;
      }

      result = a*4;
      } catch (e) { error = e.message };
      self.postMessage({ result, error });
      }`;

      function enter() {
      try {
      var answer = 1;
      var userCode = document.getElementById('test1').value;
      const blob = new Blob([workerCode], { type: 'application/javascript' });
      const workerUrl = URL.createObjectURL(blob);

      const worker = new Worker(workerUrl);

      worker.onmessage = function(e) {
      if (e.data.error) return alert(e.data.error);
      answer = e.data.result;
      if (answer > 3.141591 && answer < 3.141593) {
      alert("值為:" + answer + "\n恭喜您,此測驗全數通關了");
      document.location.href="https://corettainformation.blogspot.com/p/javascript_14.html";
      }
      else if (answer==-1) alert("錯誤");
      else { alert("值為:" + answer + "\n錯誤"); }
      //想看解答嗎,哈哈,你還太淺了。
      };

      worker.postMessage({ userCode });
      }
      catch {
      alert("錯誤");
      }
      }

      我已經盡可能把漏洞補起來了,但是仍然很可能還是有漏洞。

      刪除
  2. 好難得,自這個題庫在2019/8/1建立以來,竟然有人來這個頁面留言(說不定是認識的人)。

    在此感謝您的回饋,漏洞我就不修正了,當作紀念。

    回覆刪除
  3. 您好,想請問範例的 28 是怎麼來的?
    我的計算是:j=44, k=390

    回覆刪除

有興趣或有疑問的歡迎提問與交流喔!!!