[paiza]ドリームジャンボ（宝くじ (paizaランク C 相当)

# 頼む当たってくれ！
業務に囚われない趣味プログラマーになりたいんだ。。。

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery

# チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
[こっちの記事](https://qiita.com/AsilHatake/items/40204293bdf59cb9f9d8)に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

ちな、Mainを実行して標準入力から入力するのクソ面倒くさいので、
Java編については問題の入力例をパラメータにしたテストクラスとかも作って公開するYO!!

<details open><summary>開発・実行環境はこんな感じ</summary>

- VSCode
- Java 17
- jUnit 5.9
- maven

pom.xmlはこんな感じ

```xml:pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>jp.co.asil</groupId>
    <artifactId>paiza202408</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.9.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
```

</details>
/** ここまで定型文 */

## 実装クラス 
```java:Lottery.java
package jp.co.asil.paiza202408;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class Lottery extends Question {

  public Lottery(List<String> list) {
    super(list);
  }

  /**
   * 今年もパイザ宝くじの季節がやってきました。パイザ宝くじ券には 100000 以上 199999 以下の 6 桁の番号がついています。毎年1つ当選番号
   * (100000 以上 199999 以下)が発表され、当たりクジの番号が以下のように決まります。
   * 
   * 1等：当選番号と一致する番号
   * 前後賞：当選番号の ±1 の番号（当選番号が 100000 または 199999 の場合，前後賞は一つしかありません）
   * 2等：当選番号と下 4 桁が一致する番号（1等に該当する番号を除く）
   * 3等：当選番号と下 3 桁が一致する番号（1等および2等に該当する番号を除く）
   * 
   * たとえば、当選番号が 142358 の場合、当たりの番号は以下のようになります。
   * 
   * 1等：142358
   * 前後賞：142357 と 142359
   * 2等：102358, 112358, 122358, …, 192358 （全 9 個）
   * 3等：100358, 101358, 102358, …, 199358 （全 90 個）
   * 
   * あなたが購入した n 枚の宝くじ券の各番号が入力されるので、それぞれの番号について、何等に当選したかを出力するプログラムを書いて下さい。
   */
  @Override
  public List<String> answer() {
    String hit1 = list.get(0);
    int hit1Int = Integer.parseInt(hit1);
    // 当たり条件
    Map<String, String> hitNoMap = Map.of(
        hit1, "first", // 1等
        String.valueOf(hit1Int + 1), "adjacent", // 前後賞(+)
        String.valueOf(hit1Int - 1), "adjacent", // 前後賞(-)
        hit1.substring(hit1.length() - 4), "second", // 2等
        hit1.substring(hit1.length() - 3), "third"// 3等
    );
    // forで毎回呼び出すの嫌なので、先に値を保持
    Set<String> keys = hitNoMap.keySet();
    return list.subList(2, 2 + Integer.parseInt(list.get(1))).stream().map(lot -> {
      for (String key : keys)
        if (lot.endsWith(key))
          return hitNoMap.get(key);
      return "blank";
    }).collect(Collectors.toList());
  }
}
```

## テストクラス 
```java:Test.java
package jp.co.asil.paiza202408;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

import java.util.List;

import org.junit.jupiter.api.Test;

public class LotteryTest {
  @Test
  void testAnswer() {
    Lottery testClass = new Lottery(List.of("142358",
        "3",
        "195283",
        "167358",
        "142359"));
    assertArrayEquals(testClass.answer().toArray(), new String[] { "blank",
        "third",
        "adjacent" });
  }
}
```

# ままととめめ
[JavaScript版](https://qiita.com/AsilHatake/items/f4198209f441fb924cc6)と同じ様に当たり条件をMapで保持して、KeyのendWithsで判定してみました。
mapで当たり判定して、文字列を返すようにしてって感じです。