원라이너 프로그램

One-liner program

컴퓨터 프로그래밍에서 원라이너 프로그램은 원래 한 줄의 입력만으로 일부 기능을 수행하는 운영 체제 셸의 명령줄에 텍스트 입력이었습니다.오늘날, 원라이너는

  • 조개껍데기 언어로 쓰인 표현
  • 인터프리터가 실행할 프로그램 소스와 함께 인터프리터를 호출한다.
  • 컴파일할 소스 및 컴파일된 프로그램을 실행하기 위한 명령과 함께 컴파일러를 호출합니다.

AWK, sed, Perl 등의 스크립팅용 동적 언어는 전통적으로 한 줄 표현에 능숙했습니다.Unix 쉘이나 Windows PowerShell 의 셸 인터프리터를 사용하면 강력한 한 줄 구성을 할 수 있습니다.

원라이너라는 용어의 사용은 한 줄에 유용한 것을 하는 모든 언어에 대한 프로그램 소스를 포함하도록 확대되었습니다.

역사

원라이너 프로그램의 개념은 1960년대부터[1] APL 프로그래밍 언어가 출시되면서 알려져 왔다.간결한 구문과 강력한 수학적 연산자로, APL은 유용한 프로그램을 몇 개의 기호로 나타낼 수 있게 했다.

1970년대에 한 줄짜리 컴퓨터가 가정용 컴퓨터와 베이직의 발전과 관련되게 되었다.컴퓨터 잡지는 베이직의 여러 방언으로 타이프인 프로그램을 발행했다.일부 잡지는 단문 [2]한 줄짜리 인상적인 프로그램에만 정규 칼럼을 할애했다.

One-liner라는 단어는 The AWK Programming Language라는 의 색인에도 두 가지 참조가 있습니다(이 책은 종종 약어 TAPL로 언급됩니다).Unix 운영 체제의 일부인 프로그래밍 언어 AWK에 대해 설명합니다.저자들은 초기 Unix 머신에 대한 일상적인 작업을 통해 원라이너 패러다임의 탄생에 대해 설명합니다.

1977년 버전에는 몇 가지 변수와 사전 정의된 기능만 포함되어 있었습니다.이것은 짧은 프로그램을 작성하기 위해 디자인되었습니다.[…] 호출은 한 줄에서 두 줄 정도 길이로 입력되어 즉시 사용되었습니다.이 스타일에 맞게 기본값이 선택되었습니다.[…] 우리는 저자로서 언어가 어떻게 사용되는지 알고 있었기 때문에 한 줄만 썼습니다.

원라이너에 대한 원래 정의는 컴파일 없이 프로그램을 즉시 실행하는 것을 의미합니다.따라서 엄밀한 의미에서 통역된 언어의 소스 코드만이 원라이너로 인정됩니다.그러나 이러한 원라이너에 대한 엄격한 이해는 1985년 IOCC가 컴파일 언어인 C를 위한 베스트라이너 카테고리를 도입하면서 확대되었다.

프로그래밍 언어의 차동적 표현력을 과시하기 위해 한 줄짜리 문자가 사용되기도 한다.프로그래밍 능력을 보여주기 위해 한 줄짜리 라이너를 사용하는 경우가 많습니다.누가 가장 뛰어난 원라이너를 만들 수 있는지 알아보기 위해 종종 대회가 열린다.

기본의

