裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

正規表現:最短一致

2020年02月21日 | ブログラミング

'<.*?>' ではなくて '<[^<>]*>'

 

text = '<br />あか<br />あお<br />みどり<br />きいろ<br />'
gsub('<.*?>', '', text)
gsub('<[^<>]*>', '', text)

両方とも 'あかあおみどりきいろ' になる。

text = '<<<foo>>>'
gsub('<.*?>', '', text)
gsub('<[^<>]*>', '', text)

上は '>>',下は '<<>>' になる。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

トリッキーなプログラム

2020年02月15日 | ブログラミング

お題:標準出力 【難易度★★★★★】

標準出力でSh1maを出力してください。ルールは以下の通りです。

    • コード中に文字列("", '')を含んではいけない
    • コード中に数値を含んではいけない
    • chr, ordの禁止

できる方はどうぞ。

というのがあったので,Python で書いてみた。

後で,R でも書いてみよう。

import string
w = string.digits
w = w[len(w):len(w)]
A = list(string.ascii_uppercase)
A.pop(); A.pop(); A.pop(); A.pop(); A.pop()
A.pop(); A.pop()
print(A.pop(), end=w)
a = list(string.ascii_lowercase)
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop(); a.pop(); a.pop()
print(a.pop(), end=w)
d = list(string.digits)
d.pop(); d.pop(); d.pop(); d.pop(); d.pop()
d.pop(); d.pop(); d.pop()
print(d.pop(), end=w)
a = list(string.ascii_lowercase)
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop(); a.pop(); a.pop()
print(a.pop(), end=w)
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop(); a.pop(); a.pop(); a.pop(); a.pop()
a.pop()

print(a.pop())

R では,別のアルゴリズム(おおげさ)で書いてみる

zero = pi - pi
one = pi / pi
two = one + one
four = two + two
string.pi = as.character(pi)
cat(LETTERS[four * four + two + one], letters[four * two],
  substr(string.pi, two + one, two + one),
 
letters[four * two + four + one],
  letters[one], sep=substr(string.pi, one, zero))

Python だと

import string
from math import pi
zero = int(pi - pi)
one = int(pi / pi)
two = one + one
four = two + two
LETTERS = list(string.ascii_uppercase)
letters = list(string.ascii_lowercase)
print(LETTERS[four * four + two], letters[four * two - one],
  str(pi)[two:two + one],
  letters[four * two + four],
  letters[zero], sep=str(pi)[one:one])

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

R の fivenum() は Python のチョメチョメ

2020年02月13日 | ブログラミング

> fivenum(1:7587)
[1]    1.0 1897.5 3794.0 5690.5 7587.0

である(わざと変な個数の数列にしておく)

Python では,scipy.stats.scoreatpercentile() とか,numpy.percentile() がある。

>>> import numpy as np
>>> from scipy.stats import scoreatpercentile

>>> x = np.arange(7587)+1

>>> scoreatpercentile(x, [25, 75], interpolation_method='fraction')
array([1897.5, 5690.5])

>>> scoreatpercentile(x, [25, 75], interpolation_method='lower')
array([1897., 5690.])

>>> scoreatpercentile(x, [25, 75], interpolation_method='higher')
array([1898., 5691.])

>>> np.percentile(x, [25, 75], interpolation = 'linear')
array([1897.5, 5690.5])

>>> np.percentile(x, [25, 75], interpolation = 'lower')
array([1897, 5690])

>>> np.percentile(x, [25, 75], interpolation = 'higher')
array([1898, 5691])

>>> np.percentile(x, [25, 75], interpolation = 'midpoint')
array([1897.5, 5690.5])

>>> np.percentile(x, [25, 75], interpolation = 'nearest')
array([1897, 5691])

ということで,np.percentile() の interpolation = ' midpoint' のようだ

と,書いたけどちょっと違うみたいなので,R の fivenum() を Python に移植した

import math
def fivenum(x):
    n = len(x)
    x = sorted(x)
    n4 = ((n + 3)//2)/2
    return 0.5 * (x[math.floor(n4 - 1)] + x[math.ceil(n4 - 1)]), 0.5 * (x[math.floor(n - n4)] + x[math.ceil(n - n4)])

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村