이 사이트는 인터프리터 태그 에서 다양한 언어를 구현하는 데 많은 문제가있었습니다 . 그러나 실제로 그들 모두는 아무도 사용하지 않는 난해한 언어였습니다. 여기에서 대부분의 사용자가 이미 알고있는 실용적인 언어에 대한 통역을 할 시간입니다. 예, 제목을 읽는 데 문제가있는 경우를 대비하여 쉘 스크립트입니다. (예, GolfScript 및 Befunge와 같은 언어가 모든 것을이기는 것에 지루해하기 때문에 의도적 으로이 도전을했습니다. 따라서 더 실용적인 프로그래밍 언어가 더 큰 우승 기회를 갖는 곳에 도전하십시오)
그러나 쉘 스크립트는 비교적 큰 언어이므로 구현하도록 요청하지 않습니다. 대신, 셸 스크립트 기능의 작은 하위 집합을 만들려고합니다.
내가 결정한 하위 집합은 다음과 같은 하위 집합입니다.
- 프로그램 실행 (단일 인용 부호가 허용 되더라도 프로그램에는 문자 만 포함됨)
- 프로그램 인수
- 작은 따옴표 (공백을 포함하여 인쇄 가능한 ASCII 문자 허용, 작은 따옴표 제외)
- 따옴표없는 문자열 (ASCII 문자, 숫자 및 대시 허용)
- 파이프
- 빈 문장
- 줄 바꿈으로 구분 된 여러 문장
- 후행 / 리딩 / 다중 공간
이 태스크에서는 STDIN의 입력을 읽고 요청 된 모든 명령을 실행해야합니다. POSIX 호환 운영 체제를 안전하게 사용할 수 있으므로 Windows와 같은 이식성이 필요하지 않습니다. 다른 프로그램으로 파이프되지 않은 프로그램은 STDIN에서 읽지 않는다고 안전하게 가정 할 수 있습니다. 명령이 존재한다고 가정 할 수 있습니다. 다른 것은 사용되지 않을 것입니다. 안전한 가정이 깨지면 무엇이든 할 수 있습니다. 최대 15 개의 인수와 512 자 미만의 행을 안전하게 가정 할 수 있습니다 (명확한 메모리 할당 또는 무언가가 필요한 경우 C가 여전히 작더라도 C에서 이길 수있는 기회는 거의 없습니다). 파일 디스크립터를 정리할 필요가 없습니다.
전체 라인을받은 후 또는 STDIN이 끝난 후에도 언제든지 프로그램을 실행할 수 있습니다. 원하는 접근 방식을 선택하십시오.
쉘을 테스트 할 수있는 간단한 테스트 케이스 (세 번째 명령 후 후행 공백에 주목) :
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
위의 프로그램은 다음과 같은 결과를 출력해야합니다.
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
명령에 대한 인수가 없으면 셸 자체를 실행할 수 없습니다 (이 예외는 Perl에 대해 이루어졌습니다. Perl은 인수를 넣을 때 셸에서 명령을 실행 system
하지만 다른 경우에는이 예외를 남용 할 수 있습니다) 문자를 저장하는 방식으로 그렇게 할 수 있다면) 또는 실행하는 명령은 쉘 자체입니다. 많은 언어가 system
쉘을 실행하는 함수를 가지고 있기 때문에 이것은 아마도이 도전에서 가장 큰 문제 일 것입니다 . 대신 subprocess
파이썬의 모듈 처럼 프로그램을 직접 호출하는 언어 API를 사용하십시오 . 이것은 어쨌든 보안에 대한 좋은 아이디어이며, 안전하지 않은 쉘을 만들고 싶지 않을까요? 이것은 아마도 PHP를 중지시킬 수 있지만 어쨌든 선택할 다른 언어가 있습니다.
당신이 쉘 스크립트에서 프로그램을 만들려고하는 경우에는 사용할 수 없습니다 eval
, source
또는 .
(함수가 아닌 문자에서와 같이). 내 의견으로는 도전이 너무 쉬울 것입니다.
영리한 규칙 남용이 허용되었습니다. 내가 명시 적으로 허용하지 않은 것들이 많이 있지만, 나는 당신이 여전히 내가하지 않은 일들을 할 수 있다고 확신합니다. 때때로 사람들이 내 규칙을 해석하는 방식에 놀랐습니다. 또한 내가 언급하지 않은 것은 무엇이든 할 수 있다는 것을 기억하십시오. 예를 들어 변수를 사용하려고하면 하드 디스크를 지울 수 있지만하지 마십시오.
이것이 코드 골프이기 때문에 가장 짧은 코드가 승리합니다.