「len」を含む日記 RSS

はてなキーワード: lenとは

2015-09-15

配列初期化で「定数値が必要です」 C#

動的な長さの配列を new で初期化しようとした。「定数値が必要です」と文法エラー

初期値を指定する場合は、配列全体分を指定せねばならない。といった制約から来るようだ。配列オブジェクトの生成後に初期値を代入することになりそうだ。

var ary = new int[len]; はOK。

var ary = new int[len] { 0, 120, -120 }; は、NG になる。

2014-06-19

関数型言語

ランダム整数ランダムな個数引数に渡されて、それらを添字順にひとつずつ足して行き、50を超えたらそれまでの配列の中身を返す」みたいなのってどうやって書くんだろう。

手続き的に書くなら

var randoms = [10, 20, 1, 6, 8, 0, 0, 0, 20, 10];

var total = 0;

for (var i = 0, len = randoms.length; i < len; i++) {

if (total > 50) break;

total += randoms[i];

}

return randoms.slice(0, i);

みたいな感じですぐ思いつくんだけど、純粋関数型って変数も許してないしこういうやつは reduce するんでしょ。

まったくわからない。できないんだとしたら何が優れてるんだ。

もちろん、関数型的に each とか map とかすると見やすくなるケースが多いのはわかってるけど。

できること、できないこと、そういうのがあるから結局マルチパラダイム言語でいい感じに取捨選択してねーってことなのかなあ。

2014-05-29

WinInetを使ってVBAでPOSTする

Option Explicit

Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
Private Const INTERNET_SERVICE_HTTP = 3
Private Const INTERNET_DEFAULT_HTTP_PORT = 80
Private Const INTERNET_FLAG_RELOAD = &H80000000

