はじめに
こんにちは、Hagianです。
この記事では、Paizaの新作プログラミングゲーム「電脳少女プログラミング2088 ─壊レタ君を再構築─」のコード問題である「カジノ(Dランク)」を、Beta版の言語のみ で解いてみたのでレポートします。
私はPython3(以下、本記事内ではPythonと呼称)を得意としており (これしかできない) 、競技プログラミングでも普段からPythonで実装しています。Pythonの学習歴は5年ほど、PaizaラーニングではBランク、最高レーティングは1915 です。普段であれば他の言語にチャレンジしてみたりしないのですが、解答に使用できる言語の選択肢が豊富だったため、やってみようと思いました。
言語ごとの特徴をつかみ、楽しみながら取り組もうと思い、Beta版となっている言語にフォーカスをあてました。もっとスマートに解く方法はあると思いますが、初学者なので許してください…
Rustについて
RustはBeta版言語ですが、本記事投稿を思い立った時点(2025年2月21日)で、既に解答記事(以下リンク)が投稿されていたので触れていません。
問題
あなたはカジノにやってきました。
カジノで使われるチップは 1 ドルのもの 5 ドルのもの 10 ドルのものがあるようです。
各チップの枚数が 1 ドル, 5 ドル, 10 ドルの順で改行区切りで与えられるので合計で何ドルかを出力してください。
方針
- 3つの整数(それぞれのチップの枚数)$a$, $b$, $c$ を受け取る
- $a+5b+10c$を計算し、結果を出力する
解答例(Python3)
本題へ入る前に、Python3での(私の)解答を示します。
print(int(input())+int(input())*5+int(input())*10)
実装
Haskell
本当に初見(存在は知っていた)。
main = do
one <- readLn :: IO Int
five <- readLn :: IO Int
ten <- readLn :: IO Int
print $ one + five*5 + ten*10
参考にしたもの
CoffeeScript
本当に初見(存在を知らなかった)。
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
参考にしたもの
Bash
普段ターミナルの設定で少し触る程度の理解度で、初心者に毛が生えた程度でした。
read one
read five
read ten
count=$((one + five*5 + ten*10))
echo ${count}
参考にしたもの
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)
参考にしたもの
COBOL
本当に初見でした(存在は知っていた)が、楽しさを感じたので勉強してみようかなと思いました。
言語の性質上、桁数定義の必要があるので、そこを考慮したコードを書く必要がありました。
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.
参考にしたもの
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
参考にしたもの
F#
本当に初見(存在は知っていた)。パイプラインが演算子として存在するのが楽しいポイントでした。
let one = stdin.ReadLine() |> int
let five = stdin.ReadLine() |> int
let ten = stdin.ReadLine() |> int
let res = one + five * 5 + ten * 10 |> stdout.WriteLine
参考にしたもの
Clojure
本当に初見(存在を知らなかった)でしたが、直感的でかなり書きやすかったです。
(def one (read))
(def five (read))
(def ten (read))
(def five (* five 5))
(def ten (* ten 10))
(def res (+ one five ten))
(println res)
参考にしたもの
D
本当に初見(ただしC言語派生であることは知っていました)。CとかC++のような感じで書きやすかったです。
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);
}
参考にしたもの
Scheme
本当に初見(存在を知らなかった)。ほぼClojure。
(define one (read))
(define five (read))
(define ten (read))
(set! five (* five 5))
(set! ten (* ten 10))
(print (+ one five ten))
参考にしたもの
諦めた(相性が悪かった)言語
- Erlang
- Elixir
Erlang/Elixirとは分かり合えませんでした…。
おわりに
あえてTipsが少ない言語で攻めよう、と考えている人の参考になれば幸いです。