ニートが学ぶプログラミング

ニートの日記。プログラムのことやら、くだらないこと、思ったことをまとめていきます。頑張って毎日更新するぞぉ_(:3」∠)_ 更新が連続して途切れたら察してください。

だんだんプログラミングコンテストにも慣れてきました!

こんにちは鬱太郎です。今週土曜にAtCoder Beginner Contestの大会が夜九時からあります。それに向けての練習もかねて、今日もAtCoderの過去問を解いていました。

f:id:neet-utsu-taro:20171026220152p:plain

本番想定で300点、時間を過ぎてしまいましたが自力で400点獲得しました!満点は401点です。

あと1点は難しいらしく、問題に満点を目指さずに、まず部分点を目指しましょうと書かれていました。15時くらいからずっと考えてましたが、なかなかわかりません('ω')

不完全燃焼ですが、部分点をとれたので良しとしましょう!

今日は当日中に問題が解けて満足です。だんだんコンテストのプログラミングにも慣れてきました。

終わりに

ここまで読んでくださってありがとうございます!

スターやブックマーク、読者登録ありがとうございます!励みになってます!

プログラミングに興味のない人にはほんとに申し訳ないと思っていますが、やっぱりプログラミングが好きなのでこんな感じの記事を続けていくと思います。

明日は今日解いた問題の解説を読んで復習してできれば記事にしたいと思います。

またね('ω')ノ

スターフレンドを使ってブログ巡りをしよう!

f:id:neet-utsu-taro:20171025151301p:plain

こんにちは鬱太郎です。今日はブログ巡りをする際に便利なものを見つけたので、その紹介をしたいと思います。

背景

よーし、AtCoderの問題の記事も終わった!よっしゃブログ巡りしよう!

f:id:neet-utsu-taro:20171025152653p:plain

よーし・・・ 

ん?

f:id:neet-utsu-taro:20171025152733p:plain

未読267件

あ…

これ読み切れないやつだ…( ゚Д゚)

という事で、どうにかしようと思いました。

色々悩んだ結果、スターやブクマをしてくださった読者さんを優先に見て回ろうという結論に至りました。

そこで役に立ったのははてなスターのページです。

はてなスター

はてなスターでスターフレンドを見つけよう

はてなスターのマイページにはスターフレンドというものがあります。

f:id:neet-utsu-taro:20171025153143p:plain

このスターフレンドという欄には、一か月以内にお互いの記事にスターを付けた人が表示されます。

ワタシ、アナ、タト、トモダチ、ニ、...なってた!?こんなに簡単に友達できたら引きこもりのニートになってないよ

という事で、スターやブクマを付けてくれた人と、スターフレンドの人を優先的にブログ巡回したいと思います(記事を書いた時はまだ未巡回)。

終わりに

ここまで読んでくださってありがとうございます!

スター、ブックマーク、読者登録等いつもありがとうございます!すごい励みになっています。

いつの間にか読者登録も130人越えしていて驚きました!本当にありがとうございます!少し時間がかかるかもしれませんが、新しい読者さんも読者登録していきたいと思います。

またね('ω')ノ

AtCoderの過去問に挑戦 ABC002 AtCoder Beginner Contest 002

atcoderの画像を使わせていただきました。問題があれば削除痛いします。

はじめに

私はプログラムやプログラミングコンテストに対して何ら知識はありません。私が書くコードは、性能的にも優れているものではありません。私自身が考え、学んでいく過程でできたコードです。無駄がありますが、お許しください。また、改善等の指導があればコメント欄に記入していただけると助かります。

公式URL

使用したもの等

名称 使用したもの
言語 JavaSE8
エディタ pleiades All in one var.4.7.0
プラグイン addons.mozilla.org

A - 正直者

B - 罠

問題

問題文

B問題のリジャッジ(再採点)が終了しました。21: 50
B問題のテストケースにミスがあったので、提出されたコードをリジャッジ(再採点)してます。21: 40

神の恵みで財産を築いた高橋くんですが、なんとそこには罠がありました。
神は、高橋くんの発した言葉から母音 aiueo を全て盗んでいったのです。
高橋くんが発した言葉を表す文字列 W が与えられるので、周囲の人が聞く言葉を表す文字列を出力するプログラムを書いてください。

入力

入力は以下の形式で標準入力から与えられる。
W
  1. 1 行目には、高橋くんの発した言葉を表す文字列 W が与えられる。
    • W の長さ |W|1≦|W|≦30 を満たす。
    • W は半角英小文字(a から zまで)のみで構成される。
    • W には母音以外の文字が少なくとも 1 文字含まれることが保証されている。

出力

W から母音を全て除いた文字列を 1 行で出力してください。
また、出力の末尾には改行を入れること。

入力例 1

  1. chokudai

出力例 1

  1. chkd
  • chokudai から aiueo を除くと chkd になります

入力例 2

  1. okanemochi

出力例 2

  1. knmch
  • okanemochi から aiueo を除くと knmch になります

入力例 3

  1. aoki

出力例 3

  1. k
  • aoki から aiueo を除くと k になります
  • このように、与えられる文字列 W には母音以外の文字が少なくとも 1 文字含まれます

入力例 4

  1. mazushii

出力例 4

  1. mzsh

見出しをクリックすると開きます。↓↓

回答

母音を取り除くという問題ですね。

正規表現を使って解く

正規表現を使って解くのが一番わかりやすく、かつコードもシンプルなものになると思います。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String w = br.readLine();
      System.out.println(w.replaceAll("[aiueo]", ""));
    }
  }
}

正規表現を使った置換のメソッドは多くの言語が実装しているのではないでしょうか?Javaの場合はStringクラスにreplaceAll(String regex, String replace)というメソッドがあります1。それを使い正規表現を元に空文字に置換してあげましょう。正規表現は他言語で共通している部分が多いですが、言語によっては方言のように詳しく指定できるものもあります2

問題ではa,i,u,e,oを取り除いてあげるという事ですね。

正規表現では[aiueo]と簡単に書けます。

後はその正規表現をメソッドを使い、空文字に置換しましょう。

System.out.println(w.replaceAll("[aiueo]", ""));

Streamを使って解く

