0,0
рейтинг
6 июня 2011 в 11:25

Разработка → 10 «однострочников», которые произведут впечатление на ваших друзей

За последнюю неделю появилось несколько топиков с названием «10 однострочников на <MY_LANGUAGE>, которые произведут впечатление на ваших друзей», которые содержат однострочное решение нескольких простых задач, демонстрирующее достоинства и «крутость» любимого языка программирования автора. Я решил перевести их и для сравнения собрать в одном топике. Вся волна началась (вроде как) со Scala.
Итак, поехали!


Scala


Это 10 однострочников, демонстрирующих мощь языка Scala, чтобы произвести впечатление на ваших друзей и, может быть, даже женщин :). К тому же они являются отличными примерами использования функционального программирования и синтаксиса языка Scala, с которым вы, возможно, не знакомы. Я думаю, что нет лучшего способа изучить его, чем увидеть реальные примеры.
  1. Удваиваем каждый элемент списка

    Функция map берёт каждый элемент списка и применяет к нему соответствующую функцию. В данном примере, мы берём каждый элемент и умножаем его на 2. В результате будет возвращён список такого-же размера в отличии от других примеров, использующих функции reduceLeft и foldLeft, которые возвращают только одно не списковое значение.
    (1 to 10) map { _ * 2 }
    В комментария к оригинальной статье также был предложен вариант:
    (1 to 10) map (2*)

  2. Суммируем все числа в списке

    Наиболее распространенным примером использования reduceLeft является суммирование чисел в списке. В этом примере суммируются числа от 1 до 1000 с использованием функций диапазона to для создания нашей последовательности чисел и reduceLeft для итерации и суммирования.
    (1 to 1000).reduceLeft( _ + _ )
    В комментариях к оригинальной статье был предложен лучший вариант:
    (1 to 1000).sum

  3. Проверяем вхождение подстроки

    Этот пример возвращает булево значение если слово из списка входит в указанную строку. Я использовал этот пример для проверки того, что твит содержит интересующее меня слово. Да, технически это три строки, но первые две — это просто задание переменных.
    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(_))

  4. Чтение из файла

    Этот пример может быть впечатляющим на фоне Java, это довольно общий пример чтения файла одной строкой. На самом деле здесь два примера: один читает весь файл в строку, другой считывает файл построчно в список.
    val fileText = io.Source.fromFile("data.txt").mkString
    
    val fileLines = io.Source.fromFile("data.txt").getLines.toList

  5. С днём рожденья!

    Однострочник, который выводит песенку «Hapy Birthday». Он иллюстрирует тернарный оператор Scala, а также сочетание map и foreach.
    (1 to 4).map { i => "Happy Birthday " + (if (i == 3) "dear NAME" else "to You") }.foreach { println }

  6. Фильтрация списка чисел

    Фильтрация списка чисел на две категории, основанные на использовании partition. В этом примере создаются два списка студентов по результатам их тестирования.
    val (passed, failed) = List(49, 58, 76, 82, 88, 90) partition ( _ > 60 )

  7. Получение и разбор XML от веб-сервиса

    Так как XML является нативной структурой Scala, разбор XML происходит без каких-либо усилий. Вот пример извлечения фида поиска Twitter.
    val results = XML.load("http://search.twitter.com/search.atom?&q=scala")

  8. Поиск минимума (или максимума) в списке

    Ещё пара примеров использования reduceLeft для перебора списка и применения функции.
    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

  9. Параллельная обработка

    В Scala 2.9 был представлен новый тип коллекции под названием «параллельные коллекции», использующие многоядерные процессоры при выполнении массовых операций, таких как foreach, map, filter и т.д… Вот видео от Александра Прокопец о параллельных коллекциях на Scala Days 2010.

    Этот пример иллюстрирует использование параллельных коллекций. Представьте, что у вас есть множество данных, определенных в списке dataList и функция processItem, очень интенсивно использующая процессор. Следующий однострочник даёт вам параллельную обработку списка.
    val result = dataList.par.map(line => processItem(line))
    

  10. Решето Эратосфена

    Хорошо, на этот раз пример не совсем практический и, технически, не однострочный, поскольку он опирается на оператор, определённый ранее, но он всё-равно чертовски клёвый, пусть даже не читаемый. Даниэль Собрал написал реализацию алгоритма Решето Эратосфена, который используется для того, чтобы определить, является ли число простым.
    (n: Int) => (2 to n) |> (r => r.foldLeft(r.toSet)((ps, x) => if (ps(x)) ps -- (x * x to n by x) else ps))
    Требует определения оператора |>, синтаксис которого заимствован из F#. Смотрите, например, в блоге Стива Гилхэма.
Оригинальный пост: «10 Scala One Liners to Impress Your Friends»
Автор: Marcus Kazmierczak



CoffeScript


Вы, возможно читали пост "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей" в блоге Marcus Kazmierczak, недавно размещенный на HN. Хоть я и не знаю Scala (или Java), но это выглядит отлично, поэтому я тоже решил произвести впечатление на моих друзей — некоторые переходят с Java на Scala, мы идем из Javascript в CoffeeScript. Будем использовать node.js как среду для запуска всех примеров.

  1. Удваивание всех элементов в списке

    Маркус начинает хвастаться с функции 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. Проверка вхождения подстроки

    Очень легко, так как у нас есть метод 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 оценивается как ложь.

  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. Фильтрация списка чисел

    Фильтрация списка чисел получилась достаточно похожей:
    passed = []
    failed = []
    (if score > 60 then passed else failed).push score for score in [49, 58, 76, 82, 88, 90]
    (Можно ещё использовать filter, но тогда не получится однострочника)

  7. Получение и разбор XML от веб-сервиса

    XML-что? Не слышал о таком. Давайте вместо этого получим JSON:
    request.get { uri:'path/to/api.json', json: true }, (err, r, body) -> results = body

  8. Поиск минимума (или максимума) в списке

    Здесь удобна функция apply. Она позволяет вызывать функцию, передавая массив как список аргументов: Math.max и Math.min получают переменное число аргументов, т.е. Math.max 30, 10, 20 возвращает 30. Попробуем поработать с массивом:
    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
    Обновление (5 июня): @dionyziz прислал мне компактную версию:
    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

  11. Бонус

    Самая читаемая версия fizzbuzz, которую вы когда-либо видели:
    "#{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]