Commodore 64 용 10PRINT 원라이너 BASIC 프로그램 시뮬레이션 결과 - 10PRINT CHR$(205.5+RND(1);: GOTO 10

일반적으로 BASIC의 한 줄에는 최대 255자를 사용할 수 있으며, 간단한[3] 게임부터 그래픽 데모까지 다양한 라이너를 사용할 수 있습니다.가장 잘 알려진 데모 원라이너 중 하나는 Commodore 64용으로 작성된 10PRINT로 구어체로 알려져 있습니다.

10 인쇄하다 CHR$(205.5+RND(1)); : 에 가다 10 

C

다음 예시는 C 프로그램(IOCC의 "Best One-liner" 카테고리의 우승 엔트리)입니다.

주된(인트 c,**v){돌아가다!m(v[1],v[2]);}m(*s,*t){돌아가다*t-42?*s?63==*t*s==*t& &m(s+1,t+1):!*t:m(s,t+1)*s& &m(s+1,t);} 

이 원라이너 프로그램은 글로벌 패턴 매처입니다.대부분의 Unix 쉘과 마찬가지로 '0자 이상'을 의미하는 글로벌 문자 '*'와 정확히 한 문자를 의미하는 '?'를 이해한다.

스트링과 글로브 패턴 두 개의 Arg로 실행합니다.패턴이 일치하면 종료 상태는 0(셸 true), 일치하지 않으면 1입니다.글로벌 패턴은 문자열 전체와 일치해야 합니다.따라서 패턴의 처음과 끝에 * 를 사용하면 중간에 무언가를 찾을 수 있습니다.예:

$/a. foo'f?echo $? $/a. "최고의 쇼트 프로그램" --st*o**p?*'; echo $?

AWK

TAPL 책에는 책의 첫 장 끝에 20개의 한 줄 예가 포함되어 있습니다.

그 중 첫 번째는 다음과 같습니다.

  1. 총 입력 라인 수를 인쇄합니다.
    끝. { 인쇄물 NR } 
  2. 10번째 입력 행을 인쇄합니다.
    NR == 10 
  3. 모든 입력 행의 마지막 필드를 인쇄합니다.
    { 인쇄물 $NF } 

J

J의 예를 다음에 나타냅니다.

  • 숫자 목록의 평균을 반환하는 함수 avg:
    평균=: +/ % # 
  • 빠른 정렬:
    퀵소트=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#>) 

Perl 프로그래밍 언어의 예를 다음에 나타냅니다.

  • 중복된 단어 찾기
perl - 0777 -ne 'print "$.: doubled $_\n" while /\b(\w+)\b\s+\b\1\b/gi'
  • /usr/dict/words에서 Palindromes 찾기
perl - lne 'print if $_ eq reverse/usr/words
  • *.c 파일의 내부 편집 모든 foo를 막대로 변경
perl -p -i.bak -e's/\bfoo\b/bar/g*.c

많은 외줄타기가 실용적이다.예를 들어 다음 Perl 원라이너는 파일 내의 모든 바이트를 반전시킵니다.

perl - 0777e 'print scalar reverse <>' 파일명

대부분의 Perl 원라이너는 필수적이지만 Perl은 익명 함수, 클로저, 맵, 필터(grep), 폴드(목록:Util::reduce)를 사용하면 '기능적인' 한 줄의 줄을 만들 수 있습니다.

이 원라이너는 첫 번째 파라미터 값까지의 소수점 목록을 반환하는 데 사용할 수 있는 함수를 만듭니다.

나의 z달러 = 후보선수 { 그리프 { $a=$_; !그리프 { !($a % $_) } (2..$_-1)} (2..$_[0]) } 

명령줄에서 다음과 같이 사용할 수 있습니다.

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

2 - 숫자 범위의 소수점 목록을 쉼표로 구분하여 인쇄합니다.

하스켈

다음 Haskell 프로그램은 단일 라이너입니다. 입력 라인을 ASCIIbetic 방식으로 정렬합니다.

주된 = (맵M_ putStrln . 데이터..목록..종류 . 줄들) =< 컨텐츠의 취득 -- ghci에서는 Data와 같은 정규화된 이름입니다.List.sort는 동작합니다만, 스탠드아론 실행 파일로서 데이터를 Import 할 필요가 있습니다.목록. 

더 짧은 버전:

주된 = 소통하다 (언라인 . 데이터..목록..종류 . 줄들) - 그렇죠. - 그렇죠. 

명령줄에서 다음과 같이 사용할 수 있습니다.

cat filename ghc - e " interact (unlines . Data )List.Sort. 행)

라켓

다음 Racket 프로그램은 위의 Haskell 예시와 동일합니다.

#실패하다라켓 (각각을 위한 표시 (종류 (포트-> 회선) string<?)) 

이 명령어는 명령줄에서 다음과 같이 사용할 수 있습니다.

라켓 -e(for-each displayln (sort (port->lines) string<?))'

파이썬

Unix 명령줄에서 직접 한 줄의 작업을 수행하려면 Python의 -cmd 플래그(줄여서 -c)를 사용해야 하며 일반적으로 하나 이상의 모듈을 가져와야 합니다.문은 줄 바꿈 대신 ";"를 사용하여 구분됩니다.예를 들어 unix long listing의 마지막 필드를 인쇄하려면 다음 절차를 수행합니다.

ls -l python -c "import sys;[sys.stdout.write(' '.join([line.split(' ')[-1]])) for line in sys.stdin]"

파이썬 래퍼

Python의 한 줄 구성을 용이하게 하기 위해 몇 가지 오픈 소스 스크립트가 개발되었습니다.pyp 또는 Pyline과 같은 스크립트는 일반적으로 사용되는 모듈을 가져오고 명령행에서 Python 기능에 더 쉽게 액세스할 수 있도록 하기 위해 더 사람이 읽을 수 있는 변수를 제공합니다.위 예제의 redo를 다음에 나타냅니다(unix long list의 마지막 필드를 인쇄합니다).

ls - l pyp " space [ - 1 ]# " space " 는 pyp ls - l pyline " words [ - 1 ]# " words " 는 pyline의 공백으로 분할된 각 행을 나타냅니다.

실행 가능한 라이브러리

예를 들어 Python CGIHTTPServer 모듈은 CGI와 함께 웹 서버로서 작동하는 실행 가능한 라이브러리이기도 합니다.Web 서버를 기동하려면 , 다음과 같이 입력합니다.

$ python - m CGIHTTPServer 0.0.0 포트 8000에서 HTTP 서비스 ...

TCL 도구 제어 언어

Tcl(Tool Command Language)은 Lisp, C 및 Unix 쉘의 개념을 기반으로 하는 동적 프로그래밍/스크립트 언어입니다.인터랙티브하게 사용하거나 패키지 시스템을 사용하여 구조화할 수 있는 스크립트(프로그램)를 실행하여 사용할 수 있습니다.다음은 Wiki Books Tcl Programming의 직접 인용입니다.Wiki Books TCL 프로그래밍 텍스트는 Creative Commons Attribution-ShareAlike License에서 사용할 수 있습니다.

많은 문자열이 올바른 형식의 목록이기도 합니다.모든 간단한 단어는 길이 1의 목록이며, 긴 목록의 요소는 공백으로 구분됩니다.예를 들어, 다음 세 가지 요소의 목록에 해당하는 문자열입니다.

  foo bar grill 설정 

따옴표 또는 중괄호가 불균형한 문자열 또는 닫힘 중괄호 바로 뒤에 공백이 아닌 문자는 목록으로 직접 구문 분석할 수 없습니다.명시적으로 분할하여 목록을 만들 수 있습니다.

목록의 "구성자"는 물론 목록이라고 불립니다.요소가 변수 또는 명령 대체에서 온 경우 사용하는 것이 좋습니다(괄호는 그렇지 않습니다).TCL 명령어는 목록이므로 list 명령어를 완전히 대체하는 것은 다음과 같습니다.

   # 하나의 라이너 프로그램 proc 목록 args {set args}

Windows PowerShell

파일 워드에서 회문 검색 중.txt

컨텐츠의 취득 단어.txt   어디에{ $_ -eq -스위치 $_[($_.길이-1)..0] } 

PowerShell의 파이프 시멘틱스는 단일 라이너 프로그램으로 복잡한 시나리오를 가능하게 합니다.PowerShell 스크립트의 이 한 줄 행은 쉼표로 구분된 값 파일에서 이름과 개수 목록을 가져와서 각 이름에 대한 개수 합계를 반환합니다.

ipcsv.\과일.txt H F, C 그룹.F%{@{"$($_.이름.)"=($_.그룹. 재다C -합).}}종류가치 

「 」를 참조해 주세요.

레퍼런스

  1. ^ 10 PRINT CHR$ (205.5 + RND (1)); : GOTO 10 (PDF). Mit Press. 2014. p. 148. ISBN 9780262526746. Retrieved 3 July 2018.
  2. ^ "RUN magazine issue 35".
  3. ^ "Acorn User One-Line Games (Escape From Voros, Lexxias, Race To Varpon, Storm Clouds Over Zaqqit, Zander (AKA Lurch))". bbcmicro.co.uk. Retrieved 3 July 2018.

외부 링크

  • Perl 프로그래밍 링크
  • Wikibooks Free TCL 프로그래밍 소개 및 다운로드 PDF
  • Source Forge, 웹 사이트 다운로드 및 여러 컴퓨터 언어
  • TCL 소스, 메인 TCL 및 Tk 소스 코드 다운로드 웹사이트
  • Tcler의 Wiki, Tcl/Tk 스크립트 및 레퍼런스 클리어 하우스
  • TkDocs, Tcl/Tk 공식 문서 및 아카이브