2
1

頼む当たってくれ!

業務に囚われない趣味プログラマーになりたいんだ。。。

チェック処理とかは端折ってる

/** ここから定型文 */
ここで記載したクラスについては、
こっちの記事に書いてある、標準入力をList化したりしてるMainクラスから呼び出す予定だし・なんか継承したりしてるYO!!

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

開発・実行環境はこんな感じ
  • VSCode
  • Java 17
  • jUnit 5.9
  • maven

pom.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>
/** ここまで定型文 */

実装クラス

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());
  }
}

テストクラス

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版と同じ様に当たり条件をMapで保持して、KeyのendWithsで判定してみました。
mapで当たり判定して、文字列を返すようにしてって感じです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1