Java8から追加されたStreamを使っても解くことができます。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String w = br.readLine();
      StringBuilder sb = new StringBuilder();
      w.chars()
       .filter(c -> !(c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o'))
       .forEach(c -> sb.append((char) c));
      System.out.println(sb.toString());
    }
  }
}

配列を使って解く

勿論配列を使って問題を解くこともできます。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String w = br.readLine();
      char[] ans = new char[w.length()];
      int index = 0;
      for (char c : w.toCharArray()) {
        if (!(c == 'a' || c == 'i' || c == 'u' || c == 'e' || c == 'o')) {
          ans[index++] = c;
        }
      }
      // new String(ans)だとchar=0が入り、改行文字がなくなる
      System.out.println(String.valueOf(ans, 0, index));
    }
  }
}

このときnull文字が入って、改行文字が消されないように気を付けましょう。

成績

プログラムの実行時間およびメモリ使用量をまとめました。

実行時間 メモリ使用量
79 ms 24916 KB

C - 直訴

問題

問題文

神に盗まれた母音を取り戻すため、高橋くんは神へ直訴しました。
「神様、どうかお願いです。僕の母音を返してください。」
神はこう言いました。
「そんなに母音がほしいのか。ならば私の仕事を手伝ってもらおう。」

現在、神は天界のいたるところで測量を行っており、高橋くんは神の測量を手伝わなければなりません。
今回は三角形の測量です。高橋くんには 2 次元平面上の 3 つの点 ABC が与えられます。
少しでも早く母音を取り戻すために、三角形 ABC の面積を出力するプログラムを書いてください。

入力

入力は以下の形式で標準入力から与えられる。
xa ya xb yb xc yc
  1. 1 行目には、3ABC の座標が半角空白区切りで与えられる。
    • A の座標が (xaya)、点 B の座標が (xbyb)、点 C の座標が (xcyc) であることを表す。
    • 各座標の値 xayaxbybxcyc−1,000 以上 1,000 以下の整数であることが保証されている。
    • 3ABC が同一直線上に配置されていることはない。

出力

三角形 ABC の面積を 1 行で出力してください。
また、出力の末尾には改行を入れること。
出力は絶対誤差が 10−2 以下であれば許容される。

ヒント

3(0,0), (a,b), (c,d) で構成される三角形の面積は、|adbc|2 となります。
(このヒントは、コンテスト開始 1 時間後に公開されたものです。)

入力例 1

  1. 1 0 3 0 2 5

出力例 1

  1. 5.0
    1:入力例 1 を図示したもの

入力例 2

  1. -1 -2 3 4 5 6

出力例 2

  1. 2.0

入力例 3

  1. 298 520 903 520 4 663

出力例 3

  1. 43257.5

見出しをクリックすると開きます。↓↓

回答

3点から三角形の面積を求める問題ですね。学校でやったなぁ…でももう忘れたよという私のような方も多いのでは。

ヘロンの公式で3角形の面積を求める

import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String[] array = br.readLine().split(" ");

      Point x = new Point(Integer.parseInt(array[0]), Integer.parseInt(array[1]));
      Point y = new Point(Integer.parseInt(array[2]), Integer.parseInt(array[3]));
      Point z = new Point(Integer.parseInt(array[4]), Integer.parseInt(array[5]));

      double a2 = x.distanceSq(y);
      double b2 = y.distanceSq(z);
      double c2 = z.distanceSq(x);

      double t = Math.sqrt((a2 + b2 + c2) * (a2 + b2 + c2) - 2 * (a2 * a2 + b2 * b2 + c2 * c2)) / 4.0;

      System.out.println(t);
    }
  }

}

3角形の面積を求める方法はいろいろあったのですが、学校で習った記憶がかすかにあるなと思ったこの公式で面積を求めてみましょう。

ヘロンの公式は辺a,b,cに対して

{ \huge {\displaystyle{
T = \sqrt{s(s-a)(s-b)(s-c)} \\
s = \frac{a+b+c}{2}
}}}

これで求めることができます。懐かしい!その公式のままプログラムを書いてもいいですが、辺abcを求めるときに平方根を取ります。平方根はできるだけ最後にした方が、計算の誤差が少なくなるため変形した公式を使いましょう。

{ \huge {\displaystyle
T = \frac{\sqrt{(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)}}{4}
}}

この公式ですと、abcがそれぞれ2乗4乗されてますね。距離を求めるときに平方根を取らないでよいという事ですね。

JavaにはPoint2D::distanceSq(Point2D)というメソッドがあります3。距離を求める計算の途中で平方根を取らない値を返してくれます。

これを使うことで、計算の最後のみに平方根をとるようにできます。

1点を原点にずらす

問題のヒントにもあるように、原点、他2点から作られる三角形の面積は

{ \huge {\displaystyle
T = \frac{1}{2}|ad-bc|
}}

で求まるようです。そんな便利なのがあるんですね!なんだか行列の計算を思い出します。

という事で、与えられた3点のうちの最初の点を原点とみなすようにしてあげましょう。

package abc002.c;

import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

  public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String[] array = br.readLine().split(" ");

      Point a = new Point(Integer.parseInt(array[0]), Integer.parseInt(array[1]));
      Point b = new Point(Integer.parseInt(array[2]), Integer.parseInt(array[3]));
      Point c = new Point(Integer.parseInt(array[4]), Integer.parseInt(array[5]));

      // aを原点にするように全体をずらす

      Point b2 = new Point(b.x - a.x, b.y - a.y);
      Point c2 = new Point(c.x - a.x, c.y - a.y);

      double s = Math.abs(b2.getX() * c2.getY() - b2.getY() * c2.getX()) / 2.0;

      System.out.println(s);
    }
  }

}

成績

プログラムの実行時間およびメモリ使用量をまとめました。

実行時間 メモリ使用量
85 ms 23252 KB

D - 派閥

問題

問題文

神からの財産と、母音を取り戻した高橋くんは、AtCoder国の腐敗した政治を正すため、国会議員となろうと決めました。
もともと人心掌握術とスピーチに定評があった高橋くんは、何の苦労をすることもなく当選しました。
しかし、議員になってからが本番です。国を正すためには、首相に任命される必要があります。

