Однострочная программа
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2019 г. ) |
В компьютерном программировании однострочная программа изначально представляла собой текстовый ввод в командную строку операционной системы оболочки , который выполнял некоторую функцию всего за одну строку ввода. В настоящее время однострочник может быть
- выражение , написанное на языке оболочки;
- вызов интерпретатора вместе с исходным кодом программы для запуска интерпретатора;
- вызов компилятора вместе с исходным кодом для компиляции и инструкциями по выполнению скомпилированной программы.
Некоторые языки сценариев динамические , такие как AWK , sed и Perl , традиционно хорошо подходят для выражения однострочных строк. Интерпретаторы оболочки, такие как оболочки Unix или Windows PowerShell, позволяют создавать мощные однострочные программы.
Использование фразы « однострочник» было расширено и теперь включает в себя исходный код программы для любого языка, который делает что-то полезное в одной строке.
История
[ редактировать ]Понятие однострочной программы известно с 1960-х годов. [1] с выпуском языка программирования APL . Благодаря краткому синтаксису и мощным математическим операторам APL позволял представлять полезные программы несколькими символами.
В 1970-х годах остроты стали ассоциироваться с появлением домашних компьютеров и Бейсика . Компьютерные журналы публиковали программы ввода на многих диалектах BASIC. Некоторые журналы посвящали регулярные колонки исключительно впечатляющим коротким и однострочным программам. [2]
Слово One-liner также имеет две ссылки в указателе книги «Язык программирования AWK» (книгу часто называют аббревиатурой TAPL ). В нем объясняется язык программирования AWK , который является частью Unix операционной системы . Авторы объясняют рождение однострочной парадигмы своей повседневной работой на ранних машинах Unix :
Версия 1977 года имела лишь несколько встроенных переменных и предопределенных функций. Он был разработан для написания коротких программ […] Наша модель заключалась в том, что вызов должен был состоять из одной или двух строк, вводиться и немедленно использоваться. Значения по умолчанию были выбраны в соответствии с этим стилем […] Мы, как авторы, знали, как предполагается использовать этот язык, и поэтому писали только однострочники.
Обратите внимание, что это первоначальное определение однострочника подразумевает немедленное выполнение программы без какой-либо компиляции. Таким образом, в строгом смысле слова только исходный код интерпретируемых языков может считаться однострочным . Но это строгое понимание однострочника было расширено в 1985 году, когда IOCCC ввел категорию « Лучший однострочник» для C , который является компилируемым языком.
Примеры
[ редактировать ]Однострочники также используются, чтобы продемонстрировать дифференциальную выразительную силу языков программирования . Часто однострочники используются для демонстрации способностей к программированию. Часто проводятся конкурсы, чтобы увидеть, кто сможет создать самую выдающуюся остроту.
БАЗОВЫЙ
[ редактировать ]
Одна строка BASIC обычно может содержать до 255 символов, а одна строка варьируется от простых игр. [3] графическим демонстрациям. Одна из наиболее известных демонстрационных однострочников, в просторечии известная как 10PRINT , написана для Commodore 64 :
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
С
[ редактировать ]Следующий пример — программа на языке 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);}
Эта однострочная программа представляет собой сопоставитель шаблонов. Он понимает символы glob *
, что означает ноль или более символов, и ?
, что означает ровно один символ, как и в большинстве оболочек Unix .
Запустите его с двумя аргументами: строкой и шаблоном glob. Статус выхода равен 0 (оболочка true), если шаблон соответствует, и 1 в противном случае. Шаблон glob должен соответствовать всей строке, поэтому вы можете использовать * в начале и конце шаблона, если ищете что-то в середине. Примеры:
$ ./a.out foo 'f??'; echo $?
$ ./a.out 'best short program' '??st*o**p?*'; echo $?
АВК
[ редактировать ]Книга TAPL содержит 20 примеров острот в конце первой главы книги.
Вот самые первые из них:
- Выведите общее количество входных строк (например, wc -l ):
END { print NR }
- Выведите десятую входную строку:
NR == 10
- Распечатайте последнее поле каждой строки ввода:
{ print $NF }
Дж
[ редактировать ]Вот примеры на J :
- Функция avg для возврата среднего значения списка чисел:
avg=: +/ % #
- Быстрая сортировка :
quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)
Перл
[ редактировать ]Вот примеры на Perl языке программирования :
- Ищите повторяющиеся слова
perl -0777 -ne 'print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi
'
- Найдите палиндромы в /usr/dict/words.
perl -lne 'print if $_ eq reverse
' /usr/dict/words
- редактирование файлов *.c на месте, меняя все foo на bar
perl -p -i.bak -e 's/\bfoo\b/bar/g
' *.c
Многие остроты практичны. Например, следующая Perl однострочная строка перевернет все байты в файле:
perl -0777e 'print scalar reverse <>' filename
Хотя большинство однострочных строк 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)
' number
чтобы распечатать список простых чисел, разделенных запятыми, в диапазоне 2 - число.
Хаскелл
[ редактировать ]Следующая программа на Haskell является однострочной: она сортирует входные строки по ASCII-формату .
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 эквивалентна приведенному выше примеру на Haskell:
#lang racket
(for-each displayln (sort (port->lines) string<?))
и это можно использовать в командной строке следующим образом:
racket -e '(for-each displayln (sort (port->lines) string<?))
'
Питон
[ редактировать ]Выполнение однострочных команд непосредственно в командной строке Unix можно выполнить с помощью флага Python -cmd (для краткости -c) и обычно требует импорта одного или нескольких модулей. Операторы разделяются знаком ";" вместо новых строк. Например, чтобы напечатать последнее поле длинного списка Unix:
ls -l | python -c "import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]
"
Обертки Python
[ редактировать ]Было разработано несколько сценариев с открытым исходным кодом для облегчения создания однострочных текстов Python. Скрипты, такие как pyp или Pyline импортируют часто используемые модули и предоставляют более удобочитаемые переменные, пытаясь сделать функциональность Python более доступной в командной строке. Вот повтор приведенного выше примера (печать последнего поля длинного списка Unix):
ls -l | pyp "whitespace[-1]" # "whitespace" represents each line split on white space in pyp
ls -l | pyline "words[-1]" # "words" represents each line split on white space in pyline
Исполняемые библиотеки
[ редактировать ]Например, модуль Python CGIHTTPServer также является исполняемой библиотекой, которая работает как веб-сервер с CGI. Для запуска веб-сервера введите:
$ python -m CGIHTTPServer
Serving HTTP on 0.0.0.0 port 8000 …
Ткл
[ редактировать ]Tcl (Tool Command Language) — это динамический язык программирования/скриптов, основанный на концепциях оболочек Lisp, C и Unix. Его можно использовать в интерактивном режиме или путем запуска сценариев (программ), которые могут использовать систему пакетов для структурирования. [4]
Многие строки также представляют собой правильно сформированные списки. Каждое простое слово представляет собой список длиной в единицу, а элементы более длинных списков разделяются пробелами. Например, строка, соответствующая списку из трех элементов:
set example {foo bar grill}
Строки с несбалансированными кавычками или фигурными скобками, а также символы, не являющиеся пробелами, следующие непосредственно за закрывающими скобками, не могут быть проанализированы напрямую как списки. Вы можете явно разделить их, чтобы составить список.
«Конструктор» списков, конечно же, называется списком. Рекомендуется использовать, когда элементы получены в результате подстановки переменных или команд (фигурные скобки этого не сделают). Поскольку команды Tcl в любом случае представляют собой списки, следующая команда является полной заменой команды list:
proc list args {set args}
Windows PowerShell
[ редактировать ]Нахождение палиндромов в файле words.txt
Get-Content words.txt | Where { $_ -eq -join $_[($_.length-1)..0] }
Семантика конвейеров в PowerShell помогает реализовать сложные сценарии с помощью однострочных программ. Этот однострочный сценарий PowerShell берет список имен и счетчиков из файла значений, разделенных запятыми, и возвращает сумму счетчиков для каждого имени.
ipcsv .\fruit.txt –H F, C|Group F|%{@{"$($_.Name)"=($_.Group|measure C -sum).Sum}}|sort value
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ 10 PRINT CHR$ (205,5 + RND (1)); : ПЕРЕЙДИТЕ К 10 (PDF) . С прессой. 2014. с. 148. ИСБН 9780262526746 . Проверено 3 июля 2018 г.
- ^ «Журнал RUN №35» .
- ^ «Однострочные игры пользователя Acorn (Побег из Вороса, Лексиас, Гонка на Варпон, Грозовые тучи над Заккитом, Зандер (AKA Lurch))» . bbcmicro.co.uk . Проверено 3 июля 2018 г.
- ^ Ниже приведены прямые цитаты из
Программирование на Tcl в Wikibooks, доступных по лицензии Creative Commons Attribution-ShareAlike .
Внешние ссылки
[ редактировать ]- Ссылки на программирование на Perl
- Wikibooks Free Tcl: введение в программирование и загрузка в формате pdf
- SourceForge , веб-сайт загрузки, а также несколько языков программирования
- Tcl Sources , основной сайт загрузки исходного кода Tcl и Tk
- Wiki Tcler , скрипты Tcl/Tk и центр обмена ссылками
- TkDocs , Tcl/Tk Официальная документация и архивы