sed, 367 (소스 코드 바이트) + 532 (소스 코드의 성냥개비) = 899
s/[^0-9a-jln-suxyz]//Ig;/^$/{s/.*/0/;b};s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/;:1;s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I;/ ;/!b1;s/;.+//;s/^/,;/;:2;s/(;[^%]*)(%+)/\2\1/;:3;s/,%{10}/%,/;s/^%/,&/;/%{10}/b3;/;.*%/b2;:4;s/,[;,]/,0,/;/,[;,]/b4;s/%{9}/9/g;s/%{8}/8/g;s/%{7}/7/g;s/%{6}/6/g;s/%{5}/5/g;s/%%%%/4/g;s/%%%/3/g;s/%%/2/g;s/%/1/g;s/[^0-9]//g
온라인으로 사용해보십시오
여러 줄 버전 :
s/[^0-9a-jln-suxyz]//Ig
/^$/{s/.*/0/;b}
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
s/;.+//
s/^/,;/
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
:4
s/,[;,]/,0,/
/,[;,]/b4
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
s/[^0-9]//g
설명:
위의 스크립트는 표준 입력을 한 줄씩 (패턴 공간으로-일반적인 "sed way"로) 읽고 각 줄에 대해 해당 줄의 모든 성냥개비 표현 가능한 문자를 나타내는 데 필요한 성냥개비의 양을 출력합니다. 각 입력 라인에 대한 계산은 다음과 같이 수행됩니다.
s/[^0-9a-jln-suxyz]//Ig
먼저, 패턴 공간에서 해당하는 성냥개비 표현이없는 모든 문자를 패턴 공간에서 제거합니다. 즉, "0"에서 "9"까지의 숫자, "a"에서 "j", "n"에서 "s", "l", "u"까지의 문자가 아닌 모든 문자를 제거합니다. "x", "y"또는 "z". 대문자와 소문자는 동일하게 취급됩니다.
/^$/{s/.*/0/;b}
빈 패턴 공간으로 끝나는 경우 0을 인쇄하고 (특수 플래그를 전달하지 않는 한 sed는 항상 sed와 같이 자동으로 줄 바꿈을 수행함) 스크립트의 모든 후행을 건너 뛰고 다음 "sed cycle"( 즉, 다음 입력 줄을 읽고 처리 할 입력 줄이 더 이상 없을 때까지 첫 번째 명령에서 다시 처리를 반복하십시오.
s/.+/&; %1ir %%7lnu %%%4cfhjoy %%%%235bdegpqsxz %%%%%069a %%%%%%8/
그렇지 않으면, 패턴 공간이 비어 있지 않은 경우, 이제 세미콜론으로 구분 된 두 개의 "하위 공간"으로 분할합니다. 먼저 입력 공간 이옵니다. 입력 공간 은 처음에 패턴 공간에서 제거되지 않은 모든 문자로 구성됩니다. 라인 1의 실행; 다음은 세미콜론과 그 뒤에 맵 공간이옵니다 .
지도 공간은 각 관련 영숫자를 나타내는 데 1 이외의 몇 개의 성냥개비가 필요한지 알려줍니다. 지도 공간에서 영숫자 문자를 나타내는 데 필요한 성냥개비가 몇 개인 지 알고 싶다면 해당 문자의 왼쪽에서 연속 된 %의 첫 번째 시퀀스를 찾으십시오. 그러면 답은 %의 수입니다. 예를 들어, "b"를 나타내는 데 필요한 성냥개비의 수는 4 + 1 = 5입니다. "4"를 나타 내기 위해, 3 + 1 = 4, "y"를 나타 내기 위해, 3 + 1 = 4; 등등.
:1
s/([^% ])(.+ (%+)[^ ]*\1)/%\3 \2/I
/ ;/!b1
이것은 루프입니다. 이제 입력 공간의 모든 문자를 숫자의 해당 문자를 나타내는 데 필요한 양의 성냥개비를 나타내는 %의 (완전한) 순서로 바꾸고 그 문자 뒤에 공백 문자 (대문자, 소문자)를 붙입니다. 동일한 치료를 받으면). 루프가 종료되어야하는지 여부를 결정하는 기준은 패턴 공간에서 세미콜론의 바로 왼쪽에 공백 문자가 있는지 확인하는 것입니다. 해당 조건이 유지되면 루프를 종료하고 다음 줄로 계속 진행합니다.
s/;.+//
s/^/,;/
이 두 줄은 패턴 공간에서 세미콜론과 그 뒤에 나오는 모든 것을 제거한 다음 패턴 공간의 시작 부분에 쉼표와 세미콜론을 삽입합니다. 이제 패턴 공간을 다시 두 개의 새로운 하위 공간 ( 세미콜론 앞의 아날로그 결과 공간 과 그 후의 아날로그 입력 공간) 으로 나누었 습니다.
아날로그 입력 공간은 이전에 "입력 공간"이라고 불렀지 만 다른 형식입니다. 이제 공백으로 구분 된 % 시퀀스가 포함됩니다. 아날로그 입력 공간에서 이러한 %의 총 개수는 초기 입력 문자열을 나타내는 데 필요한 것과 동일한 개수의 성냥개비입니다. 즉, 해당 개수가 결과입니다. 그러나 일련의 퍼센트 부호가 아니라 10 진수 표기법으로 결과를 인쇄해야합니다. 아날로그 결과 공간 의 목적은 결과 의 각 숫자에 대한 아날로그 표현을 유지하는 동시에 아날로그 입력 공간에서 각 연속적인 %의 시퀀스를 하나씩 합산하여 결과를 계산하는 것입니다. 다음 루프는 그 합계를 수행합니다.
:2
s/(;[^%]*)(%+)/\2\1/
:3
s/,%{10}/%,/
s/^%/,&/
/%{10}/b3
/;.*%/b2
먼저, 레이블 2 다음에, 우리는 아날로그 결과 공간에서 세미콜론 다음의 연속 된 %의 시퀀스를 아날로그 입력 공간에서 세미콜론의 바로 왼쪽으로 이동합니다.
다음으로, 다음 계산을 수행 하는 서브 루프 (라벨 3 ) 로 들어갑니다 .
아날로그 결과 공간에서 쉼표 뒤에 10 %의 연속 된 시퀀스가 있으면 해당 %를 제거하고 쉼표 왼쪽에 즉시 단일 %를 넣습니다. 간단히 말하면 결과의 소수점 자리 중 하나가 9 개 이상의 단위를 획득 했으므로 해당 소수점 자리에서 10 단위를 빼고 다음 큰 소수점 자리에 1 단위를 추가합니다.
"%"가 패턴 공간에서 첫 번째 문자 인 경우 바로 앞에 새 쉼표를 삽입합니다. 이는 합계가 왼쪽에 이전 값보다 소수점이 하나 더있는 값에 도달했음을 나타냅니다.
아날로그 결과 공간에 10 %의 연속 된 시퀀스가 여전히 있으면 레이블 3 으로 돌아가서이 프로세스를 반복하십시오. 그렇지 않으면, 우리는이 서브 루프를 빠져 나와 다음 줄로 들어갑니다.
이제 아날로그 입력 공간에 여전히 "%"가 있으면 (즉, 세미콜론 뒤에), 총 합계에 추가 될 몇 개의 성냥개비가 여전히 있음을 의미하므로 레이블 2 로 돌아갑니다 .
합이 완료되면 코드의 마지막 루프로 들어갑니다.
:4
s/,[;,]/,0,/
/,[;,]/b4
여기서는 왼쪽에 쉼표와 오른쪽에 세미콜론 또는 쉼표로 형성된 모든 문자 쌍을 확인합니다. 이러한 모든 문자 쌍을 두 개의 쉼표 안에 "0"으로 바꿉니다.
s/%{9}/9/g
s/%{8}/8/g
s/%{7}/7/g
s/%{6}/6/g
s/%{5}/5/g
s/%%%%/4/g
s/%%%/3/g
s/%%/2/g
s/%/1/g
위의 코드는 매우 간단합니다. 아날로그 결과 공간에서 각 %의 연속 된 시퀀스를 각 특정 시퀀스의 % 수에 해당하는 10 진수 문자로 바꿉니다.
s/[^0-9]//g
마지막으로 패턴 공간에서 숫자가 아닌 모든 문자를 제거하고 친숙한 10 진수 표기법의 최종 결과가 남습니다. 이 값은 표준 출력에 인쇄되며 처리 할 입력 라인이 더 있으면 다음 sed주기가 시작됩니다.
|_\n|_
(소문자t
)