사이에 새끼 고양이 질문 및보고 U & L에서이 질문을 몇 가지에 대해 sed
어떻게 구현에 대해, 마법 tac
?
목표
파일의 행을 뒤집어 인쇄하는 프로그램을 구현하십시오.
입력
이름 또는 표준 입력을 통해 제공되는 파일
산출
라인이 표준 출력으로 반전되었습니다.
채점
바이트의 소스 코드.
답변
GS2, 3 바이트
* +
3 바이트는 순서대로 분할 선, 반전 및 결합선입니다.
답변
펄, 11 바이트
$\=$_.$\}{
정확하게 동작합니다 tac
. 이 코드에는 -p
스위치 가 필요 하며 1 바이트로 계산했습니다.
시운전
$ echo -en 'a\nb' | perl -pe'$\=$_.$\}{' | xxd -g 1
0000000: 62 61 0a ba.
$ echo -en 'a\nb\n' | perl -pe'$\=$_.$\}{' | xxd -g 1
0000000: 62 0a 61 0a b.a.
작동 원리
여기 에 설명 된 것처럼 -p
스위치는 기본적으로 while (<>) { ... ; print }
프로그램을 둘러싼 것이므로 소스 코드는 다음과 같습니다.
while(<>)
{
$\ = $_ . $\
}
print
각 입력 줄에 대해 현재 줄 ( $_
)을 앞에 추가하고 $\
(처음에는 정의되지 않음) 후자를 결과로 업데이트합니다.
모든 행이 처리 된 후 print
로컬 변수 값 $_
(이 범위에서 정의되지 않음)과 출력 레코드 구분 기호 ( $\
)가 인쇄됩니다.
답변
Pyth, 4 바이트
j_.z
.z
는 입력으로 행으로 구분 된 입력이며, _
반대로 입력 j
하고 문자를 기준으로 결합합니다 \n
. 기본적으로는입니다 .
답변
FlogScript , 2 바이트
)"
( 무정부 상태 골프 에서 시도하십시오 .)
이 )
가능 --in-out-line-array
모드를 상기 프로그램의 나머지 부분은 "
라인의 배열 역전.
답변
망막 , 7 바이트
!rm`.*$
단일 정규 표현식으로 Retina는 일치 모드에서 실행됩니다. 이것은 일반적으로 일치 횟수 !
를 인쇄하지만 실제 일치를 대신 인쇄하도록 구성합니다 (줄 바꿈으로 구분).
실제 정규식은 단지 .*$
입니다. 줄 바꿈을 제외한 모든 문자와 일치 할 수 .*
있으므로 모든 행과 일치합니다 (잠재적으로 비어 있음) .
. 나는 $
잠시 후에 갈 것이다 .
일치 항목을 반대로 인쇄하려면 어떻게해야합니까? .NET의 오른쪽에서 왼쪽으로 일치하는 모드를 사용하여 r
. 이것은 정규식 엔진이 일치하는 항목을 찾을 때 문자열의 끝에서 시작하여 뒤로 작동한다는 것을 의미합니다.
마지막으로,이 m
차종 $
일치 a의 끝 라인 대신 문자열의 끝을. 왜 우리는 그것을 필요로합니까? 문제는 .*
불필요한 일치 를 생성 한다는 것 입니다. 정규식 대체를 고려하십시오
s/a*/$0x/
입력에 적용됩니다 baaababaa
. 당신은 이것이 산출 할 것이라고 생각할 것입니다 baaaxbaxbaax
, 그러나 그것은 실제로 당신에게 줄 것 baaaxxbaxxbaaxx
입니다. 왜? aaa
엔진의 커서를 일치 시킨 후 a
와 사이에 있기 때문 b
입니다. 이제 더 이상 일치하지 않을 수 a
의, 그러나 a*
또한 빈 문자열로 만족된다. 즉, 매 경기마다 빈 경기가 다시 발생합니다.
빈 줄이 추가되기 때문에 여기서는 원하지 않습니다. 따라서 일치하는 끝을 포함하도록 요구 하여 관련없는 일치 항목 ( 오른쪽에서 왼쪽 모드로 인해 줄 의 시작 부분 에 있음) 을 버립니다. 라인.
답변
하스켈, 34 바이트
main=interact$concat.reverse.lines
[편집하다]
로 교체 unlines
하여 1 바이트를 저장 했습니다 concat
.
답변
CJam, 7 바이트
qN/W%N*
stdin을 읽고 stdout으로 인쇄합니다.
설명:
q Get input.
N/ Split at newlines.
W% Reverse list.
N* Join with newlines.