この記事は 「大石泉すき」アドベントカレンダー 3日目の記事です。
色んな言語でidol++したいと思います。
どうせ被るなら全方位に被せていけ!というモチベーションでやりました。すいません。
やること
変数 idol = 0 を izumi = 1111 に到達するまで idol++ して結果を出力します。
出力が一行だと寂しいので100の倍数でも出力しています。
諸注意
インクリメント演算子がない言語、++が違う動きをする言語もありましたので併記します。
環境構築しんどいので初めての方がすぐに試せるよう動作確認はRepl.itで行ないました。
Repl.it - The world's leading online coding platform
コードのあとにリンクを貼っておくので知らない言語にも是非触れてみてください。
各言語でなるべく同じ動きをするように努めましたが諸事情により一部で再帰していたりします。
{Clojure => whileがなかった, JavaScript => 楽しくなってしまった}
僕自身初挑戦の言語ばかりなので優しいマサカリをお待ちしております。
(この言語ではこう書くのが主流だよ, ifブロックは改行しろ, 等々)
また、各コードの実行結果は下記のようになります。
それではやっていきましょう。
#idol++できる言語
C
#include <stdio.h>
#define IZUMI 1111
int main(void) {
int idol = 0;
while (1) {
if (idol == IZUMI) break;
if (idol && !(idol % 100)) printf("%d\n", idol);
idol++;
}
printf("%d到達! 大石泉すき", idol);
return 0;
}
C#
using System;
class MainClass {
public static void Main (string[] args) {
int idol = 0;
const int IZUMI = 1111;
while (true)
{
if (idol == IZUMI) break;
if (idol != 0 && idol % 100 == 0) Console.WriteLine (idol);
idol++;
}
Console.WriteLine ("{0}到達! 大石泉すき", idol);
}
}
C++
#include <iostream>
int main() {
int idol = 0;
const int IZUMI = 1111;
while (1) {
if (idol == IZUMI) break;
if (idol && !(idol % 100)) std::cout << idol << "\n";
idol++;
}
std::cout << idol << "達成! 大石泉すき\n";
}
Go
package main
import f "fmt"
func main() {
var idol int
const izumi = 1111
for {
if idol == izumi { break }
if idol != 0 && idol % 100 == 0 { f.Println(idol) }
idol++
}
f.Printf("%v到達! 大石泉すき", idol)
}
Java
class Main {
public static void main(String[] args) {
int idol = 0;
final int IZUMI = 1111;
while (true) {
if (idol == IZUMI) break;
if (idol != 0 && idol % 100 == 0) System.out.println(idol);
idol++;
}
System.out.printf("%d到達! 大石泉すき\n", idol);
}
}
JavaScript
const recursion = (idol, izumi) => {
if (idol === izumi) return idol
if (idol && !(idol%100)) console.log(idol)
idol++
return recursion(idol, izumi)
}
const result = recursion(0, 1111)
console.log(`${result}到達! 大石泉すき`)
Kotlin
fun main() {
var idol: Int = 0
val izumi: Int = 1111
while(true) {
if (idol == izumi) break
if (idol != 0 && idol % 100 == 0) println(idol)
idol++
}
println("%d到達! 大石泉すき".format(idol))
}
何故かRepl.itがエラー吐いてたのでここだけKotlin Playgroundです。
(repl作った段階では動いてました。betaだから?)
Kotlin Playground: Edit, Run, Share Kotlin Code Online
PHP
$idol = 0;
const IZUMI = 1111;
while (true) {
if ($idol == IZUMI) break;
if ($idol && !($idol % 100)) echo "$idol\n";
$idol++;
}
echo "{$idol}到達! 大石泉すき\n";
idol++したかった言語
Clojure
inc idol
(defn recursion [x y]
(loop [idol x izumi y]
(if (and (not= idol 0) (== (rem idol 100) 0))
(println idol))
(if (= idol izumi)
idol
(recur (inc idol) izumi))))
(def start 0)
(def goal 1111)
(def result (recursion start goal))
(printf "%d到達! 大石泉すき" result)
Haskell
succ idol
Haskellに++はありますがインクリメントではなくリスト結合になっています。
import Data.List
recursion idol izumi list = do
if idol == izumi
then list
else recursion(succ idol)(izumi)(list ++ [succ idol])
recursion' idol izumi = recursion idol izumi []
filter100 list = filter (\x -> (mod x 100) == 0) list
(start, goal) = (0, 1111)
main = do
let result = recursion' start goal
let strList = map show (filter100 result)
putStrLn $ intercalate "\n" strList
putStr (show (last result))
putStrLn "到達! 大石泉すき"
Python
idol += 1
idol = 0
izumi = 1111
while True:
if idol == izumi: break
if idol != 0 and idol % 100 == 0: print(idol)
idol += 1
print("%d到達! 大石泉すき" %idol)
Ruby
idol += 1
idol = 0
izumi = 1111
while true
if idol == izumi
break
end
if idol != 0 && idol % 100 == 0
puts idol
end
idol += 1
end
printf("%d到達! 大石泉すき", idol)
Rust
idol += 1
fn main() {
let mut idol = 0;
let izumi = 1111;
loop {
if idol == izumi { break; }
if idol != 0 && idol % 100 == 0 { println!("{}", idol); }
idol += 1;
}
println!("{}到達! 大石泉すき", idol);
}
迂闊
「大石泉すき」アドベントカレンダー2日目、
cobot00さんの[Rubyで「大石泉スキ」を標準出力する & idol++] (https://qiita.com/cobot00/items/38b8109a84c55827ad17)にて
Rubyでidol++されていました。
こういう抜け穴探すような実装大好きなので勉強になりました。ありがとうございます。
(半日格闘してもHaskellの++には勝てませんでした(どなたか教えてください))