さあ、行こう!
スカラ
これらは、あなたの友人や多分女性さえも感動させるScala言語の力を示す10のワンライナーです:)。 また、関数型プログラミングとScala構文を使用したすばらしい例でもありますが、これらはよく知らないかもしれません。 実際の例を見る以外に、それを研究するより良い方法はないと思います。
リスト内の各アイテムを2倍にします。
map
関数は、リストの各要素を受け取り、対応する関数をそれに適用します。 この例では、各要素を取得して2倍します。その結果、foldLeft
とfoldLeft
を使用する他の例とは異なり、リスト以外の値を1つだけ返すのとは異なり、同じサイズのリストが返されます。
元の記事の解説では、オプションも提案されました。(1 to 10) map { _ * 2 }
(1 to 10) map (2*)
リスト内のすべての数字を要約します。
reduceLeft
の最も一般的な使用例は、リスト内の数値の合計です。 この例では、to range関数to
使用して1から1000までの数値を合計して、数値のシーケンスto
作成し、反復と合計のためにreduceLeft
to
作成します。
元の記事に対するコメントで、最適なオプションが提案されました。(1 to 1000).reduceLeft( _ + _ )
(1 to 1000).sum
部分文字列の出現の確認
この例では、リストの単語が指定された文字列にある場合、ブール値を返します。 この例を使用して、ツイートに興味のある単語が含まれていることを確認しました。 はい、技術的にはこれらは3行ですが、最初の2行は単なる変数の仕事です。
元の記事に対するコメントで、最適なオプションが提案されました。val wordlist = List("scala", "akka", "play framework", "sbt", "typesafe") val tweet = "This is an example tweet talking about scala and sbt." (words.foldLeft(false)( _ || tweet.contains(_) ))
... wordList.exists(tweet.contains(_))
ファイルから読み取る
この例は、Javaの背景に対して印象的です。1行でファイルを読み取る非常に一般的な例です。 実際には2つの例があります。1つはファイル全体を文字列に読み込み、もう1つはファイルを1行ずつリストに読み込みます。val fileText = io.Source.fromFile("data.txt").mkString val fileLines = io.Source.fromFile("data.txt").getLines.toList
お誕生日おめでとう
「Hapy Birthday」という歌を表示するワンライナー。 これは、Scalaの三項演算子と、map
とforeach
組み合わせを示していmap
。(1 to 4).map { i => "Happy Birthday " + (if (i == 3) "dear NAME" else "to You") }.foreach { println }
番号リストのフィルタリング
partition
の使用に基づいて、数値のリストを2つのカテゴリにフィルターします。 この例では、テストの結果に基づいて2つの学生リストが作成されます。val (passed, failed) = List(49, 58, 76, 82, 88, 90) partition ( _ > 60 )
WebサービスからのXMLの取得と解析
XMLはScalaのネイティブフレームワークであるため、XMLの解析は簡単です。 Twitter検索フィードを取得する例を次に示します。val results = XML.load("http://search.twitter.com/search.atom?&q=scala")
リスト内の最小(または最大)を検索します
reduceLeft
を使用してリストを反復処理し、関数を適用するreduceLeft
2つの例。
元の記事に対するコメントで、最適なオプションが提案されました。List(14, 35, -7, 46, 98).reduceLeft ( _ min _ ) List(14, 35, -7, 46, 98).reduceLeft ( _ max _ )
List(14, 35, -7, 46, 98).min List(14, 35, -7, 46, 98).max
並列処理
Scala 2.9では、「並列コレクション」と呼ばれる新しいタイプのコレクションが導入されましたforeach
、map
、filter
などの一括操作を実行するためにマルチコアプロセッサを使用します。
この例は、並列コレクションの使用を示しています。 dataListリストで定義された多くのデータと、プロセッサを非常に頻繁に使用するprocessItem関数があるとします。 次のワンライナーは、並列リスト処理を提供します。val result = dataList.par.map(line => processItem(line))
エラトステネスのふるい
さて、今回はこの例は完全に実用的ではなく、技術的には1行ではありません。先に定義した演算子に依存しているからです。しかし、たとえ判読できなくてもとにかくクールです。 Daniel Sobralは、Sieve of Eratosthenesアルゴリズムの実装を記述しました 。これは、数値が素数であるかどうかを判断するために使用されます。
|>演算子の定義が必要です。その構文はF#から借用されています。 たとえば、 Steve Gilhamのブログをご覧ください。(n: Int) => (2 to n) |> (r => r.foldLeft(r.toSet)((ps, x) => if (ps(x)) ps -- (x * x to n by x) else ps))
投稿者: Marcus Kazmierczak
CoffeScript
HNに最近投稿されたMarcus Kazmierczakブログの「 友達を 感動させるためのScalaの10のシングルライン 」という記事を読んだかもしれません。 私はScala(またはJava)を知らないが、見栄えが良いので、友人を感心させることにした。JavaからScalaに切り替えている人もいます。 すべての例を実行する環境としてnode.jsを使用します。
リスト内のすべてのアイテムを2倍にする
マーカスは、map
機能で自慢し始めます。range
と匿名関数を使用して同じことができます。
しかし、あなたはより表現力豊かな形で書くことができます[1..10].map (i) -> i*2
i * 2 for i in [1..10]
番号リスト合計
Javascript(およびCoffeeScriptの拡張機能)には、組み込みのmap
およびreduce
関数もあります。
(reduce == reduceLeft、reduceRightも使用可能です)[1..1000].reduce (t, s) -> t + s
部分文字列を確認
some
方法がsome
ため、非常に簡単です。 配列内の要素のいずれかが関数によって満たされる場合、trueを返します。
しかし、これは対応する単語を返します:wordList = ["coffeescript", "eko", "play framework", "and stuff", "falsy"] tweet = "This is an example tweet talking about javascript and stuff." wordList.some (word) -> ~tweet.indexOf word
"wordList.filter (word) -> ~tweet.indexOf word
~
"はCoffeeScriptの特別な演算子ではなく、単なる汚いトリックです。 これは、ビット単位のNOT演算子であり、オペランドのビットを反転します。 実際には、これは-x-1
同等です。 ここでは、-1
より大きいインデックスのチェックを行い、-(-1)-1 == 0
がfalseと評価されることに基づいて動作します。
ファイルを読む
クライアント側のJavaScriptユーザーはすでにこの考えに精通しています。
同期バージョンも使用できます。fs.readFile 'data.txt', (err, data) -> fileText = data
ただし、node.jsでは、これはアプリケーションの起動手順でのみ受け入れられます。 コードで非同期バージョンを使用する必要があります。fileText = fs.readFileSync('data.txt').toString()
お誕生日おめでとう
まず、Scalaバージョンを1対1で表示できます。
しかし、それは可能であり、より良いです。 これはほとんど擬似コードのようになります:[1..4].map (i) -> console.log "Happy Birthday " + (if i is 3 then "dear Robert" else "to You")
console.log "Happy Birthday #{if i is 3 then "dear Robert" else "to You"}" for i in [1..4]
番号リストのフィルタリング
数字のリストのフィルタリングは非常に似ていることが判明しました。
(フィルターは引き続き使用できますが、1行は表示されません)passed = [] failed = [] (if score > 60 then passed else failed).push score for score in [49, 58, 76, 82, 88, 90]
WebサービスからのXMLの取得と解析
XML何? これについて聞いたことがありません。 代わりにJSONを取得しましょう。request.get { uri:'path/to/api.json', json: true }, (err, r, body) -> results = body
リスト内の最小(または最大)を検索します
ここでapply
機能は便利です。 配列を引数のリストとして渡すことで関数を呼び出すことができますMath.max
とMath.min
は可変数の引数を受け取ります。Math.max 30, 10, 20
返します。 配列を操作してみましょう。Math.max.apply @, [14, 35, -7, 46, 98] # 98 Math.min.apply @, [14, 35, -7, 46, 98] # -7
並列処理
まだ存在しません。 子プロセスを作成して対話したり、 WebWorkers APIを使用したりできます 。 スキップ。
エラトステネスのふるい
これを1行に移動できませんでした。 アイデアはありますか?
更新(6月5日): @dionyzizからコンパクトバージョンが送られてきました。sieve = (num) -> numbers = [2..num] while ((pos = numbers[0]) * pos) <= num delete numbers[i] for n, i in numbers by pos numbers.shift() numbers.indexOf(num) > -1
オリジナルに似た真の単一行バージョンに使用できます。primes = [] primes.push i for i in [2..100] when not (j for j in primes when i % j == 0).length
またはやや効率的に:(n) -> (p.push i for i in [2..n] when not (j for j in (p or p=[]) when i%j == 0)[0]) and n in p
(n) -> (p.push i for i in [2..n] when !(p or p=[]).some((j) -> i%j is 0)) and n in p
ボーナス
あなたが今まで見た中で最も読まれたfizzbuzz
バージョン:
satyrからのちょっとしたヒントを使って、さらに簡単ですが、注意が必要です。"#{if i%3 is 0 then 'fizz' else ''}#{if i%5 is 0 then 'buzz' else ''}" or i for i in [1..100]
['fizz' unless i%3] + ['buzz' unless i%5] or i for i in [1..100]
」
投稿者: リカルド・トマシ
F#
10の精神で「 Scalaで友達を感動させる10のシングルライナー 」は、F#のシングルライナーです。
リスト内のすべての数字を2倍にする
簡単です。F#にもmap
がありmap
。[1 .. 4] |> Seq.map (fun x -> x * x);;
番号リスト合計
F#にsum
があるのと同じくらい簡単です:[1 .. 4] |> Seq.sum;;
部分文字列を確認
そして、それは簡単です。["f#"; "scala"] |> Seq.find(fun w -> "this tweet contains f#".Contains(w));;
ファイルの読み込み(つまらない!)
F#にはすべてのライブラリがあります。 NET ファイルのすべての行をシーケンスとして読み取るのは非常に簡単です。File.ReadLines(@"file.txt") |> Seq.map(fun l -> l.Length) |> Seq.sum;;
お誕生日おめでとう
また、退屈な...このような:[1 .. 4] |> Seq.map (fun i -> "Happy Birthday " + (if i = 3 then "dear NAME" else "to you")) |> Seq.iter Console.WriteLine;;
リストのフィルタリング(実際の分割)
組み込みのpartition
関数を使用して、リストを簡単に分割できます。[49; 58; 76; 82; 88; 90] |> List.partition (fun i -> i > 60);;
XMLの取得と解析
繰り返しますが、.NETライブラリは便利です。 残念ながら、これはF#の正確な1行ではありません。 しかし、Don Symeはこれを同期的および非同期的に行う方法を示しています 。
リストで最大値と最小値を検索します
これを行うには、F#ネットワーク構築関数で:[49; 58; 76; 82; 88; 90] |> Seq.min;; [49; 58; 76; 82; 88; 90] |> Seq.max;;
並列処理
これはJ Rochaの例です。 isprimeメソッドがあり、1〜50,000の最後の桁でグループ化された素数を取得するとします。PSeqはシーケンスを並列処理します。[|1 .. 50000|] |> PSeq.filter isprime |> PSeq.groupBy (fun i -> i % 10) |> PSeq.map (fun (k, vs) -> (k, Seq.length vs)) |> Seq.toArray |> Seq.sort |> Seq.toList;;
投稿者: ウィル・フィッツジェラルド
ルビー
Scalaの表現力を示すために、10の単一行の例のリストが公開されています。 CoffeeScriptバージョンはすぐに登場したので、Rubyバージョンだけを公開したと思いました。 Rubyの構文はScalaよりも少しすっきりしていますが、本質的には(少なくともこれらの例が示す限りでは)比較的似ています。
リスト内のすべての数字を2倍にする
(1..10).map { |n| n * 2 }
番号リスト合計
または、(組み込み)(1..1000).inject { |sum, n| sum + n }
Symbol#to_proc
使用しSymbol#to_proc
。これは、Rubyバージョン1.8.7以降で使用可能です。
またはこのように:(1..1000).inject(&:+)
(1..1000).inject(:+)
部分文字列を確認
words = ["scala", "akka", "play framework", "sbt", "typesafe"] tweet = "This is an example tweet talking about scala and sbt." words.any? { |word| tweet.include?(word) }
ファイルを読む
後者の場合、配列の各要素の末尾に「\ n」が含まれます。これは、file_text = File.read("data.txt") file_lines = File.readlines("data.txt")
.map { |str| str.chop }
.map { |str| str.chop }
または代替バージョンの使用:File.read("data.txt").split(/\n/)
お誕生日おめでとう
4.times { |n| puts "Happy Birthday #{n==2 ? "dear Tony" : "to You"}" }
番号リストのフィルタリング
[49, 58, 76, 82, 88, 90].partition { |n| n > 60 }
WebサービスからのXMLの取得と解析
この例では、open-uriおよびhpricotまたは同等のライブラリが必要です(組み込みを使用できます)。 これはあまり多くのコードではありませんが、Scalaはここで明らかに勝ちます。require 'open-uri' require 'hpricot' results = Hpricot(open("http://search.twitter.com/search.atom?&q=scala"))
リスト内の最小(または最大)を検索します
[14, 35, -7, 46, 98].min [14, 35, -7, 46, 98].max
並列処理
Scalaとは異なり、マルチコアサポートは組み込まれていません。 この例では、 並列または類似のgemが必要です。require 'parallel' Parallel.map(lots_of_data) do |chunk| heavy_computation(chunk) end
エラトステネスのふるい
Scalaのワンライナーは非常に難解ですが、完全に判読できません。 Rubyで複数行を必要とする単純な実装:
この例はStackOverflowを使用しています。index = 0 while primes[index]**2 <= primes.last prime = primes[index] primes = primes.select { |x| x == prime || x % prime != 0 } index += 1 end p primes
元の投稿: 「友達を感動させる10個のRuby One Liner」
投稿者: Antonio Cangiano
クロージュア
今日、「 Scalaで 友達を感動させる 10個のシングルライン 」という興味深い投稿を見た後、 「 CoffeeScriptで友達を感動させる10個のシングルライン 」というブログ投稿に誰かが投稿しました 。 これらの2つの投稿は小さなタスクを示しています(ほとんどのタスクは最新のプログラミング言語で簡単な解決策を持っています)。各タスクは約1行のコードで実行されます。
私のお気に入りのプログラミング言語であるClojureについても同じことを行うのが適切だと思います。
リスト内のすべての数字を2倍にする
(map #(* % 2) (range 1 11))
番号リスト合計
(reduce + (range 1 1001))
部分文字列を確認
ここで正規表現を使用するのが適切だと思います:
コメンテーターが示唆したように、Clojureセットを使用することにより、正規表現を使用せずにこの問題を解決できます。(def tweet "This is an example tweet talking about clojure and emacs.") (def regex (re-pattern (apply str (interpose "|" ["clojure" "logic" "compojure" "emacs" "macros"])))) (re-seq regex tweet) ; , true/false
(def tweet "This is an example tweet talking about clojure and emacs.") (def is-word? (set ["clojure" "logic" "compojure" "emacs" "macros"])) (not (nil? (some is-word? (.split tweet " ")))) ; true/false
ファイルを読む
Clojure Contribは今後のClojureのリリースで非推奨となり、(def file-text (slurp "data.txt")) ; (def file-lines (clojure.contrib.io/read-lines "data.txt")) ;
clojure.contrib.io/read-lines
(line-seq (clojure.java.io/reader (clojure.java.io/file “data.txt”)))
clojure.contrib.io/read-lines
は(line-seq (clojure.java.io/reader (clojure.java.io/file “data.txt”)))
と書くことができます(line-seq (clojure.java.io/reader (clojure.java.io/file “data.txt”)))
Clojure 1.3以降。 これを指摘してくれたアーロンに感謝します。
お誕生日おめでとう
代替バージョン:(doseq [l (map #(str "Happy Birthday " (if (= % 2) "dear Rich" "to You")) (range 4))] (println l))
(dotimes [n 4] (println "Happy Birthday " (if (= n 2) "dear Rich" "to You")))
番号リストのフィルタリング
(partition-by #(> % 60) [49 58 76 82 88 90])
WebサービスからのXMLの取得と解析
(clojure.xml/parse "http://search.twitter.com/search.atom?&q=clojure")
リストで最小値と最大値を検索します
(reduce max [14 35 -7 46 98]) (reduce min [14 35 -7 46 98]) ;; ((juxt #(reduce max %) #(reduce min %)) [14 35 -7 46 98]) ; [98 -7]
並列処理
;; , process-line - , (pmap process-line lines) ; "p" map
エラトステネスのふるい
「パフォーマンスと美しさの点で」「エラトステネスのふるい」に対する1行の解決策では不十分です。 この問題を解決するには、「誰でもエラトステネスのふるいを愛する」という題名のクリストフ・グランドの作品をチェックすることをお勧めします。
FizzBuzzソリューション
(map #(cond (zero? (mod % 15)) "FizzBuzz" (zero? (mod % 3)) "Fizz" (zero? (mod % 5)) "Buzz" :else %) (range 1 101))
投稿者: Baishampayan
Python
Scala、Ruby、Clojure、CoffeeScriptで10の驚くべきワンライナーを行った後、Pythonで同じことをするのは面白いと思いました。
多くのノイズなし...行きましょう。 変数の宣言とインポートは、必要に応じて別々の行にあることに注意してください。 また、迅速な検証のために結果が標準出力に出力されるように、各行が書き込まれます。
この投稿は、おそらく私が書いた最速の記事の1つです。
リスト内のすべての数字を2倍にする
print map(lambda x: x * 2, range(1,11))
番号リスト合計
print sum(range(1,1001))
部分文字列を確認
wordlist = ["scala", "akka", "play framework", "sbt", "typesafe"] tweet = "This is an example tweet talking about scala and sbt." print map(lambda x: x in tweet.split(),wordlist)
ファイルを読む
print open("ten_one_liners.py").readlines()
お誕生日おめでとう
print map(lambda x: "Happy Birthday to " + ("you" if x != 2 else "dear Name"),range(4))
番号リストのフィルタリング
print reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49, 58, 76, 82, 88, 90],([],[]))
WebサービスからのXMLの取得と解析
from xml.dom.minidom import parse, parseString import urllib2 # note - i convert it back into xml to pretty print it print parse(urllib2.urlopen("http://search.twitter.com/search.atom?&q=python")).toprettyxml(encoding="utf-8")
リストで最小値と最大値を検索します
print min([14, 35, -7, 46, 98]) print max([14, 35, -7, 46, 98])
並列処理
import multiprocessing import math print list(multiprocessing.Pool(processes=4).map(math.exp,range(1,11)))
エラトステネスのふるい
n = 50 # 2 50 print sorted(set(range(2,n+1)).difference(set((p * f) for p in range(2,int(n**0.5) + 2) for f in range(2,(n/p)+1))))
投稿者: Dhananjay Nene
C#
リスト内のすべての数字を2倍にする
Print("Multiple each item in a list by 2", Enumerable.Range(1, 10).Select(i => i * 2));
番号リスト合計
Print("Sum a list of numbers", Enumerable.Range(1, 1000).Sum());
部分文字列を確認
var wordlist = new[] { "C#", "and stuff" }; var tweet = "This is an example tweet talking about C# and stuff"; Print("Verify if a word exists in string", wordlist.Any(word => tweet.IndexOf(word) > -1)); Print("Show matched words in string", wordlist.Where(word => tweet.IndexOf(word) > -1));
ファイルを読む
Print("Read in a File", File.ReadAllBytes("oneliners.exe").Length);
お誕生日おめでとう
Print("Happy Birthday", Enumerable.Range(1, 4).Select((i) => string.Format("Happy Birthday {0} ", i == 3 ? "dear NAME" : "to You")));
番号リストのフィルタリング
var passed = new List<int>(); var failed = new List<int>(); (from bucket in new[] { passed, failed } from i in new[] { 49, 58, 76, 82, 88, 90 } select new { bucket, i }).ToList().ForEach((tuple) => tuple.bucket.AddRange(Enumerable.Repeat(tuple, 1).Where((tup) => (tup.bucket == passed && tup.i > 60) || (tup.bucket == failed && tup.i <= 60)).Select((tup) => tup.i))); Print("Filter list of numbers >60", (IEnumerable<int>)passed); Print("Filter list of numbers <=60", (IEnumerable<int>)failed);
WebサービスからのXMLの取得と解析
Print("Fetch and Parse an XML web service", XDocument.Load("http://search.twitter.com/search.atom?&q=scala"));
リストで最小値と最大値を検索します
Print("Find minimum in a list", Enumerable.Min(new[] { 14, 35, -7, 46, 98 })); Print("Find maximum in a list", Enumerable.Max(new[] { 14, 35, -7, 46, 98 }));
並列処理
Print("Parallel Processing", Enumerable.Range(1, 10).AsParallel().Select((i)=>i*2).AsEnumerable());
フィズバズ
Print("Fizzbuzz", Enumerable.Range(1, 15).Select((i)=>i + (i%3==0?"fizz":"") + (i%5==0?"buzz":"")));
投稿者: リチャード・バークビー
ハスケル
ミームに続いて( scala 、 ruby 、 clojure 、 python 、 f# 、 coffeescript 、 c# )。
リスト内のすべての数字を2倍にする
map (*2) [1..10]
番号リスト合計
foldl (+) 0 [1..1000] -- sum [1..1000]
部分文字列を確認
import Data.List let wordlist = ["monad", "monoid", "Galois", "ghc", "SPJ"] let tweet = "This is an example tweet talking about SPJ interviewing with Galois" or $ map (flip isInfixOf tweet) wordlist -- any (flip isInfixOf tweet) wordlist
ファイルを読む
fileText <- readFile "data.txt" let fileLines = lines fileText -- let fileLines = fmap lines $ readFile "data.txt"
お誕生日おめでとう
mapM_ putStrLn ["Happy Birthday " ++ (if x == 3 then "dear NAME" else "to You") | x <- [1..4]]
番号リストのフィルタリング
let (passed, failed) = partition (>60) [49, 58, 76, 82, 88, 90]
WebサービスからのXMLの取得と解析
この例では、curl
およびxml
パッケージが必要です。 インストールについては、 RWHを参照してください。import Network.Curl import Text.XML.Light import Control.Monad let results = liftM parseXMLDoc $ liftM snd (curlGetString "http://search.twitter.com/search.atom?&q=haskell" []) -- Control.Applicative let results = parseXMLDoc . snd <$> curlGetString "http://search.twitter.com/search.atom?&q=haskell" []
リストで最小値と最大値を検索します
foldl1 min [14, 35, -7, 46, 98] foldl1 max [14, 35, -7, 46, 98] -- minimum [14, 35, -7, 46, 98] maximum [14, 35, -7, 46, 98]
並列処理
この例では、parallel
パッケージが必要です。
import Control.Parallel import Control.Parallel.Strategies parMap rseq (*2) [1..100]
素数の生成
let pgen (p:xs) = p : pgen [x|x <- xs, x `mod` p > 0] take 40 (pgen [2..])
投稿者: Michael Fogus
そして今、あなたのオプション、そして