Skip to content

Instantly share code, notes, and snippets.

@yuta0801
Last active April 12, 2019 08:18
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuta0801/50fa1624ee2751d3f438bb7cb4d7a34c to your computer and use it in GitHub Desktop.
Save yuta0801/50fa1624ee2751d3f438bb7cb4d7a34c to your computer and use it in GitHub Desktop.
JavaScript Alert Recursion with Goldbach's conjecture

加筆編集しより多くの人に理解できるようにしたものをQiitaに投稿しました。 こっちはリンク、リビジョン確認用に残しますが、これからの修正はQiitaメインになります。 alert無限ループは不正プログラムとして逮捕されるらしいので警察にゴールドバッハ予想を証明してもらおう - Qiita

これは何?

これは以下のツイートに触発されて作ったn回目のアラートダイアログで2n+2を二つの素数の和で表せるかを全探索して表せた場合もう一度アラートダイアログを表示するJavaScriptプログラムだよ

n回目のアラートダイアログで2n+2を二つの素数の和で表せるかを全探索して表せた場合もう一度アラートダイアログを表示するみたいなプログラムを書けば警察がゴールドバッハ解いてくれるのでは

— ほんまか? (@Kory__3) March 4, 2019

それぞれのファイルの説明

index.js

  • 最初にコピペしながら作ったもの

dev.js

  • index.jsをできるだけ圧縮したもの
  • (1ツイートに収めようとして頑張ったけど挫折した残骸)
  • (まぁブックマークレットとして使うなら短いほうがいいよね?ね?)

minified.js

  • dev.jsから10回の制限を無くし
  • console.logをalertに置き換え
  • さらにminifyしたもの

更に短いもの

  • @Yuki_jukjisさんがさらに圧縮してくれました
  • dev.js相当のもの、minified.js相当のものがあるので短いほうがいい方はぜひ使ってみてください

@yuta0381
(()=>{
for(n=r=4,p=[]; r&&n<100; n+=2){
for(a=2;a<n;f&&p.push(a),a++)
for(f=b=2;b<a;a%b++||(f=0));
for(r=c=0;c<p.length;~(b=p.indexOf(n-(a=p[c++])))&&(r=a+" + "+p[b]));
r&&console.log(n+" = "+r);
}
})()

— Yuki /jukʲi/ (@Yuki_jukjis) March 5, 2019

使い方

index.js

  • index.jsを読み込めばmain(1)[^1]で実行できるよ
  • (for文ではなく再帰で実行してるから引数の1は重要だよ)
  • カスタマイズもしやすいと思うのでいろいろ活用できると思うよ()

dev.js

  • こんな無理やり圧縮したクソコード忘れて..

minified.js

  • ブラウザで実行するのに特化したバージョンだよ。
  • やっぱり短いほうがいいでしょ?
  • ブックマークレットなどにいかが?
  • 他の2と違ってループ回数制限もないのでちゃんとゴールドバッハの予想が検証できるね!

自己責任で使ってね! これを作るきっかけにもなった、再帰alertスクリプトを掲示板に書き込んだ女子中学生や男性が補導、書類送検されたことを忘れないでね!!

(function main(n) {
var result = (function () {
var arr=[2];for(i=3;i<n;i+=2){for(no=1,j=2;j<i;j++)i%j==0&&(no=0);no&&arr.push(i)}
while (arr.length > 0) {
var item = arr.shift()
if (item * 2 == n) return item + " + " + item
var index = arr.indexOf(n - item)
if (~index) {
var itemPair = arr.splice(index, 1)[0]
return item + " + " + itemPair
}
}
})()
if (result && n < 100) {
console.log(n + " = " + result)
main(n + 2)
}
})(4)
function getPrimes(n) {
var sieve = [], i, j, primes = []
for (i = 2; i <= n; ++i) {
if (!sieve[i]) {
primes.push(i)
for (j = i << 1; j <= n; j += i) sieve[j] = true
}
}
return primes
}
function goldbach(initial) {
var list = getPrimes(initial)
while (list.length > 0) {
var item = list.shift()
if (item * 2 === initial) return item + " + " + item
var index = list.indexOf(initial - item)
if (index !== -1) {
var itemPair = list.splice(index, 1)[0]
return item + " + " + itemPair
}
}
}
function main(n = 1) {
var initial = 2 * n + 2
var result = goldbach(initial)
if (result && initial < 100) {
console.log(initial + ' = ' + result)
main(n + 1)
}
}
main(1)
!function r(n){var f=function(){var r=[2];for(i=3;i<n;i+=2){for(no=1,j=2;j<i;j++)i%j==0&&(no=0);no&&r.push(i)}for(;r.length>0;){var f=r.shift();if(2*f==n)return f+" + "+f;var o=r.indexOf(n-f);if(~o)return f+" + "+r.splice(o,1)[0]}}();f&&(alert(n+" = "+f),r(n+2))}(4);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment