FizzBuzz問題をいろいろな言語で解く
Zenn記事:色々な言語のFizz Buzz問題
この記事に触発されたので、FizzBizz問題の備忘録を作ります(何番煎じ?)。
あとはプログラム言語の仕様を調べたいのと、名前を思い出せる言語はどのくらいあるかを知りたい欲。
FizzBuzz問題とは?
Wiki記事:Fizz Buzz
英語圏で遊ばれる言葉遊びである。
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの発言した数字に1を足した数字を発言していく。ただし、3の倍数の場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合(すなわち15の倍数の場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。
つまりは、一から数え上げていき、三の倍数なら「Fizz」、五の倍数なら「Buzz」、両方の倍数(十五の倍数)なら「Fizz Buzz」、それ以外なら直前の数値に一を足して発言するということのようで。
これをコンピュータで再現しようというのがFizzBizz問題ということです。
また、プログラマーの技量の測定としても使えるもよう。
私と同様、この著者は、プログラミングの仕事への応募者200人中199人はコードがまったく書けないということで苦労している。繰り返すが、彼らはどんなコードも書けないのだ。
【プログラムのいろはの「い」】第1回:14年目のFizzBuzz問題”の問題”
どうすれば人間はプログラムを書けるようになるのか?
Qiita記事のFizzBuzz問題に書かれているが、制約の件を考えていくと多くの書き方が生み出される。
プログラミングの初歩的な問題で扱われることが多いですが、使える予約語や演算子、関数やオブジェクトが制限されると、とたんに難易度が上がります。
また、Code Golfと呼ばれるとにかくコードを短くするコンテストがある。こちらもWikipediaのコードゴルフ記事から引用する。
コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う。バイナリサイズではなく、ソースコードの文字数がスコアとなる。
詳しくはこちらの記事が参考になる。
今回の記事はそれらも考えながら紹介していく。
具体的に知りたいのであれば最終鬼畜FizzBuzz大全を読むことをおすすめする。
それから、ここにないコードは下のFizzBuzz記事のおすすめまとめにある可能性がある。
コード規約
最初のコードはifとforのみで条件分岐と繰り返しを実装する。
1から100まで実行。分岐後はFizzBuzz、Fizz、Buzz、数字のいずれかを表記する。
それ以降のコードは自由に表現してもよい。
コード
C
#include<stdio.h>
int main(void)
{
for(int i=1;i<101;i++){
if(i%15==0){
printf("FizzBuzz\n");
}
else if(i%3==0){
printf("Fizz\n");
}
else if(i%5==0){
printf("Buzz\n");
}
else{
printf("%d\n",i);
}
}
}
昔から存在し、今も前線で使われている言語(特に組み込み系)。
下のはCode Golfで有名なコードです。
main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}
C言語のCode Golfはこちらの記事。すごく参考になる。return 0
が入っていない理由も書いてあります。
ただ、clでのコンパイルだとうまく実行されませんでした。
C++
#include <iostream>
int main() {
for(int i = 1; i < 101; i++) {
if(i % 15 == 0){
std::cout << "FizzBuzz" << "\n";
}
else if(i % 3 == 0){
std::cout << "Fizz" << "\n";
}
else if(i % 5 == 0){
std::cout << "Buzz" << "\n";
}
else{
std::cout << i << "\n";
}
}
return 0;
}
ポインタの扱いがクソ難しいで有名なシープラプラ。
ゲーム業界ではその速度から現役でも使われる言語。Unreal Engineで使用できる言語です。
ちなみに、C++はC言語の要素を使えるので、先ほどにあったC言語のコードと同じでも可能。
つまり、C++はC言語のコードでCode Golfができます。
(. 余_談 .)
C++は事あるごとにジョークが生まれる言語です。以下はToggeterでまとめられていた内容です。
自分の足を打ち抜く系のジョークもこれが一番強力です。
- C言語
自分の足を撃て。
- C++
間違って自分自身のインスタンスを一ダースも作ってしまい、全部の足を撃つことになる。
救急治療は困難である、なぜなら、どれが本物の自分でどれがビットワイズコピーで、どれが単なるポインタのくせに「ここだよ助けてよ~」と叫んでいるのか、さっぱり分からないからである。
C#
using System;
class fizzbuzz{
public static void Main(){
for (int i = 1; i < 101; i++)
{
if (i % 15 == 0) {
Console.WriteLine("FizzBuzz");
}
else if (i % 5 == 0) {
Console.WriteLine("Buzz");
}
else if (i % 3 == 0) {
Console.WriteLine("Fizz");
}
else {
Console.WriteLine(i);
}
}
}
}
C言語としての雰囲気がところ変わる。
C++ベースとし、Javaなどのオブジェクト指向を分かりやすくしたプログラム言語である。
ちなみに、UnityやGodotで使える言語でもある。
FizzBuzzを使いコードの読みやすさ問題を解いている記事。
D
import std.stdio;
void main(){
for(int i = 1;i<101;i++){
if(i % 15 == 0){
writeln("FizzBuzz");
}else if(i % 3 == 0){
writeln("Fizz");
}else if(i % 5 == 0){
writeln("Buzz");
}else{
writeln(i);
}
}
}
C++をベースにした言語。C++の特徴である高いパフォーマンス性能を近いところまで再現し、人間に読みやすいようにしているとのこと。
ポインタ操作を行えるが、メモリ安全性を備えているという不思議な言語である。
また、C言語のコードを使えるという仕様でもある(#include<stdui.h>
をimport std.stdio
に変えるでけでよいそうだ)。
import std.stdio;
void main(){
for(int i = 1;i<101;i++){
if(i % 15 == 0){
printf("FizzBuzz\n");
}else if(i % 3 == 0){
printf("Fizz\n");
}else if(i % 5 == 0){
printf("Buzz\n");
}else{
printf("%d\n",i);
}
}
}
D言語は実用的な言語を目指して開発され、メモリ安全や低レベルへのアクセスのような相反するような機能を同時に提供している汎用言語
C++の構文的な失敗をふまえて人間にも機械にも優しい構文設計となっている
メモリ安全性を実現するために様々な手法を使うことができ、自身の責任でもってそれを使わないことも可能である
C言語をベースにしているだけあって、比較的学習しやすかった。
RustやNimより古い言語なので、比較的レトロな書き方ではある。しかし、現在の言語にも通じる現代的な書き方も備えている印象だった。
特にwriteln
での変数表示は意外なものだった。
D言語を知りたいならこの記事を読むのが吉。
上の記事を参考にしていたら、Rustのmatchによく似た書き方でFizzBuzzを解く書き方が載っていた。
import std.stdio;
import std.range: iota;
import std.algorithm: map, joiner;
import std.conv : to;
string fizzBuzz()
{
return 1.iota(101).map!(i =>
i%15 == 0 ? "FizzBuzz!"
: i%5 == 0 ? "Buzz!"
: i%3 == 0 ? "Fizz!"
: i.to!string
).joiner("\n").to!string;
}
void main()
{
writeln(fizzBuzz());
}
Java
public class fizzbuzz{
public static void main(String[] args){
for (int i=1; i < 101; i++) {
if (i%15==0) {
System.out.println("FizzBuzz");
} else if (i%3==0) {
System.out.println("Fizz");
} else if (i%5==0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
}
かの有名なMinecraftでよく聞くJava版のJava。
whileでの実装はこちらの記事。
JavaのCode Golfはこちらの記事。
Nim
for i in 1..100:
if i mod 15 == 0:
echo "FizzBuzz"
elif i mod 3 == 0:
echo "Fizz"
elif i mod 5 == 0:
echo "Buzz"
else:
echo i
Pythonに似ている言語(適当)。
ほかの人やっているのかなと思って調べていたら、この記事に共感できる一言がありました。
人類は%かmodか統一すべき...
Nimのすばらしさを説明してくれている記事。
Rust
fn main() {
for i in 1..101 {
if i % 15 == 0 {
println!("FizzBuzz");
} else if i % 3 == 0 {
println!("Fizz");
} else if i % 5 == 0 {
println!("Buzz");
} else {
println!("{}", i);
}
}
}
他のオブジェクト指向の言語に比べてかなりシンプルになった感じがする。
また、Rustには多くの表現があり、この記事ではRustの特徴をしっかりと捉えながらFizzBuzz問題を解いている。Rustの分岐を学びたいなら非常におすすめ。
RustのCode Golfはこちらの記事。 なお、現在は103文字。どうなってるの???Mojo
def main():
for i in range(1,101):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
公式のURLはこちら。
Pythonと高い互換性を持ち、高速化ができると言われている。
Pythonとの比較を行っている記事はこちらを。
fn parameterizedFizzBuzz[n: Int, counter: Int]():
@parameter
if counter > n:
return
else:
if counter % 15 == 0:
print("FizzBuzz")
elif counter % 3 == 0:
print("Fizz")
elif counter % 5 == 0:
print("Buzz")
else:
print(counter)
parameterizedFizzBuzz[n, counter + 1]()
こちらを参考に。
fnを使う場合、しっかりとした戻り値が必要みたい。
ちなみに私の環境はWindows環境なのでMojoはまだ使えません。ちくしょーっ。まぁ、WSL2を使えばいい話なんですがね。
BASIC
FOR I = 1 TO 100
IF I MOD 15 = 0 THEN
PRINT "FizzBuzz"
ELSE IF I MOD 3 = 0 THEN
PRINT "Fizz"
ELSE IF I MOD 5 = 0 THEN
PRINT "Buzz"
ELSE
PRINT I
END IF
NEXT I
BASICは方言が多い言語です。ので下のサイトでコードを眺めるのも一興。
BASICといえばプチコンに採用されているSmileBASICを思い出します。
ところで、ZennもQiitaもBASICのシンタックスハイライトに対応しているんですね。とんでもねぇ。
SmallBasic
For i = 1 to 100
If (i % 15 == 0) Then
Print "FizzBuzz"
Elseif (i % 3 == 0) Then
Print "Fizz"
Elseif (i % 5 == 0) Then
Print "Buzz"
Else
Print i
Endif
Endfor
Small Basicでlet’sプログラミング: もっと思いどおりにパソコンを使おう!
カンタン。タノシイ。カッコイイ。小学生からのプログラミング Small Basicで遊ぼう!!
この本が家にあったのでついでに。動作環境がないので動作確認はしてないけど、まぁ動くでしょう。
SmallBasicのシンタックスハイライトはないので、代わりにBasicを使用。
VisualBasic
Class fizzbuzz
Public Shared Sub Main()
For i As Integer = 1 To 100
If i mod 15 = 0 Then
Console.WriteLine("FizzBuzz")
ElseIf i mod 5 = 0 Then
Console.WriteLine("Buzz")
ElseIf i mod 3 = 0 Then
Console.WriteLine("Fizz")
Else
Console.WriteLine(i)
End If
Next
End Sub
End Class
調べても調べてもなかなか情報が出てこないですねこの言語。使わないからだいたい忘れています。
開発したいならMicrosoft公式ドキュメントを読み解きましょうっ。
「visual studio Visual Basic fizzbuzz」でようやく二つという感じでした。
COBOL
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9(3).
PROCEDURE DIVISION.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
EVALUATE FUNCTION MOD(I 3) = ZERO
ALSO FUNCTION MOD(I 5) = ZERO
WHEN TRUE ALSO TRUE
DISPLAY 'FIZZBUZZ'
WHEN TRUE ALSO FALSE
DISPLAY 'FIZZ'
WHEN FALSE ALSO TRUE
DISPLAY 'BUZZ'
WHEN OTHER
DISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)
END-EVALUATE
END-PERFORM.
STOP RUN.
Wikipdiaから参照。COBOLも方言が多い言語です。
COBOLでFizzBuzzを書いている人達がいましたので貼り付け。コードは記事のほうがそうとう読みやすい。
COBOLが悪いと言っている人は、COBOLを理解していない。 しかし、これから学ぶ言語ではない。
COBOLは「古い」のか?令和の時代にCOBOLの“いま”を語る
Cobolの現状:なぜ「オワコン」と言われるのか?
まぁ、言われたところで学習コストがな・・・、相も変わらず読みずらい言語だ。
これもシンタックスハイライト対応と。しかもVScodeのmarkdownにも対応。
ついでにpaiza.ioで実行できる言語でもある。とんでもねぇけどBASICはないのか。
Bash
for ((i = 1; i < 101; i++))
do
if [ $(($i%15)) -eq 0 ]; then
echo 'fizzbuzz'
elif [ $(($i%3)) -eq 0 ]; then
echo 'fizz'
elif [ $(($i%5)) -eq 0 ]; then
echo 'buzz'
else
echo $i
fi
done
Bashの動きを考えたいならこの記事が良さげ?
Windowsバッチファイル
@ECHO OFF & CLS
SET I=0
:LOOP
SET /A I=I+1, F=I%%3, B=I%%5, N=!(F*B)
IF %F% == 0 SET /P X=Fizz<NUL
IF %B% == 0 SET /P X=Buzz<NUL
IF %N% == 0 SET /P X="%I%"<NUL
ECHO;
IF %I% LSS 100 GOTO :LOOP
こちらの記事から参照。
かなり面倒くさい言語、FizzBuzzも作りたくない。
PowerShell
for($i=1;$i -lt 101;$i++)
{
if($i % 15 -eq 0){
echo FizzBuzz
}
elseif($i % 3 -eq 0){
echo Fizz
}
elseif($i % 5 -eq 0){
echo Buzz
}
else{
echo $i
}
}
switch文だとこうなる。
switch (1..100) {
{$_ % 15 -eq 0} {'FizzBuzz'; continue}
{$_ % 3 -eq 0} {'Fizz'; continue}
{$_ % 5 -eq 0} {'Buzz'; continue}
default {$_}
}
PowerShellのCode Golfはこちらの記事。
Lisp
(dotimes (i 100) ; マクロ. (dotimes (カウンタ変数 繰り返し数 dotimesの返り値) E0 E1 ...)
(let (num) ; (let (V0 V1 V2 ...) E0 E1 E2 ...) 局所変数を定義する
(setq num (+ i 1)) ; num に i + 1 を代入
(if (= 0 (mod num 3)) ; Fizzを判断
(format t "Fizz") ; Fizzを出力
nil) ; else節(なにもしない)
(if (= 0 (mod num 5)) ; Buzzを判断
(format t "Buzz") ; Buzzを出力
nil) ; else節(なにもしない)
(if (and (not (= 0 (mod num 5))) ; FizzでもBuzzでもないのを判断
(not (= 0 (mod num 3))));
(format t "~a" num)) ; 数字を出力
(format t " " ))) ; すきま
こちらの記事から参照。
ほかの解法としてこんなのも。(defun FizzBuzz (n)
(if (> n 0)
(progn
(print (FizzBuzz (- n 1)))
(if (= (mod n 15) 0)
'FizzBuzz
(if (= (mod n 5) 0)
'Buzz
(if (= (mod n 3) 0)
'Fizz
n))))
0))
(dotimes (i 100)
(cond
; 15の倍数(3の倍数かつ5の倍数)
((equal (mod (+ 1 i) 15) 0) (format t "FizzBuzz~%")) ; modはPHPの%演算子に相当
; printではなく表示の調整が効くformatを利用。改行しないと見づらかったため。~% で改行
; 3の倍数
((equal (mod (+ 1 i) 3) 0) (format t "Fizz~%"))
; 5の倍数
((equal (mod (+ 1 i) 5) 0) (format t "Buzz~%"))
; 条件にヒットしない場合
(t (format t "~A~%" (+ 1 i))) ; ~Aでパラメータを引き渡す事を指定
)
)
こちらもかなり昔から存在する言語。Wikipediaに載っている分で20個以上。
Lispも方言が多くある言語。Lispは神の言語と呼ばれているようで。こちらの記事が分かりやすかった。
C、C++、Perl、Fortran、Java、COBOL、APLが引き合いに出され、神はこれらの言語を全て知っているが、その上でLispを選んだ、Lispで世界の全てを作った。なぜなら神には締め切りがあって6日間で世界を作らなければならなかったから、というのが要旨だ。
そういう意味でLispが神の言語というよりは、Lispを自由に扱えるようになったプログラマが神の域に近づくというのが正解のような気がします。
LispのCode Golfはこちらの記事。
Perl
for($i = 1;$i < 101;$i++){
if($i % 15 == 0){
print "FizzBuzz\n";
}
elsif($i % 3 == 0){
print "Fizz\n";
}
elsif($i % 5 == 0){
print "Buzz\n";
}
else{
print $i,"\n"
}
}
1995年11月20日第九版発行の『Perlプログラミング』があったので参考に。
Pythonが影響を受けた言語とのこと。print ""
とelsif
が分かりやすいかも。
Pythonがリストで回せるように、Perlにもforeach
という配列を使う繰り返し処
理がある。
foreach $i ((1..100)) {
if ($i % 15 == 0) {
print "FizzBuzz\n";
} elsif($i % 3 == 0) {
print "Fizz\n";
} elsif($i % 5 == 0) {
print "Buzz\n";
} else {
print "$i\n";
}
}
PerlのCode Golfはこちらの記事。
Scala
for(i <- 1 to 100) {
if(i % 3 == 0 && i % 5 == 0) {
println("FizzBuzz")
}else if (i % 3 == 0) {
println("Fizz")
}else if (i % 5 == 0) {
println("Buzz")
}else {
println(i)
}
}
こちらを参考に。
for(i<-1 to 100)println{var s="";if(i%3==0)s="Fizz";if(i%5==0)s+="Buzz";if(s=="")i else s}
ScalaのCode Golf。
下のURLでF3を押してScala, 90 bytes
と入力すると見れます。
Lua
for i = 1,100 do
if i % 15 == 0 then
print("FizzBuzz")
elseif i % 3 == 0 then
print("Fizz")
elseif i % 5 == 0 then
print("Buzz")
else
print(i)
end
end
こちらを参考に。
ゲームエンジンをいろいろ調べているときに、Luaを使用するエンジンが多い印象だった言語。
R
for(i in 1:100){
if(i%%15==0){
print("FizzBuzz")
}
else if(i%%3==0){
print("Fizz")
}
else if(i%%5==0){
print("Buzz")
}
else{
print(i)
}
}
統計解析向けの言語。
学ぶならこちらのサイトがよさげ。
いろいろなFizzBuzzの解き方をまとめている記事。
Ruby
for i in 1..100
if i%15==0
puts "FizzBuzz!"
elsif i%3==0
puts "Fizz!"
elsif i%5==0
puts "Buzz!"
else
puts i
end
end
『初めてのRuby』を参考に。
ただ、今回の記事のために学習したところ、確かに打つのが楽しい言語ではある、かなぁ。
ちなみにRubyの作者であるまつもとゆきひろ氏は、Quoraという質問サイトでよく見かける。
RubyのCode Golfはこちらの記事。
JavaSprict
for(let i = 1; i <= 100; i++){
if (i % 15 === 0){
console.log("FizzBuzz");
} else if (i % 5 == 0) {
console.log("Buzz");
} else if (i % 3 == 0) {
console.log("Fizz");
} else {
console.log( i );
}
}
JavaScriptのCode Golfはこちらの記事。
Go
package main
import "fmt"
func main(){
for i := 1; i < 101 ; i++ {
if i % 15 == 0 {
fmt.Println("FizzBuzz")
} else if i % 3 == 0 {
fmt.Println("Fizz")
} else if i % 5 == 0 {
fmt.Println("Buzz")
} else {
fmt.Println(i)
}
}
}
Googleが開発した言語。標準ライブラリが非常に充実している言語とも。
この記事ではRustの標準ライブラリは小さいのかを検証しているが、おまけのほうでC++、Go、Python、Rust、Scalaの標準ライブラリのソースコード行数を検証している。「Goの標準ライブラリはすごく充実している」という印象とも一致します。
Python3
for i in range(1,101):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
他の言語に比べて簡略的である。これが愛される理由だろうか。
ちなみに変数名は日本語にすることも可能。なでしこっぽくできる。
for 変数 in range(1,101):
if 変数 % 15 == 0:
print("FizzBuzz")
elif 変数 % 3 == 0:
print("Fizz")
elif 変数 % 5 == 0:
print("Buzz")
else:
print(変数)
Python2
for i in range(1,101):
if i % 15 == 0:
print "FizzBuzz"
elif i % 3 == 0:
print "Fizz"
elif i % 5 == 0:
print "Buzz"
else:
print i
printの構文はpython3とどっちのほうがいいのだろうか?
Python2のCode Golf
Swift
for n in 1...100 {
if n % 15 == 0 {
print("FizzBuzz");
}else if n % 5 == 0 {
print("Buzz")
}else if n % 3 == 0 {
print("Fizz")
}else{
print(n)
}
}
MacとiOSのアプリで使われている言語。
詳しい説明はAppleの公式サイトで。
いろんな方法でFizzBuzzを解いている記事。
FizzBuzzをいろいろな方法で解いている記事。
for i in 1...100{print(i%15<1 ?"FizzBuzz":i%3<1 ?"Fizz":i%5<1 ?"Buzz":"\(i)")}
Swift, 77 bytesより引用。
GDScript
func _ready():
for i in range(1,101):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
Godotで使える専用言語GDScript。
Pythonをベースにしている言語、これのシンタックスハイライトも代わりにpythonで行っています。
C#を使うのとGDScriptを使うの、どっちがいいのだろうか?
なでしこ3
Nを1から100まで繰り返す
もし、N%15=0ならば「FizzBuzz」と表示。
違えば、もし、N%3=0ならば「Fizz」と表示。
違えば、もし、N%5=0ならば「Buzz」と表示。
違えば、Nを表示。
ここまで。
公式のFizzBuzz問題から(N%3=0)かつ(N%5=0)
をN%15=0
に変更し引用。
日本語でプログラムのコードを作れる言語。
Scratchで教えるかなでしこで教えるかの派閥がありそう。あるのかな?
ちなみに、お嬢様言葉でコーディングを行う記事がありましたわ~。
Scratch
MITのScratch。せっかく、小学生からはじめるわくわくプログラミングにFizzBuzzがあるなら打ってしまえと。コードの形は違いますが。
一秒表示するコメント表示でFizzBuzzとFizzとBuzzと数値を表現しています。
APL(A Programming Language)
{⍵∨3|⍵:⍵∨5|⍵:'FizzBuzz' ⋄ 3|⍵:'Fizz' ⋄ 5|⍵:'Buzz' ⋄ ⍕⍵}¨1+⍳100
{⍵∨3|⍵:'FizzBuzz'⋄3|⍵:'Fizz'⋄5|⍵:'Buzz'⋄⍕⍵}¨1+⍳100
{⍵∨'Fizz'∧3|⍨⍵:'Buzz'∧5|⍨⍵:,⍕⍵}¨1+⍳100
ChatGPTで出力したコードです。なので動かんかもしれない。実行環境がないので動作チェックも不可能。
1960年くらいの言語。数学の表記法に影響を受けているだけあって、かなーり独特な記法を行う。
プログラムの動きはなんとなく分かったのだが、ネットで調べてもAPLの情報がまったくないからどうしようもねぇ。
ちなみに、AIチャットでほかにないかと聞いたら出てきた言語。今も使われているのだろうか?
Hexagony
= ? 3 } ) "
. \ > % ' 5 ?
\ F \ B ; u ; "
} " / ; d ' % < >
\ g 4 / ! { { \ } .
% < @ . > " ' . < > ,
} / $ { ; ; z ; i ;
z ; ; $ / < > ? {
$ / " . / _ . .
. . . . . . .
. . . . . .
Befungeが長方形なら、Hexagonyは六角形にコードを配置する言語・・・なのだが訳が分からない。
ちなみに上記のコードはCode Golfのコードを六角形にしたようだが、よく分からない。下の記事に詳しい説明があるのでそちらを参考にすること。
HexagonyのCode Golf記事
上の記事に貼られているURLと同じ、別の作者の丁寧な説明URL:Hexagony, 91 bytes
なお、AtCoder に登録したら解くべき精選過去問 10 問を Hexagony で解いてみた(言語解説編)という記事があるので、言語仕様を知りたいならこちらを。
Chef
Curry Chicken Soup for FizzBuzz
Take 100 slices of Chicken
Bake the Chicken at 350 degrees for 25 minutes
Mix in 1 cup of Fizz
Mix in 1 cup of Buzz
Pour the soup into 100 bowls
Go to the kitchen and start cooking
Take the first bowl
If the contents of the bowl is divisible by 3 and 5
Say FizzBuzz
Else If the contents of the bowl is divisible by 3
Say Fizz
Else If the contents of the bowl is divisible by 5
Say Buzz
Else
Say the contents of the bowl
Take the next bowl
If there are no more bowls
Stop cooking
Serve the soup when done
ChatGPTで出力したコードです。なので動かん(検証済み)。
Hello Worldとフィボナッチ数列を出力するコードはありました。そして言語仕様を分かりやすくまとめてくれていました。先行者に感謝。 修正する気力があれば修正したい。Ook!
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook. Ook? Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook? Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook? Ook? Ook! Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook. Ook? Ook. Ook? Ook! Ook! Ook! Ook? Ook! Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook? Ook! Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook. Ook. Ook? Ook. Ook! Ook? Ook! Ook? Ook! Ook! Ook? Ook! Ook. Ook? Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook? Ook! Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook? Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook! Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook! Ook! Ook? Ook!
Brainfuckのコードを置き換えた言語。チンパンジーでも読める言語が売りなそうで。
このコードはBrainfuckのコードをそのまま置き換えています。多分動く、はず。
Ook!とはどういう言語は詳しく知りたいなら下記の記事を読んでください。記事の場所を知っている人は驚くかもしれません。
ちなみに、下の上記以外の他言語にBrainfuckのURLがあります。そこから参照しています。別の派生もなかなかに面白いです。
GolfScript
100,{)..3%!'Fizz'*\5%!'Buzz'*+\or}%n*
Code Golfのために作られた言語。言語の仕様上どうやっても同じになるのでこちらからそのままコピペ参照。
GolfScriptのCode Golf記事
gs2
f
Code Golf専用のプログラム言語。
仕組みとしては、内部関数を呼び出すためのコードです。
gs2のCode Golf記事
gf2のGithub。言語仕様はこちら。
上記以外の他言語
FizzBuzzを1byteで実装する
Zig:多言語FizzBuzzチャレンジ4日目:Zig
SmailBasic:プチコン3号 SmileBASIC コミュニティ
ActiveBasic:時代遅れひとりFizzBuzz祭り ActiveBasic編
FizzBuzz:プログラミング言語 FizzBuzz
FizzBuzzLang:FizzBuzzを書くためだけに作った言語、FizzBuzzLang
Brainfuck:FizzBuzz を Brainfuck で書いてみた
Whitespace:WhitespaceでFizzBuzz(207bytes)
Befunge:BefungeでFizzBuzz[追記あり]
TrumpScript:トランプ氏をイメージしたプログラミング言語 TrumpScriptでFizzBuzz
Shakespeare:FizzBuzzShakespeare
Vim:vimでfizzbuzzをやってみた
FizzBuzzではなくHelloWorldだが気にするな
Ikura:プログラミング言語「Ikura」を作ってみた。
コミュ障プログラミング言語:コミュ障プログラミング言語で遊んでみた(公式サイトはリンク切れ)
Nyaruko:名状しがたいプログラミング言語のようなもの Nyaruko
これらはすべてBrainfuckの置き換えです。面白いことできるね。
コードの説明
実際のところ、全ての言語で最初のコードはfor文とif文で説明できるように選んでいる(gs2とかは例外中の例外)。
#include<stdio.h>
int main(void)
{
for(int i=1;i<101;i++){
if(i%15==0){
printf("FizzBuzz\n");
}
else if(i%3==0){
printf("Fizz\n");
}
else if(i%5==0){
printf("Buzz\n");
}
else{
printf("%d\n",i);
}
}
}
コードの通り、C言語で説明をする。
#include<stdio.h>
関数の定義。これがなければprintf
もscanf
も使えない。
おなじまいとよく言われているが、指定先にあるプログラムファイルの関数を読みだしているだけである。別の言語に置き換えるとPythonのimport
やC#のusing
にあたる。
最近の言語は<stdio.h>
に類似する関数が最初から入っていることが多くなった印象がある。小さいメモリから脱却して、より多くのメモリを使用できるから最初から読み込ませようということかな。
void main(){}
システムの呼び出しでmain関数を実行する。
実際のところ、プログラムの実行を行ったときに最初に呼び出される場所と考えてよい。エントリーポイントと呼ばれている。
インタプリタ言語でもmainを呼び出してはいるのだが(後述)、動作の基本上、上からコードを読んでいくという流れになっている。
例として、Pythonの実行では、コードの実行時に__name__
という変数に__main__
が入る。そもそも__name__
はモジュールの名前が入るが、自分自身を実行している場合には、__main__
が入るという仕様になっている。
したがって、Pythonに準するmainはこのような形になる。
if __name__ == "__main__":
pass
そのため、これの後ろに関数を設置したとしてもモジュールとして読み込まない限りは読み込んでくれないようである。
for(int i=1;i<101;i++)
繰り返し処理を行う文。今回はfor
を使用したが、他にはWhile
や再帰関数など様々な手法が存在する(C言語にはGOTO文というものがあってだな)。
C言語のように型を明記するのもあれば、Pythonのように暗記するのもある。
for i in range(1,101,1)
しかしながら、for()
の中もrange()
の中も順番は変わらず、同じ感覚で使えるのはありがたい。
FOR I = 1 TO 100
BASICではその値まで繰り返すとのことなので、101ではなく100を代入する。なぜこっちの仕様にならなかったのだろうか。
if(i % 15 == 0){}
演算に用いる記号は昔から変わらない。
実際、Perlの入力に用いた本が1995年出版だったが演算子に違いはなかった。
今回は商の余りを返す演算子%
を使用している。
else if(i % 3 == 0){}
else
とif
を組み合わせる条件式。先ほどのif
が条件に合わなければ順に処理していく。
elif i%3==0
elsif i%3==0
Pythonはまだ分かる。だが、Rubyのelsif
はなんなんだ。なんでこうなった?
else{}
先ほどのif
及びelse if
にも条件が一致しなかった場合、どれにも該当しない場合に実行する。
なお、else
がないとこのような動作になる。
i = 15
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
#出力結果
#FizzBuzz
i = 15
if i % 15 == 0:
print("FizzBuzz")
if i % 3 == 0:
print("Fizz")
if i % 5 == 0:
print("Buzz")
#出力結果
#FizzBuzz
#Fizz
#Buzz
if
の処理は上から順に一致するか確認していき、一致したところで処理を行いif
の外へ出るという動作をしている。
そのため、if
を分断すると、すべての条件に一致するため、三つの文字列が出力されてしまう。
printf("FizzBuzz");
ターミナルに文字列を出力する。これを標準出力と呼ぶ。
最近の言語ではそのままprint
で入力する言語が多くなってきた。
Rustのprintln!
、エクスクラメーションマークはなぜあるのでしょうかねぇ。マクロだとしてもねぇ。めんどうなのよ。
これらを組み合わせると先ほどのFizzBuzzのコードが完成する。
お疲れさまでした。
また、先ほどのコードでは15の場合はFizzBuzzと表記したが、別にFizzとBuzzを両方出力すればいいのである。Code Golfもそんな動きだしね。
for i in range(1,101):
if i % 3 == 0:
print("Fizz",end="")
if i % 5 == 0:
print("Buzz",end="")
if not i % 3 == 0 and not i % 5 == 0:
print(i,end="")
print()
人工知能で遊ぼう
ChatGPTにコードを入れてどの言語かを聞くという遊びをToggeterで見ました。記事の内容は別の言語に変換ですが。
ということでいろいろやってみましょう。
Python2
- Copilot
「このコードはPythonのコードです。このコードは有名なプログラミングの問題、FizzBuzzを解くものです。1から100までの数字を順に出力し、その数が3で割り切れる場合は"Fizz"、5で割り切れる場合は"Buzz"、15で割り切れる場合は"FizzBuzz"と出力します。それ以外の数はそのまま出力します。この問題はプログラミングの基本的な制御構造を理解しているかを確認するためによく使われます。このコードはPython 2のバージョンで書かれています。Python 3では、print関数を使う際には括弧が必要です。例えば、print("FizzBuzz")のようになります。この違いはPython 2とPython 3の間の主な違いの一つです。この問題を解くことで、プログラミングの基本的な概念を理解していることが確認できます。この問題は、プログラミングの初心者にとっては良い練習問題になります。また、経験豊富なプログラマーにとっては、新しい言語を学ぶ際の良いスタート地点にもなります。」
しっかりPython2と認識していますね。優秀。
COBOL
- リートンのさむら
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 99 VALUE 1.
PROCEDURE DIVISION.
MAIN-ROUTINE.
PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > 100
IF COUNTER DIVIDED BY 15 = 0 THEN
DISPLAY 'FizzBuzz'
ELSE
IF COUNTER DIVIDED BY 3 = 0 THEN
DISPLAY 'Fizz'
ELSE
IF COUNTER DIVIDED BY 5 = 0 THEN
DISPLAY 'Buzz'
ELSE
DISPLAY COUNTER
END-IF
END-IF
END-IF
END-PERFORM.
STOP RUN.
さすがに酷だったか?と思ったら比較的綺麗に出力。
しかしさすがにエラー。
Main.cob: 25: warning: line not terminated by a newline
Main.cob: in paragraph 'MAIN-ROUTINE':
Main.cob: 11: error: 'DIVIDED' is not defined
Main.cob: 11: error: invalid expression
Main.cob: 11: error: syntax error, unexpected BY
Main.cob: 14: error: 'DIVIDED' is not defined
Main.cob: 14: error: invalid expression
Main.cob: 14: error: syntax error, unexpected BY
Main.cob: 17: error: 'DIVIDED' is not defined
Main.cob: 17: error: invalid expression
Main.cob: 17: error: syntax error, unexpected BY
エラーの内容を投げたのだが、さすがに無理そうです。
IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZBUZZ.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 99 VALUE 1.
01 REMAINDER PIC 99.
PROCEDURE DIVISION.
MAIN-ROUTINE.
PERFORM VARYING COUNTER FROM 1 BY 1 UNTIL COUNTER > 100
DIVIDE COUNTER BY 15 GIVING REMAINDER REMAINDER
IF REMAINDER = 0
DISPLAY 'FizzBuzz'
ELSE
DIVIDE COUNTER BY 3 GIVING REMAINDER REMAINDER
IF REMAINDER = 0
DISPLAY 'Fizz'
ELSE
DIVIDE COUNTER BY 5 GIVING REMAINDER REMAINDER
IF REMAINDER = 0
DISPLAY 'Buzz'
ELSE
DISPLAY COUNTER
END-IF
END-IF
END-IF
END-PERFORM
STOP RUN.
エラー起きました。当たり前ですね。COBOL、恐るべし子っ!
「COBOLで15引く7を実行するコードを作成してください。」とか単純的なコードであれば可能でした。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBTRACT-NUMBERS.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 NUM1 PIC 9(2) VALUE 15.
77 NUM2 PIC 9(2) VALUE 7.
77 RESULT PIC 9(2).
PROCEDURE DIVISION.
SUBTRACT NUM2 FROM NUM1 GIVING RESULT.
DISPLAY 'RESULT: ' RESULT.
STOP RUN.
そもそもCOBOLの出力が可能な時点で十分にすごいのよ・・・。
Python3
- リートンのさむら
for i in range(1, 101):
if i % 3 == 0 and i % 5 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
暗記PowerShell -> Rust
可能。めっちゃきれいなコードだった。
for i in 1..=100 {
if i % 3 == 0 && i % 5 == 0 {
println!("FizzBuzz");
} else if i % 3 == 0 {
println!("Fizz");
} else if i % 5 == 0 {
println!("Buzz");
} else {
println!("{}", i);
}
}
- 私
なぜPowerShellと判断したのでしょうか?理由を聞かせてください。
- さむら
そうですな、私がPowerShellと判断した理由を説明させていただきます。
提示されたコードの構文から、以下の点でPowerShellスクリプトであると考えました。
変数の前にi) がついている (
比較演算子が-ltや-eqと、通常の<や==ではない
echoが出力の手段として使われている
ブロックの開始と終了がカッコ{}ではなく、改行で区切られている
Scala -> Java
可能。
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
- 私
なぜScalaだと判断できたの?
- さむら
for(i <- 1 to 100) の構文 - これは Scala のレンジ記法に似ていると感じました
println() の使用 - Scala でよく使われる関数です
条件分岐の構造 - if-else if-else の形式が Scala らしいと思いました
かんそー
人工知能で遊ぶの結構面白い。
あとがき
FizzBuzz問題は順次、分岐、反復の基本を押さえて始めてできるプログラムのため、初心者向けであり技量の基準と言われていると。そう聞かれたらなるほど納得はする。が、しかしな、少なくともPythonで割り算の処理したときに出力がfloatになる現象での基準、てめーはダメだ。
ちなみにこの記事を打っている時、小学生からはじめるわくわくプログラミングという昔販売されていた小学生用のScratch本なのだが、「算数」の項目で出題されていた(3.0対応の最新版にあるかどうかは知らない)のを思い出した。
それほどまでにFizzBuzzは有名な問題なのだろうか(有名です)。
ちなみに昔、「いろんな言語でプログラムができるかを聞くのであれば、FizzBuzz問題をいくつのコードで実装できるかを聞け」と教わったことがあります。
いちおう「ここはどのような処理をしているのかを聞くのも重要だ」も言われたが・・・どうなんだろうか。他のコードでは「偶数奇数判定」「素数判定」「フィボナッチ数列」「結果を配列にして複数出力」と言われました。
今まで入力してきたコードを適当に振り返れるだけ振り返っていきましょう。
C言語は今まで長く触れてきた言語かなと。いままでminGWでコンパイルしてきましたが、WSLやclでのコンパイルができるようになってずいぶんと楽になった印象(今はclでやってます)。
C++。すごくむずかしいと思ったけど、慣れれば案外難しくない言語。おそらく、アップデートで使いづらかった部分が改善されているのかもしれない。昔はそうとう読めたものじゃなかったと聞くしね。
それでも、多重継承だったりポインタ操作だったり、意味わからん手法が沢山あるからやっぱり嫌いな言語。
C#。UnityだったりGodotだったりで出番があります。学ぶことはないと思ってたのに。ちなみに、Windowsであれば.NETを使ってコンパイルできます。
Rust。気に入っている言語です。プログラムの第二言語ではなく第一言語にしたいくらいです。( ^ω^)・・・Code Golf、やってみようかな。AtCoderが先か。
D言語。この記事の作成中に見つけた言語です。Rustとはまた違った面白さがありそうですね。しかも今までのC言語の資産(知識やコード)が使えるのはとても強い、学びやすかったのもよかったので、Rustと同時に学習をしていきたい言語。
ちなみに、AtCoderでD言語の使い手がまったくいなさそうだったので、D言語でやっていくのもありそう。
Nim。どこかで知った言語。Pythonの実行速度が遅いからいろいろ調べたような記憶。ファイル操作らへんまでやって投げているからあまり響かなかった言語かなぁ。
Mojo。最近注目を浴びている言語。D言語がC言語と高い互換性を持つように、MojoはPythonと高い互換性を持っている言語です。なので、機械学習の界隈ではいろいろ研究されているそうです。MacとLinuxはあるのですが・・・Windows版来ないかなぁ。
Java。嫌いです。以上。でもMinecraftのJava版は好きです。
JavaSprictは一番嫌いな言語です(自己紹介)。一応ちょいとはできますがね。
BASIC。昔の言語。
派生としてプチコン専用のSmailBasicがあるみたいですが、あれ使った人に聞きたいです。使いやすかったですか、あれ。
昔の数学の教科書を読んでいると、たまーに後ろのほうにあるんですよね、BASICのコード。図書館にでも行けばもっと多くのコードが見つかるでしょうか。まとめてみたい。
SmallBasic。何気に三番目に触れた言語です。本に3Dグラフィックの内容とかあったけど小学生だとなんとなくしか理解できていませんでした。今だったら分かる。
VisualBasic。Visual StdioでWindowsアプリケーションを作る時に使いました。まぁ、使いやすかったです。思う部分はありますが、それでもJavaよりかは最高に使いやすかったです。
COBOL。銀行のシステムで使われていると聞く恐ろしい言語。実際のところ、昔の書き方がアレなだけで、言語仕様は・・・方言も悪さをしていそうだ。
今後学びたいという感じではありますが、いかんせん教材がない。こういうところもCOBOLの難読化につながる要因なのかもしれない。
いちおう大学の図書館にCOBOL関連の本があるので暇ができたら読んでみたい。
Bash。WSLを使う前にLinuxを使っていたので使えますが、だいたい忘れています。このコードを打つ時も昔使った資料集を使いました。
Windowsバッチファイル。二番目に学んだ言語。PowerShellを使う前はこれを使っていましたが、いかんせん難しい印象しかありません。
PowerShell。Pythonを使う前はこれをインタプリタ言語の主力として使っていました。今でもちょっとした処理をしたいときやWindows特有のことをしたいときは使います。
Perl。名前だけ知っている形でしたが、今回の記事を書くにあたって、かなりさらっと読みました。パット見た感じ、Pythonの理念というよりか思想のもとになった書き方がいくつか見受けられた感じでした。
変数名の前に$
をつける構文はBashやBatに近いものが、for文の作りがC言語系統であることからも、当時ではかなり革新的だったかと思うところが節節に見受けられました。
こう鑑みると、言語仕様が昔から変わらないのはなんて幸せなことだろうか。
Lua。昔のゲームエンジンを見ていると、どうもLuaを指定している感じだったのが印象的だった言語です。C++に代わる言語として使われていたのでしょうか。
Python。この言語に初めて触れた時は扱いずらい言語でした。が、使っていくごとに利便さを感じ、今では結構使う言語になっています。Pythonを使い始めて、printの中にif文を入れたりfor文を一行にまとめたり、結構独特な構文が多いですが、意外と分かるもんだ。
しかし、言いたいことがあります。・・・elif
よ、おお、なぜそなたはelif
なのだ?それはね?それはー?それはね?それはー?Perlとかに影響受けたから。
Swift。正直iOSのアプリを開発したことがないので、どういう言語なのかが良く分からない。でも、Macを使う機会は今後そんなにないだろうし、覚えなくてもいいか(おい)。
GDSprict。Godot専門の言語です。Pythonのように作れるのが思いのほか便利なので、C#よりかはこっちが出番多いかな。
なでしこ。日本語でコードを打つのは小説を打つ感覚に似ていて少しだけ楽しかった。でも、二分三秒くらいで飽きた。しかし、教育現場で使える言語だろうか?今だったら日本語で変数を作れるPythonでいいのかもしれない。
Scratch。言語と言っていいのか分かりませんが、最初に学んだ言語です。
正直、教育現場ではこれを使っとけばいいのです。小学校のころから無駄にコードを打たせないで、プログラムの仕組みから段階的に学ばせればいいのです(急な自己語り)。
gf2。発想が面白い。というよりCode Golfという内容を知るきっかけになった言語でもある。Code Golf的なコードをいろいろ考えていきたい。
ChatGPTで出力したコードはいつか自ら修正したほうがいいかな。
ちなみに人工知能に「他の言語なんかある?」と聞いたところ、APLが出力されました。あとはChuckNorris、Shakespeare Programming Language、Chef、Befunge、TrumpScriptとネタ言語が出てきて愉快でした。ほかはWhitewhite(!?)です。Whitespaceの誤字です。実行できなかったので、コードは間違っていました。
とりあえず、APL、Chefの二つはChatGPTの出力なのでほぼ動かないかと思われます。お気を付けて。
今までに学習した言語はC、C++、C#、BASIC、SmallBasic、VisualBasic、Bash、PowerShell、Java、JavaSprict、Python3、GDSprict、Rustですが、しっかりと使えるのは、PowerShell、C、Python、Rust((; ・`д・´)<Rustは学習中でしょうがっ)といったあたりでしょうか。
こう見ると一貫性がなさそうですが、オブジェクト指向より関数型言語のほうが性に合っているというよりか、結構得意な印象が見えたような気がしなくもないです。
今は課題で使うPythonと、趣味のRustとD言語、ゲーム開発でのGDSprictとC#を中心に学んだほうがよさそうかな。COBOLもやってはみたいですが、Rustより学習コスト高くないか。
昔のプログラミング本を読んでいくと、言語仕様の思想が書かれていることが多かったという感じがする。それとも最近の入門向けはそこまで書かないのだろうか。
それから、基礎的な内容は変わらずに残っているのがよーく分かりました。分かりましたけど、Python2とPython3、それからPerlの仕様変更結構大きくないですかね。
それからFizzBuzzを調べていると、ズンドコキヨシというなんとも愉快なコードがありました。ので、今度はなにかの言語で練習として作ってみます。下記の記事で言語別にまとめてくれています。
ちなみにこの記事の文字数、4万文字だそうです。なんだこの数値は。そりゃ執筆も校正も途中で力尽きるわ。
こんな記事を打つならAtCoderやっときゃよかったかな。
FizzBuzz記事のおすすめまとめ
多言語FizzBuzz Advent Calendar 2022
1, 2, Fizz, 4, Buzz
fizzbuzz-polyglot
FizzBuzz関連でおすすめな記事
FizzBuzz Zero ―― 人類の知識なしでFizzBuzzをマスターする
逆FizzBuzz問題 (Inverse FizzBuzz)
FizzBuzzとは関係ないがこの記事と関連してそうな記事
Discussion