裏 RjpWiki

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

2021 年日本数学オリンピック予選 問題 1, 2, 3

2021年11月14日 | ブログラミング

2021 年日本数学オリンピック予選 問題 1, 2, 3

https://www.imojp.org/archive/mo2021/jmo2021/problems/jmo31yq.html

Q1.

互いに素な正の整数 m, n が m + n = 90 をみたすとき,積 mn としてありうる,最大の値を求めよ。

  value = 0
  mn = ()
  for m = 1:45
      n = 90 - m
      gcd(m, n) == 1 && (value = max(value, m * n); mn = (m, n))
  end
  println("mn = $value,  (m, n) = $mn") # 2021
  mn = 2021,  (m, n) = (43, 47)

Q2.

下図のような正十角形がある。全体の面積が 1 のとき,斜線部(濃い青色を付けた2つの部分)の面積を求めよ。

  using Plots
  pyplot(label="")
  x = zeros(10)
  y = zeros(10)
  for i = 1:10
      y[i], x[i] = sincosd(i*36)
  end
  δ = [1, 1, -1, -1, -1, -1, -1, 1, 1, 1].*0.1
  plot(x, y, seriestype=:shape, fillcolor=false, tickfontsize=12,
      aspect_ratio=1, xlims=(-1.2, 1.2))
  plot!(x[[1, 2, 3, 6]], y[[1, 2, 3, 6]], seriestype=:shape, fillcolor=:blue)
  plot!(x[[1, 9, 10]], y[[1, 9, 10]], seriestype=:shape, fillcolor=:blue)
  plot!(x[[4, 5, 6]], y[[4, 5, 6]], seriestype=:shape, fillcolor=:blue, alpha=0.3)
  annotate!(x .+ δ, y, Char.(65:74))

三角形 AIJ を 三角形 DEF の位置に移動すれば,色の付いた面積は,正十角形の面積の半分から,三角形CDF の面積を除いたものである。 正十角形の頂点 A, B, ..., J の x, y 座標は ベクトル x, y に入っている。 線分 CF, DF の長さ,∠DFC = θ を求める。

  CF = sqrt((x[3] - x[6])^2 + (y[3] - y[6])^2)
  1.6180339887498947
  DF = sqrt((x[4] - x[6])^2 + (y[4] - y[6])^2)
  DF = y[4] - y[6]
  1.1755705045849463
  θ = 90 - atand((y[3] - y[6]) / (x[3] - x[6]))
  18.0

よって,三角形 EFC の面積 s は

  s = CF * DF * sind(θ)
  0.5877852522924731

正十角形の面積 S は 10sind(θ)

  S = 10sind(36)
  5.877852522924732

よって,色を付けた部分の面積は

  S/2 - s
  2.3511410091698925

S = 1 とすると,

  (S/2 - s) / S
  0.39999999999999997

別解

多角形の面積を求める関数を定義していくつかの部分に分けて面積を求めてみよう。
n 多角形(当然三角形も)の頂点座標を反時計回りで n×2 行列で用意して関数を呼ぶ。

  function area(xy)
      x = xy[:, 1]
      -sum((vcat(x[2:end], x[1]) - vcat(x[end], x[1:end-1])) .* xy[:, 2]) / 2
  end
  area (generic function with 1 method)
  AIJ = area([x[1] y[1]; x[9] y[9]; x[10] y[10]])
  0.11225699414489633
  ABCF = area([x[1] y[1]; x[2] y[2]; x[3] y[3]; x[6] y[6]])
  1.06331351044005
  ABCDEF = 10area([0 0; x[1] y[1]; x[2] y[2]])
  2.938926261462366
  (AIJ + ABCF) / ABCDEF
  0.39999999999999997

面白い(?)のは三角形 BCF の面積が正十角形の 1/10 であること。

  BCF = area([x[3] y[3]; x[4] y[4]; x[6] y[6]])
  0.29389262614623657

