双子座線型群

Искусственный язык / Программирование / Шахматы / Математика

プログラミング

HSPでコムソート

2015-12-20 by 古城みの コメントする

HSPで一次元配列をコムソートでソートするための命令を作りました。
サンプルファイルのようにして比較関数(のようなもの)を作って使用します。

  • combsort.hsp-v1.0.0.zip
    • combsort.hsp
    • combsort-sample.hsp

リリースノート:

  • v1.0.0 [2015.12.20]:公開
カテゴリー: プログラミング, モジュール タグ: HSP

JavaScriptでtr

2015-11-06 by 古城みの コメントする

JavaScriptでPerlのtrを使えるようにしました。

  • perl_tr.js-v1.1.1.zip
    • perl_tr.js
    • perl_tr.min.js

文字リスト(第二,第三引数)中でバックスラッシュ(円記号)を使う場合、各バックスラッシュについてエスケープ(\→\)する必要があるので、Perlに対して倍の量が必要になります。

// Perl
$str =~ tr/A\\Z/a\-z/;

// JavaScript
perl_tr( str, 'A\\\\Z', 'a\\-z' );

以下動作例です。

// 'AAABBBefg' を返す
perl_tr( 'AAabcdefg', 'abcd', 'AB' );

// 'BBabcdBBB' を返す
perl_tr( 'AAabcdefg', 'abcd', 'AB', 'c' );

// 'AAABefg' を返す
perl_tr( 'AAabcdefg', 'abcd', 'AB', 'd' );

// 'AAABefg' を返す
perl_tr( 'AAabcdefg', 'abcd', 'AB', 's' );

// 'J S ' を返す
perl_tr( 'JavaScript', 'A-Z', ' ', 'cs' );

リリースノート

  • v1.1.1.zip [2015-11-09] – コードを整理
  • v1.1.0.zip [2015-11-08] – バックスラッシュの扱いを整備
  • v1.0.0.zip [2015-11-06] – 公開
カテゴリー: プログラミング, モジュール タグ: JavaScript, Perl

JavaScriptでstrtr

2015-11-05 by 古城みの コメントする

PHP の strtr を JavaScript で使えるようにしました。ここで出てる例と同じ結果を返すので多分問題ないと思います。

  • php_strtr.js-v1.0.1.zip
    • php_strtr.js
    • php_strtr.min.js
// 'hello all, I said hi'を返す
php_strtr( 'hi all, I said hello', {
    'h'     : '-',
    'hello' : 'hi',
    'hi'    : 'hello'
});

リリースノート

  • v1.0.1 [2015.11.10] – コードを整理
  • v1.0.0 [2015.11.05] – 公開
カテゴリー: プログラミング, モジュール タグ: JavaScript, PHP

JavaScriptでガンマ関数

2015-11-01 by 古城みの コメントする

ここの下の方にあるランチョス近似のコード(Python)を JavaScript にしてみた。

/*
 * Γ(x) = (x - 1)! = Gamma(x)
 */
var Gamma = (function()
{
    var p = [
        676.5203681218851,
        -1259.1392167224028,
        771.32342877765313,
        -176.61502916214059,
        12.507343278686905,
        -0.13857109526572012,
        9.9843695780195716e-6,
        1.5056327351493116e-7
    ];
    var g = 7;

    function Gamma( z )
    {
        if( z < 0.5 ){
            return Math.PI/( Math.sin(Math.PI*z)*Gamma(1-z) );
        }

        z --;
        var x = 0.99999999999980993;

        for( var i=p.length; i--; ){
            x += p[i] / (z + i + 1);
        }

        var t = z + g + 0.5;
        var G = Math.sqrt(Math.PI*2) *Math.exp( (z+0.5)*Math.log(t)-t ) *x;

        if( Math.floor(z) === z ){
            return Math.round( G );
        } else {
            return G;
        }
    }

    return Gamma;
})();

少し書き換えて対数ガンマ関数を計算できるようにしたものも置いておきます。

/*
 * ln Γ(x) = GammaLN(x)
 */
var GammaLN = (function()
{
    var p = [
        676.5203681218851,
        -1259.1392167224028,
        771.32342877765313,
        -176.61502916214059,
        12.507343278686905,
        -0.13857109526572012,
        9.9843695780195716e-6,
        1.5056327351493116e-7
    ];
    var g     = 7;
    var LN_PI = Math.log( Math.PI );

    function GammaLN( z )
    {
        if( z < 0.5 ){
            return LN_PI -Math.log(Math.sin( Math.PI*z )) -GammaLN(1-z);
        }

        z --;
        var x = 0.99999999999980993;

        for( var i=p.length; i--; ){
            x += p[i] / (z + i + 1);
        }

        var t = z + g + 0.5;
        return ( LN_PI+Math.LN2 )/2 +Math.log(x) +(z+0.5)*Math.log(t) -t;
    }

    return GammaLN;
})();