AtCoder国には高橋くんを除いて N 人の国会議員と、M 個の人間関係 (xy) が存在します。
人間関係 (xy) とは、議員 x と議員 y が知り合いであることを意味します。
高橋くんは N 人の議員から何人かを選んで派閥を作ろうと企んでいます。
派閥に含まれるすべての議員は互いに知り合いでなければなりません。
高橋くんが作成することができる最大の派閥に属する議員数を求めるプログラムを書いてください。

入力

入力は以下の形式で標準入力から与えられる。
N M
x1 y1
x2 y2
:
xM yM
  1. 1 行目には、高橋くん以外の国会議員の数 N (1≦N≦12) と、人間関係の数 M (0≦MN(N1)2) が半角空白区切りで与えられる。
  2. 2 行目から M+1 行目までの M 行で、人間関係が与えられる。
    • 各議員は 1 から N までの整数で番号がつけられている。
    • 2 行目を基準とした第 i (1≦iM) 行において、議員 xi と議員 yi は知り合いであることを意味する。
    • xiyi はともに整数で、 1≦xi<yiN を満たす。
    • ij のとき、(xiyi)(xjyj) であることが保証されている。

出力

高橋くんが作成することができる最大の派閥に属する議員数を 1 行で出力してください。
また、出力の末尾には改行を入れること。

入力例 1

  1. 5 3
  2. 1 2
  3. 2 3
  4. 1 3
  • 1 行目:5 人の議員と 3 つの人間関係が存在する。
  • 2 行目:議員 1 と議員 2 は知り合いである。
  • 3 行目:議員 2 と議員 3 は知り合いである。
  • 4 行目:議員 1 と議員 3 は知り合いである。

出力例 1

  1. 3
  • 議員 1、議員 2、議員 3 は互いに知り合いなので、この 3 人は派閥を構成することができる。

入力例 2

  1. 5 3
  2. 1 2
  3. 2 3
  4. 3 4

出力例 2

  1. 2
  • 議員数 2 の派閥として
    1. 議員 1 と議員 2 の派閥
    2. 議員 2 と議員 3 の派閥
    3. 議員 3 と議員 4 の派閥
    3 通りが考えられます。

入力例 3

  1. 7 9
  2. 1 2
  3. 1 3
  4. 2 3
  5. 4 5
  6. 4 6
  7. 4 7
  8. 5 6
  9. 5 7
  10. 6 7

出力例 3

  1. 4

入力例 4

  1. 12 0

出力例 4

  1. 1
  • たとえ 12人の議員がいても、誰も知りあいでなければ 1 人からなる派閥しか作成することはできません。

見出しをクリックすると開きます。↓↓

回答

難問でした…この問題では組み合わせを考慮する必要があります(たぶん)。 bit演算を使うなんて変態のすることだ!なんて思ってましたが、どうやら私は変態になったようです(´;ω;`)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String[] array = br.readLine().split(" ");

      int n = Integer.parseInt(array[0]);

      HumanMap map = new HumanMap(n);

      String str = null;
      while ((str = br.readLine()) != null) {
        map.put(str);
      }
      System.out.println(map.max());
    }
  }

  private static class HumanMap {
    private final int[] map;
    private final int size;
    private final int[] key;

    public HumanMap(int n) {
      map = new int[n];
      key = new int[n];
      for (int i = 0; i < n; i++) {
        map[i] = 1 << i;
      }

      size = n;

    }

    public void put(String str) {
      String[] array = str.split(" ");
      this.put(Integer.parseInt(array[0]), Integer.parseInt(array[1]));
    }

    public void put(int a, int b) {
      map[a - 1] |= (1 << (b - 1));
      map[b - 1] |= (1 << (a - 1));
    }

    public int max() {
      int max = 1;

      for (int line : map) {
        if (Integer.bitCount(line) > max) {
          for (int filter = Integer.lowestOneBit(line); filter <= line; filter++) {
            int combination = filter & line;
            if (combination > 0 && Integer.bitCount(combination) > max) {
              int keySize = setKey(combination);
              int value = combination;
              for (int k = 0; k < keySize; k++) {
                value &= map[key[k]];
              }
              max = Math.max(Integer.bitCount(value), max);
            }
          }
        }
      }
      return max;
    }

    private int setKey(int line) {
      int index = 0;
      for (int i = 0; i < size; i++) {
        if ((line & (1 << i)) > 0) {
          key[index++] = i;
        }
      }
      return index;
    }
  }
}

ポイント1 人間関係を対戦表に入れる

問題では、人間関係(x,y)が入力されます。人間関係をPointクラスのように新しく作ってもいいのですが、クラス作成時やリスト追加などの処理でメモリ・時間のリソースを奪ってしまいます。

ABC001-Dから学んだように人間関係を入れて置ける配列を用意しましょう。具体的には総当たりの対戦表のようなものをイメージします。下の例は入力例1の場合です。

f:id:neet-utsu-taro:20171024212513p:plain

こんな風に配列を用意しておけば、どんなに人間関係が増えても配列の大きさに影響はありません。

人間関係(x,y)が与えられた場合、この配列の[x-1][y-1][y-1][x-1]に○(true)を入れてあげるだけです。

人間関係の配列を作る場合、2次元配列はできるだけやめましょう。私の経験不足なだけかもしれませんが、2次元配列でいろいろと処理をしようとすると、頭の中が混乱してしまいます。下のように配列の行をビットとして考え、intの数値配列として保存するのがいいと思います。

f:id:neet-utsu-taro:20171024213808p:plain

  • 対戦表の行を検索する場合はint[i]などのアクセス
  • 対戦表の列を検索する場合はビット演算によるアクセス

という風に分けることで混乱を最小限に抑えました。

またビット演算&を使うことで、人間関係で共通の部分を簡単に求めることができます。

例えば、人間関係1,2,3の共通の関係を求める場合は

7(111) & int[0] & int[1] & int[2] = 7(111)

と求めることができます。

ポイント2. 組み合わせをビット演算で表現する

問題の後半高橋くんが作成することができる最大の派閥に属する議員数を求めるプログラムを書いてください。の部分を求める際に、組み合わせを考えなくてはいけません。

{ \huge {\displaystyle{
\sum_{r=1}^{n}{}_n C _r
}}}

この数だけ、可能性を考慮する必要があります。私にはよくわからなかったので、ビット演算を使って組み合わせを表現しました。

先ほどの例があるとします。

f:id:neet-utsu-taro:20171024213808p:plain

人間1の人間関係で共通している人数を求めるとします。

  1. 人間1の人間関係を調べる。
    人間1の人間関係は7(111)です。

  2. 1から7までの数値と&演算して組み合わせを求める。
    人間関係7の最小ビットの数値1からその値7(111)までの値を使って組み合わせを求めます。
    7 & 1 = 1, 7(111) & 2(010) = 2(010), 7(111) & 3(011) = 3(011)のようにします。すると、1,2,4, 3,5,6, 7という7通りの関係を取得できます。これは

3C1 + 3C2 + 3C3 = 3 + 3 + 1 = 7

という考え方と同じですね。

人間3の人間関係の場合も同様に

最小のビット1からその値23(10111)までの値で&演算します。すると、
1,2,4,16, 3,5,17,6,18,20, 7,19,22,21, 23の15通りの関係を取得できます。

4C1 + 4C2 + 4C3 + 4C4 = 4 + 6 + 4 + 1 = 15

と同じです。

成績

プログラムの実行時間およびメモリ使用量をまとめました。

実行時間 メモリ使用量
86 ms 23252 KB

まとめ

問題Dは最大クリーク問題と呼ばれるものの小さいものらしいですね!問題の正答に1日以上かかったわけですが、解説を見ると改善するところはあまりなかったのが嬉しかったです

終わりに

ここまで読んでくださってありがとうございます!

長かったですが、ようやくABC002クリアできました! 今週末にABCのコンテストがあるらしいので、参加したいと思います。(前回あったの知らなかった(´;ω;`))

