Хочу вернуться к подзабытой теме о «10 однострочниках» на любимом языке. Бурное обсуждение на Хабре было несколько месяцев назад. К сожалению, не многие приводили действительно однострочники и не многие из них были читабельны. Хочу предложить версию на Racket, которая по этим параметрам местами даже превосходит изначальный пример на Scala.
Можно делать так:
Либо так:
Находит первое вхождение (если не находит, возвращает #f):
Выбирает из wordlist подстроки, присутствующие в tweet:
Раз вариант
Два вариант
Три вариант
Возвращает два списка — отвечающий условию и не отвечающий.
Загружаем стандартные библиотеки:
Следующее действие помещает полученный xml в структуру типа document
При желании, можно распарсить полученный документ в дерево — родной формат лиспа, коим Racket и является:
Не сложнее, чем сложение чисел:
Пусть есть какие-то данные. В качестве теста приведём обычный список:
И есть какая-то процедура. Для наглядности выберем многократную печать символа:
Запускается параллельная обработка так:
Задача скорее алгоритмическая. Есть множество способов её решения.
Вот генерация списка чисел от 2 до max
Это в одну строчку записывать не стоит.
А если нужна только проверка числа на простоту методом решета Эратосфена, то код и правда может уместиться в строку (на месте 113 должно стоять проверяемое число).
Но я бы такое всё же разбивал «на лесенки», как и все остальные решения этой задачи.
1. Удваиваем каждый элемент списка
Можно делать так:
(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)
Выбирает из wordlist подстроки, присутствующие в tweet:
(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))
Два вариант
(for ((x (in-range 4))) (display (string-append "Happy Birthday" (if (= x 2) ", dear John" " to You") "\n")))
Три вариант
(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))
Возвращает два списка — отвечающий условию и не отвечающий.
7. Получение и разбор XML от веб-сервиса
Загружаем стандартные библиотеки:
(require net/url xml)
Следующее действие помещает полученный xml в структуру типа document
(define doc (read-xml (get-pure-port (string->url "http://search.twitter.com/search.atom?&q=racket"))))
При желании, можно распарсить полученный документ в дерево — родной формат лиспа, коим Racket и является:
(xml->xexpr (document-element doc))
8. Поиск минимума (или максимума) в списке
Не сложнее, чем сложение чисел:
(apply max '(14 35 -7 46 98))
(apply min '(14 35 -7 46 98))
9. Параллельная обработка
Пусть есть какие-то данные. В качестве теста приведём обычный список:
(define data-list '(A B C D E F G H))
И есть какая-то процедура. Для наглядности выберем многократную печать символа:
(define (process sym) (for ((n (in-range 10))) (display sym)))
Запускается параллельная обработка так:
(for ((x data-list)) (thread (λ () (process x))))
10. Решето Эратосфена
Задача скорее алгоритмическая. Есть множество способов её решения.
Вот генерация списка чисел от 2 до max
(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))])))
Это в одну строчку записывать не стоит.
А если нужна только проверка числа на простоту методом решета Эратосфена, то код и правда может уместиться в строку (на месте 113 должно стоять проверяемое число).
(let check ([cur 2] [n 113]) (cond [(= (remainder n cur) 0) #f] [(> (sqr cur) n) #t] [else (check (add1 cur) n)]))
Но я бы такое всё же разбивал «на лесенки», как и все остальные решения этой задачи.