Однострочная программа

редактировать

Первоначально однострочная программа была текстовым вводом в командную строку операционной системы оболочки, которая выполняет некоторую функцию всего за одну строку ввода. Однострочным может быть

  • выражение, написанное на языке оболочки;
  • вызов интерпретатора вместе с исходным кодом программы для запуска интерпретатора;
  • вызов компилятор вместе с исходным кодом для компиляции и инструкциями по выполнению скомпилированной программы.

Некоторые динамические языки сценариев, такие как AWK, sed, и Perl традиционно умело выражали однострочники. Специализированные интерпретаторы оболочки, такие как оболочки Unix или Windows PowerShell, позволяют создавать мощные однострочники.

Использование фразы «однострочный» было расширено, чтобы также включить исходный код программы для любого языка, который делает что-то полезное в одной строке.

Содержание
  • 1 История
  • 2 Примеры
    • 2.1 BASIC
    • 2.2 C
    • 2.3 AWK
    • 2.4 J
    • 2.5 Perl
    • 2.6 Haskell
    • 2.7 Racket
    • 2.8 Python
      • 2.8.1 оболочки Python
      • 2.8.2 Исполняемые библиотеки
    • 2.9 Язык управления инструментами TCL
    • 2.10 Windows PowerShell
  • 3 См. Также
  • 4 Ссылки
  • 5 Внешние ссылки
История

Концепция однострочной программы известна с 1960-х годов, когда был выпущен язык программирования APL. Благодаря краткому синтаксису и мощным математическим операторам APL позволял представлять полезные программы несколькими символами.

В 1970-х однострочные стали ассоциироваться с появлением домашних компьютеров и BASIC. Компьютерные журналы публиковали программы набора на многих диалектах BASIC. Некоторые журналы посвящали регулярные колонки исключительно впечатляющим коротким и однострочным программам.

Слово «однострочный» также имеет две ссылки в указателе книги Язык программирования AWK (книга часто обозначается аббревиатурой TAPL). В нем объясняется язык программирования AWK, который является частью Unix операционной системы. Авторы объясняют рождение однострочной парадигмы своей повседневной работой на ранних Unix машинах:

В версии 1977 года было только несколько встроенных переменных и предопределенных функций. Он был разработан для написания коротких программ […] Наша модель заключалась в том, что вызов должен состоять из одной или двух строк, вводиться и использоваться немедленно. Для соответствия этому стилю были выбраны значения по умолчанию […] Мы, как авторы, знали, как предполагается использовать язык, и поэтому мы писали только однострочники.

Обратите внимание, что это первоначальное определение однострочника подразумевает немедленное выполнение программы без компиляции. Таким образом, в строгом смысле, только исходный код для интерпретируемых языков считается однострочным. Но это строгое понимание однострочного языка было расширено в 1985 г., когда IOCCC представил категорию Best One Liner для C, который является компилируемым языком.

Примеры

Однострочники также используются, чтобы продемонстрировать дифференциальную выразительную силу языков программирования. Часто однострочники используются для демонстрации способностей к программированию. Часто проводятся конкурсы, чтобы увидеть, кто может создать самый выдающийся однострочный материал.

BASIC

Смоделированный вывод однострочной программы 10PRINT BASIC для Commodore 64 - 10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10

Одна строка BASIC обычно может содержать до 255 символов, а одна строка варьируется от простых игр до графических демонстраций. Один из наиболее известных демонстрационных однострочников в просторечии известен как 10PRINT и написан для Commodore 64 :

10 PRINT CHR $ (205,5 + RND (1)); : GOTO 10

C

Следующий пример представляет собой программу C (победившая запись в категории «Лучшая однострочная» статьи IOCCC ).

main (int c, char ** v) {return! M (v [1], v [2]);} m (char * s, char * t) {return * t-42? * S? 63 == * t | * s == * t m (s + 1, t + 1):! * T: m (s, t + 1) || * s m (s + 1, t);}

Эта однострочная программа представляет собой средство сопоставления с шаблоном глобуса. Он понимает глобальные символы `* ', означающие` ноль или более символов' и `? ' означает ровно один символ, как и большинство оболочек Unix.

Запускайте его с двумя аргументами: строкой и шаблоном глобуса. Статус выхода равен 0 (оболочка true), когда шаблон соответствует, и 1 в противном случае. Шаблон glob должен соответствовать всей строке, поэтому вы можете использовать * в начале и в конце шаблона, если вы ищете что-то в середине. Примеры:

$./a.out foo 'f ??'; эхо $? $./a.out 'лучшая короткая программа' '?? st * o ** p? *'; эхо $?

AWK

Книга TAPL содержит 20 примеров однострочников в конце первой главы книги.

Вот самые первые из них:

  1. Вывести общее количество строк ввода:
    END {print NR}
  2. Вывести десятую строку ввода:
    NR == 10
  3. Распечатайте последнее поле каждой строки ввода:
    {print $ NF}

J

