paizaラーニングレベルアップ問題集の「宝くじ」を色々な言語でやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[宝くじ](https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery)を色々な言語でやってみました。対象は[コードモンスター大図鑑](https://paiza.jp/code_monster)で対応している9言語です。

2024/08/25更新
Javascriptのコードを修正いたしました。
- - -
###### 方針
問題文の
> 1等：当選番号と一致する番号
> 前後賞：当選番号の±1の番号（当選番号が100000または199999の場合，前後賞は一つしかありません）
> 2等：当選番号と下4桁が一致する番号（1等に該当する番号を除く）
> 3等：当選番号と下3桁が一致する番号（1等および2等に該当する番号を除く）

> 1等の場合: first
> 前後賞の場合: adjacent
> 2等の場合: second
> 3等の場合: third
> それ以外（外れ）の場合: blank

を関数にします。

2024/08/26更新
2等の判定において、購入した宝くじ券の番号$a$と当選番号$b$の下4桁が一致する判定において、「$a$, $b$を整数として見た時$a$を$10000$で割った余りと$b$を$10000$で割った余りが等しい」としておりましたが、$a\equiv b\mod m$ならば$a-b\equiv 0\mod m$という性質を用いて、「$a-b$を$10000$で割った余りが$0$」とします。
これにより、2等の判定基準が変更された場合でも1ヶ所修正すればよいことになります。
3等についても同様です。
- - -
###### PHP
```php
<?php
	global $b;
	$b = fgets(STDIN);


	function lottery($a) {
		global $b;
		if ($a == $b) { // 1等：当選番号と一致する番号
			return "first";
		} elseif (abs($a - $b) == 1) { // 前後賞：当選番号の±1の番号
			// elseif ($a == $b - 1 || $a == $b + 1)
			return "adjacent";
		} elseif (($a - $b) % 10000 == 0) { // 2等：当選番号と下4桁が一致する番号
			// elseif ($a % 10000 == $b % 10000)
			return "second";
		} elseif (($a - $b) % 1000 == 0) { // 3等：当選番号と下3桁が一致する番号
			// elseif ($a % 1000 == $b % 1000)
			return "third";
		} else { // それ以外（外れ）
			return "blank";
		}
	}


	$n = fgets(STDIN);
	for ($i = 0; $i < $n; $i++) {
		$a = fgets(STDIN);
		echo lottery($a) . "\n";
	}
?>
```
- - -
###### Ruby
```rb
$b = gets.to_i


def lottery(a) 
	if a == $b # 1等：当選番号と一致する番号
		return "first"
	elsif (a - $b).abs == 1 # 前後賞：当選番号の±1の番号
		# elsif a == $b - 1 || a == $b + 1
		return "adjacent"
	elsif (a - $b) % 10000 == 0 # 2等：当選番号と下4桁が一致する番号
		# elsif a % 10000 == $b % 10000
		return "second"
	elsif (a - $b) % 1000 == 0 # 3等：当選番号と下3桁が一致する番号
		# elsif a % 1000 == $b % 1000
		return "third"
	else # それ以外（外れ）
		return "blank"
	end
end


n = gets.to_i
n.times do
	a = gets.to_i
	puts lottery(a)
end
```
- - -
###### Java	
```java
import java.util.*;

public class Main {

	static int b;

	static String lottery(int a) {
		if (a == b) { // 1等：当選番号と一致する番号
			return "first";
		} else if (Math.abs(a - b) == 1) { // 前後賞：当選番号の±1の番号
			// else if (a == b - 1 || a == b + 1)
			return "adjacent";
		} else if ((a - b) % 10000 == 0) { // 2等：当選番号と下4桁が一致する番号
			// else if (a % 10000 == b % 10000)
			return "second";
		} else if ((a - b) % 1000 == 0) { // 3等：当選番号と下3桁が一致する番号
			// else if (a % 1000 == b % 1000)
			return "third";
		} else { // それ以外（外れ）
			return "blank";
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		b = sc.nextInt();
		int n = sc.nextInt();
		for (int i = 0; i < n; i++) {
			int a = sc.nextInt();
			System.out.println(lottery(a));
		}
		sc.close();
	}
}
```
- - -
###### Python
```py
b = int(input())


def lottery(a):
	if a == b: # 1等：当選番号と一致する番号
		return "first"
	elif abs(a - b) == 1: # 前後賞：当選番号の±1の番号
		# elif a == b - 1 or a == b + 1:
		return "adjacent"
	elif (a - b) % 10000 == 0: # 2等：当選番号と下4桁が一致する番号
		# elif a % 10000 == b % 10000:
		return "second"
	elif (a - b) % 1000 == 0: # 3等：当選番号と下3桁が一致する番号
		# elif a % 1000 == b % 1000:
		return "third"
	else: # それ以外（外れ）
		return "blank"


n = int(input())
for _ in range(n):
	a = int(input())
	print(lottery(a))
```
- - -
###### C言語
```c
#include <stdio.h>
#include <stdlib.h>

int b;

char* lottery(int a) {
	if (a == b) { // 1等：当選番号と一致する番号
		return "first";
	} else if (abs(a - b) == 1) { // 前後賞：当選番号の±1の番号
		// else if (a == b - 1 || a == b + 1)
		return "adjacent";
	} else if ((a - b) % 10000 == 0) { // 2等：当選番号と下4桁が一致する番号
		// else if (a % 10000 == b % 10000)
		return "second";
	} else if ((a - b) % 1000 == 0) { // 3等：当選番号と下3桁が一致する番号
		// else if (a % 1000 == b % 1000)
		return "third";
	} else { // それ以外（外れ）
		return "blank";
	}
}

int main(void) {
	scanf("%d", &b);
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		int a;
		scanf("%d", &a);
		puts(lottery(a));
	}
}
```
- - -
###### C#
```cs
using System;

class Program
{
	static int b;

	static String lottery(int a)
	{
		if (a == b)
		{
			// 1等：当選番号と一致する番号
			return "first";
		}
		else if (Math.Abs(a - b) == 1)
		// else if (a == b - 1 || a == b + 1)
		{
			// 前後賞：当選番号の±1の番号
			return "adjacent";
		}
		else if ((a - b) % 10000 == 0)
		// else if (a % 10000 == b % 10000)
		{
			// 2等：当選番号と下4桁が一致する番号
			return "second";
		}
		else if ((a - b) % 1000 == 0)
		// else if (a % 1000 == b % 1000)
		{
			// 3等：当選番号と下3桁が一致する番号
			return "third";
		}
		else
		{
			// それ以外（外れ）
			return "blank";
		}
	}

	static void Main()
	{
		b = int.Parse(Console.ReadLine());
		int n = int.Parse(Console.ReadLine());
		for (int i = 0; i < n; i++)
		{
			int a = int.Parse(Console.ReadLine());
			Console.WriteLine(lottery(a));
		}
	}
}
```
- - -
###### Javascript
2024/08/25 `parseInt`から`Number`に修正
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
// const b = parseInt(lines[0], 10);
const b = Number(lines[0]);


function lottery(a) {
	if (a === b) { // 1等：当選番号と一致する番号
		return "first";
	} else if (Math.abs(a - b) === 1) { // 前後賞：当選番号の±1の番号
		// else if (a === b - 1 || a === b + 1)
		return "adjacent";
	} else if ((a - b) % 10000 === 0) { // 2等：当選番号と下4桁が一致する番号
		// else if (a % 10000 == b % 10000)
		return "second";
	} else if ((a - b) % 1000 === 0) { // 3等：当選番号と下3桁が一致する番号
		// else if (a % 1000 == b % 1000)
		return "third";
	} else { // それ以外（外れ）
		return "blank";
	}
}


// const n = parseInt(lines[1], 10);
const n = Number(lines[1]);
for (var i = 0; i < n; i++) {
	// let a = parseInt(lines[2 + i], 10);
	let a = Number(lines[2 + i]);
	console.log(lottery(a));
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int b;

string lottery(int a) {
	if (a == b) { // 1等：当選番号と一致する番号
		return "first";
	} else if (abs(a - b) == 1) { // 前後賞：当選番号の±1の番号
		// else if (a == b - 1 || a == b + 1)
		return "adjacent";
	} else if ((a - b) % 10000 == 0) { // 2等：当選番号と下4桁が一致する番号
		// else if (a % 10000 == b % 10000)
		return "second";
	} else if ((a - b) % 1000 == 0) { // 3等：当選番号と下3桁が一致する番号
		// else if (a % 1000 == b % 1000)
		return "third";
	} else { // それ以外（外れ）
		return "blank";
	}
}

int main(void) {
	cin >> b;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int a;
		cin >> a;
		cout << lottery(a) << endl;
	}
	return 0;
}
```
- - -
###### Kotlin
```kotlin
import java.util.*;

var b = 0


fun lottery(a: Int): String {
	if (a == b) { // 1等：当選番号と一致する番号
		return "first"
	} else if (Math.abs(a - b) == 1) { // 前後賞：当選番号の±1の番号
		// else if (a == b - 1 || a == b + 1)
		return "adjacent"
	} else if ((a - b) % 10000 == 0) { // 2等：当選番号と下4桁が一致する番号
		// else if (a % 10000 == b % 10000)
		return "second"
	} else if ((a - b) % 1000 == 0) { // 3等：当選番号と下3桁が一致する番号
		// else if (a % 1000 == b % 1000)
		return "third"
	} else { // それ以外（外れ）
		return "blank"
	}
}


fun main() {
	val sc = Scanner(System.`in`)
	b = sc.nextInt()
	val n = sc.nextInt()
	for (i in 1..n) {
		var a = sc.nextInt()
		println(lottery(a))
	}
	sc.close()
}
```