재미있는 코드 골프 - 이번에는 맥주99병을 해보아요~ ^^

raymundo의 이미지

http://codegolf.com/99-bottles-of-beer

Perl의 경우 170바이트가 1위인데,

저는 174바이트에서 막혔습니다.

뭐 당연히... 이것도 제 힘만으로 한 건 아니고 OTL
저 혼자 하는 걸로는 220바이트 정도에서 막히더군요. 이리저리 끙끙대 보다가, 이것만 붙잡고 하염없이 있을 수가 없다보니 컨닝 비스무리하게... http://99-bottles-of-beer.net/language-perl-727.html 여기 코멘트란에 있는 코드를 가지고 코드골프 사이트에서 요구하는 출력에 맞게 고쳤습니다.

4바이트를 도저히 못 줄이겠네요. 아니면 170바이트가 되려면 이 형태로는 안 되고 아예 새로 뜯어고쳐야 할지도?

sub b{[@b=(abs||99,bottle."s"x!!++$_,of,beer),on,the,wall]}print"@{+b}, @b.
",$_?"Take one down and pass it around":"Go to the store and buy some more",", @{+b}.
 
"for-99..-1

(위 코드의 줄바꿈은 일부러 추가한게 아니라, 스트링 안에서 "\n"이 들어가는 자리를 그냥 편집기에서 엔터를 눌러 입력한 겁니다)
leonid의 이미지


이것도 한번 도전해보려 했지만 너무 어려워보여서 못하고있었네요

ascii art(도저히 1바이트가 안줄어듬.. OTL)는 잠시 보류하고 이걸 해봐야겠습니다.. ㅋㅋ

raymundo의 이미지

ASCII art 때와 달리 이번 종목은 호응이 별로 없군요 ^^;

그나저나 1바이트가 남은 상태라면, vi로 편집하는 경우 제일 끝에 자동으로 "\n"을 붙여버리니까 그것 때문에 1바이트 손해보고 있는 건 아닌지 확인해보세요. ":set noeol binary"해 준 후 저장하면 (jg님이 가르쳐주신 거) 붙이지 않게 할 수 있습니다.

좋은 하루 되세요!

byteme의 이미지

sub b{[@b=(-$_,bottle."s"x!!++$_,of,beer),on,the,wall]}print"@{+b}, @b.
",$_?"Take one down and pass it around":"Go to the store and buy some more",", @{+b}.
"for-99..-1

이거면? 169인데요.. 뭔가 잘못했나.

raymundo의 이미지

http://codegolf.com/competition/output/99-bottles-of-beer

제일 마지막 라인 보시면 다시 99병이 되어야 합니다. :-)

좋은 하루 되세요!

leonid의 이미지

첫 시도인 204B짜리 루비코드 입니다.

def c(n)"#{n} bottle#{n>1?'s':''} of beer"end
99.downto(1){|n|puts"#{c(n)+w=' on the wall'}, #{c(n)}.
#{n>1?'Take one down and pass it around':'Go to the store and buy some more'}, #{c(n>1?n-1:99)+w}.
 
"}

-ㅅ-a

jg의 이미지

아.. 어렵네요. 엉뚱한 174B버전만 하나 더 만들었습니다. =_=

sub b{[@b=(-$_++||99,bottl.($_?es:e),of,beer),on,the,wall]}print"@{&b}, @b.
",$_?"Take one down and pass it around":"Go to the store and buy some more",", @{&b}.
 
"for-99..-1

일단 gg..

--
perl -e's@@JEON Myoung-jin@;sub man{s| _|her e|}
sub see{s;^;Just;;u;s;e ;Perl ;;to;print$_,$/}$uperMan=M;
s=^....=U are not=;s~$uperMan~~;&admitIt;s=U are = A=;s|young|_|;&man;
sub admitIt{say;ye;s!-\w+! Hacker!};see U'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

jg의 이미지

간만에 기억이 나서 더듬거리며 해봤는데 결과는 179B -_-;; 퇴행하고 있는??

sub b{@_=$_?qw(Take one down and pass it around es):qw(Go to the store and buy some more e);[@b=(1-$_++||99,bottl.pop,of,beer),on,the,wall]}print"@{&b}, @b.
@_, @{&b}.
 
"for-98..0

그 사이에 1위는 165B 군요. 기가막힙니다.

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

jg의 이미지

저녁 아르바이트를 끝내고 뭔가 머릿속에 번뜩해서 짜보았지만..
또다른 174B 버전만을 양상했군요..

sub b{@b=(-$_++||99,bottl.($_?es:e),of,beer);"@b on the wall"}print+b,", @b.
",$_?"Take one down and pass it around, ":"Go to the store and buy some more, ",b,".
 
"for-99..-1

약오르네요;;

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

raymundo의 이미지

오 잊고 있던 걸 다시 물 위로 끄집어내셨네요ㅎ 근데 2007년이나 지금이나 제 실력이 달라진게 없어서 여전히 더 줄이려면 머리 빠개질 듯 ^^

좋은 하루 되세요!

jg의 이미지

문득 생각이 나서 해봤는데.. 이건 마약입니다. 지금 금단 현상을 겪고 있네요;;
codegolf 는 몇 년이 지나도 코드를 공개하지 않는군요. 헐.. 아직도 최단 코드를 찾고 있는 건가요..

원글에 쓰인 @{[]} 구문은 perl의 잘 알려지지 않은 기능입니다.
물론 중급이상의 perl 사용자라면 알고 있는 기능이지요. 가칭은 baby cart이구요.
${[]}는 array 내용을 copy하거나 반환된 readonly array를 수정하기 위해 쓰이는 것은
당연한 기능으로 보이지만 double quote 안에서도 동작한다는 것이 잘 알려지지 않았지요.
ruby에서는 비슷한 기능을 조금 더 간단한 구문을 통해 쓸 수 있다고 하네요.

--
2007년 말에 타국에 온 뒤로 2년간 거의 perl을 못하다가 최근에 짬이 나서
응용프로그램을 하나 만들고 있습니다. 진도는 지지부진 합니다만, 언젠가는 완성되겠죠. -_-;;

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

jg의 이미지

173B 버전이 가능하군요.. 본래 글에서 글자 배치를 바꾸고 한 글자만 빼면 되네요. 헉.

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}