Jump to content

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

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

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

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

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

Понятие однострочной программы известно с 1960-х годов. [1] с выпуском языка программирования APL . Благодаря краткому синтаксису и мощным математическим операторам APL позволял представлять полезные программы несколькими символами.

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

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

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

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

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

Имитация вывода 10PRINT для Commodore 64. однострочной программы BASIC

Одна строка 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 примеров острот в конце первой главы книги.

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

  1. Выведите общее количество входных строк (например, wc -l ):
    END { print NR }
    
  2. Выведите десятую входную строку:
    NR == 10
    
  3. Распечатайте последнее поле каждой строки ввода:
    { 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

См. также

[ редактировать ]
  1. ^ 10 PRINT CHR$ (205,5 + RND (1)); : ПЕРЕЙДИТЕ К 10 (PDF) . С прессой. 2014. с. 148. ИСБН  9780262526746 . Проверено 3 июля 2018 г.
  2. ^ «Журнал RUN №35» .
  3. ^ «Однострочные игры пользователя Acorn (Побег из Вороса, Лексиас, Гонка на Варпон, Грозовые тучи над Заккитом, Зандер (AKA Lurch))» . bbcmicro.co.uk . Проверено 3 июля 2018 г.
  4. ^ Ниже приведены прямые цитаты из Программирование на Tcl в Wikibooks, доступных по лицензии Creative Commons Attribution-ShareAlike .
[ редактировать ]
  • Ссылки на программирование на Perl
  • Wikibooks Free Tcl: введение в программирование и загрузка в формате pdf
  • SourceForge , веб-сайт загрузки, а также несколько языков программирования
  • Tcl Sources , основной сайт загрузки исходного кода Tcl и Tk
  • Wiki Tcler , скрипты Tcl/Tk и центр обмена ссылками
  • TkDocs , Tcl/Tk Официальная документация и архивы
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 64fc0d06b2df816e429c13c52c68051b__1696497420
URL1:https://arc.ask3.ru/arc/aa/64/1b/64fc0d06b2df816e429c13c52c68051b.html
Заголовок, (Title) документа по адресу, URL1:
One-liner program - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)