2014-09-18
美しいワンライナー10選
[ PR ]
ワンライナー (One-Liner)とは、Twitterなどでプログラムを投稿するための1行に収めたプログラムのことです。
今回は、美しいワンライナーを10種類紹介します。
(1) 1から100までの素数を一覧表示(UNIX: seq)
seq 1 100 | perl -lne 'print if (1x$_) !~ /^1?$|^(11+?)\1+$/'
seq 1 100 | perl -lne 'print if (1x$_) !~ /^1?$|^(11+?)\1+$/'
# 2
# 3
# 5
# 7
# 11
# 13
# 17
# 19
# (中略)
# 73
# 79
# 83
# 89
# 97
(2) わずか140バイトのテトリス(JavaScript)
function(a,b,c,d){d+=c;return[d<0|a&b<<d?a=parseInt((a|b<<c).toString(d=32,b=new Date&2|1).replace('v',''),d):a|b<<d,a,b,d]}
ワンライナーではありませんが、ワンライナーに変換でき、あまりに有名なので選びました。
function(a,b,c,d){d+=c;
return[d<0|a&b<<d?a=
parseInt((a|b<<c)
.toString(d=32,b=new Date&2|1)
.replace('v',''),d):
a|b<<d,a,b,d]}
(3) フィボナッチ数列(Ruby)
ruby -e "def fib n;n==0?[0]:n==1?[0,1]:(2..n-1).inject([0,1]){|a|a<<(a[-1]+a[-2])};end; puts fib(10)"
ruby -e "def fib n;n==0?[0]:n==1?[0,1]:(2..n-1).inject([0,1]){|a|a<<(a[-1]+a[-2])};end; puts fib(10)"
# 0
# 1
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# 34
(4) クイックソート(Ruby)
ruby -e "class Proc; def self_curry; self.curry.call(self) end end; p lambda { |f, seq| seq.empty? ? [] : seq[1..seq.size].partition { |a| a < seq.first }.map { |a| f.call(f, a) }.insert(1, seq.first).flatten }.self_curry.call((1..10).sort_by{rand})"
ruby -e "class Proc; def self_curry; self.curry.call(self) end end; p lambda { |f, seq| seq.empty? ? [] : seq[1..seq.size].partition { |a| a < seq.first }.map { |a| f.call(f, a) }.insert(1, seq.first).flatten }.self_curry.call((1..10).sort_by{rand})"
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
(5) FizzBuzz(Scala)
scala -e '(1 to 15).map(i => if(i % 3 == 0 && i % 5 == 0) "fizzbuzz" else if(i % 3 == 0) "fizz" else if(i % 5 == 0) "buzz" else i).foreach(println(_))'
scala -e '(1 to 15).map(i => if(i % 3 == 0 && i % 5 == 0) "fizzbuzz" else if(i % 3 == 0) "fizz" else if(i % 5 == 0) "buzz" else i).foreach(println(_))'
/*
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
*/
(6) タイムゾーンを一覧表示(Groovy)
groovy -e "TimeZone.getAvailableIDs().sort().each{ println it } "
groovy -e "TimeZone.getAvailableIDs().sort().each{ println it } "
// Africa/Abidjan
// Africa/Accra
// Africa/Addis_Ababa
// Africa/Algiers
// Africa/Asmara
// Africa/Asmera
// Africa/Bamako
// Africa/Bangui
// (中略)
// Asia/Hong_Kong
// Asia/Hovd
// Asia/Irkutsk
// Asia/Istanbul
// Asia/Jakarta
// Asia/Jayapura
// Asia/Jerusalem
// Asia/Kabul
// Asia/Kamchatka
(7) InetAddressを一覧表示(Groovy)
groovy -e 'println "${InetAddress.localHost}\n${InetAddress.localHost.loopbackAddress}" '
groovy -e 'println "${InetAddress.localHost}\n${InetAddress.localHost.loopbackAddress}" '
# m.local/192.168.2.103
# false
(8) Happy Birthday!(Haskell, Scala)
mapM_ putStrLn ["Happy Birthday " ++ (if x == 3 then "dear Tom" else "to You") | x <- [1..4]]
mapM_ putStrLn ["Happy Birthday " ++ (if x == 3 then "dear Tom" else "to You") | x <- [1..4]]
# Happy Birthday to You
# Happy Birthday to You
# Happy Birthday dear Tom
# Happy Birthday to You
(1 to 4).map { i => "Happy Birthday " + (if (i == 3) "dear Tom" else "to You") }.foreach { println }
# Happy Birthday to You
# Happy Birthday to You
# Happy Birthday dear Tom
# Happy Birthday to You
(9) JSONを整形表示(Node.js)
echo '{"hoge": 1, "foo":[1,2,3]}' | node -e "var stdin = ''; process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function (chunk) { stdin += chunk}); process.stdin.on('end', function () { var output = JSON.stringify(JSON.parse(stdin), null, ' '); console.log(output) });
echo '{"hoge": 1, "foo":[1,2,3]}' | node -e "var stdin = ''; process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function (chunk) { stdin += chunk}); process.stdin.on('end', function () { var output = JSON.stringify(JSON.parse(stdin), null, ' '); console.log(output) });"
/*
{
"hoge": 1,
"foo": [
1,
2,
3
]
}
*/
(10) 文字列を検索(Clojure)
(let [words #{"scala" "akka" "play framework" "sbt" "typesafe"} tweet "This is an example tweet talking about scala and sbt."] (filter #(contains? words %) (re-seq #"\S+" tweet)))
(let [words #{"scala" "akka" "play framework" "sbt" "typesafe"} tweet "This is an example tweet talking about scala and sbt."] (filter #(contains? words %) (re-seq #"\S+" tweet)))
; ("scala")
フルスクラッチから1日でCMSを作る シェルスクリプト高速開発手法入門 (アスキー書籍)
posted with amazlet at 14.09.18
KADOKAWA / アスキー・メディアワークス (2014-07-02)
売り上げランキング: 8,890
売り上げランキング: 8,890