色んな言語でidol++して「大石泉すき」と出力する

この記事は [「大石泉すき」アドベントカレンダー](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki) 3日目の記事です。
色んな言語でidol++したいと思います。
どうせ被るなら全方位に被せていけ!というモチベーションでやりました。すいません。

# やること
変数 **idol = 0** を **izumi = 1111** に到達するまで **idol++** して結果を出力します。
出力が一行だと寂しいので100の倍数でも出力しています。

# 諸注意
インクリメント演算子がない言語、++が違う動きをする言語もありましたので併記します。

~~環境構築しんどいので~~初めての方がすぐに試せるよう動作確認はRepl.itで行ないました。
[Repl.it - The world's leading online coding platform](https://repl.it/)
コードのあとにリンクを貼っておくので知らない言語にも是非触れてみてください。


各言語でなるべく同じ動きをするように努めましたが諸事情により一部で再帰していたりします。
{Clojure => whileがなかった, JavaScript => 楽しくなってしまった}

僕自身初挑戦の言語ばかりなので優しいマサカリをお待ちしております。
(この言語ではこう書くのが主流だよ, ifブロックは改行しろ, 等々)

また、各コードの実行結果は下記のようになります。

![alt](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408555/5d78f662-1bd2-150a-56a5-ece8e58269f4.png)


それではやっていきましょう。

#idol++できる言語

## C

```c:main.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;
}
```

[Repl.it - OhishiIzumiSukiC](https://repl.it/@m19e/OhishiIzumiSukiC)

## C# 

```cs:main.cs
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++

```cpp:main.cpp
#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";
}
```

[Repl.it - OhishiIzumiSukiCPP](https://repl.it/@m19e/OhishiIzumiSukiCPP)

## Go

```go:main.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)
}
```

[Repl.it - OhishiIzumiSukiGO](https://repl.it/@m19e/OhishiIzumiSukiGO)

## Java

```java:Main.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);
  }
}
```

[Repl.it - OhishiIzumiSukiJAVA](https://repl.it/@m19e/OhishiIzumiSukiJAVA)

## JavaScript

```js:index.js
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}到達! 大石泉すき`)
```

[Repl.it - OhishiIzumiSukiJS](https://repl.it/@m19e/OhishiIzumiSukiJS)

## Kotlin

```kotlin:main.kt
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](https://pl.kotl.in/Juf4jcu56)

## PHP

```php:main.php
$idol = 0;
const IZUMI = 1111;

while (true) {
  if ($idol == IZUMI) break;
  if ($idol && !($idol % 100)) echo "$idol\n";
  $idol++;
}

echo "{$idol}到達! 大石泉すき\n";
```

[Repl.it - OhishiIzumiSukiPHP](https://repl.it/@m19e/OhishiIzumiSukiPHP)

# idol++したかった言語

## Clojure

**inc idol**

```clojure:main.clj
(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)
```

[Repl.it - OhishiIzumiSukiCLJ](https://repl.it/@m19e/OhishiIzumiSukiCLJ)

## Haskell

**succ idol**
Haskellに++はありますがインクリメントではなくリスト結合になっています。

```hs:main.hs
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 "到達! 大石泉すき"
```
[Repl.it - OhishiIzumiSukiHS](https://repl.it/@m19e/OhishiIzumiSukiHS)

## Python

**idol += 1**

```python:main.py
idol = 0
izumi = 1111

while True:
  if idol == izumi: break
  if idol != 0 and idol % 100 == 0: print(idol)
  idol += 1

print("%d到達! 大石泉すき" %idol)
```

[Repl.it - OhishiIzumiSukiPY](https://repl.it/@m19e/OhishiIzumiSukiPY)

## Ruby

**idol += 1**

```rb:main.rb
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)
```

[Repl.it - OhishiIzumiSukiRB](https://repl.it/@m19e/OhishiIzumiSukiRB)

## Rust

**idol += 1**

```rs:main.rs
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);
}
```

[Repl.it - OhishiIzumiSukiRS](https://repl.it/@m19e/OhishiIzumiSukiRS)


# 迂闊

[「大石泉すき」アドベントカレンダー](https://qiita.com/advent-calendar/2019/ohishi-izumi-suki)2日目、
[cobot00](https://qiita.com/cobot00)さんの[Rubyで「大石泉スキ」を標準出力する & idol++] (https://qiita.com/cobot00/items/38b8109a84c55827ad17)にて
[Rubyでidol++](https://qiita.com/cobot00/items/38b8109a84c55827ad17#irb%E3%81%8B%E3%82%89%E3%81%AE%E5%AE%9F%E8%A1%8C)されていました。

こういう抜け穴探すような実装大好きなので勉強になりました。ありがとうございます。
(半日格闘してもHaskellの++には勝てませんでした(どなたか教えてください))