stringtranslate.com

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

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

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

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

История

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

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

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

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

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

Примеры

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

БАЗОВЫЙ

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

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

10 ПЕЧАТЬ CHR$ ( 205.5 + RND ( 1 )); : ПЕРЕЙТИ К 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. Она понимает символы glob *, означающие ноль или более символов, и ?, означающие ровно один символ, как и большинство оболочек Unix .

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

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

АВК

В конце первой главы книги « Язык программирования AWK» приведено 20 примеров однострочных выражений .

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

  1. Вывести общее количество входных строк (например, wc -l ):
    КОНЕЦ  {  печать  NR  }
  2. Распечатайте десятую строку ввода:
    НР  ==  10
  3. Распечатать последнее поле каждой входной строки:
    {  печать  $ NF  }

Дж.

Вот примеры на языке J :

Перл

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

perl -0777 -ne ' ' print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi
perl -lne ' ' /usr/dict/wordsprint if $_ eq reverse
perl -p -i.bak -e ' s/\bfoo\b/bar/g' *.c

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

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

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

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

мой $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 состоит из одной строки: она сортирует входные строки по ASCII-символам .

main = ( mapM_ putStrLn . Data . List . sort . lines ) =<< getContents -- В ghci будет работать квалифицированное имя, например Data.List.sort, хотя в качестве отдельного исполняемого файла вам придется импортировать Data.List.          

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

main = interact ( unlines . Data . List . sort . lines ) -- То же самое.        

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

cat  имя_файла | ghc -e "interact (unlines . Data.List.sort . lines)"    

Ракетка

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

#lang racket ( for-each displayln ( sort ( port->lines ) string<? ))    

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

ракетка -е ' '(for-each displayln (sort (port->lines) string<?))

Питон

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

ls -l | питон -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" представляет каждую строку, разделенную пробелом в pyp
ls -l | pyline "words[-1]" # "words" представляет каждую строку, разделенную пробелом в pyline         

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

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

$ python  -m  CGIHTTPServer Обслуживание HTTP на порту 0.0.0.0 8000 …

Тсл

Tcl (Tool Command Language) — это динамический язык программирования/скриптинга, основанный на концепциях оболочек Lisp, C и Unix. Его можно использовать интерактивно или путем запуска скриптов (программ), которые могут использовать систему пакетов для структурирования. [4]

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

 пример набора { foo bar grill }   

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

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

 список  аргументов процедуры {набор аргументов }  

Windows PowerShell

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

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

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

ipcsv .\ fruit .txt H F , C | Группа F |%{@{ " $( $_ . Имя )  " =( $_ . Группа | мера C -sum ) . Сумма }}| сортировать значение  

Смотрите также

Ссылки

  1. ^ 10 PRINT CHR$ (205,5 + RND (1)); : ПЕРЕЙДИТЕ К 10 (PDF) . Мит Пресс. 2014. с. 148. ИСБН 9780262526746. Получено 3 июля 2018 г.
  2. "Журнал RUN выпуск 35". Ноябрь 1986 г.
  3. ^ "Игры пользователя Acorn One-Line (Escape From Voros, Lexxias, Race To Varpon, Storm Clouds Over Zaqqit, Zander (AKA Lurch))". bbcmicro.co.uk . Получено 3 июля 2018 г.
  4. ^ Ниже приведены прямые цитаты изПрограммирование на Tcl в Wikibooks, доступное по лицензии Creative Commons Attribution-ShareAlike .

Внешние ссылки