以下の図で,三角形 CDF と三角形 CDO の面積が等しいから,最初の図の色の付いた部分は全体の 4/10。

  plot!([x[3], x[4], 0], [y[3], y[4], 0], seriestype=:shape, fillcolor=:green, alpha=0.3)
  annotate!(0.05, -0.05, "O")

これに気づけば,なにもコンピュータなんか使わなくても答えは出る。

Q3.

AB = AC なる二等辺三角形 ABC の内部に点 P をとり,P から辺 BC,CA,AB におろした垂線の足をそれぞれ D,E,F とする。BD = 9,CD = 5,PE = 2,PF = 5 のとき,辺 AB の長さを求めよ。ただし,XY で線分 XY の長さを表すものとする。

P を通り,BC に平行な直線を描き,AB,AC との交点を Q, R とする。 ⊿FQP ∽ ⊿ ERP ゆえ,QP:PR = 5:2

  # QP を求める
  using SymPy
  @syms QP PR
  eq1 = Eq(2QP, 5PR)
  eq2 = Eq(QP - PR, 4)
  s1 = solve([eq1, eq2])
  Dict{Any, Any} with 2 entries:
    PR => 8/3
    QP => 20/3

FQ を求める

  FP = 5
  QP = s1[QP]
  FQ = sqrt(QP^2 - FP^2)
  println(string(FQ))
  5*sqrt(7)/3

A から底辺におろした垂線の足を O とすれば, ⊿FQP ∽ ⊿OBA より,FQ:PQ = BO:AB

AB を求める

  BO = 7
  AB =QP * BO / FQ
  println(string(AB))
  4*sqrt(7)

これが答えだ。

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

2020 年日本数学オリンピック予選 問題 1,3,4,5

2021年11月11日 | ブログラミング

1. 2020 年日本数学オリンピック予選 問題 1,3,4,5

https://www.imojp.org/archive/mo2020/jmo2020/problems/jmo30yq.html

Q1.

千の位と十の位が 2 であるような 4 桁の正の整数のうち,7 の倍数はいくつあるか。

  count = 0
  for i = 0:100:900, j = 0:9
      (2020 + i + j) % 7 == 0 && (count += 1)
  end
  println(count) # 14
  14

Q3.

2 × 3 のマス目の各マスに 1 以上 6 以下の整数を重複しないように 1 つずつ書き込む。辺を共有して隣りあうどの 2 マスについても書き込まれた整数が互いに素になるように書き込む方法は何通りあるか。ただし,回転や裏返しにより一致する書き込み方も異なるものとして数える。

要素数 6 個のベクトルを 2 × 3 行列に対応づける。
1 3 5
2 4 6

  g(x, i, j) = gcd(x[i], x[j]) == 1
  
  using Combinatorics
  count = 0
  a = 1:6
  for i in 1:factorial(length(a))
      x = nthperm(a, i)
      (g(x, 1, 2) && g(x, 3, 4) && g(x, 5, 6) && g(x, 1, 3) && g(x, 3, 5) && g(x, 2, 4) && g(x, 4, 6)) && (count += 1)
  end
  println(count) # 16
  16

Q4.

正の整数 n であって,n^2 と n^3 の桁数の和が 8 であり,n^2 と n^3 の各桁合わせて 1 以上 8 以下の整数がちょうど 1 個ずつ現れるようなものを全て求めよ。

  for n in 1:floor(Int, (10^8)^(1/3))
      n2n3 = string(n^2) * string(n^3)
      length(n2n3) == 8 && length(Set(n2n3)) == 8 && println(n) # 24
  end
  24

Q5.

正の整数 n は 10 個の整数 x1, x2, ..., x10 を用いて (x1^2-1)(x2^2-2)…(x10^2-10) と書ける。このような n としてありうる最小の値を求めよ。