Оригинальный пост: «10 CoffeeScript One Liners to Impress Your Friends
»

Автор: Ricardo Tomasi



F#


В духе of 10 "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей" вот некоторые однострочники на F#:
  1. Удваивание всех чисел в списке

    Тут всё просто, у F# тоже есть map:
    [1 .. 4] |> Seq.map (fun x -> x * x);;

  2. Сумма списка чисел

    Это так же просто, так как у F# есть ещё sum:
    [1 .. 4] |> Seq.sum;;

  3. Проверка вхождения подстроки

    И это просто, ведь у нас есть find:
    ["f#"; "scala"] |> Seq.find(fun w -> "this tweet contains f#".Contains(w));;

  4. Чтение файла (скуууучно!)

    У F# есть все библиотеки. NET. Очень легко прочесть все строки файла как последовательность:
    File.ReadLines(@"file.txt") |> Seq.map(fun l -> l.Length) |> Seq.sum;;

  5. С днём рожденья!

    Тоже скучно… вот так:
    [1 .. 4] |> Seq.map (fun i -> "Happy Birthday " + (if i = 3 then "dear NAME" else "to you")) |> Seq.iter Console.WriteLine;;

  6. Фильтрация (на самом деле, разделение) списков

    С использованием строенной функции partition, мы легко можем разделить список:
    [49; 58; 76; 82; 88; 90] |> List.partition (fun i -> i > 60);;

  7. Получение и парсинг XML

    Опять же, пригодятся библиотеки .NET. К сожалению, это не совсем однострочник в F#. Но Дон Сайм показывает, как это сделать синхронно и асинхронно.

  8. Поиск максимума и минимума в списке

    Для этого в F# сеть строенные функции:
    [49; 58; 76; 82; 88; 90] |> Seq.min;;
    [49; 58; 76; 82; 88; 90] |> Seq.max;;

  9. Параллельная обработка

    Это пример от J Rocha. Предположим, у нас есть метод «isprime», и мы хотим получить количество простых чисел, сгруппированных по их последней цифре, от 1 до 50000. 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;;
Оригинальный пост: «F# One liners to impress your friends»
Автор: Will Fitzgerald



Ruby


Был опубликован список из 10 однострочных примеров, которые призваны показать выразительность Scala. Версия CoffeeScript появились быстро, так что я думал, что опубликовал Ruby-версию один. Я считаю, что синтаксис Ruby немного чище, чем Scala, но в сущности (по крайней мере, насколько показывают эти примеры) относительно аналогичный.
  1. Удвоение всех чисел в списке

    (1..10).map { |n| n * 2 }

  2. Сумма списка чисел

    (1..1000).inject { |sum, n| sum + n }
    Или используя (встроенный) синтаксис Symbol#to_proc, который стал доступен, начиная с версии Ruby 1.8.7:
    (1..1000).inject(&:+)
    Или даже так:
    (1..1000).inject(:+)

  3. Проверка вхождения подстроки

    words = ["scala", "akka", "play framework", "sbt", "typesafe"]
    tweet = "This is an example tweet talking about scala and sbt."
    
    words.any? { |word| tweet.include?(word) }

  4. Чтение файлов

    file_text = File.read("data.txt")
    file_lines = File.readlines("data.txt")
    Последнее включает в себя "\n" в конце каждого элемента массива, который может быть отделён путем добавления .map { |str| str.chop } или с использованием альтернативной версии:
    File.read("data.txt").split(/\n/)

  5. С днём рожденья

    4.times { |n| puts "Happy Birthday #{n==2 ? "dear Tony" : "to You"}" }

  6. Фильтрация списка чисел

    [49, 58, 76, 82, 88, 90].partition { |n| n > 60 }

  7. Получение и разбор XML от веб-сервиса

    require 'open-uri'
    require 'hpricot'
    
    results = Hpricot(open("http://search.twitter.com/search.atom?&q=scala"))
    В этом примере требуются open-uri и hpricot или эквивалентные библиотеки, (вы можно использовать встроенную). Это не слишком много кода, но Скала явно выигрывает здесь.

  8. Поиск минимума (или максимума) в списке

    [14, 35, -7, 46, 98].min
    [14, 35, -7, 46, 98].max

  9. Параллельная обработка

    require 'parallel'
    
    Parallel.map(lots_of_data) do |chunk|
      heavy_computation(chunk)
    end
    В отличие от Scala, поддержка многоядерности не встроена. Этот пример требует parallel или аналогичный gem.

  10. Решето эратосфена

    Однострочник на Scala очень заумный, но совершенно нечитаемый. Простая реализация, требующая более чем одной строки, на Ruby:
    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
    Этот пример со StackOverflow.

Оригинальный пост: «10 Ruby One Liners to Impress Your Friends»
Автор: Antonio Cangiano



Clojure


Я увидел интересный пост сегодня под названием "10 однострочников на Scala, чтобы произвести впечатление на ваших друзей", а затем кто-то опубликовал в другом блоге пост под названием "10 однострочников на CoffeeScript, чтобы произвести впечатление на ваших друзей". Эти два поста показывают небольшие задачки (большинство из них имеют тривиальные решения в современных языках программирования), каждая их которых выполнены в примерно 1 строку кода.