スター、ブックマーク、読者登録等ありがとうございます!いつも励みになってます!

ブログ巡りもまだなので明日したいと思います。

またね('ω')ノ

一夜明けてAtCoderの過去問を解いたよ!

こんにちは鬱太郎です。日本中では片や選挙、片や台風。そんな中、私はAtCoderの過去問 AtCoder Beginer Contest 002と格闘していました。

そして...

f:id:neet-utsu-taro:20171022213546p:plain

解けたぞぉ!

天の声「13時から始めて、13時半ですべての問題を解いたんだね?30分で解くなんてやるじゃん!

違うよ...よく見てごらん

天の声「ん?」

f:id:neet-utsu-taro:20171022214930p:plain

天の声「あっ…

問題を解くのに1日と30分かかりました…

でも回答を見ずに正答できて大満足です(*'ω'*)

まさか、これを使うことになるとは...

{ \huge { \displaystyle
  _{n}C_{r}
}}

しかも値を求めるのではなく、可能性をすべて計算しなくちゃいけない問題でした(まだ正式な回答を見ていないので、間違いかも)

{ \displaystyle
  _{5}C_{2}
}

の場合は、10通りですが、10通り分の可能性{0,1},{1,2},{2,3},{3,4},{4,0},{0,2},...を使い、その条件でいろいろと処理する必要がありました。もしかしたら、そんな必要なかったのかも…

そんなの分かるか!メモリ制限もあるし、時間制限もあるんだぞ!ってことでいろいろと悩んでいたのですが、1日経って解けてうれしいです。そんなこんなでもう遅いので、今日はもう寝ようと思います。

スター、ブックマーク、読者登録ありがとうございます!励みになってます!(豊田議員落ちたみたいですね…)

あした、まだ見てない皆さんのブログを見て回ろうと思います。

またね('ω')ノ

AtCoderの過去問に苦戦中

f:id:neet-utsu-taro:20171021223112p:plain

( ゚Д゚)

_(:3」∠)_

( ;∀;)

3問目まで順調に行ったんだ...

本番と仮定すると、残り時間が105分もあったんだ。でも-440分経った現在も苦戦中…

うぎゃぁ…

お休みなさい

またね('ω')ノ

次のタグをアニメーションで表示非表示にできるようにしました

こんにちは鬱太郎です。先日作ったnext-hiddenを改良しました。良ければ見て言って下さい!

ここをクリックしてください

f:id:neet-utsu-taro:20170907193330j:plain

そう!アニメーションで動作をできるようにしました。

前の記事

www.neetaro.com

改善のコメントありがとうございます。

f:id:neet-utsu-taro:20171020193643p:plain

要件見た感じもっとコンパクトにできそうな気がするけど気のせいかも

ghostbassさん

コメントありがとうございます!確かにそうですね!つぎのkathewさんのコメントを元にコードを改良したら確かにコンパクトになりました。でも要件追加して、コードが伸びましたww

eachで回さなくて大丈夫だよ。jQueryでイベントを仕込んだらセレクタにヒットする全ての要素にイベントが適用されるよ/初期状態で非表示化するのは$(セレクタ).next().hide() おすすめ

kathewさん

コメントありがとうございます!そうなんですね!教えていただいてありがとうございます!私はjQueryについて詳しくなくて、逆引きで調べて作って動けばOKみたいな感じでしたので本当に助かりました。

コメントから学んだことを書いていきますね。ありがとうございます。

end()を使ってメソッドチェーンが書ける

end()はjQueryのメソッドの一つです。一つ前の選択状態に戻すという効果があります。

$(".next-hidden").next().hide();