ブルートフォースでやっつける。

  using Combinatorics
  all_perm(x, n) = Iterators.product([x for i = 1:n]...)
  function q5()
      c = 1:10
      n = typemax(Int64)
      amin = []
      for i in all_perm(0:4, 10)
          i[1] != 0 && continue
          a = [x for x in i]
          b = prod(a .^ 2 .- c)
          0 < b < n && (n = b; amin = a)
      end
      println(n)
      println(amin)
  end
  @time q5() # 84
  84
  [0, 1, 2, 1, 2, 2, 3, 3, 4, 3]
    7.724304 seconds (49.21 M allocations: 5.958 GiB, 5.45% gc time, 3.39% compilation time)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

2020 年日本数学オリンピック予選 問題7

2021年11月10日 | ブログラミング

2020 年日本数学オリンピック予選 問題7

https://www.imojp.org/archive/mo2020/jmo2020/problems/jmo30yq.html

Q7. 2×1010 のマス目の各マスに 1 以上 5 以下の整数を 1 つずつ書き込む。辺を共有して隣りあうどの 2 マスについても書き込まれた数の差が 2 または 3 となるように書き込む方法は何通りあるか。ただし,回転や裏返しによる一致する書き込みも異なるものとして数える。

 常套手段としては,場合分けを考えて...ということになるのだろうが,どうせコンピュータを使って解を求めようとしているんだから,ブルートフォースで解のとっかかりを調べよう。

 まず最も簡単な場合の 2 × 2 列の場合に,そのような書き込み法が何通りあるか見てみよう。

  pairs = []
  for i = 1:5
      for j = 1:5
          2 <= abs(i-j) <= 3 && append!(pairs, [[i, j]])
      end
  end
  println(pairs)
  n = length(pairs)
  for i = 1:n
      for j = 1:n
          if i != j
              (2 <= abs(pairs[i][1] - pairs[j][1]) <= 3 &&
               2 <= abs(pairs[i][2] - pairs[j][2]) <= 3) && print(" $(pairs[i]):$(pairs[j])")
          end
      end
      println()
  end
  Any[[1, 3], [1, 4], [2, 4], [2, 5], [3, 1], [3, 5], [4, 1], [4, 2], [5, 2], [5, 3]]
   [1, 3]:[3, 1] [1, 3]:[3, 5] [1, 3]:[4, 1]
   [1, 4]:[3, 1] [1, 4]:[4, 1] [1, 4]:[4, 2]
   [2, 4]:[4, 1] [2, 4]:[4, 2] [2, 4]:[5, 2]
   [2, 5]:[4, 2] [2, 5]:[5, 2] [2, 5]:[5, 3]
   [3, 1]:[1, 3] [3, 1]:[1, 4] [3, 1]:[5, 3]
   [3, 5]:[1, 3] [3, 5]:[5, 2] [3, 5]:[5, 3]
   [4, 1]:[1, 3] [4, 1]:[1, 4] [4, 1]:[2, 4]
   [4, 2]:[1, 4] [4, 2]:[2, 4] [4, 2]:[2, 5]
   [5, 2]:[2, 4] [5, 2]:[2, 5] [5, 2]:[3, 5]
   [5, 3]:[2, 5] [5, 3]:[3, 1] [5, 3]:[3, 5]

 1 列目の配置は 10 通り,それぞれに対して 2 列目は 3 通りあることがわかった。

 この手のコンピュータプログラミングにおける定石は,簡単な場合について計算し,結果に規則性があるかどうか見るということだ。

 そこで,2 × ncol 行列で条件を満たす個数を勘定するプログラムを書く。

  using Combinatorics
  
  all_perm(x, n) = Iterators.product([x for i = 1:n]...)
  
  isng(x, y) = !(2 <= abs(x - y) <= 3)
  
  function checkcol(a, ncol)
      for j = 1:ncol
          isng(a[1, j], a[2, j]) && return false
      end
      true
  end
  
  function checkrow(a, ncol)
      for j = 1:ncol-1
          (isng(a[1, j], a[1, j+1]) || isng(a[2, j], a[2, j+1])) && return false
      end
      true
  end
  
  function q7(ncol)
      count = 0
      for i in all_perm(1:5, 2ncol)
          a = reshape([j for j in i], 2, :)
          checkcol(a, ncol) && checkrow(a, ncol) && (count += 1)
      end
      count
  end
  q7 (generic function with 1 method)

