2019年8月11日頃にTwitterで「1から100の偶数の和を求める方法」(ワンライナー)が話題になったので
各言語ごとにまとめてみました。
私の独断と偏見ですが
「2550を直接出力するもの」「公式を使って総和を計算するもの」は
除外しています。
あくまでそれぞれのプログラミング言語の特色が現れるものをまとめたいと考えています。
以前あったズンドコきよしのまとめみたいなノリです。
https://qiita.com/shunsugai@github/items/971a15461de29563bf90
編集リクエスト歓迎です。
新しいワンライナーはコメント欄ではなく編集リクエストにて追加していただけると助かります!
---
8/15 11:30
コメント欄を取り込み&新たにツイートを拾いました。
---
#発端のツイート
まにゃです。
— まにゃpy@Python解説の猫 (@uuyr112) August 11, 2019
いきなり問題!
ここまでのツイートを手がかりに
Pythonのfor文を使って1から100までの間の偶数の和を計算するソースコードを書いてみて下さい。
#Python
1から100までの偶数の和もPythonならたったの1行で書ける
— まにゃpy@Python解説の猫 (@uuyr112) August 11, 2019
result =sum(list([i for i in range(1,101) if i %2 == 0]))
(sumは組み込み関数なのでimportなしで使えます。)
とてもシンプルですね。Pythonなら複雑なコードもシンプルに。
そう、Pythonならね
上の改良版
result = sum(i for i in range(1, 101) if i % 2 == 0)
pythonで「1から100までの間の偶数の和を計算するソースコードを」
— ryotenabe (@ryotenabe) August 13, 2019
import numpy as np
print(sum(np.arange(2, 101, 2)))
これだと...あんまりコードの練習にならない...けど。
思いつき.
result = sum(range(0, 101, 2))
— 村内隆清 (@killykillymine) August 12, 2019
これで同じ解が得られて、しかもシンプルです。
rangeで生成できるものものはlistで生成したものと同じようにふるまいますが、listより一般的にメモリ効率が良いと言われています。
それはなぜかの解説をお願いします。
#Haskell
コンテクストわかんないけどHaskellなら
— Hideyuki Tanaka (@tanakh) August 13, 2019
main = print $ sum [2,4..100]
(sumは組み込み関数なのでimportなしで使えます。)
とてもシンプルですね。Haskellなら複雑なコードもシンプルに。
そう、Haskellならね。
Haskellなら、[2,4..100] みたいなリッチなのがなくても、
— Hideyuki Tanaka (@tanakh) August 13, 2019
main = sum $ filter even [1..100]
死ぬほどシンプルだし、evenがなかったとしても、
main = sum $ filter (\x -> x `mod` 2 == 0) [1..100]
sumがなかったとしても
main = foldl (+) 0 $ filter (\x -> x `mod` 2 == 0) [1..100]
#C
1から100までの偶数の和もCならたったの1行で書ける
— TokusiN (@toku51n) August 13, 2019
s;i;main(){for(;i<100;s+=i+=2);printf("%d",s);}
(printfは何故かincludeなしで使えます。)
とてもシンプルですね。Cなら複雑なコードもシンプルに。
そう、Cならね
100までの偶数の和の話をTLで見たのでCで。
— TEFSOM (@Si_SJ_MOSFET) August 13, 2019
int i,j=0;for(i=0;i<=100;i+=2)j+=i;
比較的お行儀良く書いてもこれで済む。
#LISP
1から100の偶数和
— 電池🍨🍬 (@QZTWE) August 13, 2019
(loop for a from 2 to 100 by 2 sum a)
1から100までの偶数の和、Common Lispだとこんな感じかな。
— こうじ (@mhkoji) August 13, 2019
(loop for i from 1 to 100 when (evenp i) sum i)
1から100までの偶数の和もCommon Lispならカッコ以外の記号を使わず書ける
— zick (実家箕面) (@zick_minoh) August 13, 2019
(loop for i from 1 to 100 if (evenp i) sum i)
(loopはANSI標準のマクロなのでそのまま使えます)
慣れないキー配列でもカッコのいちだけ覚えれば安心ですね。
1から100までの偶数の和をCommon Lispでも,たった一行で書ける
— Shigeru FUJITA (@shigerufujita) August 14, 2019
(loop for i from 1 while (<= i 100) when (oddp i) sum i)
loopマクロは強力なのですがLisp初心者にはお勧めしません... https://t.co/uvNZv5xLV7 pic.twitter.com/awBTIF86PL
#PHP
PHP はさりげなく関数が用意されてたりしますね。たまたまっぽい気もするけど。
— \助けよや/ (@yoya) August 13, 2019
echo array_sum(range(2,100,2)); # 1〜100の偶数の和
1から100までの偶数の和もPHPならたったの1行で書ける
— ウラル (@barley_ural) August 14, 2019
array_sum(range(2, 100, 2))
とてもシンプルですね。PHPなら複雑なコードもシンプルに。
そう、PHPならね
#C#
1~100までの偶数の和
— へまたいと (@Hematite777) August 13, 2019
var sum = Enumerable.Range(1,100).Where(x=>x%2==0).Sum();
ソラで書いたらスペルあってるか不安。Rangeの引数あってるか不安、Sumにselecterのオーバーライドあったか覚えてなくて不安。
1から100までの偶数の和もC#ならたったの1行で書ける
— Tadahiro Ishisaka (@ishisaka) August 14, 2019
var a = Enumerable.Range(1, 100).Where(n => n % 2 == 0).Sum();
まぁ今の言語ならだいたい1行で書けるんじゃないの。。。https://t.co/EPQ4wFmcCu
\--- コメント欄より C#のLINQでWhere使わないバージョンです。最近話題の1から100の偶数の和を計算するワンライナー、C#だとこんな感じかな。
— 🐄 👪ぬーぼー✈️🌧️ (@noobow) August 14, 2019
やはりLINQは便利。
Enumerable.Range(1, 100).Where(x => x % 2 == 0).Sum()
var sum = Enumerable.Range(1, 100).Sum(x => x % 2 == 0 ? x : 0);
#F#
1から100までの偶数の和もF#ならたったの1行で書ける
— りず (r.izumita) (@rizumita) August 13, 2019
let result = List.sum [0..2..100]
とてもシンプルですね。F#なら複雑なコードもシンプルに。
そう、F#ならね
こうですか?(0からなのでちょっとズルですけどw)
#Clojure
1から100までの偶数の和もClojureならたったの1行で書ける
— enk (@enk_enk) August 13, 2019
(reduce + (filter even? (range 101)))
(reduceは組み込み関数なのでimportなしで使えます。)
とてもシンプルですね。Clojureなら複雑なコードもシンプルに。
そう、Clojureならね
(apply + (range 0 101 2))
— あやぴー (@_ayato_p) August 13, 2019
#Ruby
こういうのはRubyがわりと強くて日本語の語順通りに「1から100までの 偶数の 和」の定義通りに書ける。
— reismann (@reismannnr2) August 13, 2019
puts (1..100).select(&:even?).inject(&:+)
1から100までの偶数の和もRubyならたったの1行で書ける
— hogeover30 (@hogeover30) August 13, 2019
result = (1..100).select(&:even?).sum
(sumは組み込み関数なのでimportなしで使えます。)
とてもシンプルですね。Rubyなら複雑なコードもシンプルに。
そう、Rubyならね
Ruby で 1 から 100 までの偶数の和を求める
— ICM7216 (@icm7216) August 13, 2019
even? でふるいにかける方法
(1..100).select(&:even?).sum
Enumerator::ArithmeticSequence オブジェクトを使う方法
(2..100).step(2).sum
数学的に解決する方法
2 * (1..100/2).sum
1から100までの偶数の和が1行で書けるよ。Ruby編。
— 宮崎ひび(がんばらない) (@hibi_myzk) August 14, 2019
(1..100).select(&:even?).reduce(&:+)
1から100までの偶数の和を (1..100).select(&:even?).sum って書けるのが Ruby のいいところだと思っている
— kdc518 (@kdc518) August 14, 2019
#Scala
1から100までの偶数の和もScalaならたったの1行で書ける
— smzst (@_smzst) August 13, 2019
val result = (for(i <- 1 to 100; if i % 2 == 0) yield i).sum
(sumは組み込みメソッドなのでimportなしで使えます。)
とてもシンプルですね。Scalaなら複雑なコードもシンプルに。
そう、Scalaならね
どうでもいいけど、1から100までの偶数の和、scalaだと (2 to 100 by 2).sum でいける
— かすてらふぃ (@cstl_fy) August 13, 2019
#PureScript
1から100までの偶数の和、試しにPureScriptで書いてみたが・・・importがアレだ
— 《ネルヤ》というニャオスの指輪 (@goldarn_ring) August 13, 2019
import Prelude
import Data.Array
import Data.Foldable
import Effect.Console
main = logShow $ sum $ filter (_ `mod` 2 == 0) $ 1 .. 100
#Swift
1から100までの偶数の和もSwiftならたったの1行で書ける
— むちむちイカクラーゲス (@ffguymac) August 13, 2019
print([Int](1...100).filter({(foo: Int) -> Bool in foo % 2 == 0}).reduce(0) {(a: Int, b: Int) -> Int in return a + b})
とてもシンプルですね。Swiftは頑張るしかない
そう、Swiftならね。
1から100までの偶数の和のSwift版。
— Tomoki Kobayashi (@temoki) August 13, 2019
(1...100).filter { $0 % 2 == 0 }.reduce(0, +)
strideだとこうなるけど from: 2 のところが気になる。偶数の始まりを定数で指定してるのは違うかなー。
stride(from: 2, through: 100, by: 2).reduce(0, +)
1から100までの偶数の和もSwiftならたったの1行で書ける
— りず (r.izumita) (@rizumita) August 14, 2019
let result = Set((1...100).map { $0 ^ $0 & 1 }).reduce(0, +)
とてもややこしいですね。Swiftなら複雑なコードも複雑に。
そう、Swiftならね
var a=0;for i in 1..<101{if i.isMultiple(of:2){print(i);a+=i}};print(a)
— Junji Suzuki (@jboysoft)
#Julia
なんだかわからないけど、100までの偶数の和を出力するのが流行ってるんですか?Juliaだと
— Hidemoto Nakada (@hidemotoNakada) August 13, 2019
println(sum(2:2:100))
ですかね。
#Perl
1から100までの偶数の和もPerlならたったの1行で書ける
— shckor (@shckor) August 13, 2019
perl -e ‘for(1..100){$s+=$_++%2*$_};print”$s\n”’
とてもシンプルですね。Perlなら複雑なコードもシンプルに。
そう、Perlならね
1から100までの偶数の和もPerlならたったの1行でコマンドラインから書ける
— y.say (@wake_up_kemeko) August 14, 2019
$ perl -E '$n+=$_ for grep {!($_%2)} 1..100;print$n'
(ほとんどのサーバーにPerlは入っています)
とてもシンプルですね。Perlなら複雑な処理もシンプルに。
そう、Perlならね
#bash
1から100までの偶数の和もbashならたったの1行で書ける
— T.MOTOOKA (@t_motooka) August 13, 2019
seq 100 | grep '[24680]$' | tr '\n' '+' | sed 's/\+$/\n/' | bc
とてもシンプルですね。シェル芸なら複雑なコードもシンプルに。
そう、シェル芸ならね
1から100までの偶数の和もBashならたったの1行で書ける
— シェル児 (@egpl0_sh) August 13, 2019
seq 0 2 100|paste -sd+|bc
(seq, paste, bcはCore utilsなのでapt installなしで使えます。)
とてもシンプルですね。Bashなら複雑なコードもシンプルに。
そう、Bashならね
\--- コメント欄より seq コマンドには -s オプションがありますので、1から100までの偶数の和もBashならたったの1行で書ける
echo {2..100..2}+ 0 | bc
とてもシンプルですね。Bashなら複雑なコードもシンプルに。
そう、Bashならね
$ seq -s+ 2 2 100 | bc
と書けます。また、bc コマンドの代わりに bash の arithmetic expansion を使って、
$ echo $(($(seq -s+ 2 2 100)))
とする事もできます。
#Java
偶数の和を一行で。Javaだってできるもん! と言いたいが標準のStreamがイマイチなのでJOOL(https://t.co/O6BYvxCgtq)頼み。
— yoh2 (@yoh2_sdj) August 13, 2019
public class Hoge{public static void main(final String[] args){System.out.println(org.jooq.lambda.Seq.rangeClosed(2, 100, 2).sum().get());}}
標準のみで算出
jshell> IntStream.rangeClosed(1,100).filter(i->i%2==0).sum();
$5 ==> 2550
ライブラリを使わずに書いてみました。
(jshell(Java9以降)で実行するということで…)
int result = java.util.stream.IntStream.rangeClosed(1, 100).filter(i -> i % 2 == 0).sum();
#Smalltalk
1から100までの偶数の和もPharo/Squeak Smalltalkならたった3つのメッセージを送るだけ
— sumim (@sumim) August 13, 2019
((1 to: 100) select: #even) sum
(sumは組み込みメソッドなのでそのまま使えます)
とてもシンプルですね。Pharo/Squeakなら複雑なコードもシンプルに書けて、IDEのサポートも手厚い
そう、Smalltalkならね https://t.co/LsYeVqfm4T
Pharo/SqueakでSmalltalkによる100までの偶数の和、美しいコードだ…
— キタミアキヤ@涼天環 (@K_akiya) August 13, 2019
((1 to: 100) select: #even) sumhttps://t.co/kMjDM6oVzO
#Elixir
Elixir で1から100までの偶数の和はこうなります。
— Susumu Yamazaki (@zacky1972) August 13, 2019
1..100 |> Enum.filter(& rem(&1, 2) == 0) |> Enum.sum
#Excel
\--- コメント欄より Excel/Power BIにおけるPower Queryでも何通りかできますね。(^^;1から100までの偶数の和をエクセルで計算
— はけた@ピボットテーブル×データ整形本 8月23日発売 (@excelspeedup) August 14, 2019
=SUMPRODUCT(ROW(A1:A100)*ISEVEN(ROW(A1:A100)))
List.Sum(List.Generate(()=>2,each _<=100,each _+2))
あとは、
List.Sum(List.Numbers(2,100/2,2))
とかですね。
---
「1から100の偶数の和を求めるワンライナー」
— Kou Excelが大好きだ! (@LoverExcel) August 14, 2019
遅ればせながら関数で。
=SUMPRODUCT((MOD(ROW(1:100),2)=0)*ROW(1:100))
---
行列積を使ったバージョン
=MMULT(MOD(COLUMN(B1:CW1),2),ROW(A1:A100))
#JavaScript
\--- コメント欄より JavaScriptは `[...Array(100).keys()].reduce((s,v) => ++v % 2 ? s:s + v,0)` のほうがちょっと短い? \---1から100までの偶数の和もJavaScriptならたったの1行で書ける
— 高梨ギンペイ (@ginpei_jp) August 14, 2019
Array.from({ length: 100 }, (_, i) => i + 1).reduce((s, v) => v % 2 ? s : s + v, 0)
(Arrayは組み込みオブジェクトなのでimportなしで使えます。)
とても(以下略)
再帰関数を使ったバージョン
(f=(x,y)=>(y<=100?f(x+(y%2?0:y),++y):x))(0,0);
#Dart
1から100までの偶数の和もDartならたったの1行で書ける
— 岡竜之介tech@最近はFlutter (@agajo_tech) August 14, 2019
main()=>print((List.generate(101,(i)=>i)).reduce((x,y)=>y%2==0?x+y:x));
(reduceは組み込み関数なのでimportなしで使えます。)
とてもシンプルですね。Dartなら複雑なコードもシンプルに。
そう、Dartならね
#Rust
Rustなら
— Hideyuki Tanaka (@tanakh) August 13, 2019
fn main() { println!("{}", (0..=100).filter(|i| i % 2 == 0).sum::<i32>()); }
クッソわかりづらい文法でノイズにあふれててそれほどシンプルでもないけど1行に書けるしよく見たらPythonと大して変わんないしPythonでいいならRustでいいじゃん(適当)
#R
コメント欄より
-----
Rなら。
sum(seq(2,100,2))
----
Rだとこう書けます。
— プログラマたんbot (@cppfriendsbot) August 14, 2019
library(purrr)
seq(1,100) %>% purrr::reduce(.f=function(s,x) if (x %% 2 == 0) (s+x) else s, .init=0)
NumPyのfrompyfunc, reduceでもそうですが、初期値0を明示するのは必須です。
「1から100の偶数の和を求めるワンライナー」まとめ https://t.co/WMOqGkcnY0 #Qiita
#elm
コメント欄より
List.range 1 100 |> List.filter (\x -> modBy 2 x == 0) |> List.sum
#VBA
1から100までの偶数の和もExcelVBAならたったの1行で書ける
— ことりちゅん@えくせるちゅんちゅん (@KotorinChunChun) August 14, 2019
Debug.Print Evaluate(Join(Filter([TRANSPOSE(ROW(1:100))/2], ".", False), "+")) * 2
とてもシンプルですね。ExcelVBAなら複雑なコードもシンプルに。
そう、ExcelVBAならね
1から100の偶数の和を求めるワンライナー「VBA版」
— はけた@ピボットテーブル×データ整形本 8月23日発売 (@excelspeedup) August 14, 2019
Dim i, j: For i = 2 To 100 Step 2: j = j + i: Next
普通すぎてつまらない。 https://t.co/fxpiL3SOCH
1から100の偶数の和を求めるワンライナー
— わえなび the Theory of Word-Excel (@waenavi_jp) August 14, 2019
VBAイミディエイトウィンドウ
s=0:for i=1 to 100:s=s+iif(i mod 2,0,i):next:?s
s=0:for i=1 to 100:s=s-(i mod 2=0)*i:next:?shttps://t.co/s7xkk0M3Nl pic.twitter.com/jhy0Z06Dyt
#Kotlin
コメント欄より
1から100までの偶数の和もKotlinならたったの1行で書ける
val result = (1..100).filter { it % 2 == 0 }.sum()
(filterとsumは標準ライブラリーの関数なのでデフォルトでインポートされるkotlin.collectionsパッケージの関数なのでimportなしで使えます。)
とてもシンプルですね。Kotlinなら複雑なコードもシンプルに。
そう、Kotlinならね
---
「1から100の偶数の和を求めるワンライナー」まとめ - Qiita https://t.co/zkel9IqqNR
— Concept of Love (@beatdjam) August 14, 2019
Kotlinがなかった
REPLじゃなけりゃこれが最短なのかな
fun main()=println((0..100 step 2).sum())
#SQL
おっと偶数の総和か彡(゚)(゚)
— gonsuke777 (@ora_gonsuke777) August 14, 2019
SQL(ORACLE書式)
SELECT SUM(LEVEL) FROM DUAL WHERE MOD(LEVEL, 2) = 0 CONNECT BY LEVEL <= 100;
SQL(再帰WITH)
WITH rec(ol) AS (SELECT 1 FROM DUAL UNION ALL SELECT ol + 1 FROM rec WHERE ol < 100) SELECT SUM(ol) FROM rec WHERE MOD(ol, 2) = 0;
#PowerShell
PowerShellだと
— ぢゃくそんは勉強ができない (@_jackson) August 14, 2019
(1..100 | ?{$_ % 2 -eq 0} | measure -Sum).Sum
ってとこかな / 「1から100の偶数の和を求めるワンライナー」まとめ - Qiita https://t.co/kIrSLp6C9k
1から100の偶数の和を求めるワンライナーの記事にPowerShellがないぞ!
— すたんくらうど (@stuncloud) August 14, 2019
PS> 1..100 | ? {$_ % 2 -eq 0} | measure -Sum | select -exp Sum
「1から100の偶数の和を求めるワンライナー」まとめ - Qiita https://t.co/Ao8Zng6af8 PowerShellでひねらず書くとこうかな `(1..100 | ? {$_ % 2 -eq 0 } | Measure-Object -Sum).Sum;`
— KIMATA RobertHisasi (@robert_KIMATA) August 14, 2019
#HSP
#HSP3 だってできるもん…
— K-s (@skymonsters_Ks) August 15, 2019
for c,0,101,2:a+c:next:mes a
HSPならこれでウィンドウに結果表示までできる!
「1から100の偶数の和を求めるワンライナー」まとめ https://t.co/J6WwQU4h5p #Qiita
repeatなら
— K-s (@skymonsters_Ks) August 15, 2019
repeat 100,1:a+(cnt\2=0)*cntmes a
こんな感じ?
do:a+c:c+2:until c>100:mes a
doも短い。もっと短くできるんかな…
b=2+100 : for a,,25 : c+b : mes c : next : title""+c
— Junji Suzuki (@jboysoft)
//一番小さな偶数と大きな偶数をペアにして内側へすすむ
#Vim script
exe 'echo ' . join(range(2, 101, 2), '+')
" vim 8以上、偶数の判定も行う版
exe 'echo ' . join(filter(range(101), {i, v -> v % 2 == 0}), '+')
Groovy
Groovyだとこんな感じになるかと思います。
— 山p🌁 (@yamap_55) August 16, 2019
(0..100).findAll{it % 2 == 0}.sum()
Go
for i, N, result := 1, 100 + 2, 0; i <= N; i++ { if i == N { fmt.Println(result) } else { result += (i + 1) & 1 * i } }
ref: https://qiita.com/noobow/items/28cd77968815f329ca77#comment-324899874e91ab0ea091
#Delphi
1から100までの偶数の和を Delphi (10.3) で素直に書くとこうなるかな。
— DEKO (@ht_deko) August 16, 2019
begin var v:=0;for var i in[1..100]do if not Odd(i)then Inc(v, i);Writeln(v)end.
77 文字。
— DEKO (@ht_deko) August 16, 2019
begin var v:=0;for var i in[1..100]do Inc(v,i*Ord(not Odd(i)));Writeln(v)end.
DOS
set s=0 & for /l %a in (0,2,100) do set /a s = s + %a
J
奇数の項をゼロに置き換えて総和を求める
+/(2&|0:^:["_1])>:i.100
偶数の項だけ選び出して総和を求める
+/(#~[:-.2&|)>:i.100
偶数の項に1、奇数の項に0を掛けてから総和を求める
+/(*[:-.2&|)>:i.100
jq
1から100までの偶数の和も jq ならたったの1行で書ける
— Takeshi Shinoda (@takeshinoda) August 16, 2019
$ jq -n '[range(1;101) | select(.%2==0)] | add'
とてもシンプルですね。jq なら複雑なコードもシンプルに。
そう、jq ならね