Я думаю будем уместно сделать тоже самое для моего любимого языка программирования — Clojure.
  1. Удваивание всех чисел в списке

    (map #(* % 2) (range 1 11))

  2. Сумма списка чисел

    (reduce + (range 1 1001))

  3. Проверка вхождения подстроки

    Я считаю правильным использовать здесь регулярные выражения:
    (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
    Как подсказали комментаторы, эта проблема может быть решена без использования регулярных выражений за счет использования множеств Clojure.
    (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

  4. Чтение файла

    (def file-text (slurp "data.txt")) ; Читает весь файл
    (def file-lines (clojure.contrib.io/read-lines "data.txt")) ; Читает последовательность строк
    Clojure Contrib будет считаться устаревшим в будущих релизах Clojure, clojure.contrib.io/read-lines можно записать в виде (line-seq (clojure.java.io/reader (clojure.java.io/file “data.txt”))) в Clojure 1.3 и старше. Спасибо Aaron за указание на это.

  5. С днём рожденья

    (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")))
    

  6. Фильтрация списка чисел

    (partition-by #(> % 60) [49 58 76 82 88 90])

  7. Получение и парсинг XML от веб-сервиса

    (clojure.xml/parse "http://search.twitter.com/search.atom?&q=clojure")

  8. Поиск минимума и максимума в списке

    (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]

  9. Параллельная обработка

    ;; Предположим, что process-line - это интенсивно использующая процессор функция, оперирующая со строками
    (pmap process-line lines) ; Обратите внимание на "p" перед map

  10. Решето Эратосфена

    Я не достаточно хорош (с точки зрения производительности и красоты) для однострочного решения «Решета Эратосфена». Я рекомендую проверить труд Кристофа Гранда на эту тему под названием «Все любят Решето Эратосфена» для решения этой проблемы.

  11. Решение FizzBuzz

    (map #(cond (zero? (mod % 15)) "FizzBuzz" (zero? (mod % 3)) "Fizz" (zero? (mod % 5)) "Buzz" :else %) (range 1 101))
Оригинальный пост: «10 Clojure One Liners to Impress Your Friends»
Автор: Baishampayan



Python


После 10 удивительных однострочников на Scala/Ruby/Clojure/CoffeeScript, я подумал, что будет интересно сделать тоже самое на Python.

Без особого шума… поехали. Обратите внимание, что объявления переменных и импорты в отдельных строки по мере необходимости. Также каждая строка написана так, чтобы выводить результат на стандартный вывод для быстрой проверки.

Этот пост, возможно, один из самых быстрых, что я писал.
  1. Удваивание всех чисел в списке

    print map(lambda x: x * 2, range(1,11))

  2. Сумма списка чисел

    print sum(range(1,1001))

  3. Проверка вхождения подстроки

    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)

  4. Чтение файла

    print open("ten_one_liners.py").readlines()

  5. С днём рожденья

    print map(lambda x: "Happy Birthday to " + ("you" if x != 2 else "dear Name"),range(4))

  6. Фильтрация списка чисел

    print reduce(lambda(a,b),c: (a+[c],b) if c > 60 else (a,b + [c]), [49, 58, 76, 82, 88, 90],([],[]))

  7. Получение и разбор 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")

  8. Поиск минимума и максимума в списке

    print min([14, 35, -7, 46, 98])
    print max([14, 35, -7, 46, 98])

  9. Параллельная обработка

    import multiprocessing
    import math
    
    print list(multiprocessing.Pool(processes=4).map(math.exp,range(1,11)))

  10. Решето Эратосфена

    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))))
Оригинальный пост: «10 Python one liners to impress your friends»
Автор: Dhananjay Nene



C#


  1. Удваивание всех чисел в списке
    Print("Multiple each item in a list by 2", Enumerable.Range(1, 10).Select(i => i * 2));

  2. Сумма списка чисел

    Print("Sum a list of numbers", Enumerable.Range(1, 1000).Sum());

  3. Проверка вхождения подстроки

    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));

  4. Чтение файла

    Print("Read in a File", File.ReadAllBytes("oneliners.exe").Length);

  5. С днём рожденья

    Print("Happy Birthday", Enumerable.Range(1, 4).Select((i) => string.Format("Happy Birthday {0} ", i == 3 ? "dear NAME" : "to You")));

  6. Фильтрация списка чисел

    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);

  7. Получение и разбор XML от веб-сервиса

    Print("Fetch and Parse an XML web service", XDocument.Load("http://search.twitter.com/search.atom?&q=scala"));

  8. Поиск минимума и максимума в списке

    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 }));

  9. Параллельная обработка

    Print("Parallel Processing", Enumerable.Range(1, 10).AsParallel().Select((i)=>i*2).AsEnumerable());

  10. FizzBuzz

    Print("Fizzbuzz", Enumerable.Range(1, 15).Select((i)=>i + (i%3==0?"fizz":"") + (i%5==0?"buzz":"")));
Оригинальный пост: «10 C# One Liners to Impress Your Friends»
Автор: Richard Birkby



Haskell


Соледуя за мемом (scala, ruby, clojure, python, f#, coffeescript, c#).

  1. Удваивание всех чисел в списке
    map (*2) [1..10]

  2. Сумма списка чисел

    foldl (+) 0 [1..1000]
    -- или лучше
    sum [1..1000]

  3. Проверка вхождения подстроки

    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

  4. Чтение файла

    fileText <- readFile "data.txt"
    
    let fileLines = lines fileText
    -- или лучше
    let fileLines = fmap lines $ readFile "data.txt"

  5. С днём рожденья

    mapM_ putStrLn ["Happy Birthday " ++ (if x == 3 then "dear NAME" else "to You") | x <- [1..4]]

  6. Фильтрация списка чисел

    let (passed, failed) = partition (>60) [49, 58, 76, 82, 88, 90]

  7. Получение и разбор 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" []

  8. Поиск минимума и максимума в списке

    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]

  9. Параллельная обработка

    Для этого примера необходим пакет parallel.
    import Control.Parallel
    import Control.Parallel.Strategies
    
    parMap rseq (*2) [1..100]

  10. Генерация простых чисел

    let pgen (p:xs) = p : pgen [x|x <- xs, x `mod` p > 0]
    
    take 40 (pgen [2..])
Оригинальный пост: «10 Haskell One Liners to Impress Your Friends»
Автор: Michael Fogus




