10人の友達にあなたの目を見張らせるCoffeeScript単行コードの絶技


もしかするとあなたはすでにMarcus KazmierczakのこのHNで人気のある「10人の友達にあなたの目を見張らせるScala単行コードの絶技」を見たことがあるかもしれませんが、私はScalaについてよく知りませんが(Javaもそうです)、これは本当にいいように見えて、そこで私も少しかゆくて、私の友达にも私に目を奪われたいと思っています--JavaからScalaではありませんて、私はJavascriptからCoffeeScriptまで、次の例は、node.js環境に基づいている.
1.リストの各項目に2を掛ける
Marcusの最初の例はmap関数を実証し、range構文と匿名関数を使用して同じことを行うことができます.
[1..10].map (i) -> i*2  

もっと読みやすいバージョンもあります.
i * 2 for i in [1..10]  

2.数列加算
Javascript(およびCoffeeScript拡張)には、mapおよびreduceの関数があります.
[1..1000].reduce (t, s) -> t + s  

(reduce == reduceLeft,   reduceRight)  

3.文字列に単語が含まれているかどうかを確認する
これは本当に簡単です.配列内の任意の要素が条件を満たす限りtrueを返すsomeメソッドがあるからです.
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では特別なオペレータではありません.ここでは、実際にはビットごとに逆オペレータを取り、数値をビットごとに反逆を行なう.で操作します.上記の例では-x-1に相当します.ここでは、配列の下付き文字が-1より大きいかどうかをチェックします.-(-1)-1=0でfalseが返されるからです.
4.ファイルの読み込み
クライアントJavascriptフレームワークを使用するユーザーは、次のコードに親しみを感じます.
fs.readFile 'data.txt', (err, data) -> fileText = data  

同期バージョンも使用できます.
fileText = fs.readFileSync('data.txt').toString()  

ただし、node.jsでは、プログラムの起動時にのみ同期バージョンを使用できます.他の時間には非同期バージョンを使用する必要があります.
5.お誕生日おめでとう
まず、まずScalaバージョンのマッピング版をください.しかし、文字列を少し改ざんしました.
[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]  

6.フィルタ数列
1つの数値シーケンスを2つのタイプにフィルタします.これはもう近いです.
passed = []  
failed = []  
(if score > 60 then passed else failed).push score for score in [49, 58, 76, 82, 88, 90]  

△filterも使えますが、それでは一行ではありません...
7.XML Webサービスの読み取りと解析
XMLは神馬東東?聞いたことがありませんが、jsonに変えてみましょう.requestライブラリを使用することができます.
request.get { uri:'path/to/api.json', json: true }, (err, r, body) -> results = body  

8.数列の最小(最大)値を見つける
私たちは素晴らしいapply関数を持っています.それは、Math.maxとMath.minという可変パラメータを持つ関数を配列で呼び出すことができます.この2つの関数は、Math.max 30、10、20などの可変長パラメータを受け入れます.次のコードを試してみましょう.
Math.max.apply @, [14, 35, -7, 46, 98] # 98  
Math.min.apply @, [14, 35, -7, 46, 98] # -7  

9.並列処理
これはまだだめです.サブプロセスを作成して自分で通信したり、WebWorkers APIを使って実現したりして、これをスキップしてみましょう.
10.エラトスターニふるい
(訳者注:エラトスターニふるい法は古代ギリシャの数学者エラトスターニが提案した簡単な素数判定アルゴリズムで、詳しくはウィキペディアを参照)
一行でできるの?
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  

更新(06/05):@dionyzizは私にこのもっと簡潔なバージョンを送ってくれました:
primes = []  
primes.push i for i in [2..100] when not (j for j in primes when i % j == 0).length  

オリジナル版のように1行で判定を完了できます.
(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  

11.奨励
最後に、あなたが見たことのない最も読みやすいfizzbuzz(数3、数5ゲーム)バージョンを奨励します.
"#{if i%3 is 0 then 'fizz' else ''}#{if i%5 is 0 then 'buzz' else ''}" or i for i in [1..100]  

更新:satyrのヒントに基づいて、ここではより簡単で、より巧みなバージョンです.
['fizz' unless i%3] + ['buzz' unless i%5] or i for i in [1..100]  

配列に+オペレータを使用すると文字列になり、配列にundefinedまたはnullが含まれている場合、[].toString()および[].join(',')はJavascriptでも同様に効果的です([undefined]+"b"=="b")
結論
私はこれらの例のいくつかの文法がScalaにこんなに近いことに驚いたが、私はそれが別の星に属するプログラミング言語だと思っていた.
ここではCoffeeScriptについて詳しく知ることができます.コードクリップについても、TwitterでFollowを歓迎します.  @ricardobeat .