ついでに逆数を計算できるようにしたものも。

/*
 * 1/Γ(x) = GammaInv(x)
 */
var GammaInv = (function()
{
    var p = [
        676.5203681218851,
        -1259.1392167224028,
        771.32342877765313,
        -176.61502916214059,
        12.507343278686905,
        -0.13857109526572012,
        9.9843695780195716e-6,
        1.5056327351493116e-7
    ];
    var g = 7;

    function GammaInv( z )
    {
        if( z < 0.5 ){
            return Math.sin(Math.PI*z) /( Math.PI*GammaInv(1-z) );
        }

        z --;
        var x = 0.99999999999980993;

        for( var i=p.length; i--; ){
            x += p[i] / (z + i + 1);
        }

        var t = z + g + 0.5;
        return Math.exp( t-(z+0.5)*Math.log(t) ) /Math.sqrt(Math.PI*2) /x;
    }

    return GammaInv;
})();
カテゴリー: プログラミング, モジュール タグ: JavaScript, 数値計算, 数学

JavaScriptでhttp_build_query

2015-09-29 by 古城みの コメントする
カテゴリー: プログラミング, モジュール タグ: JavaScript, PHP

JavaScriptでparse_str(クエリ文字列のパース)

2015-09-26 by 古城みの 1件のコメント

PHPのparse_strをJavaScriptで使うためのコードをつくりました。入れ子の配列にも対応してたら長く(100行程度)なったのでzipにしたものを置いておきます。
 http_parse_query.js-v1.0.3.zip

これを script タグで読み込むと関数 http_parse_query が定義されます。parse_str とはやや使い方が異なるので違う名前にしました。

var query_str = 'a=0&b%5B%5D=1&b%5B%5D=2&b%5B%5D=3&c%5Bk%5D%5B%5D%5Br%5D=4';
var output    = http_parse_query( query_str );

// 結果
output = {
    "a" : "0",
    "b" : ["1","2","3"],
    "c" : { "k":[ {"r":"4"} ] }
}

配列は、すべての要素が0番からの連番になっている場合のみ添字配列として扱い、連番になっていない要素を含む場合は連想配列扱いになります。

第二・第三・第四引数に文字列を渡すと、PHP の http_build_query() のそれと同じように解釈します。またクエリ文字列のURLエスケープは UTF-8 でしてある必要があります。

var query_str = 'var_0=%E3%81%82;var_1=%E3%81%84;var_2=%E3%81%86+%E3%81%88';
var output    = http_parse_query( query_str, 'var_', ';', 'PHP_QUERY_RFC3986' );

// 結果
output = ["あ","い","う+え"];

URLのクエリ文字列をパースするコードは次のようになります。

// JavaScript
var output = http_parse_query( location.search.substr(1) );

// PHP(参考)
parse_str( $_SERVER['QUERY_STRING'], $output );

 

リリースノート

  • v1.0.3 [2015.10.31] – URLエンコードを修正
  • v1.0.2 [2015.09.28] – 第四引数に対応
  • v1.0.1 [2015.09.28] – 処理を改善
  • v1.0.0 [2015.09.27] – 公開
カテゴリー: プログラミング, モジュール タグ: JavaScript, PHP

プロフィール

古城みの

リンク

  • 線型結界(サイト)
  • Twitter
  • Pixiv
  • SoundCloud

最近の投稿

  • 詰めシェルトの解答
  • tiv 1
  • シェルトの指し手表記
  • シェルトの対局記録
  • 高さ実数のテトレーション

最近のコメント

  • シェルトの対局記録 に シェルトの指し手表記 – 双子座線型群 より
  • JavaScriptでparse_str(クエリ文字列のパース) に JavaScriptでhttp_build_query より

アーカイブ

  • 2018年2月
  • 2018年1月
  • 2017年2月
  • 2016年10月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年9月
  • 2015年8月
  • 2014年9月

カテゴリー

  • プログラミング
  • ボードゲーム
  • モジュール
  • 制作
  • 告知
  • 数学
  • 棋譜

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Copyright © 2022 双子座線型群.

Omega WordPress Theme by ThemeHall