※当サイトの記事には、広告・プロモーションが含まれます。

Look-and-say sequence(「ルック&セイ」数列) をJavaで試してみる

兄から教えてもらったYouTubeの動画で初めてその存在を知りました、その名も、わいわい、じゃなくて『「ルック&セイ」数列』。(動画で実況してる方は、わいわい、という方だそうです。)

www.youtube.com

⇧  上記のひたすらゲームを実況しながらプレイしているYouTubeの動画で出てきました。ゲームの世界は奥深いですね。

stabucky.com

⇧  上記サイト様は、JavaScriptで実装していました。

 

ちなみに、前も紹介したかもしれませんが、Facebookが「flick」という単位を提唱してるみたいですね。

pc.watch.impress.co.jp

it.srad.jp

 映像系はコンテンツの処理に対する時間に対してシビアですね。

 

Look-and-say sequenceをJavaで実装してみる

Look-and-say sequence - Rosetta Code

⇧  上記サイト様で実装されてました。多種多様な言語を網羅されてます。

今回はJavaで。

package lookSay;

public class LookAndSay {

  public static void main(String[] args) {
     // 初項
     String num = "1";     // 10項まで繰り返し
     for (int i = 1; i <= 10; i++) {       // 表示
       System.out.print(num + " ");       // 次の項を作成
       num = lookAndSay(num);
     }
  }

  public static String lookAndSay(String number) {
    StringBuilder result = new StringBuilder();
    // 数列の項の値の先頭
    // number = 111221 だったら、repeat = 1
    char repeat = number.charAt(0);
    // 項の値で先頭以外の部分 + 半角スペース(項と項の隙間)
    // 11221␣
    number = number.substring(1) + " ";
    // 項の中で同一の数字が続く場合のカウント用
    int times = 1;

    // 項の値を1文字づつとして捉える
    // number.toCharArray()は、[1,1,2,2,1]
    for(char actual: number.toCharArray()) {
      // 項の先頭の値と、それ以降の値を比較
      if(actual != repeat) {
        result.append(times + "" + repeat);
        // 同一の数字が続く数のカウントをリセット
        times = 1;
        repeat = actual;
        
      // 同一の数字が続いていれば、
      } else {
        // その数字の数をカウント
        times ++;
      }
    }
    // number = "111221"の場合、"312211"が返る
    return result.toString();

  }

}

f:id:ts0818:20180226213102j:plain

ameblo.jp

⇧  上記サイト様で説明してくれていますが、直前の項をLook(見て)、今現在の項をSay(言う)というところから、 Look-and-say 数列ってことになるみたいですね。

f:id:ts0818:20180226224925p:plain

直前の項を見て、次の項が決まるってことみたいですね。

数学とアルゴリズムを勉強していかねばですね。

 

今回はこのへんで。