2014-09-18

美しいワンライナー10選

ruby-oneliner.png

[ 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[d0|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]}

tetris-140byte.png

(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を作る シェルスクリプト高速開発手法入門 (アスキー書籍)
KADOKAWA / アスキー・メディアワークス (2014-07-02)
売り上げランキング: 8,890

コメントはTwitterアカウントにお願いします。

RECENT POSTS


[ PR ]

.