【Beta版言語縛り】Dランク問題：カジノを解いてみた【電脳少女プログラミング2088 ─壊レタ君を再構築─】


# はじめに

こんにちは、Hagianです。
この記事では、Paizaの新作プログラミングゲーム「電脳少女プログラミング2088 ─壊レタ君を再構築─」のコード問題である「カジノ（Dランク）」を、**Beta版の言語のみ** で解いてみたのでレポートします。

https://ppg.paiza.jp/denno2088/

私はPython3（以下、本記事内ではPythonと呼称）を得意としており ~~（これしかできない）~~ 、競技プログラミングでも普段からPythonで実装しています。**Pythonの学習歴は5年ほど、PaizaラーニングではBランク、最高レーティングは1915** です。普段であれば他の言語にチャレンジしてみたりしないのですが、解答に使用できる言語の選択肢が豊富だったため、やってみようと思いました。

https://paiza.jp/works/

言語ごとの特徴をつかみ、楽しみながら取り組もうと思い、Beta版となっている言語にフォーカスをあてました。**もっとスマートに解く方法はあると思いますが、初学者なので許してください…**

## Rustについて

RustはBeta版言語ですが、本記事投稿を思い立った時点（2025年2月21日）で、既に解答記事（以下リンク）が投稿されていたので触れていません。

https://qiita.com/tmrtmr/items/e98307e3147c20cce3c4

# 問題

あなたはカジノにやってきました。
カジノで使われるチップは 1 ドルのもの 5 ドルのもの 10 ドルのものがあるようです。

各チップの枚数が 1 ドル, 5 ドル, 10 ドルの順で改行区切りで与えられるので合計で何ドルかを出力してください。

# 方針

1. 3つの整数（それぞれのチップの枚数）$a$, $b$, $c$ を受け取る
2. $a+5b+10c$を計算し、結果を出力する

# 解答例（Python3）

本題へ入る前に、Python3での（私の）解答を示します。

```python:d_02.py
print(int(input())+int(input())*5+int(input())*10)
```

# 実装

## Haskell

本当に初見（存在は知っていた）。

```haskell:d_02.hs
main = do
    one <- readLn :: IO Int
    five <- readLn :: IO Int
    ten <- readLn :: IO Int
    print $ one + five*5 + ten*10
```

### 参考にしたもの

https://minoki.github.io/ks-material/haskell/competitive.html

https://qiita.com/7shi/items/145f1234f8ec2af923ef

## CoffeeScript

本当に初見（存在を知らなかった）。

```coffeescript:d_02.coffee
readline = require('readline')
lines = []
reader = readline.createInterface process.stdin, process.stdout

solve = (input) ->
    one = parseInt input[0]
    five = parseInt input[1]
    ten = parseInt input[2]
    ans = 0
    ans += one + five*5 + ten*10
    console.log(ans)
    process.exit()

reader.on 'line', (line) ->
    lines.push line
    solve(lines) if lines.length is 3
```

### 参考にしたもの

https://qiita.com/prd_xxx/items/3c06cb12726420b3a877

## Bash

普段ターミナルの設定で少し触る程度の理解度で、初心者に毛が生えた程度でした。

```bash:d_02.sh
read one
read five
read ten
count=$((one + five*5 + ten*10))
echo ${count}
```

### 参考にしたもの

https://qiita.com/yuizumi/items/d55f9dfe56fa2bf12d94

https://web-learn.hatenablog.com/entry/2024/08/17/000505

## R

ほぼ初見（統計解析の参考に見たことがある程度）。標準入力のやり方が中々見つからず手こずりました…。

```r:d_02.r
input <- readLines("stdin",n=3)
one <- as.numeric(input[1])
five <- as.numeric(input[2])
ten <- as.numeric(input[3])
cat(one + five*5 + ten*10)
```

### 参考にしたもの

https://qiita.com/stkdev/items/f4112c0f8e5bd4d0e642

https://qiita.com/bo9chan/items/4b2fecefa8c076235c5a

## COBOL

本当に初見でした（存在は知っていた）が、楽しさを感じたので勉強してみようかなと思いました。
言語の性質上、桁数定義の必要があるので、そこを考慮したコードを書く必要がありました。