А теперь ваши варианты, и да начнутся холивары! )
Маршалов Александр @Amper
карма
157,2
рейтинг 0,0
Программист
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (147)

  • +11
    Померялись, ага :)
  • +1
    В C# задача 6 (фильтрация списка чисел) решена как-то слишком длинно. Непонятно, зачем там таплы. Почему не просто вот так?

    (new[] { 49, 58, 76, 82, 88, 90 }).ForEach( v => (v > 60 ? passed : failed).Add(v) );


    Не проверял, компилируется ли, но уверен, что как-то вот так можно решить задачу.
    • +2
      Простите, но не таплы, а тьюплы /ˈtjuːp(ə)l/
      oxforddictionaries.com/definition/tuple;jsessionid=53A30DAF1B12692CC0AF5CC4D192C2DB
      • 0
        Да, спасибо. Я когда-то даже специально смотрел транскрипцию, но уже забыл.
      • +3
        Мне нравится простое русское "кортеж".
        • +6
          А что в нём «простого русского»?
          Это заимствованоне французское слово(cortege).
          • +9
            Про «русское» — это была шутка :)
            Но всё-таки у нас в математике используется именно «кортеж», а не «тьюпл». Да и выговорить его куда проще.
            • +3
              Упорядоченная n-ка?..
            • +1
              А у нас используется «тупл». Русифицированная версия, даже склоняется: туплы, туплу и т.д. Это как с микрософтом :)
    • +1
      Можно так же использовать GroupBy:

      var result = (new[] { 49, 58, 76, 82, 88, 90 }).GroupBy(v => v > 60).ToDictionary(gr=>gr.Key);

      //result[true] - passed
      //result[false] - failed
  • –2
    на PHP это будет «многотысячник», а не «однострочник» :)
    • +4
      Ну кроме пункта 9, все остально вполне ок.
      • +3
        А чего минусуете? :) Сам пишу на php не первый год.

        Самоирония должна быть у каждого разработчика. Код, представленный на описанных в посте языках, более лаконичный. И это надо признать.
        • –3
          Какой из 10 однострочников будет представляться в виде тысяч строк на PHP?
          • 0
            В русской литературе есть понятие «гипербола». Не надо понимать буквально мои слова. Не 1000 строк, но 10-15 строк. PHP никогда не гордился лаконичностью кода.
            • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Эко вы хитро гиперболой-то нас ошарашили! Как лопатой по лбу!
        • +12
          val fileText = io.Source.fromFile("data.txt").mkString

          менее лаконичен, чем
          $fileText = file_get_contents("data.txt");


          Строго говоря, только пункт 9 решается в десять строчек, остальные реализуются через одну строчку (благодаря PHP 5.3)
          • 0
            Для п.9 в PEAR что-то есть, если мне память не изменяет, чтобы в 1 строку
        • +24
          Как ниже описали — на PHP код не менее лаконичный.

          Поехали по пунктам:

          // 1
          // PHP 5.3
          array_map(function($a){return $a*2;}, array(...));

          // 2
          array_sum(array(...));

          // 3
          strpos($mystring, $findme);

          // 4
          $fileText = file_get_contents("data.txt");


          P.S. Кроме троллей никого не минусую принципиально
      • +1
        Согласен, все пункты кроме 9 можно выполнить на php в одну строчку.
  • +6
    Обожаю такие посты!
  • +11
    Первую задачу на питоне можно решить через list comprehension:
    print [x*2 for x in range(1,11)]

    Легче читается, чем через лямбды
    • +1
      Кстати, когда много таких здач решать приходится, вместо list используют numpy.array, он мощнее и быстрее:

      # arr = numpy.array(range(1, 1001))
      print arr*2
      
  • +14
    А как же Perl? :(
    • +17
      Оригинальное название поста «как на других языках написать однострочники перла» :3
    • +15
      А Perl в жюри!
    • +5
      Он смотрит на все примеры как на говно зная что может намного больше уместить в одну строку ^_^
    • +2
      Вот и Perl. =)
  • +1
    Извините, но заголовок режет слух. Лучше было бы так: «10 строк кода, которые удивят(шокируют) ваших друзей».
    За подборку спасибо.
    • 0
      Спасибо, поправил
  • +11
    вхождение подстроки, Python:

    wordlist = ["scala", "akka", "play framework", "sbt", "typesafe"]
    tweet = "This is an example tweet talking about scala and sbt."

    print [word in tweet for word in wordlist


    Если нужно только булево значение, как на scala:

    wordlist = ["scala", "akka", "play framework", "sbt", "typesafe"]
    tweet = "This is an example tweet talking about scala and sbt."

    print any(word in tweet for word in wordlist)
  • +1
    ], прошу прощения :)
  • +6
    Третий однострочник на Python не найдёт «play framework», даже если он будет присутствовать в строке tweet, ибо split()
  • +1
    (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)));

    Заказчик платить за кол-во символов?
  • +1
    А каждый посмотрел только те строки, на языке которых он пишет?
    • 0
      я наоборот))
    • 0
      Я посмотрел первые 2 или 3, а дальше пропускал. Суть задач понятна, на тех я зыках, что я использую, сделать смогу (ну большую часть), поэтому непонятно, зачем смотреть на своих.
  • +4
    Увидев заголовок, я уж надеялся увидеть следующее:
    echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{
  • +13
    Кое-что на PHP
    1:
    array_map(function($v){ return $v*2;}, range(1,10));

    2:
    array_sum(range(1,1000));

    3:
    $word_list = array("monad", "monoid", "Galois", "ghc", "SPJ");
    $str = "This is an example tweet talking about SPJ interviewing with Galois";
    $result = (bool)array_filter($word_list, function($v)use($str){return (strpos($str, $v)!==FALSE);});

    4:
    $file = file_get_contents("data.txt");

    5:
    implode(PHP_EOL, array_map(function($v){ return "Happy Birthday ".(($v==3)?"dear NAME":"to you");}, range(1,4)));

    6:
    array_filter(array(49, 58, 76, 82, 88, 90), function($v){return ($v>60);});

    7:
    $xml = simplexml_load_file("http://search.twitter.com/search.atom?&q=scala");

    8:
    $min = min(array(14, 35, -7, 46, 98));
    $max = max(array(14, 35, -7, 46, 98));
    • +5
      У меня немного иначе вышло
      1. Удваивание всех чисел в списке
      foreach(range(1,10) as &$v) $v *= 2;
      2. Сумма списка чисел
      $result = array_sum(range(1, 10));
      3. Проверка вхождения подстроки
      $tweet = "This is an example tweet talking about scala and sbt.";
      foreach(array("monad", "monoid", "Galois", "ghc", "SPJ") as $word)
      strpos($tweet, $word) === false ?: $hits[] = $word;
      var_dump($hits);

      4. Чтение файла
      $lines = file("data.txt");
      5. С днём рожденья
      foreach(range(1,10) as $i) echo "Happy Birthday " .($i%2 ? "dear Robert" : "to You");
      6. Фильтрация списка чисел
      $passed = $failed = array();
      foreach(range(1,10) as $v) ($v > 10) ? $passed[] = $v : $failed[] = $v;

      7. Получение и разбор XML от веб-сервиса ( XML -> массив)
      $parser = function ($iter) use (&$parser) {
      foreach($iter as $key=>$val) $arr[$key][] = ($iter->hasChildren()) ? $parser($val) : strval($val);
      return $arr;
      }
      $result = $parser(new SimpleXmlIterator(file_get_contents("http://domain.ru/api"), null));

      8. Поиск минимума (или максимума) в списке
      max(array(14, 35, -7, 46, 98));
      min(array(14, 35, -7, 46, 98));
      • 0
        ух, не указал язык(
      • 0
        10й пункт (про решето), не знаю как записать короче:
        $i = range(2,100); 
        while(($a[] = array_shift($i))&&count($i) > 0)foreach($i as $k=>$v) if($v%end($a) == 0) unset($i[$k]);
        


        Простые числа в лежат в $a
        var_dump($a);


        • –1
          В одну строчку это можно утолкать, если первую строчку вставить в array_shift.
          • 0
            Не совсем понял, как именно?
            • 0
              while(($a[] = array_shift($i = range(2,100)))&&count($i) > 0)foreach($i as $k=>$v) if($v%end($a) == 0) unset($i[$k]);

              Но в данной ситуации такой финт ушами не работает.

              И да, я в курсе, что это не кошерно и всё такое.
              • 0
                кошерно-не кошерно, но такой код не работает :)
                • 0
                  Вообще объявление переменных внутри аргументов функций или внутри if вполне работает. Просто приведённый пример — не тот случай. Хотя, чтобы оно заработало можно извратиться ещё дальше с isset и тернарным оператором, но это уже будет совсем говнокод :)
                  • 0
                    объявление переменных внутри аргументов функций работает.
                    Но, ($i = range(2,100)) — вернет true, соответственно будет выполнятся array_shift(true) — а значит все зациклится.
                    Попробуйте сами :)
                  • 0
                    а нет вру.
                    зациклится, но не поэтой причине. ($i = range(2,100)) — вернет не boolean а сам массив.
        • +2
          for($i = range(2,100);($a[] = array_shift($i)) && count($i) > 0;)foreach($i as $k=>$v) if($v%end($a) == 0) unset($i[$k]);
          
          • 0
            Да, кстати, вот и одна строчка :)
    • +2
      1. foreach (range(0, 1000) as $i) $i*2;
      2. array_sum(range(0, 1000));
      3. count(array_diff($wordlist, explode(' ', $tweet)))>0?true:false;
      4. file_get_contents(); или file() для построчного чтения.
      


      дальше лень )
      • 0
        1 не очень корректно, возвращает не список. Вернее вообще ничего не возвращает :)
        • 0
          А он нигде не возвращает
          Можно так
          foreach (range(0, 1000) as $i) echo $i*2;
          

          или так
          foreach (range(0, 1000) as $i)  $a[]=$i*2;
          


          Это уже мелочи.
          Мне вот 10й пункт более интересен :)
          • +1
            array_map(function($v){ return $v*2;}, range(1,10));
            из коммента выше — возвращает ) Примеры в посте на руби и питоне тоже, остальные — похоже на то.
            • 0
              В данном случае, работать будет только в 5.3 или выше.
              А что же, в 5.2 в одну строку уже не записать? :)
              • 0
                На планшете неудобно :)
      • 0
        3 не корректно, нужен поиск подстроки, а у вас происходит поиск слова в строке.
        • +1
          Я не совсем понял, что вы имели ввиду, в любом случае, 3 пункт на php в одну строку лучше всего будет выглядеть так:
          !(str_replace($wordlist,'',$tweet)==$tweet);
          
          • 0
            Красиво, ничего не скажешь.
    • +2
      Кстати, песенка про день рождения делается намного проще (и не обязательно 5.3 PHP)
      for($i=0;++$i<=4; printf("Happy Birthday %s", $i==3?"dear NAME":"to You"))
    • 0
      $min = min(14, 35, -7, 46, 98);
      $max = max(14, 35, -7, 46, 98);
  • +13
    Только, прошу — не использовать такое в коде, который я буду поддерживать. Потому как я маньяк и знаю ваши адреса…
    • 0
      Да ладно, там вроде бы нигде нет грязных хаков. И уж всяко лучше писать
      doubles = [x*2 for x in range(1,5)]
      чем
      doubles = []
      i = 1
      while i<5:
        l.append(i*2)
        i+=1
      


      Да, во втором как бы более понятен метод работы. Правда, только для тех, кто на питоне не программирует. А если знаешь язык, и не пользуешься его легитимными функциями — это как-то странно.
      Меньше кода — меньше ошибок.
  • +18
    а как же 10 однострочников на assembler?
  • +1
    одностроки на sed смотрятся весьма неплохо (запускать можно, безобидная команда):
    echo 0|sed 's909=bO%3g)o19;s0%0aob)]vO0;s()(0eh}=(;s%}%r1="?0^2{%;
    s)")@l2h3%"@$);sw%wh]r()$o%!w;sz(z^+.z;sa+a !z" a;sxzxi?v{a)ax;:b;
    s/\(\(.\).\)\(\(..\)*\)\(\(.\).\)\(\(..\)*%.*\6.*\2.*\)/\5\1\3\7/;
    tb;s/%.*//;s/.\(.\)/\1/g'

    а вообще их далеко не десяток.
    про аналогичный список для awk'a, я не говорю, т.к. awk, в отличии от sed, не является языком программирования.
    зы. но мой любимый однострок — на перле (запускать не стоит, если что — я предупреждал):
    echo "test... test... test..." | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'
    • 0
      Я надеюсь, Вы хотели сказать, что awk, в отличии от sed, является языком программирования? :)
      • +3
        Я хотел сказать именно то, что сказал. Тем не менее ошиблись и Вы, и я. sed — язык программирования (пруф), только вот awk таки тоже язык программирования.
        Человекам свойственно ошибаться, что поделать.
        • 0
          Да уж, оказывается sed — тьюринг-полный язык.
      • 0
        sed ':s;s:^.\+$:{s}\:{y}=*}2>y:;y:{\:}:r-:;y:y=s:f/m:;:m;s;.\.\?\+;&\&;e;bm'

        Не печатает
        • 0
          Парсер пробел убил после :r-
        • 0
          ну вы хотя бы проверили свое творение. оно ж работать не будет. конструкция после :m не отрабатывает. про мелочи типа ненужной метки :s я уж совсем молчу.
          • +1
            Опечатался несколько раз, понедельник же. Хотя, может это защита от дурака, а то ещё на боевых серверах пустят.
          • 0
            Вот, пофиксил.
            sed ':s;s:^.\+$:{s}\:{y}=*}2>y:;y:{\:}:r- :;y:y=s:f/m:;:m;s;.\?\+;&\&;e;bm'
            • 0
              та не, ну зачем там цикл то в конце? он же сам себя в рекурсию загоняет.
              вот так прекрасно сработает (и писать лучше в домашнюю директорию, а то вдруг в текущую нету прав на запись:
              echo 0|sed 's:^.\+$:{s}\:{y}=*}2>y:;y:{\:}:r- :;y:y=s:f/m:;s=>=>~/=;s;.\?\+;&\&;e'
    • 0
      Если запускать не стоит, то поделитесь, пожалуйста — что делает этот однострок?
    • +1
      # IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format
      awk 1

      Шедеврально :-)
  • +2
    hpricot в ruby как-то уже морально устарел вместо него рекомендуется Nokogiri.
    вместо partition в фильтрации чисел вы скорее всего имели в виду select.
    и вообще решето эратосфена у вас странное. нужен однострок? держите:
    puts (errat = lambda { |arr=(2..20).to_a, mul=2, max=20| mul > max/2 ? arr : errat.call(t = arr.select { |x| x == mul || x % mul != 0 }, t[t.find_index(mul)+1], max) }).call

    :)
    • +1
      точнее даже так:
      puts (errat = ->(arr=(2..20).to_a, mul=arr.first, max=arr.last) { mul > max/2? arr: errat.(t = arr.select { |x| x == mul || x % mul != 0 }, t[t.find_index(mul)+1], max) }).()
  • 0
    поднять веб сервер на питоне одной строкой:
    python -m SimpleHTTPServer
    Ну просто очень часто этим пользуюсь для отладки.
    • +1
      Я б не сказал, что это «на Python» )
      • +1
        вот на ruby это действительно так:
        WEBrick::HTTPServer.new(:Port => 3000, :DocumentRoot => Dir.pwd).start
  • +6
    Где элегантные решения для brainfuck !? :)
  • +2
    вставлю свои 5 копеек
    не совсем те задачи, которые указывались, но всё же. Все примеры на c#

    вычисление числа фибоначчи
    Enumerable.Range(1, n).Skip(2).Aggregate(new KeyValuePair<int, int>(1, 1), (seq, index) => new KeyValuePair<int, int>(seq.Value, seq.Key + seq.Value)).Value


    вычисление факториала
    Enumerable.Range(1, n).Aggregate((accumulator, next) => accumulator * next);
  • +2
    Решето Эратосфена используется для нахождения всех простых чисел до некоторого целого числа n, а для того, чтобы определить, является ли число простым, используются тесты на простоту.

    Сборка понравилась. Особенно любят однострочные коды Python-программисты, сам язык толкает к минимализму. Хотя, в принципе, если перейти к монадическому синтаксису в том же C#, то в одну строчку можно записать почти что хочешь.
  • 0
    Создание и разрушение модальной формы в одну строчку. Delphi.

    with TMyModalForm.Create(nil) do try Result := ShowModal = mrOK finally Free end;
  • +8
    Лучше 10 строк понятного кода, чем 1 говнострочник.
    • 0
      Всё в этом мире симметрично:
      Лучше одна понятная строка, чем 10 строчек говнокода.

      Из говнокода в этих примерах — разве что решето Эратосфена, да ещё фильтрация списка в некоторых примерах. И то, большей частью из-за желания написать в одну строку код, которых всё-таки по хорошему занимает несколько строк.
  • +1
    Для ruby можно короче с xarray гемом

    require 'xarray'
    (1..10).to_a.map { x * 2 }

    p.s. Потом можно будет и без to_a
    • 0
      этот xarray только портит читаемость кода:
      1) теряется мнемоничность переменных. items.map {|item| item.do_smth } понятнее, чем x, особенно когда items имеет определённую смысловую нагрузку
      2) определите x вне блока до этого — и мучайтесь с дебагом
      3) смотришь на блок — и не можешь понять, откуда взялось это 'x'
      • 0
        это инструмент который смысл применять в нужных ситуациях

        тут главная задача — ускорение и упрощение небольших скриптов.

        когда у тебя длинная цепь из map, select, each конкретное название роли играть не будет. Тем более этот механизм идет вместе а не вместо

        Полностью согласен с пунктом 2.

        если включил xarray то скорее всего что такое х ты уже знаешь
  • +1
    Сборка для php
    (часть взята из комментов выше, варианты с анонимными функциями решил не использовать, т.к. работают только в версии 5.3 и выше)
    1. foreach (range(0, 100) as $i) echo $i*2;
    2. array_sum(range(0, 100));
    3. !(str_replace($wordlist,'',$tweet)==$tweet)
    4. file_get_contents('file.txt'); или file('file.txt'); для построчного чтения.
    5. for($i=0;++$i<=4; printf("Happy Birthday %s", $i==3?"dear NAME":"to You"));
    6. foreach(range(1,10) as $v) ($v > 10) ? $passed[] = $v : $failed[] = $v;
    7. $xml = simplexml_load_file("http://search.twitter.com/search.atom?&q=scala");
    8. $min = min(array(14, 35, -7, 46, 98));
       $max = max(array(14, 35, -7, 46, 98));
    9. -
    10. $i=range(2,100);while(($a[]=array_shift($i))&&$i)foreach($i as $k=>$v)if(!($v%end($a)))unset($i[$k]);
    • 0
      10й пункт был поправлен юзером Ogra
      for($i=range(2,100);($a[]=array_shift($i))&&count($i)>0;)foreach($i as $k=>$v)if($v%end($a)==0)
      unset($i[$k]);
  • 0
    PHP, 9й пункт.
    Не уверен в работоспособности, вечером проверю:

    $jobs = array("./job1.php", "./job2.php");
    foreach ($jobs as $job) {popen('/usr/local/bin/php '. $job, 'r');}
    • 0
      Может curl_multi?
      • 0
        Можно и curl_multi и через сокеты fsockopen, если задачи «расшарены» миру. Через пайпы же можно запускать задачи «скрытые» от внешнего мира.
  • +1
    Common Lisp:
    sprunge.us/IYXU

    (Стандартная библиотека уж очень тонкая, поэтому позволил себе использовать alexandria)
    (Решето Эратосфена неосилил)
    • 0
      Судя по скромному молчанию, по ссылкам здесь ходить тоже не принято. Приведу (слегка поправив) самые интересные пункты: (html не могу, простите)

      2. Суммируем все числа в списке

      Свёртку использовать неинтересно:
      (reduce #'+ (iota 1000 :start 1))

      Гораздо веселее цикл:
      (loop for i from 1 to 1000 summing i)

      5. С днём рожденья!

      (format t "~{Happy Birthday ~:[to You~;dear NAME~]~^~&~}" '(nil nil t nil))
  • +2
    Groovy:
    1. (1..10).each{println it*2}
    2. (1..10).sum()
    3. 
      def wordList = ['groovy','programming']
      def tweet = 'interesting tweet about groovy'
      wordList.each{if(tweet.contains(it))return true}
      return false;
      

      Красивее не знаю как сделать.
    4. def stringList = new File(fileNameHere).readLines()
    5. (1..4).each{println("Happy birthday${it == 3?', dear NAME':' to you'}")}
    6. def passed=[]
      def failed = []
      [23,45,67,69,35,47,79,23,45,85,23,68,22,88,63].each{it>60 ? passed.add(it) : failed.add(it)}}
    7. Не знаю, как сделать красиво
    8. [23,45,67,69,35,47,79,23,45,85,23,68,22,88,63].min()
    9. Не знаю, думаю, что красивого решения нету
    10. Копипаста с розеттакод:
      def sievePrimes = { bound -> 
          def isPrime  = new BitSet(bound)
          isPrime[0..1] = false
          isPrime[2..<bound] = true
          (2..(Math.sqrt(bound))).each { pc ->
              if (isPrime[pc]) {
                  ((pc**2)..<bound).step(pc) { isPrime[it] = false }
              }
          }
          (0..<bound).findAll { isPrime[it] }
      }
      
      
    • +1
      1 (1..10).collect{it*2}
      3 wordList.collect{tweet.contains(it)}
      6 def (passed, failed) = [23,45,67,69,35,47,79,23,45,85,23,68,22,88,63].split{it>60}
      7 def xml = new XmlParser().parse('http://search.twitter.com/search.atom?&q=scala')
      • 0
        но println-то в первом все равно нужен?
        за 3-6-7 спасибо!
      • 0
        а третье нам не вернет итоговый true или false;

        А вообще, в чем разница между collect и each?
        • 0
          3. wordList.any{tweet.contains(it)}
          • 0
            Классно, спасибо!

            А может вы мне подскажете, чем отличается collect и each?
            • 0
              each выполняет переданный closure в цикле и возвращает объект на котором вызван.

              collect возвращает список значений которые возвращает closure – en.wikipedia.org/wiki/Map_(higher-order_function)
            • 0
              Кстати ваш вариант 3 вообще не рабочий.
              • 0
                Спасибо. А ведь вы правы — closure-то делает не тот ретурн.
  • –6
    Я думаю, на знакомых самое большое впечатление произведёт однострочник
    rm -Rf /
    • 0
      Да ладно!
    • +1
      --no-preserve-root забыли :)
    • +2
      Я вас огорчу:
      root@test:~# rm -rf /
      rm: it is dangerous to operate recursively on `/'
      rm: use --no-preserve-root to override this failsafe
    • 0
      Бсдшник? держите плюсик :)
    • 0
      Смех смехом, а я когда-то давно, обжегся на команде rm.

      Опечатался в скрипте и в результате получилось что-то вроде rm -rf / (уж не помню точно). Причем опечатку я заметил быстро и сразу по ctrl+c, но было слишком поздно, машина начала в ужасе кричать на свое недомогание, а после ребута не поднялась вовсе. Выяснилось, что за буквально пару секунд было вынесено 70% системы. :)
      Но у меня был хэппи-энд, машинка была тестовая, и новую работу мне искать не пришлось.

      С тех пор на 10 раз проверяю написанный скрипт, перед запуском.
  • 0
    За руби отдельно мерси.
  • +3
    Powershell (15 минут):
    1. (1..10) | ForEach { $_ * 2 }
    2. ((1..1000) | Measure -Sum).Sum
    3. "This is an example tweet talking about javascript and stuff." -match "coffeescript|eko|play framework|and stuff|falsy"
    4. Content data.txt
    5. (1..4) | ForEach { $s = "Happy Birthday "; $s += If($_ -eq 3) {"dear NAME"} Else {"to You"}; $s }
    6. (49, 58, 76, 82, 88, 90) | ForEach { If($_ -gt 60) {$List1 += @($_)} Else {$List2 += @($_)} }
    7. $xml = (New-Object System.Xml.XmlDocument); $xml.load("test.xml")
    8. ((14, 35, -7, 46, 98) | Measure -Minimum).Minimum
    9. (есть, но в одну строку не влезет)
    10. ForEach($i in 2..($n = 130)) { If($n % $i -eq 0) {Break}  }; If($i -eq $n) {"Prime"} Else {"Not prime"}
    

    • 0
      Седьмой-то надо из сети грузить.
      • 0
        Кому как. В зависимости от винды.
      • 0
        $xml = (New-Object System.Xml.XmlDocument); $xml.load("http://habrahabr.ru/rss/lenta/9c1806bb61d9b6612943104ddbf830d9")
        


        ПОтом можно

        $xml.rss.channel.item
        • +1
          Кстати, можно ведь еще чуть короче:
          7. ($xml = New-Object System.Xml.XmlDocument).load("test.xml")

          • 0
            [xml](new-object System.Net.WebClient).DownloadString('http://habrahabr.ru/rss/lenta/9c1806bb61d9b6612943104ddbf830d9')
            
            • 0
              Имхо так все-таки сложнее)
    • +1
      Сократим буковки
      1. 1..10 | % { $_ * 2 }
      2.(1..1000 | Measure -s).Sum
      4. gс data.txt
      5. 1..4 | % { "Happy Birthday $(If($_ -eq 3) {"dear NAME"} Else {"to You"})" }
      
      • +1
        1..4 | %{"Happy Birthday "+("to You", "dear NAME")[$_ -eq 3]}
        
      • 0
        Действительно, за это спасибо)
  • +3
    Мне кажется, что (1 to 1000).sum лучше записать как 1000*1001/2 или, еще лучше, 500500
    • 0
      Отличная идея :)
  • 0
    на bash:
    1. seq 10 | sed 's/$/*2/' | bc
    2. seq 10 | sed ':a;N;$!ba;s/\n/+/g' | bc
    3. echo "long long string" | grep "substr" 1>/dev/null 2>&1 && echo success || echo fail
    4. cat file
    5. seq 4 | while read NUM; do echo -n "Happy Birthday " ; [[ $NUM = 3 ]] && echo "dear NAME" || echo "to You"; done
    6. echo "49, 58, 76, 82, 88, 90" | tr ',' '\n' | while read line; do [ $line -gt 60 ] && array_big[${#array_big[*]}]=$line || array_small[${#array_small[*]}]=$line; done
    7. xml2 < file.xml
    8. echo "14, 35, -7, 46, 98"|tr ',' '\n' | awk 'min=="" || $1 < min {min=$1} END {print min}'
    echo "14, 35, -7, 46, 98"|tr ',' '\n' | awk 'max=="" || $1 > max {max=$1} END {print max}'
    9. seq 10 | while read line; do (echo very long process & ) ; done
    10.A=128014;Z=0;for i in `seq 2 $(echo "sqrt($A)+1"|bc)`; do X=$(($A%$i)); [[ "$X" = "0" ]] && Z=1; done; [[ $Z = 1 ]] && echo is complicated || echo is simple
  • 0
    Где мой любимый C++? С использованием, например, qt4 можно творить точно такие же вещи.
    • 0
      // 1. Удваивание всех чисел в списке
      for_each(a, a + 10, [] (int &x) { x *= 2; });
      // 2. Сумма списка чисел
      int sum = 0; for_each(a, a + 10, [&sum] (int x) { sum += x; });
      // 3. Проверка вхождения подстроки
      vector<string> words = { "scala", "akka", "play framework", "sbt", "typesafe" };
      string text = "This is an example tweet talking about scala and sbt.";
      for_each(words.begin(), words.end(), [text] (string word) { cout << (text.find(word) != string::npos) << endl; });
      // 4. Чтение файла
      string data; ifstream in("10.cpp"); getline(in, data, '\0');
      // 5. С днём рожденья
      for (int i = 0; i < 4; ++i) printf("Happy Birthday %s\n", i == 2 ? "dear Name" : "to You");
      // 6. Фильтрация списка чисел
      vector<int> a = { 49, 58, 76, 82, 88, 90 };
      a.resize(remove_if(a.begin(), a.end(), [] (int &x) { return x > 60; }) - a.begin());
      // 7. Минимальный и максимальный элементы
      *min_element(a.begin(), a.end());
      *max_element(a.begin(), a.end());


      это то что смог с ходу на C++ накидать, есть идеи по остальным пунктам и улучшениям этих?
      • 0
        > for (int i = 0; i < 4; ++i) printf(«Happy Birthday %s\n», i == 2? «dear Name»: «to You»);

        Этот однострочник 20 лет назад можно было на C написать. Что-то здесь скалисты перемудрили.
        • +1
          40 лет назад, если мне не изменяет память, то C появился в 70х годах :)
          • 0
            Если мне не изменяет память, то сейчас 10-е, 40 лет от 70-х, каждый день чувствую.
  • 0
    (1 to 1000).reduceLeft( _ + _ )


    я один тут голую жопу сидящую на стуле вижу?
  • +2
    А так считается?
    ldi a, 0x00 \n ldi b, 0x0A \n main_loop: \n cpi a, b \n brsh exit \n mov c, a \n add c, c \n out c \n inc a \n jmp main_loop
  • 0
    F#
    1. Если не возводить в квадрат, а удваивать, как на Scala, то можно так:
    [1..10] |> Seq.map ((*) 2)

    5. Можно без map'a:
    Seq.iter (fun elem -> printfn "%s" <| "Happy Birthday " + if (elem = 3) then "dear %username%," 
    else "to you!") [1..4]


    А так — круто! :)
  • +2
    А где Брейнфак? Там в любом случае однострочники вышли б )
  • +2
    После программирования на Perl — не удивляет.
    • 0
      Таки да.

      Недавно помню решали одну мелкую задачку-тест.

      Условия просты: Есть набор товаров на POS-терминале типа «AABBCC» (два товара А, два Б, два Це). Есть прайс лист со скидочными ценами — типа товар А стоит 1.25 за одну штуку но 3 за 3 штуки и т.д.

      Нужно подсчитать сумму покупки.

      Мои решения: Perl с одной перменной, C# с одним классом, C# без единого класса и переменных

      Если кто-то знает как что-то улучшить — форкайте :) Или тоже интересны красивые маленькие решения на других языках.
      • 0
        Дайте пару примеров входных и выходных данных.
        • 0
          сейчас для спортивного интереса сделал еще JavaScript версию (пришлось правда для красоты функцию редьюса для объектов добавить.

          Тестовые данные можно из решений взять:
          var pricelist = { 
             A: { price: 1.25, pack: 3, ppack: 3}, 
             B: { price: 4.25 }, 
             C: { price: 1, pack:6, ppack:5}, 
             D: { price: 0.75} };
          ....
          console.log(POS(['A','B','C','D','A','B','A'])); // -> 13.25
          console.log(POS(['A','B','C','D'])); // -> 7.25
          console.log(POS(['C','C','C','C','C','C','C'])); // -> 6
          
          • 0
            sprunge.us/ReWV?cl

            Переменных нет, код чисто-функциональный. Есть пара именованных значений спрятанных в аргументах лямбд просто чтобы не считать их по пять раз.
  • 0
    map() в питоне deprecated, вместо него следует юзать list comprehensions.
  • 0
    Perl ссылка не работает, и вообще не могу найти этот документ, очень грустно, к кэшах тоже нет

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.