(528) 포트란 (470) (481)
사전 처리 지시문을 사용 하려면 -fpp
플래그 (점수 +3) 1 로 컴파일해야합니다 ( 3 자 이상을 절약하므로 완전히 괜찮습니다). 대소 문자를 구분하지 않으므로 -8 : D가 있습니다. 어쨌든 한 번 사용 된대로 전처리하지 않음으로써 5 개의 문자를 절약 endif
했습니다 .
컴파일러가 전처리를 강제로 수행하도록 파일에 .F90
확장자 가 있어야합니다 (이를 호출하는 것이 좋습니다 hq9+.F90
). 코드는 대소 문자를 구분합니다. 대소 문자를 구분하지 않으면 16자를 추가 할 수 있으므로 8자를 절약 할 가치가 없습니다. 나의 이전의 대답은에 bottles
대한 복수의 변화를 설명하지 않았다 9
. 이 버전은 그것을 수정하고 슬프게도 더 많은 문자를 추가합니다.
#define P print*,
#define W " of beer on the wall"
#define N print'(x,i0,a,a)',
#define e enddo
#define S case
#define J len(trim(c))
character(len=99)::c,b=" bottles";read*,c;do i=1,J;if(all(c(i:i)/=["H","Q",'9',"+"])) then;P"Source code contains invalid characters";exit;endif;e;do i=1,J;select S(c(i:i));S("H");P"Hello, world!";S("Q");P c;S("9");l=8;do k=99,1,-1;N k,b(1:l),W;N k,b(1:l)," of beer";P "Take one down, pass it around";if(k==2)l=l-1;if(k==1)exit;N k-1,b(1:l),W;P"";e;P"No more",trim(b),W;S default;endselect;e;end
ungolfed & non-preprocessed 훨씬 나아 보입니다 (아마도 무슨 일이 일어나고 있는지 볼 수 있기 때문에).
program hq9
character(len=99)::c,b=" bottles"
read*,c
do i=1,len(trim(c))
! change the below to ["H","h","Q","q","9","+"] to be case-insensitive
if(all(c(i:i)/=["H","Q","9","+"]))then
print*,"Source code contains invalid characters"
exit
endif
enddo
do i=1,len(trim(c))
select case(c(i:i))
case("H") ! change to case("H","h") for case-insensitive
print*,"Hello, world!"
case("Q") ! change to case("Q","q") for case-insensitive
print*, c
case("9")
l=8
do k=99,1,-1
print'(x,i0,a,a)', k,b(1:l)," of beer on the wall"
print'(x,i0,a)', k,b(1:l)," of beer"
print*,"Take one down, pass it around"
if(k==2) l=l-1
if(k==1) exit
print'(x,i0,a)', k-1,b(1:l)," of beer on the wall"
print*,""
enddo
print*,"No more",trim(b)," of beer on the wall"
case default
! do nothing
endselect
enddo
end program hq9