Вот примеры в J :

  • функции avg, возвращающей среднее значение списка чисел :
    avg =: + /% #
  • Quicksort :
    quicksort =: (($: @ (<#[), (=#[), $:@(># [)) ({~? @ #)) ^: (1 <#)

Perl

Вот примеры на языке программирования Perl :

  • Ищите повторяющиеся слова
perl -0777 -ne 'print "$.: удвоил $ _ \ n ", а / \ b (\ w +) \ b \ s + \ b \ 1 \ b / gi'
  • Найдите палиндромы в / usr / dict / words
perl -lne 'напечатайте, если $ _ eq reverse'/ usr / dict / words
  • редактирование на месте файлов *.c с заменой всего foo на bar
perl -p -i.bak -e' s / \ bfoo \ b / bar / g'*.c

Практично много однострочников. Например, следующий однострочник Perl перевернет все байты в файле :

perl -0777e 'печать скалярного обратного <>' имя_файла

Пока st Perl однострочники являются обязательными, поддержка Perl анонимных функций, замыканий, отображения, фильтра (grep) и сворачивания (List :: Util :: reduce) позволяет создавать «функциональные» однострочники.

Этот однострочный файл создает функцию, которую можно использовать для возврата списка простых чисел до значения первого параметра:

my $ z = sub {grep {$ a = $ _; ! grep {! ($ a% $ _)} (2.. $ _- 1)} (2.. $ _ [0])}

Его можно использовать в командной строке, например:

perl -e '$, = ","; print sub {grep {$ a = $ _; ! grep {! ($ a% $ _)} (2.. $ _- 1)} (2.. $ _ [0])} ->(shift)'число

на распечатать разделенный запятыми список простых чисел в диапазоне 2 - число.

Haskell

Следующая программа Haskell является однострочным: она сортирует свои входные строки ASCIIbetically.

main = (mapM_ putStrLn. Data.List.sort. lines) = << getContents -- In ghci a qualified name like Data.List.sort will work, although as a standalone executable you'd need to import Data.List.

Еще более короткая версия:

main = interact (unlines. Data.List.sort. lines) - Ditto.

Можно использовать в командной строке, например:

cat filename | ghc -e "interact (unlines. Data.List.sort. lines)"

Racket

Следующая программа Racket эквивалентна приведенному выше примеру Haskell:

#lang racket (для-каждой строки displayln (sort (port->lines) 

), и это можно использовать в командной строке следующим образом:

racket -e '(for-each displayln (sort (port->lines) string '

Python

Выполнение однострочных строк непосредственно в командной строке Unix может быть выполнено с помощью флага -cmd Python (для краткости -c), и обычно требует импорта одного или нескольких модулей. Выражения разделяются знаком ";" вместо символов новой строки. Например, для вывода последнего поля длинного списка unix:

ls -l | python -c " import sys; [sys.stdout.write (''.join ([line.split ('') [- 1]])) для строки в sys.stdin]"

оболочки Python

Несколько сценариев с открытым исходным кодом были разработаны для облегчения создания однострочников Python. Такие сценарии, как pyp или Pyline, импортируют часто используемые модули и предоставляют больше удобочитаемых переменных в попытке сделать функциональность Python более доступной в командной строке. Вот повтор вышеприведенного примера (печать последнего поля длинного списка unix):

ls -l | pyp "whitespace [-1]" # "whitespace" представляет каждую строку, разделенную на пробел в pyp ls -l | pyline "words [-1]" # "words" представляет каждую строку, разделенную на пробел в pyline

Исполняемые библиотеки

Например, модуль Python CGIHTTPServer также является исполняемой библиотекой, которая работает как веб-сервер с CGI. Чтобы запустить веб-сервер, введите:

$ python -m CGIHTTPServer Serving HTTP on 0.0.0.0 port 8000…

TCL Tool Control Language

Tcl (Tool Command Language) - динамический язык программирования / сценариев основан на концепциях оболочек Lisp, C и Unix. Его можно использовать в интерактивном режиме или путем запуска скриптов (программ), которые могут использовать систему пакетов для структурирования. Ниже приведены прямые цитаты из Wiki Books Tcl Programming. Текст в Wiki Books Tcl Programming доступен по лицензии Creative Commons Attribution-ShareAlike.

Многие строки также являются хорошо сформированными списками. Каждое простое слово представляет собой список длиной один, а элементы более длинных списков разделяются пробелами. Например, строка, которая соответствует списку из трех элементов:

set example {foo bar grill}

Строки с несбалансированными кавычками или фигурными скобками или непробельные символы, следующие непосредственно за закрывающими фигурными скобками, не могут быть проанализированы как списки напрямую. Вы можете явно разделить их, чтобы составить список.

«Конструктор» для списков, конечно, называется списком. Рекомендуется использовать, когда элементы поступают в результате подстановки переменных или команд (фигурные скобки этого не делают). Поскольку команды Tcl в любом случае являются списками, следующая команда полностью заменяет команду list:

# One liners program proc list args {set args}

Windows PowerShell

Поиск палиндромов в файле words.txt

Get-Content words.txt | Где {$ _ -eq -join $ _ [($ _. Length-1).. 0]}

Семантика конвейера в PowerShell помогает реализовать сложные сценарии с однострочными программами. Этот однострочный сценарий в PowerShell берет список имен и счетчиков из файла значений, разделенных запятыми, и возвращает сумму счетчиков для каждого имени.

ipcsv. \ Fruit.txt –HF, C | Group F |% {@ {"$ ($ _. Name)" = ($ _. Group | measure C -sum).Sum}} | sort value
См. Также
Ссылки
Внешние ссылки
  • Wikibooks Введение в бесплатное программирование на Tcl и скачать pdf
  • [1] sourceforge net, загрузить веб-сайт, а также несколько языков
  • Tcl Sources, основной сайт загрузки исходного кода Tcl и Tk
  • Tcler's Wiki, сценарии Tcl / Tk и справочная информационная служба
  • TkDocs, официальная документация и архивы Tcl / Tk
Последняя правка сделана 2021-06-01 11:43:31
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте