zsh을, 603 594 566 561 548 440 415 399 378 370 바이트
ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}
coreutils +에 따라 다릅니다 dc
.
온라인으로 사용해보십시오!
그건 ... 여정이었습니다.
이 답변에는 세 부분이 있습니다. 처음 4 줄은 특정 코드를 처리하기 위해 특정 경우를 처리합니다. 다음 두 줄과 마지막 줄은 본질적으로 동일한 것을 수행하지만 주어진 문자를 제거하면 정확히 한 줄이 실행됩니다. 대부분 보완적인 문자 세트로 작성되므로 문자를 제거하면 한 문자 만 제거하고 다른 문자는 계속 작동 할 수 있습니다.
첫 번째 부분을 보면 먼저 처리합니다
- 개행 제거
ec\nho \\n
- 공백 제거
ca t<<<$'\x20'
( exi t
나중에 코드를 실행하지 않도록하기 위해 이어짐)
$
함께 삭제 d$c -e8BC6P
( 8BC6
= 9226
이고 36*256 + 10
, 36 및 10 바이트의 값이며 $
, 각각의 문자와 개행 우리는 행 6에서 대형 주석에 포함하는 것을 피하기 위해 진수 16 진수를 사용)
0
with with d0c -eKp
( K
십진 정밀도를 얻습니다. 0
기본적으로)
다음 부분에서는 (두 번째 줄의 끝에서 쓰레기를 제외하고) 사용 된 유일한 문자는 $'\01234567v;
, space 및 newline입니다. 이 중 4 개가 설명되었으므로 나머지 줄 ( '\1234567v
)은 마지막 줄에서 발생할 수 없습니다. 8 진수 이스케이프 확장 ( $'\123'
값이 123 8 인 ASCII 문자를 나타냄)은 다음과 같습니다.
zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'
첫 번째 줄은 프로그램에 사용 된 모든 문자를 반복하고 자신의 소스 코드 ( $0
실행중인 스크립트의 파일 이름)에서 각 문자를 검색하여 찾을 수없는 문자를 인쇄합니다.
두 번째 줄은 조금 이상하게 보이며 exit
많은 nops와 같은 일을하는 것처럼 보입니다 . 그러나 exit
8 진수로 인코딩 하면 또는이 $'\145\170\151\164'
포함되지 않은을 직접 생성 합니다 . 우리는 실제로 이것을 제거에 덜 탄력적으로 만들어야합니다 . 그 중 하나 가 제거되어 첫 번째 줄이 끊어지면 두 번째 줄도 끊어 나머지 코드를 실행할 수 있기 때문입니다. 그러나 3 행과 4 행을 실행할 수 있도록 또는 제거 된 경우에도 끊어야 합니다. 이것은 8 진수로 각각 2와 3을 갖는 및 에 구두 뿔을 사용하여 수행됩니다 .2
3
'\014567v
2
3
:
;
두 번째 줄 끝에있는 정크는 단순히 인쇄 가능한 모든 ASCII 문자가 적어도 한 번 나타나도록하기 위해 존재합니다. 각 문자를 반복하여 확인하는 방식에는이 문자가 필요합니다.
exit
첫 번째 섹션에서 호출되지 않은 경우 (즉,이 중 하나를 제거하여 엉망이 된 경우) 두 번째 섹션으로 넘어가므로 '\01234567v
이러한 문자를 사용하지 않고 동일한 작업을 수행해야합니다. 마지막 줄은 디코딩 된 첫 번째 줄과 비슷하지만 몇 바이트를 절약하기 위해 루프 범위를 축소 할 수 있다는 점을 제외하고 '\01234567v
는 제외하고 모든 문자 가 포함되어 있음을 이미 알고 있습니다. 또한 그 0# $#
앞에 주석이 달려있어 제거 0
되거나 외부 출력이 외부 출력을 생성하지 못하게합니다 $
.