Private Declare Function InternetOpenA Lib "wininet.dll" (ByVal sCallerName As String, ByVal dwAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal dwFlags As Long) As Long
Private Declare Function InternetConnectA Lib "wininet.dll" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nProxyPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumberBytesToRead As Long, ByRef lNumberOfBytesRead As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInternetHandle As Long) As Long
Private Declare Function HttpOpenRequestA Lib "wininet.dll" (ByVal hConnect As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal sAcceptTypes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function HttpSendRequestA Lib "wininet.dll" (ByVal hRequest As Long, ByVal sHeaders As String, ByVal dwHeadersLength As Long, ByVal lpOptional As String, ByVal dwOptionalLength As Long) As Long

Private Function submitPost(ByRef host, ByRef url_path, ByRef sendString) As Variant

  Dim dataArray() As Byte, dataPosition, dataSize

 'WinInet初期化
  Dim hInternet
  hInternet = InternetOpenA(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
  If hInternet = 0 Then
    submitPost = dataArray
    Exit Function
  End If

 'サーバ接続
  Dim hConnect
  hConnect = InternetConnectA(hInternet, host, INTERNET_DEFAULT_HTTP_PORT, vbNullString, vbNullString, INTERNET_SERVICE_HTTP, 0, 0)
  If hConnect = 0 Then
    InternetCloseHandle hInternet
    submitPost = dataArray
    Exit Function
  End If

 'リクエスト初期化
  Dim tmpURL As String * 255
  tmpURL = url_path
  Dim hRequest
  hRequest = HttpOpenRequestA(hConnect, "POST", tmpURL, "HTTP/1.1", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
  If hRequest = 0 Then
    InternetCloseHandle hConnect
    InternetCloseHandle hInternet
    submitPost = dataArray
    Exit Function
  End If

 'リクエストを送信
  Const strHeader = "Content-Type: application/x-www-form-urlencoded"
  HttpSendRequestA hRequest, strHeader, Len(strHeader), sendString, Len(sendString)

 'データ取得
  Dim readResult, tmpArray(1023) As Byte, tmpPosition, tmpSize
  dataPosition = 0
  dataSize = 0
  Do
    tmpSize = 0
    Erase tmpArray
    readResult = InternetReadFile(hRequest, tmpArray(0), 1024, tmpSize)
    If Not readResult = 1 Or tmpSize = 0 Then
      Exit Do
    End If

    dataSize = dataSize + tmpSize
    ReDim Preserve dataArray(dataSize - 1)
    For tmpPosition = 0 To tmpSize - 1 Step 1
      dataArray(dataPosition) = tmpArray(tmpPosition)
      dataPosition = dataPosition + 1
    Next
  Loop

 'クローズ処理
  InternetCloseHandle hRequest
  InternetCloseHandle hConnect
  InternetCloseHandle hInternet

  submitPost = dataArray

End Function

Public Function downloadFilePost(ByRef targetURL, ByVal sendArray, ByRef savePath) As Boolean

 'URLの分解
  Dim startE, endE, host, url_path
  startE = InStr(1, targetURL, "//") + 2
  endE = InStr(startE, targetURL, "/")
  endE = IIf(startE > endE, Len(targetURL) + 1, endE)
  host = Mid(targetURL, startE, endE - startE)
  url_path = Mid(targetURL, endE)

 'ポストデータエンコード
  Dim jscript
  With CreateObject("ScriptControl")
    .Language = "JScript"
    Set jscript = .CodeObject
  End With
  Dim ix, sendBuffer
  For ix = 0 To UBound(sendArray) Step 1
    sendBuffer = Split(sendArray(ix), "=")
    sendArray(ix) = sendBuffer(0) & "=" & jscript.encodeURIComponent(sendBuffer(1))
  Next
  Set jscript = Nothing

  Dim data
  data = submitPost(host, url_path, Join(sendArray, "&"))

  If LenB(data) <= 0 Then
    downloadFilePost = False
    Exit Function
  End If

 'バイナリで書き込み
  With CreateObject("ADODB.Stream")
    .Type = 1
    .Open
    .Write data
    .SaveToFile savePath, 2
    .Close
  End With

  downloadFilePost = True

End Function

2014-02-15

Python無名関数っぽいUnixコマンド作った。

GitHubとかブログやってないからここに書いておく。

使い方

標準入力を使いまわしたいとき

... | fun x:: cmd1 x : cmd2 x : ... : cmdn x | ...

ただしcmdにはサブシェルパイプなどは使用できない。

標準入力をそのまま利用する場合と一行毎に処理する場合

一行毎に処理する場合はxargs -Iを利用する。

$ ls *txt
a.txt b.txt
$ cat a.txt
1
$ cat b.txt
2
$ ls *txt | fun x:: echo x : cat x
a.txt b.txt
1
2
$ ls *txt | xargs -Ix fun _:: echo x : cat x
a.txt
1
b.txt
2

コード(fun)

>と<はそれぞれ大小の不等号で置き換えてくださいな

#!/usr/bin/env python
import sys
from subprocess import *

def take_variable(var):
	# check the syntax of variable (http://www.gnu.org/software/bash/manual/bash.html)
	# variable ::= (_|[A-z])(_|[A-z]|[0-9])*
	# variable contained space
	if len(var.split()) > 1:
		raise Exception('fail: the variable contained space')
	# check head
	if not (var[0].isalpha() or var[0] == '_'):
		raise Exception('fail: the variable contained wrong character')
	# check the body of variable
	b = True
	i = 0
	for c in var[1:]:
		i += 1
		# is variable contained invalid character?
		if not (c.isalpha() or c.isdigit() or c == '_'):
			b = False
			break
	# no exception if thre are only spaces after variable
	if not b and not var[i:].isspace():
		raise Exception('fail: the variable contained wrong character')
	elif b:
		return var[0]
	else:
		return var[:i]

def parse(var_to_cmds):
	# check the position of '::'
	try:
		pos = var_to_cmds.index('::')
	except Exception:
		raise Exception('not exists "::"')
	var = var_to_cmds[:pos]
	cmd_str = var_to_cmds[pos+2:]
	# check the format of variable and commands
	if var ==  '':
		raise Exception('fail: no variable before "::"')
	elif cmd_str == '':
		raise Exception('fail: no commands after "::"')

	return (take_variable(var),cmd_str)


if __name__ == '__main__':
	# parse variable and commands
	try:
		var,cmd_str = parse(' '.join(sys.argv[1:]))
	except Exception, e:
		print >>sys.stderr, e
		sys.exit(1)

	# var -> val
	val = sys.stdin.read().replace('\n',' ')
	# mapping and split by ':' again
	commands = map(
			(lambda cmd: cmd.replace(' '+var+' ',' '+val+' ')),
			cmd_str.split(':'))

	# exec command
	for cmd in commands:
		try:
			# need split for remove spaces
			check_call(cmd.split())
		except Exception,e:
			# print >>sys.stderr, e
			sys.exit(1)

本当はfunじゃなくて\(バックスラッシュ)で、:: じゃなくて→にしたかったんだけど、シェルが置き換えちゃうからしかたない

シェルの改造は禁断の手段だし

2011-06-16

via http://b.hatena.ne.jp/torin/20110614#bookmark-46762850

もうTogetterは本人IDしかないまとめなら福本伸行風味に「ざわ…」を大量に背景表示する機能を実装すべき

Togetterが実装することはないだろうから、俺が作る。

// ==UserScript==
// ==/UserScript==
(function(){
  if (null != window.frameElement) return false;
  if (! location.pathname.match(/^\/li\//)) return false;
  window.addEventListener('DOMContentLoaded', function() {
    var curator = document.querySelector('div.balloon_box.info_prof div.balloon_img.tltip').getAttribute('title').toLowerCase();
    var tweeters = document.querySelectorAll('div.tweet_box div.status div.status_right a.status_name');
    var len = tweeters.length;
    var tweeter = '';
    for (var i = 0; i < len; i++) {
      if(curator != tweeters.item(i).textContent.toLowerCase()) {
        break;
      }
    }
    if (i >= len) {
      var data = 'data:image/png;base64,'+
        'iVBORw0KGgoAAAANSUhEUgAAAKQAAAA9CAYAAAAj3MLKAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAC'+
        'vUlEQVR4nO2YS27DMAxEffNerOteq0UDFEgXkinxMyN6FrOKYT0On5Ki18fX56UoLIEDKMp7Yl92'+
        'Xd9/SYWenFPFoCTtNuxFbyJkCjE7p4pByUuJKKHAErJ1UkXJEEJC9k66LNFSSMjeiX9hspTMQuoi'+
        'BHSYvZjoJbEKib4MXVK6oIglScjeKV+Sd1ESsncgi/IsS0L2DmxZuwuTkL1Td1CQlBKyd2oPC5BS'+
        'QvZO/YFOKauFHPF6g148azCHOpZUKWSWjBKTTEiPlN2ElJQkQu5KKSF7Bw/glHLlM0nJn9LS0am+'+
        'WFEX8El5jIzZi185y/Iseh4JKSHdu0DLJCGJFmY97+QZS4SsKIkhBTebQsjTxYQDrCwNzeUVstsl'+
        'fIyQJ0oZJWRUT+x9DedBA+yUjeayslbJ00lKOMBu2WguC2e1NKd0NZ0BDdClaI+QT+tqyo8G6FL0'+
        'jK3655S5p1t2NIC3aJayd4R8Yk+37GiALmWPmFC8jB2ZuNEAUWWjC5/9LCM4I8/OmGF4gdFyMRSe'+
        'yYNkjDg7Y45pP2ixMiRgYkGySUgiEVg42Jgi50rpCi1UpgwMDGzf2pFzpXS1W/ApYRASIWMrIdES'+
        'dRISJWOUkJHvsbyzrYgS8sz/RbYW8skyHi8kWp5uMjIsn5HJLSQakD0SMph5Vioajj0s39JWNnRf'+
        'Ju6T4dkWztQhG4+Z+2R4pmUzdcjGs8Q+GgANxhwJmcg+GgANxhqrjKgOmVi2+EdDoMEYsyIjokMW'+
        'DtcMo0HQYGy5Ew/dIdPFcM3BUOYJYRayi4yvWWYDoeFYYlk4qr9OMr7muRsMDQgtZ+FvRDYh0d1t'+
        'z2Mtv0syZEQJ2U3Gf0JKSruQ1ucRMkrIA+NZ+MrzktEp5FPE3F165POScUHIzlLuLj/j+Ugh0SKl'+
        'C6lwprOMr/nQAMrG0prK+JsfF3m2CCi6mVcAAAAASUVORK5CYII=';
      var div = document.createElement('div');
      var img = document.createElement('img');
      img.setAttribute('class', 'za-wa');
      img.src = data;
      function remimg() {
        var rem = document.querySelector('img.za-wa');
        if(rem) {
          window.setInterval(function() {
            rem.style.opacity -= 0.05;
            if (rem.style.opacity == 0) {
              document.body.removeChild(rem);
              return;
            }
          }, 100);
        }
      }
      function addimg() {
        var c_img = img.cloneNode(false);
        c_img.style.position = 'fixed';
        c_img.style.top = Math.floor(Math.random() * 100) + '%';
        var leftp = Math.floor(Math.random() * 100);
        if(leftp < 50) {
          leftp = Math.floor(leftp / 4);
        } else {
          leftp = 100 - Math.floor(leftp / 4);
        }
        leftp += '%';
        var ratio = (120 - Math.floor(Math.random() * 70));
        c_img.style.left = leftp;
        c_img.style.zIndex = -1;
        c_img.style.opacity = 1;
        c_img.style.width = (Math.floor(164 * ratio / 100)) + 'px';
        c_img.style.height = (Math.floor(61 * ratio / 100)) + 'px';
        document.body.appendChild(c_img);
        var r = Math.floor(Math.random() * 1000) + 1000;
        window.setTimeout(addimg, r);
        window.setTimeout(remimg, 2500);
      }
      addimg();
    }
  }, false);
})();

2010-11-14

facebook初音ミクが600人も居る件

初音ミクfacebookページがあるというのを海外ニュースで読んだので、どんなもんかと思って検索してみた。

そしたら、出てくる出てくる。「結果をもっとみる」を果てしなくクリックした結果、最終的にざっと600人ぐらいも出てきた。わけわかんねぇ。

何だか楽しくなってきたので他のボカロ検索して調べてみた。

 

Hatsune Miku 約600人

Kagamine Rin 約660人

Kagamine Lin 7人ぐらい

Kagamine Ren 約70人

Kagamine Len 約560人

Megurine Luka 約500人

MeikoKaitoは、これを含む名前が全部出てきてしまって分離が面倒なので断念。

Kaai Yuki 15人ぐらい

Hiyama Kiyoteru 15人ぐらい

Nekomura iroha 12人ぐらい

kasane teto 180人位

Akita neru 170人ぐらい

Yowane haku 90人ぐらい

 

・・・ボカロに限らず、こんな調子アニメキャラゲームキャラ名前の人が他にもザクザク出てくる予感。

当然、この人達はその系統趣味があるので、外国の人の様子を知るにはとても面白いです。

2009-03-26

ハッシュ関数を調べる

セキュリティ目的ではない。ハッシュテーブルで使うような奴でキャッシュで使いたい。

手軽なほうが良い。軽いほうが良い。推測可能でよい。数十バイトくらいの文字列にしたい。

md5が一番汎用っぽいけど、無駄に重い気がする。crc32は軽そうだしそれなりに汎用っぽいけど、ハッシュ長が短いのがめんどい

ベターはなんだろう。セオリーはなんだろう。

調べた→ http://anond.hatelabo.jp/20090327015620

ベンチ用スクリプト

#!/usr/local/bin/python
from sys import argv, stderr
from time import time
from string import ascii_letters, join
from random import choice
from hashlib import md5
from binascii import crc32
from itertools import izip

time_fmt = '%10s: %5d ms'
shift = int(argv[1]) if len(argv)>1 and argv[1].isdigit() else 2
length = 0x100 << shift
cycle = 0x10000 &gt;&gt; shift
print &gt;&gt; stderr, 'string length: 0x%x, cycle: 0x%x' % (length, cycle)
data = tuple(''.join(choice(ascii_letters) for i in xrange(length)) for j in xrange(cycle))

start = time()
md5hex = tuple(md5(s).hexdigest() for s in data)
print &gt;&gt; stderr, time_fmt % ('md5hex', (time() - start) * 1000)

start = time()
crc32x4 = tuple(''.join('%08x' % abs(crc32(s[i::4])) for i in (0, 1, 2, 3)) for s in data)
print &gt;&gt; stderr, time_fmt % ('crc32x4', (time() - start) * 1000)

start = time()
startend = tuple(s[:16]+s[-16:] for s in data)
print &gt;&gt; stderr, time_fmt % ('headtail', (time() - start) * 1000)

start = time()
skip = tuple(s[::(len(s)/32+1)] for s in data)
print &gt;&gt; stderr, time_fmt % ('skipover', (time() - start) * 1000)

for s in izip(data, md5hex, crc32x4, startend, skip):
    print join(s)

実行結果

% python hashbench.py 0 &gt; hash0.txt
string length: 0x100, cycle: 0x10000
    md5hex:   199 ms
   crc32x4:  1081 ms
  headtail:    30 ms
  skipover:    41 ms
% python hashbench.py 2 &gt; hash1.txt
string length: 0x400, cycle: 0x4000
    md5hex:    83 ms
   crc32x4:   363 ms
  headtail:    10 ms
  skipover:    20 ms
% python hashbench.py 4 &gt; hash2.txt
string length: 0x1000, cycle: 0x1000
    md5hex:    52 ms
   crc32x4:   170 ms
  headtail:     2 ms
  skipover:     5 ms

2009-02-13

初心者Twitterを楽しむアルゴリズムを考えた

http://anond.hatelabo.jp/20090211162032

を頑張って実践中なのだけどどうも

”だれをフォローするか”

で詰まってしまうので、ある程度機械的に増やす方法を考えた。対象は5人くらいまではFollowしてもらえたけどそっから先どうすれば良いか分からない人

# フォローを返してもらえなかったらremove
for f in user.followings:
  if not f.following(user): user.remove(f)

# Following / Follower比を保っている間
while len(user.followers) * 1.5 < len(user.followings):
  # Followersから2人選ぶ
  for i in range(user.followers):
    for j in range(i + 1, len(user.followers)):
      # 共通のユーザーを選ぶ
      shared_users = shared(user.followers[i], user.followers[j])
      for su in shared_users:
        # まだフォローしておらず
        if user.following(su): continue
        
        # フォローを返してくれそうで
        if len(su.followers) &gt; len(su.followings): continue
        
        # botでなさそうなら
        if len(su.followings) &gt; len(su.followers) * 1.5: continue
        
        # フォローする
        user.follow(su)

これを3日に一回くらい定期的に実行すれば徐々に面白くなっていく。はず。

共通のユーザーを探すのは

とか

2009-01-16

面倒くさくなった

// ==UserScript==
// @name           anond
// @namespace      http://anond.hatelabo.jp/
// @include        http://anond.hatelabo.jp/?page=*
// ==/UserScript==
function anond(doc) {
    $X(".//div[@class='section'][.//h3/a[2][starts-with(@href, 'http://anond.hatelabo.jp')]]", doc, Array).forEach(function(node){
        node.style.display = "none";
    });
    $X(".//h3/a[1]", doc, Array).forEach(function(node){
        var a = document.createElement("a");
        a.name = node.pathname;
        a.href = "#" + node.pathname + "/footer";
        a.innerHTML = "V";
        node.parentNode.insertBefore(a, node);
    });
    $X(".//p[@class = 'sectionfooter']/a[1]", doc, Array).forEach(function(node){
        var a = document.createElement("a");
        a.name = node.pathname + "/footer";
        a.href = "#" + node.pathname;
        a.innerHTML = "^";
        node.parentNode.insertBefore(a, node);
        node.parentNode.insertBefore(document.createTextNode(" | "), node);
    });
}

anond(document);
if (AutoPagerize.addDocumentFilter)
    AutoPagerize.addDocumentFilter(anond);


// by http://lowreal.net/blog/2007/11/17/1
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var result = exp.evaluate(
                context,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );
            var ret = [];
            for (var i = 0, len = result.snapshotLength; i < len; i++) {
                ret.push(result.snapshotItem(i));
            }
            return ret;
        case undefined:
            var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
            switch (result.resultType) {
                case XPathResult.STRING_TYPE : return result.stringValue;
                case XPathResult.NUMBER_TYPE : return result.numberValue;
                case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
                case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}

2008-12-26

[]Hatena::Bookmark::24H::Chart

修正:いい加減&が変換されるのを何とかしてほしい

解説:Hatena::Bookmark::24H(http://hatebu24h.ashitano.in/)に、トップエントリの獲得したブックマーク数の推移のチャートを加えます。

// ==UserScript==
// @name           chart of Hatena::Bookmark::24H
// @namespace      http://anond.hatelabo.jp/
// @include        http://hatebu24h.ashitano.in/*
// ==/UserScript==

var url = unescape("http://chart.apis.google.com/chart?chs=160x60%26cht=ls%26chd=t:");
url = url + $X("//div[@class='clocktxt']", Array).map(function(s){return s.firstChild.nodeValue}).join(",");
//var id = $X("//h3/a/@href")[0].nodeValue;
//url = url + $X("//div[@class='entrytitle' or @class='entrytitle2'][.//a[@href='"+id+"']]/../preceding-sibling::div[1]", Array).map(function(s){return s.textContent.match(/\d+/)}).join(",");
var before = makeElements({
    nodeName: "div",
    className: "sidebox",
    childNodes: [{
        nodeName: "div",
        className: "sidetitle",
        innerHTML: "Recent top entry chart"
      },{
        nodeName: "div",
        className: "sidetitle",
        childNodes: {
            nodeName: "img",
            src: url
        }
    }]
});
var after = $X("//div[@class='sidebox']", Array)[0];
after.parentNode.insertBefore(before, after);

// util

// var 0.01
function makeElements(obj) {
    if (typeof obj != "object")
        return document.createTextNode(obj);
    if (obj instanceof Array)
        return obj.map(makeElements);
    var node = document.createElement(obj.nodeName);
    delete obj.nodeName;
    if (obj.childNodes) {
        [].concat(makeElements(obj.childNodes)).forEach(node.appendChild, node);
        delete obj.childNodes;
    }
    function extend(dst, src) {
        for (var i in src) {
            if (typeof src[i] == "object" &amp;&amp; dst[i] &amp;&amp; typeof dst[i] == "object")
                extend(dst[i], src[i]);
            else
                node[i]=obj[i];
        }
    }
    extend(node, obj);
    return node;
}

// by http://lowreal.net/blog/2007/11/17/1
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var result = exp.evaluate(
                context,
                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
                null
            );
            var ret = [];
            for (var i = 0, len = result.snapshotLength; i < len; i++) {
                ret.push(result.snapshotItem(i));
            }
            return ret;
        case undefined:
            var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
            switch (result.resultType) {
                case XPathResult.STRING_TYPE : return result.stringValue;
                case XPathResult.NUMBER_TYPE : return result.numberValue;
                case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
                case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}

2008-12-23

今年の情報オリンピック予選のこの問題、

冬の寒いある日,JOI太郎君は広場にはった薄氷を割って遊ぶことにした.広場は長方形で,東西方向に m 個,南北方向に n 個,つまり, m × n の区画に区切られている.また,薄氷が有る区画と無い区画がある. JOI太郎君は,次のルールにしたがって,薄氷を割りながら区画を移動することにした.

薄氷があるどの区画からも薄氷を割り始めることができる.

東西南北のいずれかの方向に隣接し, まだ割られていない薄氷のある区画に移動できる.

移動した先の区画の薄氷をかならず割る.

JOI太郎君が薄氷を割りながら移動できる区画数の最大値を求めるプログラムを作成せよ.ただし, 1 ≦ m ≦ 90,1 ≦ n ≦ 90 である.与えられる入力データでは,移動方法は20万通りを超えない.

入力

入力はn+2行ある. 1 行目には整数 m が書かれている. 2 行目には整数 n が書かれている. 3 行目から n+2 行目までの各行には、0 もしくは 1 が, 空白で区切られて m 個書かれており,各区画に薄氷があるか否かを表している.北から i 番目,西からj番目の区画を (i,j) と記述することにすると (1 ≦ i ≦ n, 1 ≦ j ≦ m),第 i+2 行目の j 番目の値は,区画 (i,j) に薄氷存在する場合は 1 となり,区画 (i,j) に薄氷存在しない場合は 0 となる.

のいい最適化の方法が思いつかない。

一応プログラムは書けたけど90*90の時にまともに動く気がしない。

単なる深さ優先検索。

array = [
  [1, 1, 1, 0, 1],
  [1, 1, 0, 0, 0],
  [1, 0, 0, 0, 1]
]
result = []
def get(x, y):
  if (0 <= x < len(array)) and (0 <= y < len(array[0])):
    return array[x][y]
  else:
    return -1
def func(x, y, route):
  route = route[:]
  # print x, y, get(x, y)
  if get(x, y) == 0:
    result.append(route)
    return
  if (x, y) in route:
    return
  route.append((x, y))
  if get(x - 1, y ) >= 0: func(x - 1, y , route)
  if get(x , y + 1) >= 0: func(x , y + 1, route)
  if get(x + 1, y ) >= 0: func(x + 1, y , route)
  if get(x , y - 1) >= 0: func(x , y - 1, route)
func(0, 0, [])
for i in result:
  print i

2008-07-31

[][][][]無題

百万回繰り返された例の件について書いてみるよ。あ、タイトルは必要ないよね?このタグだけ見ればわかるものw

Perl

  • sigil 汚い、my our local 汚い。
  • ->が汚い、ドットにしてよ。Perl6ではドットになるんだって?やったぁ。
  • とにかくコードを見るだけでげんなりする。
  • クラス機構が後付けなのがめんどくせー。Exporter使うのだるい
  • とにかく文法がアレすぎる。あ、でも後置修飾子はおきにいり。
  • でもはえー、ちょうはえー。
  • ライブラリ超使える。もうなんでもできる。

総評:肉は腐りかけがうまい

PHP

  • 名前がださい。
  • ライブラリがださい。関数名がださい。
  • もうとにかください、見るのも嫌。

総評:作った人間はドS、使ってる人間はドM。

Python

総評:とにかく微妙というか、中途半端につかいにくい。いまだにPerlが生きていたり、Rubyキャッチアップされてるのも納得の出来。これがLL界を制覇したらPerlよりうっとうしい。

Ruby

  • 基本的な機能には文句ない。メソッドチェインとかブロック構文とかもうさいこう。
  • なんで定数に代入可なんだろう。警告出るからいいけど。
  • なんでも式だから乱用したら解読しにくそう。
  • ボキャブラリや慣習が他の言語からの流用が多いから覚えやすい。
  • ライブラリが貧弱。
  • バイト文字処理が貧弱。
  • require 'rubygems' が汚いしめんどくさい。RUBYOPTつかえ?そういう問題じゃない。
  • いちばんおそい。でもPythonとどっこいどっこいだからあんまりきにしない。
  • 日本でしか人気ないから結構あっという間にすたれそう。
  • よくまとまってて使いやすいけど、特に目新しい点はないよね。人気があんまりないから変な要望がなくてごちゃごちゃしてないって部分はあるかも。

総評Perlライブラリが流用できたら最高。できなかったらNIH症候群にかかる。

いじょう、ストレスたまったドヘタプログラマが真夏の暑いときに油をぶちまけてみたよ☆

ログイン ユーザー登録
ようこそ ゲスト さん