友達を感動させる10のラケットシングルライナー

私の好きな言語で忘れられていた「10人のワンライナー」のトピックに戻りたいと思います。 Habréに関するストーミーな議論は数ヶ月前でした。 残念ながら、実際にシングルライナーを引用した人は多くなく、読める人も多くありませんでした。 私は、いくつかの場所で元のScalaの例を凌ぐ、ラケットのバージョンを提案したいと思います。


1.リスト内の各アイテムを2倍に

これを行うことができます:
(for/list ((i (in-range 10))) (* 2 i)) 

または:
 (map (curry * 2) (build-list 10 (λ (x) x))) 


2.リスト内のすべての数値を要約します

 (apply + (build-list 10000 (λ (x) x))) 


3.部分文字列を確認します

 (define wordlist '("Racket" "akka" "play framework" "sbt" "curring")) ;   (define tweet "This is an example tweet talking about Racket and curring") ;   

最初の出現箇所を検索します(見つからない場合は#fを返します)。
 (findf (curryr regexp-match? tweet) wordlist) 

ツイートに含まれる部分文字列をワードリストから選択します。
 (filter (curryr regexp-match? tweet) wordlist) 


4.ファイルからの読み取り

 (file->string "file.txt") ;    (file->lines "file.txt") ;    


5.曲「Happy Birthday」の印刷


時間オプション
 (for-each (λ (x) (display (string-append "Happy Birthday" (if x ", dear John" " to You") "\n"))) '(#f #f #t #f)) 

2つのオプション
 (for ((x (in-range 4))) (display (string-append "Happy Birthday" (if (= x 2) ", dear John" " to You") "\n"))) 

3つのオプション
 (display-lines (build-list 4 (λ (x) (string-append "Happy Birthday" (if (= x 2) ", dear John" " to You"))))) 


6.数字のリストのフィルタリング

 (partition (curry > 60) '(49 58 76 82 88 90)) 

2つのリストを返します。1つは条件に一致し、もう1つは一致しません。

7. WebサービスからXMLを取得および解析する

標準ライブラリをダウンロードします。
 (require net/url xml) 

次のアクションは、結果のxmlをタイプドキュメントの構造に入れます
 (define doc (read-xml (get-pure-port (string->url "http://search.twitter.com/search.atom?&q=racket")))) 

必要に応じて、結果のドキュメントを解析して、ツリー(Lispのネイティブ形式、ラケット)に変換できます。
 (xml->xexpr (document-element doc)) 


8.リストで最小(または最大)を検索します

数字を追加するよりも複雑ではありません:
 (apply max '(14 35 -7 46 98)) (apply min '(14 35 -7 46 98)) 


9.並列処理

いくつかのデータがあります。 テストとして、通常のリストを示します。
 (define data-list '(ABCDEFGH)) 

そして、いくつかの手順があります。 わかりやすくするために、シンボルの複数の印刷を選択します。
 (define (process sym) (for ((n (in-range 10))) (display sym))) 

並列処理は次のように始まります。
 (for ((x data-list)) (thread (λ () (process x)))) 


10.エラトステネスのふるい

タスクはかなりアルゴリズム的です。 それを解決する方法はたくさんあります。
以下は2から最大までの数字のリストです
 (define (eratosphen max) (let er ([lst null] [cur 2]) (cond [(> cur max) (reverse lst)] [(ormap (λ (x) (= (remainder cur x) 0)) lst) (er lst (add1 cur))] [else (er (cons cur lst) (add1 cur))]))) 

これは1行で書く価値はありません。
また、EratosthenesのSieveメソッドを使用して簡単に番号を確認する必要がある場合、コードは実際に行に収まります(確認する番号は113でなければなりません)。
 (let check ([cur 2] [n 113]) (cond [(= (remainder n cur) 0) #f] [(> (sqr cur) n) #t] [else (check (add1 cur) n)])) 

しかし、この問題に対する他のすべての解決策と同様に、私はそれを「梯子に」分解します。

Source: https://habr.com/ru/post/J126606/


All Articles