```cobol:D_02.cob
IDENTIFICATION          DIVISION.
PROGRAM-ID.             D_02.
DATA                    DIVISION.
    WORKING-STORAGE     SECTION.
        01 WORK-AREA.
            03 ONE      PIC 9(3).
            03 FIV      PIC 9(3).
            03 TEN      PIC 9(3).
            03 RES      PIC 9(4).
            03 TWO      PIC 9(2).
            03 THR      PIC 9(3).
PROCEDURE               DIVISION.
    MAIN                SECTION.
    ACCEPT ONE FROM SYSIN.
    ACCEPT FIV FROM SYSIN.
    ACCEPT TEN FROM SYSIN.
    
    COMPUTE RES = ONE + FIV * 5 + TEN * 10.
    
    IF RES < 100 THEN
        MOVE RES TO TWO
        DISPLAY TWO UPON SYSOUT
    ELSE IF RES < 1000 THEN
        MOVE RES TO THR
        DISPLAY THR UPON SYSOUT
    ELSE
        DISPLAY RES UPON SYSOUT
    END-IF
    
    END-IF.
    
    STOP RUN.
END PROGRAM D_02.
```

### 参考にしたもの

https://www.cobol.co.jp/cobol-nyuumon/benkyou/b007/

https://qiita.com/mikecat_mixc/items/5d8e7954ccdd05a5e947

## VB

本当に初見（存在は知っていた）。構造はっきりしてて書きやすいですね。

```vb:d_02.vb
Module mainModule
    Sub Main()
        Dim one As Integer = Integer.parse(Console.ReadLine())
        Dim five As Integer = Integer.parse(Console.ReadLine())
        Dim ten As Integer = Integer.parse(Console.ReadLine())
        Console.WriteLine("{0:d}", one + five * 5 + ten * 10)
    End Sub
End Module
```

### 参考にしたもの

https://qiita.com/mikecat_mixc/items/a339d8863b837300b6a0

https://learn.microsoft.com/ja-jp/dotnet/api/system.console.writeline?view=net-8.0#system-console-writeline(system-string-system-object-system-object)

## F#

本当に初見（存在は知っていた）。パイプラインが演算子として存在するのが楽しいポイントでした。

```fsharp:d_02.fs
let one = stdin.ReadLine() |> int
let five = stdin.ReadLine() |> int
let ten = stdin.ReadLine() |> int
let res = one + five * 5 + ten * 10 |> stdout.WriteLine
```

### 参考にしたもの

https://qiita.com/kuuso1/items/606b75c172cafa1d07f6

https://zenn.dev/flipflap/articles/atcoder-with-fsharp

## Clojure

本当に初見（存在を知らなかった）でしたが、直感的でかなり書きやすかったです。

```clj:d_02.clj
(def one (read))
(def five (read))
(def ten (read))
(def five (* five 5))
(def ten (* ten 10))
(def res (+ one five ten))
(println res)
```

### 参考にしたもの

https://qiita.com/shunsuke459/items/6c01e6b9fbaa12e35a8f

## D

本当に初見（ただしC言語派生であることは知っていました）。CとかC++のような感じで書きやすかったです。

```d:d_02.d
import std.stdio;
import std.string;
import std.conv;
void main(){
  int one = readln.chomp.to!int;
  int five = readln.chomp.to!int;
  int ten = readln.chomp.to!int;
  writeln(one+five*5+ten*10);
}
```

### 参考にしたもの

https://takeo1116.sakura.ne.jp/ABS_D.html

## Scheme

本当に初見（存在を知らなかった）。ほぼClojure。

```scheme:d_02.scm
(define one (read))
(define five (read))
(define ten (read))
(set! five (* five 5))
(set! ten (* ten 10))
(print (+ one five ten))
```

### 参考にしたもの

https://qiita.com/mikecat_mixc/items/ec726dbf1dd4eaa20004

https://qiita.com/dolyplpl/items/a3dcdbfb617579e52bba

## 諦めた（相性が悪かった）言語

* Erlang
* Elixir

Erlang/Elixirとは分かり合えませんでした…。

# おわりに

あえてTipsが少ない言語で攻めよう、と考えている人の参考になれば幸いです。