頼む当たってくれ!
業務に囚われない趣味プログラマーになりたいんだ。。。
チェック処理とかは端折ってる
/** ここから定型文 */
ここで記載したクラスについては、
こっちの記事に書いてある、標準入力を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で当たり判定して、文字列を返すようにしてって感じです。