実際に,i = 1〜5 列まで増やしながら解を求めてみよう。

  for i in 1:5
      println("i = $i,  q7 = $(q7(i))")
  end
  i = 1,  q7 = 10
  i = 2,  q7 = 30
  i = 3,  q7 = 90
  i = 4,  q7 = 270
  i = 5,  q7 = 810

この結果を見れば,10 * 3 ^ (i -1) であることが推理できるというものだろう。

  for i in 1:5
      println("i = $i,  q7 = $(q7(i)), estimate = $(10 * 3 ^ (i-1))")
  end
  i = 1,  q7 = 10, estimate = 10
  i = 2,  q7 = 30, estimate = 30
  i = 3,  q7 = 90, estimate = 90
  i = 4,  q7 = 270, estimate = 270
  i = 5,  q7 = 810, estimate = 810

従って,i = 1010 ならば,10 * 3 ^ 1009 通りある。

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

Julia 1.6.3/M1-chip で RCall 使用できるようになった

2021年11月08日 | ブログラミング

Julia 1.6.3
R 4.1.1
macOS Monterey 12.0.1
M1 chip Mac mini 2020

で,RCall が使えなくなっていたが,R 4.1.2 にバージョンアップしたら使えるようになった。

julia> using RCall
[ Info: Precompiling RCall [6f49c342-dc21-5d91-9882-a32aef131414]

julia> R"sqrt(8)"
RObject{RealSxp}
[1] 2.828427


julia> R"""
       x = 3
       y = 7
       print(x * y)
       """
[1] 21
RObject{RealSxp}
[1] 21

でも,Julia 1.7.0-rc2 ではまだ使えない

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

2020 年日本数学オリンピック予選 問題6

2021年11月08日 | ブログラミング

2020 年日本数学オリンピック予選 問題6
https://www.imojp.org/archive/mo2020/jmo2020/problems/jmo30yq.html

Q6. 平面上に 3 つの正方形があり,図のようにそれぞれ 4 つの頂点のうち 2 つの頂点を他の正方形と共有している。ここで,最も小さい正方形の対角線を延長した直線は最も大きい正方形の左下の頂点を通っている。最も小さい正方形と最も大きい正方形の一辺の長さがそれぞれ 1,3 であるとき,斜線部の面積を求めよ。

一辺の長さが 3 の正方形の頂点は以下の通り。

  A = (0, 0)
  B = (3, 0)
  C = (3, 3)
  D = (0, 3);

一辺が 1 の正方形 DEFG の頂点 E の座標を (x, y) とすると,F, G も決まる。

  using SymPy
  @syms x, y
  E = (x, y)
  G = (3 - y, 3 + x)
  F = (x + (3 - y), y + x);

頂点 A, E, G が一直線ということから,線分 AE と AG の傾き(tangent)が等しとする方程式を解き,x, y を求める。

  eq1 = Eq(G[2] / G[1], y / x)
  eq2 = Eq(x^2 + (3 - y)^2, 1)
  solve([eq1, eq2])
  2-element Vector{Dict{Any, Any}}:
   Dict(x => -1/6 + sqrt(17)/6, y => 17/6 - sqrt(17)/6)
   Dict(x => -sqrt(17)/6 - 1/6, y => sqrt(17)/6 + 17/6)

図から,x, y は以下のようになる。 なお,後々の数式変形のために a = sqrt(17) としておく。そうしておかないと,単純に数値解を求めてくれるので,ある意味綺麗じゃない。

  @syms a
  x = (a - 1) / 6
  y = (-a + 17) / 6;

E, G, F を再定義する。

  E = (x, y)
  G = (3 - y, 3 + x)
  F = (x + (3 - y), y + x)
  println("E:$E\nG:$G\nF:$F")
  E:(a/6 - 1/6, 17/6 - a/6)
  G:(a/6 + 1/6, a/6 + 17/6)
  F:(a/3, 8/3)

二番目に大きい正方形の対角線の長さ FB は以下のようになる。

  FB = sqrt((F[1] - 3)^2 + F[2]^2)

三角形 FHB は直角二等辺三角形なので,HB の長さは以下のようになる。

  FB² = (F[1] - 3)^2 + F[2]^2
  HB = sqrt(FB²/2)

頂点 H の座標を (u, v) とする。

  @syms u, v
  H = (u, v);

方程式を立てよう。

  eq3 = Eq((H[1]- 3)^2 + H[2]^2, HB^2)
  eq4 = Eq((F[1]-H[1])^2 + (F[2]-H[2])^2, HB^2)
  solve([eq3, eq4], [u, v])
  u, v = (-(-a^2 + 8*a + 9)/(6*(a - 9)), a/6 - 1/6)
  u(a=>sqrt(17)), v(a=>sqrt(17))
  H = (0.853850937602943, 0.520517604269610)
  H = (u, v)
  ((a^2 - 8*a - 9)/(6*a - 54), a/6 - 0.166666666666667)

三点を辺上に持つ長方形の面積は以下の通り。

  sq = expand((F[1]-E[1])*(F[2]-H[2]))
  - a^2 / 36 + 0.444444444444444 a + 0.472222222222222

右上の三角形の面積は

  tru = simplify((F[2]-E[2]) * (F[1]-E[1]) /2)
  a^2/72 - 1/72

右下の三角形の面積は

  trr = simplify((F[2]-H[2]) * (F[1]-H[1]) /2)
  - 0.0138888888888889 a^2 + 0.25 a - 0.236111111111111

左下の三角形の面積は

  trl = simplify((E[2]-H[2]) * (H[1]-E[1]) /2)
  0.5 - 0.0555555555555556 a

求める三角形の面積は,長方形の面積から 3 つの三角形の面積を除いたものである。

  S = expand(sq - tru - trr - trl)
  - 0.0277777777777778 a^2 + 0.25 a + 0.222222222222222

a = sqrt(17) なので,もう少し簡約化すれば,

  -0.0277777777777778*17+0.222222222222222 + 0.25a
  0.25 a - 0.250000000000001

0.25 * sqrt(17) - 0.25 = (sqrt(17) - 1) / 4 である

  S(a=>sqrt(17))
 0.780776406404415

とどのつまりが,

  (sqrt(17)-1)/4
  E1 = E[1](a=>sqrt(17))
  E2 = E[2](a=>sqrt(17))
  F1 = F[1](a=>sqrt(17))
  F2 = F[2](a=>sqrt(17))
  G1 = G[1](a=>sqrt(17))
  G2 = G[2](a=>sqrt(17))
  println("E:($E1, $E2)\nF:($F1, $F2)\nG:($G1, $G2)")
  using Plots
  pyplot()
  delta = 0.1
  plot([A[1], B[1], C[1], D[1], A[1]],
       [A[2], B[2], C[2], D[2], A[2]],
       seriestype=:shape, fillcolor=false, tickfontsize=12,
       linewidth=2, xlims=(-0.5, 4), aspect_ratio=1, label="")
  annotate!([A[1] - delta, B[1] + 2delta, C[1] + 2delta, D[1]- delta] .- delta,
            [A[2], B[2], C[2], D[2]],
            ["A", "B", "C", "D"])
  plot!([D[1], E1, F1, G1, D[1]],
       [D[2], E2, F2, G2, D[2]],
       seriestype=:shape, fillcolor=false, tickfontsize=12,
       linewidth=2, aspect_ratio=1, label="")
  annotate!([E1 + delta, F1 + delta, G1 + 2delta],
            [E2 - delta, F2 + delta, G2],
            ["E(x,y)", "F", "G"], :left)
  plot!([G1, A[1]], [G2, A[2]], linestyle=:dash, color=:black, label="")
  F1 = F[1](a=>sqrt(17))
  F2 = F[2](a=>sqrt(17))
  H1 = H[1](a=>sqrt(17))
  H2 = H[2](a=>sqrt(17))
  I1 = 3 + H2
  I2 = 3 - H1;
  plot!([F1, H1, B[1], I1, F1],
        [F2, H2, B[2], I2, F2],
       seriestype=:shape, fillcolor=false, tickfontsize=12,
       linewidth=2, label="")
  annotate!([H1 + 2delta, I1 + delta], [H2 + delta, I2], ["H(u,v)", "I"], :left)
  plot!([E1, H1], [E2, H2], linewidth=2, color=:black, label="")
  savefig("fig2.png")

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

M1 チップでの Julia の SymPy を使えるようにした

2021年11月07日 | ブログラミング

M1 チップ搭載の Mac mini
macOs Monterey version 12.0.1
Julia 1.6.3
で,
using SymPy しようとすると, 
/Users/foo/.julia/packages/SymPy/jTadH/src/numbers.jl
の 256 行目からの式でエラーがあるので使えないよということになった。

件の式は,

sympy_core_numbers = ((:Zero, 0),
                      (:One, 1),
                      (:NegativeOne, -1),
                      (:Half, 1//2),
                      (:NaN, NaN),
                      (:Exp1, ℯ),
                      (:ImaginaryUnit, im),
                      (:Pi, pi),
                      (:EulerGamma, Base.MathConstants.eulergamma),
                      (:Catalan, Base.MathConstants.catalan),
                      (:GoldenRation, Base.MathConstants.golden),
                      (:TribonacciConstant, big(1)/3 + (-big(3)*sqrt(big(33)) + 19)^(1//3)/3 + (3*sqrt(big(33)) + 19)^(1//3)/3))

一行ずつ潰していくと最後の行
(:TribonacciConstant, big(1)/3 + (-big(3)*sqrt(big(33)) + 19)^(1//3)/3 + (3*sqrt(big(33)) + 19)^(1//3)/3)
が原因ということがわかった。しかも,この1行を実行すると永遠に終わらない。
さらにどこが変なのか,項ごとに見ていくと
big(1) はすぐに解釈されるが,big(1)/3 ですでに無限ループ?に落ちるらしい。
なので,この行をコメントアウトして,再度 using SymPy してみると,無事に通った。
まあ,:TribonacciConstantがどこかで使われていれば問題が出るだろうが,少なくとも私は使いそうにない。
しかし,多倍長演算パッケージがちゃんと使えないとすると,ちょっと困ることもあるだろうな?

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

2020 年日本数学オリンピック予選 問題2

2021年11月07日 | ブログラミング

2020 年日本数学オリンピック予選 問題2
https://www.imojp.org/archive/mo2020/jmo2020/problems/jmo30yq.html

Q2. 一辺の長さが 1 の正六角形 ABCDEF があり,線分 AB の中点を G とする。正六角形の内部に点 H をとったところ,三角形 CGH は正三角形となった。このとき,三角形 EFH の面積を求めよ。

  using SymPy

点 A, B, C, D, E, F, G の座標を定める(C を原点(0, 0) とする)。

  A = (0, 2sind(120))        # 0, sqrt(3)
  B = (cosd(120), sind(120)) # -1/2, sqrt(3)/2
  C = (0, 0)
  D = (1, 0)
  E = (1+cosd(60), sind(60)) # 1.5, sqrt(3)/2
  F = (1, sqrt(3))           # 1, sqrt(3)
  G = 0.5 .*(A .+ B)         # -1/4, sqrt(3)*3/4
  println("A:$A\nB:$B\nC:$C\nD:$D\nE:$E\nF:$F\nG:$G")
  GC = sqrt(sum(G .^ 2))        # sqrt(7)/2
  GH = sqrt(sum((G .- H) .^ 2))
  CH = sqrt(sum(H .^ 2))
  println("GC:$GC\nGH:$GH\nCH:$CH")
  eq1 = Eq(GH, GC)
  eq2 = Eq(CH, GC)
  solve([eq1, eq2], [x, y])
  H = (1, sqrt(3)/2)
  EH = E[1]-F[1] # = 1/2
  FH = F[2]-H[2] # = sqrt(3)/2
  s = EH * FH / 2 # = sqrt(3)/8
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--043 データフレームを clipboard にコピーする

2021年11月01日 | ブログラミング

1. Julia の小ネタ--043 データフレームを clipboard にコピーする

clipboard(df) とすれば,df が clipboard にコピーされるのではあるが,期待するようなタブ区切りのデータではない。

以下のような単純なデータフレーム df を clipboard(df) してみると,

  using CSV, DataFrames
  df = DataFrame(:a => 1:5, :b => rand(5), :c => ["a", "b", "c", "d", "e"])

5 rows × 3 columns

  a b c
  Int64 Float64 String
1 1 0.358309 a
2 2 0.348789 b
3 3 0.249906 c
4 4 0.402276 d
5 5 0.947734 e
  clipboard(df)

clipboard を然るべきアプリの然るべき箇所にペースト(command + v) すると,以下のようなものがペーストされるであろう。

  
  5×3 typename(DataFrame)
  │ Row │ a     │ b        │ c      │
  │     │ Int64 │ Float64  │ String │
  ├─────┼───────┼──────────┼────────┤
  │ 1   │ 1     │ 0.865478 │ a      │
  │ 2   │ 2     │ 0.503881 │ b      │
  │ 3   │ 3     │ 0.289082 │ c      │
  │ 4   │ 4     │ 0.256818 │ d      │
  │ 5   │ 5     │ 0.849747 │ e      │

tab 区切りのデータ(tab separated values TSV)としてコピーするには,
clipboard(sprint(show, "text/tab-separated-values", df))
とする。

  clipboard(sprint(show, "text/tab-separated-values", df))

これにより,以下のような TSV データが clipboard にコピーされる。

  
  "a" "b" "c"
  1   0.8654777830565838  "a"
  2   0.5038807198792826  "b"
  3   0.28908228451250684 "c"
  4   0.2568176696256196  "d"
  5   0.8497466570672143  "e"

あとは,然るべきアプリの然るべき箇所にペースト(command + v) するだけである。

2. おまけ Matrix を TSV 形式で clipboard にコピーする

sprint の第3引数を Matrix オブジェクトにすればよいだけである。

ここでは,df を Matrix にして与えてみる。当然であるがデータフレームの列名を除いた部分だけが clipboard にコピーされる。

  clipboard(sprint(show, "text/tab-separated-values", Matrix(df)))
  
  1   0.8654777830565838  a
  2   0.5038807198792826  b
  3   0.28908228451250684 c
  4   0.2568176696256196  d
  5   0.8497466570672143  e
  
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--042 clipboard からデータフレームを読み込む

2021年11月01日 | ブログラミング

1. Julia の小ネタ--042 clipboard からデータフレームを読み込む

 「Julia の小ネタ--038 文字列からデータフレームを読み込む」に似ているが,clipboard の内容からデータフレームを作る例を挙げておく。
 IOBuffer( ) に,クリップボードから読み込んだ文字列を与えるのである。
 CSV.read( ) の第1引数は通常はファイルパスであるが,IOBuffer( ) で引数に文字列を指定することもできる。
 欄の区切り文字は delim で指定するが,例のように空白で(桁を揃えて)区切られている場合は,ignorerepeated=true を指定しなければならない。

 以下を command + c でクリップボードにコピー後,

      x1    x2    x3    x4    y1    y2    y3    y4
      10    10    10     8  8.04  9.14  7.46  6.58
       8     8     8     8  6.95  8.14  6.77  5.76
      13    13    13     8  7.58  8.74 12.7   7.71
       9     9     9     8  8.81  8.77  7.11  8.84
      11    11    11     8  8.33  9.26  7.81  8.47
      14    14    14     8  9.96  8.1   8.84  7.04
       6     6     6     8  7.24  6.13  6.08  5.25
       4     4     4    19  4.26  3.1   5.39 12.5
      12    12    12     8 10.8   9.13  8.15  5.56
       7     7     7     8  4.82  7.26  6.42  7.91
       5     5     5     8  5.68  4.74  5.73  6.89

 以下を実行する。

  using CSV, DataFrames
  anscombe = CSV.read(IOBuffer(clipboard()), DataFrame, delim=" ", ignorerepeated=true)

11 rows × 8 columns

  x1 x2 x3 x4 y1 y2 y3 y4
  Int64 Int64 Int64 Int64 Float64 Float64 Float64 Float64
1 10 10 10 8 8.04 9.14 7.46 6.58
2 8 8 8 8 6.95 8.14 6.77 5.76
3 13 13 13 8 7.58 8.74 12.7 7.71
4 9 9 9 8 8.81 8.77 7.11 8.84
5 11 11 11 8 8.33 9.26 7.81 8.47
6 14 14 14 8 9.96 8.1 8.84 7.04
7 6 6 6 8 7.24 6.13 6.08 5.25
8 4 4 4 19 4.26 3.1 5.39 12.5
9 12 12 12 8 10.8 9.13 8.15 5.56
10 7 7 7 8 4.82 7.26 6.42 7.91
11 5 5 5 8 5.68 4.74 5.73 6.89

2. おまけ clipboard から行列(Matrix)を読み込む

 データフレームは列名があり,列の型は必ずしも一定ではない。  
 データフレームに対して,行列 Matrix は列名はなく,全ての列の型は同じである。

 以下を command + c でクリップボードにコピー後,

      10    10    10     8  8.04  9.14  7.46  6.58
       8     8     8     8  6.95  8.14  6.77  5.76
      13    13    13     8  7.58  8.74 12.7   7.71
       9     9     9     8  8.81  8.77  7.11  8.84
      11    11    11     8  8.33  9.26  7.81  8.47
      14    14    14     8  9.96  8.1   8.84  7.04
       6     6     6     8  7.24  6.13  6.08  5.25
       4     4     4    19  4.26  3.1   5.39 12.5
      12    12    12     8 10.8   9.13  8.15  5.56
       7     7     7     8  4.82  7.26  6.42  7.91
       5     5     5     8  5.68  4.74  5.73  6.89

 以下を実行する。
 見た目は,最初の4列は整数型であるが,残り4列が実数型なので,実数型の Matrix として読まれる。

  using DelimitedFiles
  anscombe2 = readdlm(IOBuffer(clipboard()))
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--041 clipboard へ出力

2021年11月01日 | ブログラミング

clipboard へ出力

clipboard(str) とすると,str の内容がクリップボードにコピーされる。そのあと,クリップボードの内容をペースト(command + v) できる。

以下を実行後,

  str = "0123456789\nabcdefghij\n"
  clipboard(str)

別のアプリの入力場面で,command + v すれば

0123456789
abcdefghij

が,ペーストされるであろう。

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

Julia の小ネタ--040 クリップボード(clipboard)から入力

2021年11月01日 | ブログラミング
  s = clipboard()
  println(s)
  s
  s2 = clipboard()
  println(s2)
  s2
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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