は、hide()のところでは$(".next-hidden).next()を選択しています。end()を付けることで、一つ前の$(".next-hidden")の選択状態に戻すことができます。

$(".next-hidden").next().hide().end().click(function(){
  $(this).next().toggle();
});

こんな感じにつなげて記述することができます。

これをメソッドチェーンと言うらしいです。

セレクタ.eachは必須じゃない

私が逆引きでいろいろとjQueryについて調べていた時に、セレクタ.eachで処理しているコード例が多かったので初めて知りました。nullの場合とかはエラーを吐かないんですね。

今回のコードのように中にif文とか書いてる場合はさすがにeachでいいのかな?

今回の改善の流れ

コメントで指摘を受けて、いろいろとjQueryについて調べているときに、

ん・・?

f:id:neet-utsu-taro:20171020200751p:plain

.toggle() 表示、非表示を切り替える。

デデーン!

そんな便利なものあったのか!

if($(this).next().is(":visible")){
  $(this).next().hide();
}else{
  $(this).next().show();
}

これが

$(this).next().toggle();

一行に!

そして、ふと上を見ると?

f:id:neet-utsu-taro:20171020201220p:plain

アニメーション…だと…?

という事で、next-hiddenはコードがシンプルになった途端にアニメーションも追加できる要件が追加されましたw

参考サイト

f:id:neet-utsu-taro:20171020201458p:plain www.kantenna.com

動作デモ

前回の動作

www.neetaro.com

クリック(タップ)すると次のタグが表示非表示します

f:id:neet-utsu-taro:20170907193330j:plain:h100

前回の動作に加え、新たに二つの動作が追加されました。

スライド表示非表示

jQueryのslideToggle()を使った動作を追加しました。

クリック(タップ)すると次のタグが表示非表示します

f:id:neet-utsu-taro:20170907193330j:plain:h100

フェードイン・アウト表示非表示

jQueryのfadeToggle()を使った動作を追加しました。

クリック(タップ)すると次のタグが表示非表示します

f:id:neet-utsu-taro:20170907193330j:plain:h100

ソースコードと使用例

実際の使い方を説明していきます。

1.スクリプトコードを記事に張りつける

下記コードを使用する記事の中に記述してください。そのまま記法の方はHTML編集タグから追加できます。先頭の1行はjQueryの読み込みコードなので、既にヘッダー等に同様の記述がある場合は不要です。

<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
$(function(){
    var classSelector = ".next-hidden";
    var attrForNext = "data-display";
    var attrNextClass = "data-next-class";
    var attrType = "data-type";
    var attrTime = "data-time";
    
    $(classSelector).next().hide().end().each(function(){
        if($(this).next().length){
            var time = $(this).attr(attrTime);
            var toggleArgument = (isNaN(time))?time:Number(time);
            switch($(this).attr(attrType)){
                case "slide":
                $(this).click(function(){
                    $(this).next().slideToggle(toggleArgument);
                });
                break;
                case "fade":
                $(this).click(function(){
                    $(this).next().fadeToggle(toggleArgument);
                });
                break;
                default:
                $(this).click(function(){
                    $(this).next().toggle(toggleArgument);
                });
                break;
            }
            $(this).next().css("display",$(this).attr(attrForNext)).addClass($(this).attr(attrNextClass));          
        }
    });
})
</script>

2.イベントを登録したいタグにクラス名や属性を追加する

ソースコードをコピペした後はタグにクラス名を付けるだけで機能します。

そのまま記法の方は、HTML編集ページから、Markdown記法の方は直接記述できます。

通常の動作

class="next-hidden"を記述することで、そのタグに次のタグを表示非表示にさせるイベントを追加します。このとき、デフォルトで次のタグの要素を非表示にします。

<p class="next-hidden"><a>ここをクリック</a></p>
<p>タグに<code>class="next-hidden"</code>を追加することで、クリックすると次のタグを表示非表示させるイベントを追加できます。</p>

ここをクリック

タグにclass="next-hidden"を追加することで、クリックすると次のタグを表示非表示させるイベントを追加できます。

スライドしつつ表示非表示にさせる

class="next-hidden"を記述し、属性data-type="slide"を追記することで、スライド動作を有効にします。

<p class="next-hidden" data-type="slide"><a>ここをクリック</a></p>
<p>タグに<code>class="next-hidden" data-type="slide"</code>を追加することで、クリックすると次のタグをスライド動作で表示非表示させるイベントを追加できます。</p>

ここをクリック

タグにclass="next-hidden" data-type="slide"を追加することで、クリックすると次のタグをスライド動作で表示非表示させるイベントを追加できます。

フェードしつつ表示非表示にさせる

class="next-hidden"を記述し、属性data-type="fade"を追記することで、フェード動作を有効にします。

<p class="next-hidden" data-type="fade"><a>ここをクリック</a></p>
<p>タグに<code>class="next-hidden" data-type="fade"</code>を追加することで、クリックすると次のタグをフェード動作で表示非表示させるイベントを追加できます。</p>

ここをクリック

タグにclass="next-hidden" data-type="fade"を追加することで、クリックすると次のタグをフェード動作で表示非表示させるイベントを追加できます。

オプション

最初に次のタグを表示しておきたい場合

さらにdata-display="block"という属性を追記することで、初期状態を表示状態にすることができます。通常の動作、スライド動作、フェード動作のすべてに追記することができます。次の例はフェード動作に初期状態を表示させる属性を追加します。

<p class="next-hidden" data-type="fade" data-display="block"><a>ここをクリック</a></p>
<p>タグに<code>data-display="block"</code>を追記することで、クリックすると次のタグを表示非表示させるイベントを追加できます。また、次のタグは最初から表示されます。</p>

ここをクリック

タグにdata-display="block"を追記することで、クリックすると次のタグを表示非表示させるイベントを追加できます。また、次のタグは最初から表示されます。

次のタグにクラスを追加したい場合

さらにdata-next-class="hogehoge"という属性を追記することで、次のタグにclass="hogehoge"を追加します。もちろんhogehogeの部分には好きなクラス名を記述できます。

これも動作に関わらず追記することができます。次の例はスライド動作にクラス名を追加します。

<style>.hogehoge{background-color: gray;}</style>
<p class="next-hidden" data-type="slide" data-next-class="hogehoge"><a>ここをクリック</a></p>
<p>タグに<code>data-next-class="hogehoge"</code>を追加することで、次のタグにクラス名<code>hogehoge</code>を追加できます。この例ではCSSで背景を変更しています。</p>

ここをクリック

タグにdata-next-class="hogehoge"を追加することで、次のタグにクラス名hogehogeを追加できます。この例ではCSSで背景を変更しています。

アニメーション動作にかかる秒数を指定したい場合

全ての動作にかかる時間をミリ秒単位で指定できます。例えば、data-time="3000"を追記することで、表示非表示に掛かる動作を3秒に指定できます。

通常の動作で3秒
<p class="next-hidden" data-time="3000"><a>ここをクリック</a></p>
<p>タグに<code>data-time="3000"</code>を追記することで、クリックすると3秒かけて次のタグを表示非表示させるイベントを追加できます。</p>

ここをクリック

タグにdata-time="3000"を追記することで、クリックすると3秒かけて次のタグを表示非表示させるイベントを追加できます。

スライド動作で3秒
<p class="next-hidden" data-type="slide" data-time="3000"><a>ここをクリック</a></p>
<p>タグに<code>data-time="3000"</code>を追記することで、クリックすると次のタグをスライド動作で3秒かけて表示非表示させるイベントを追加できます。</p>

ここをクリック

タグにdata-time="3000"を追記することで、クリックすると次のタグをスライド動作で3秒かけて表示非表示させるイベントを追加できます。

フェード動作で3秒
<p class="next-hidden" data-type="fade" data-time="3000"><a>ここをクリック</a></p>
<p>タグに<code>data-time="3000"</code>を追記することで、クリックすると次のタグをフェード動作で3秒かけて表示非表示させるイベントを追加できます。</p>

ここをクリック

タグにdata-time="3000"を追記することで、クリックすると次のタグをフェード動作で3秒かけて表示非表示させるイベントを追加できます。

動作のまとめ

  • class="next-hidden"で機能を追加
  • data-type="slide"でスライド動作
  • data-type="fade"でフェード動作
  • data-typeを記述しない、もしくは上記2つ以外の値の場合は通常の動作
  • 読み込み時はデフォルトで次のタグを非表示にします。data-display="block"で読み込み時に表示
  • data-next-class="..."で次のタグにクラス名を指定
  • data-time=...で表示非表示にそれぞれかかる秒数を指定できる。1秒の場合はdata-time="1000"

過去の記事も参考に

www.neetaro.com

過去の記事で書いてあることはこの改良型でも動作します。

終わりに

次のタグをアニメーションで表示非表示にできるようにしました!

アニメーションの選択肢が3倍に増えたので3倍遊べますよ!ふふふ(*'ω'*)

スターやブクマ、コメント、読者登録ありがとうございます!すごい励みになってます。

またね('ω')ノ

祝!読者登録100人突破

こんにちは鬱太郎です。先日読者登録が100人を突破しました!

ありがとうございます!

正直プログラムのことをただべちゃくちゃしゃべっているだけなので、普通のブログが好みの方々には申し訳ないと思っています。

こんな私のブログをたまにちょっと見て「ふーん」と思っていただければ嬉しいです!

本当にありがとうございます。

嬉しさのあまりプログラムを作りました(3秒ごとに名前が変わります!)↓↓

さん 本当にありがとうございます!

これからもよろしくお願いします!

またね('ω')ノ

立憲民主党のフォロワーは英数字のみの名前率が高い! 各政党のフォロワー情報を比較してみた

こんにちは鬱太郎です。今日もまだ比較中なので、そのデータを貼り付けます。

終わらない(´;ω;`)

ソースコード

クリックしてソースコードを見る

nameプロパティを調べる

nameプロパティはTwitterの名前を意味します。よく変えたりする方も多いのではないでしょうか?

名前の文字列のサイズで比較してみる

名前のサイズで比較してみます。lengthでグループ分けですね!

f:id:neet-utsu-taro:20171018200659p:plain

うわ・・・線が多すぎてどれがどれだかわかりませんね(´;ω;`)

でも4文字の名前の人が1番多いというのが分かりますね!これは日本語の名前が4文字が多いからでしょうか?こういったデータを見ると和みますね!(私だけかな?)

しいて言えば20文字で急にぴょんとデータが跳ねているのが気になるところです。

そのままでは見にくいので、平均からの差のグラフを作りました。

f:id:neet-utsu-taro:20171018201003p:plain

ますますわからん・・・w( ;∀;)

政党名 最大 最小 合計 平均 中央値 標準偏差
公明 24 0 488076 6.62 5 4.28
自民 23 0 839717 6.75 5 4.30
立民 29 0 1215297 6.95 5 4.34
日本 22 0 258753 6.83 5 4.37
維新 22 1 93210 6.80 5 4.37
希望 20 1 73912 6.97 5 4.45
幸実 23 0 47743 7.07 5 4.52
共産 26 1 264532 7.20 6 4.54
民進 28 1 182694 7.21 6 4.61
自由 24 0 214001 7.58 6 4.75
社民 28 1 164356 7.59 6 4.78

各政党別の文字列の長さの詳細です。データを出してみたものの…わからん!(*'ω'*)

クリックして表1を見る

文字列の長さ 立民 民進 社民 幸実 共産
0 0.00% 0.00% 0.00% 0.01% 0.00%
1 1.38% 1.77% 1.44% 1.66% 1.39%
2 7.04% 6.70% 5.95% 6.83% 6.23%
3 11.14% 10.32% 9.34% 10.22% 9.88%
4 18.79% 17.92% 17.27% 18.82% 18.63%
5 11.96% 12.46% 11.99% 12.79% 13.19%
6 8.58% 8.33% 8.36% 8.80% 8.58%
7 6.63% 6.36% 6.47% 6.50% 6.27%
8 6.13% 5.70% 5.84% 5.27% 5.84%
9 4.46% 4.61% 4.45% 4.25% 4.46%
10 3.81% 3.80% 4.18% 4.01% 3.82%
11 3.33% 3.46% 3.50% 3.57% 3.54%
12 3.22% 3.16% 3.55% 3.08% 3.20%
13 2.94% 3.09% 3.26% 2.64% 2.81%
14 2.63% 2.43% 2.65% 2.19% 2.42%
15 2.11% 2.16% 2.53% 2.13% 2.31%
16 1.60% 1.75% 1.98% 1.66% 1.71%
17 1.24% 1.50% 1.78% 1.42% 1.51%
18 1.00% 1.43% 1.59% 1.38% 1.24%
19 0.88% 1.22% 1.59% 1.14% 1.23%
20 1.12% 1.81% 2.27% 1.61% 1.74%
21 0.00% 0.00% 0.00% 0.00% 0.00%
22 0.00% 0.00% 0.00% 0.00% 0.00%
23 0.00% 0.00% 0.00% 0.01% 0.00%
24 0.00% 0.00% 0.00% 0.00% 0.00%
25 0.00% 0.00% 0.00% 0.00% 0.00%
26 0.00% 0.00% 0.00% 0.00% 0.00%
27 0.00% 0.00% 0.00% 0.00% 0.00%
28 0.00% 0.00% 0.00% 0.00% 0.00%
29 0.00% 0.00% 0.00% 0.00% 0.00%

クリックして表2を見る

文字列の長さ 自民 希望 公明 日本 維新 自由
0 0.00% 0.00% 0.00% 0.02% 0.00% 0.01%
1 1.59% 1.59% 1.60% 1.58% 1.49% 1.37%
2 7.71% 7.18% 8.29% 8.02% 7.62% 5.74%
3 11.18% 11.15% 12.03% 11.43% 11.41% 9.59%
4 19.34% 19.17% 19.23% 18.16% 19.46% 17.44%
5 12.86% 11.27% 13.75% 12.46% 12.44% 11.87%
6 8.55% 8.62% 8.53% 8.69% 8.73% 8.53%
7 6.61% 6.86% 5.94% 6.60% 6.76% 6.32%
8 5.74% 6.10% 5.24% 5.82% 5.57% 5.84%
9 4.29% 4.32% 3.95% 4.63% 4.18% 4.44%
10 3.66% 3.92% 3.46% 3.97% 3.80% 4.07%
11 3.23% 3.07% 3.02% 3.19% 2.98% 3.65%
12 2.85% 2.85% 2.77% 2.77% 2.77% 3.57%
13 2.49% 2.90% 2.55% 2.47% 2.57% 3.13%
14 2.21% 2.40% 2.20% 2.08% 2.13% 2.88%
15 1.91% 1.86% 1.85% 1.88% 1.88% 2.52%
16 1.46% 1.58% 1.47% 1.48% 1.34% 2.08%
17 1.23% 1.46% 1.15% 1.29% 1.32% 1.78%
18 1.00% 1.04% 0.96% 1.10% 1.08% 1.59%
19 0.87% 1.10% 0.87% 1.02% 0.99% 1.46%
20 1.19% 1.54% 1.11% 1.35% 1.48% 2.11%
21 0.00% 0.00% 0.00% 0.00% 0.00% 0.01%
22 0.00% 0.00% 0.00% 0.00% 0.01% 0.00%
23 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%
24 0.00% 0.00% 0.00% 0.00% 0.00% 0.01%
25 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%
26 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%
27 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%
28 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%
29 0.00% 0.00% 0.00% 0.00% 0.00% 0.00%

名前が英数字のみのフォロワー

Twitterの名前が英数字のみ(-_も含む)の人を検索します。

正規表現で

^[a-zA-Z0-9_\-]+$

と書けますね。

f:id:neet-utsu-taro:20171018202019p:plain

党名 スクリーン名 英数字のフォロワー フォロワー数 英数字率 偏差値
立民 CDP2017 47562 174880 0.272 71.79
希望 kibounotou 2677 10606 0.2524 62.74
自民 jimin_koho 29791 124317 0.2396 56.83
自由 seikatsu1pr 6508 28240 0.2305 52.58
維新 osaka_ishin 3043 13705 0.222 48.69
民進 MinshintoNews 5500 25333 0.2171 46.41
共産 jcp_cc 7892 36727 0.2149 45.38
日本 nipponkokoro 8121 37905 0.2142 45.08
公明 komei_koho 15603 73702 0.2117 43.91
社民 SDPJapan 4524 21644 0.209 42.66
幸実 hr_party_TW 1284 6753 0.1901 33.93
名称
平均 0.224872486895227
標準偏差 0.0216113775137216

立憲民主党が英数字の名前を付けているフォロワーが多いという結果になりました。これが、件の疑惑の元といえるんじゃないですかね。英数字のアカウントが多いという噂は聞いていましたが、本当に他党に比べて多いことが分かりました。

逆に幸福実現党は英数字の名前のフォロワーが少ないという結果が出ました。

クリックしてーターミナルの結果を見る

f:id:neet-utsu-taro:20171018200344p:plain

名前に@を付けてるフォロワー

Twitterの名前を名前@状況などのように使っている方をよく見かけますね。そんな人を検索します。

正規表現で

^[^@]+@[^@]+$

と書けますね。

f:id:neet-utsu-taro:20171018202826p:plain

党名 スクリーン名 名前に@を使用 フォロワー数 名前に@使用率 偏差値
幸実 hr_party_TW 245 6753 0.0363 66.86
日本 nipponkokoro 1322 37905 0.0349 64.08
維新 osaka_ishin 445 13705 0.0325 59.3
民進 MinshintoNews 781 25333 0.0308 56.05
社民 SDPJapan 605 21644 0.028 50.34
希望 kibounotou 285 10606 0.0269 48.19
共産 jcp_cc 954 36727 0.026 46.42
自民 jimin_koho 3131 124317 0.0252 44.85
自由 seikatsu1pr 639 28240 0.0226 39.77
公明 komei_koho 1661 73702 0.0225 39.59
立民 CDP2017 3496 174880 0.02 34.54
名称
平均 0.0277814617448422
標準偏差 0.00504040916871676

全体の約2.7%の方が名前に@を使っているようですね。名前に@を使っているからアクティブとかそんなわけではないと思いますが、こういったデータでも政党別に違いがあるんだなと思いました。

幸福実現党はフォロワー数が7000と少ないものの、先ほどの英数字の使用率が低いことも合わせると、フォロワーの(生身の人間としての)質が高いという推測ができますね。

逆にフォロワー数が多い政党ほど、質が低いという事がいえるのかも…(不安げ)

まあ、名前からすべてわかるわけないですけどね!

クリックしてーターミナルの結果を見る

f:id:neet-utsu-taro:20171018200016p:plain

終わりに

ここまで読んでくださってありがとうございます!

なんかもう…疲れた…

読者さんのブログを見るのもをくれてしまって申し訳ないです。でもfeedlyにたまっているので、ひと段落したら見て回りたいと思います。

読者登録が100人を越えました!ありがとうございます!

またね('ω')ノ

公明党のフォロワーは卵アイコン率が高い! 各政党のフォロワー情報を比較してみた

こんにちは鬱太郎です。まだ、フォロワーの分析が終わっていないので、今日は途中の情報をペタペタと張り付けていきます。

bool値の政党別比較

protected

f:id:neet-utsu-taro:20171017142539p:plain

protectedはtrueだと鍵垢であるという事を表します。今回はtrueの数を収集し、各政党別に比較してみました。

党名 スクリーン名 鍵垢数 フォロワー数 鍵垢率 偏差値
希望 kibounotou 1795 10606 0.1692 71.99
立民 CDP2017 25722 174880 0.1471 60.69
維新 osaka_ishin 1807 13705 0.1318 52.92
自民 jimin_koho 16327 124317 0.1313 52.66
幸実 hr_party_TW 874 6753 0.1294 51.68
公明 komei_koho 9510 73702 0.129 51.48
民進 MinshintoNews 3257 25333 0.1286 51.25
共産 jcp_cc 4076 36727 0.111 42.28
日本 nipponkokoro 4047 37905 0.1068 40.13
社民 SDPJapan 2288 21644 0.1057 39.59
自由 seikatsu1pr 2750 28240 0.0974 35.34

鍵垢率は希望の党と立憲民主党が飛びぬけて高いことが、偏差値からも分かると思います。

クリックしてターミナルの結果を見る

f:id:neet-utsu-taro:20171017184053p:plain

default_profile

f:id:neet-utsu-taro:20171017153422p:plain

default_profileはtrueだとまだプロフィールを編集していないことを示します。今回はtrueの数を収集し、政党別に比較してみました。

党名 スクリーン名 プロフィール未設定 フォロワー数 プロフィール未設定率 偏差値
公明 komei_koho 59121 73702 0.8022 73.31
維新 osaka_ishin 10093 13705 0.7364 58.93
幸実 hr_party_TW 4886 6753 0.7235 56.1
自民 jimin_koho 87787 124317 0.7062 52.3
共産 jcp_cc 25704 36727 0.6999 50.92
民進 MinshintoNews 17540 25333 0.6924 49.28
日本 nipponkokoro 25954 37905 0.6847 47.6
希望 kibounotou 7185 10606 0.6774 46.01
社民 SDPJapan 14235 21644 0.6577 41.69
立民 CDP2017 111696 174880 0.6387 37.53
自由 seikatsu1pr 17881 28240 0.6332 36.33
名称
平均 0.695660491063167
標準偏差 0.0456899688652164

公明党が明らかに高い数値を出していることが分かると思います。順に維新の会・幸福実現党・自民党と続きます。

クリックしてターミナルの結果を見る

f:id:neet-utsu-taro:20171017183758p:plain

default_profile_image

f:id:neet-utsu-taro:20171017154217p:plain

default_proflie_imageはいわゆる卵アイコンであるかどうかを示します。今回は卵アイコンのユーザーを収集し、政党別に比較してみました。

党名 スクリーン名 卵アイコン数 フォロワー数 卵率 偏差値
公明 komei_koho 21362 73702 0.2898 75.61
自民 jimin_koho 28509 124317 0.2293 59.26
立民 CDP2017 37371 174880 0.2137 55.03
共産 jcp_cc 7569 36727 0.2061 52.98
維新 osaka_ishin 2627 13705 0.1917 49.09
幸実 hr_party_TW 1233 6753 0.1826 46.63
民進 MinshintoNews 4368 25333 0.1724 43.88
社民 SDPJapan 3721 21644 0.1719 43.75
自由 seikatsu1pr 4794 28240 0.1698 43.16
希望 kibounotou 1713 10606 0.1615 40.94
日本 nipponkokoro 5945 37905 0.1568 39.67
名称
平均 0.195061020797349
標準偏差 0.0370112264916619

先ほどのdefault_profileの結果から予想できるように公明党が群を抜いて卵アイコン率が高いことが分かります。自民共産維新等も前回偏差値50以上の政党ですね。ただ、プロフィール未設定の割合が低かった立憲民主党が、卵アイコン率ですとかなりの高い数値を出しているのが気になります。プロフィール未設定の時の偏差値は36と低いものでしたが、今回は55と高い数値を出しています。プロフィールを設定したが、卵アイコンを変えていないというユーザーが多いという事でしょうか?

クリックしてターミナルの結果を見る

f:id:neet-utsu-taro:20171017183548p:plain

profile_use_background_image

f:id:neet-utsu-taro:20171017151143p:plain

profile_use_background_imageはプロフィールの背景画像が有効であるかどうかを表しています。どうやら、現在廃止された値のようですね。

党名 スクリーン名 プロフィールの背景画像が有効 フォロワー数 背景画像率 偏差値
公明 komei_koho 69945 73702 0.949 72.82
自民 jimin_koho 115119 124317 0.926 61.92
幸実 hr_party_TW 6201 6753 0.9183 58.25
立民 CDP2017 158656 174880 0.9072 53.03
維新 osaka_ishin 12228 13705 0.8922 45.93
日本 nipponkokoro 33769 37905 0.8909 45.29
共産 jcp_cc 32704 36727 0.8905 45.09
自由 seikatsu1pr 25124 28240 0.8897 44.71
希望 kibounotou 9433 10606 0.8894 44.59
民進 MinshintoNews 22338 25333 0.8818 40.98
社民 SDPJapan 18922 21644 0.8742 37.41
名称
平均 0.9008
標準偏差 0.021121934

ほとんどのユーザーがtrueの様です。昔のプロパティを今も互換性のために残してあるという事でしょうか?

クリックしてターミナルの結果を見る

f:id:neet-utsu-taro:20171017183841p:plain

終わりに

今回は裏で分析中という事で、こんだけしか比較を出せませんでした。すみません!

頑張ってすべてのデータを出したいなと思います(選挙期間中に間に合うかなw)

またね('ω')ノ