Excelの列ってAとかAAとかあるんですが、それを数値として処理できるようにするための関数でつ。
追記: k3cさんが直してくれますた。この手のアルゴリズムはまだ磨きがたりないな_| ̄|○
sub rowtonum($) {
my ($row) = @_;
my $base = ord("a");
my $interval = ord("z") - $base;
my $rownum = 0;
my $dig = 0;
foreach my $c (reverse(split(//, $row))) {
$rownum += (ord(lc($c)) - $base + 1) * ($dig * $interval + 1);
$dig++;
}
$rownum--;
return $rownum;
}
へびだとこうなる。計算がめんどくさいからあんま見た目かわらんかも。
def rowtonum(row):
base = ord('a')
interval = ord('z') - base;
rownum = 0
dig = 0
row = list(row)
row.reverse()
for c in row:
rownum += (ord(c.lower()) - base + 1) * (dig * interval + 1)
dig += 1
rownum -= 1
return rownum
皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー
代案とか。 (スコア:1)
import string
def rowtonum(rowname):
fromchar = string.ascii_uppercase
tochar = string.digits + string.ascii_uppercase
for i in range(len(fromchar)):
rowname = string.replace(rowname, fromchar[i], tochar[i])
return string.atol(rowname, 26)
Re:代案とか。 (スコア:1)
まあそんなでっかい表はないと思うが (スコア:1)
sub rowtonum2($) {
my $row = lc( shift @_ );
my $base = ord( "a" ) - 1;
my $interval = ord( "z" ) - $base;
my $num = 0;
foreach my $c ( split( //, $row ) ) {
$num *= $interval;
$num += ord( $c ) - $base;
}
return --$num;
}
rowtonum2("AAA") = 702となります。
Re:まあそんなでっかい表はないと思うが (スコア:1)
計算氏さんどうもさんくすです。
typo修正 (スコア:1)
荒らし (スコア:0)
が
「計算氏さんどうもうさんくさいです。」
に見えたのは内緒だ。
Re:まあそんなでっかい表はないと思うが (スコア:0)
def rowtonum2(row):
base = ord('a') -1
interval = ord('z') - base
num = 0
for c in row[::-1]:
num *= interval
num += ord(c.lower()) - base
return num -1
print rowtonum2('AAA')
列は row でなくて column じゃなかろうか (スコア:1)
(defun coltonum (x)
(interactive "s")
(let ((ret 0))
(while (and
(string-match "^[A-Za-z]\\{,4\\}$" x)
(> (length x) 0))
(setq ret (+ (* ret 26) (% (aref x 0) 32)))
(setq x (substring x 1)))
(setq ret (if (> ret 0) (1- ret) 0))
(if (interactive-p) (princ ret t) ret)))
えっと (スコア:0)
# 根本的に勘違いしているのでAC
紅玉版 (スコア:0)
def rowtonum
upcase.unpack("C*").inject(0){|n,c|n*26+c-?@}-1
end
end
"A".rowtonum # => 0
"AAA".rowtonum # => 702
Re:紅玉版 (スコア:1)
これとは直接関係ないすけど、Matzさんが26真数を実装したとか言ってましたね...
じゃ、26進数版 (スコア:0)
def rowtonum
tr("a-zA-Z", "0-9a-p0-9A-P").to_i(26)+("1"*size).to_i(26)-1
end
end
もう少しキレイにできないかな。 (スコア:0)
row = map(lambda x:ord(x.lower()) - ord('a') +1, row)
return reduce(lambda x,y:x*26 +y, [0] + row[::-1]) -1
print rowtonum('A')
print rowtonum('AAA')