99 бутылок пива на стене

Есть такой прелюбопытный сайт "99 Bottles of Beer on The Wall". Это сборник листингов программ, написанных на разных языках, но выводящих один и тот же текст - "песню про пиво". Как ни странно, но я обнаружил, что могу пополнить список из 227 языков, представленных на сайте, еще своими 6 экземплярами. Что я без промедления и сделал. Но, так как владелец сайта занят переездом на новый адрес и ему пока не до меня, я решил выложить эти образцы здесь, чтобы широкая общественность могла полюбоваться делом рук моих.

1. PostgreSQL. СУБД для UNIX. -> www.postgresql.org
YourTable - это ваша таблица с числом строк более 100.

-- Written by Evgeny.Stepanischev at ksu.ru
-- 
CREATE SEQUENCE temp_beer_seq INCREMENT -1 MINVALUE 0 MAXVALUE 99 START 99;
CREATE FUNCTION temp_b() RETURNS text
AS 'SELECT \' bottle\'||CASE WHEN last_value=1 THEN
\'\'::text ELSE \'s\'::text END||\' of beer\' FROM temp_beer_seq'
LANGUAGE 'sql';
        
CREATE FUNCTION temp_b_out() RETURNS text
AS 'SELECT s.last_value||temp_b()||\' on the wall, \'||
s.last_value||temp_b()||\'.\\n Take one and pass it around,\\n \'||
CASE WHEN NEXTVAL(\'temp_beer_seq\')=0 THEN \'No\'
 ELSE text(s.last_value-0) END||
temp_b()||\' on the wall.\\n\'
FROM temp_beer_seq s'
LANGUAGE 'sql';

SELECT CASE WHEN temp_beer_seq.last_value=0
THEN 'No more bottles of beer...\n Go to the store and buy some more...\n
 99 bottles of beer.' ELSE temp_b_out() END
FROM YourTable LIMIT 100,1;
                    -- 

DROP SEQUENCE temp_beer_seq;
DROP FUNCTION temp_b();
DROP FUNCTION temp_b_out();
-- END

2. СУБД. MySQL -> www.mysql.com
YourTable - это ваша таблица с числом строк более 100.

/* Program by Evgeny.Stepanischev at ksu.ru*/
SET @beer:=100;
SET @w:=' on the wall';
SELECT IF(@beer<2,'\nNo more bottles of beer...\n\
Go to the store and buy some more...\n99 bottles of \
beer.',CONCAT(CONCAT('\n',@str:=CONCAT(@beer:=@beer-1,\
@bot:=CONCAT(' bottle',IF (@beer>1,'s',''),' of beer')),\
@w,', ',@str,'.\nTake one and pass it around,\n'), IF \
(@beer-1=0,'No more ',@beer-1),@bot,@w,'.')) as beer
FROM YourTable LIMIT 100;

3. xSSI для Apache -> www.apache.com
Знаком "@" обозначено место, где перевод строки _не_ нужен,
просто строчки такие длинные, что пришлось их разбить.

<!-- Written by Evgeny.Stepanischev at ksu.ru -->
<!--#if expr="$D=A || $D=B" -->
        <!--#if expr="$K=/${D}8/" -->
        <!--#set var="D" value="8" -->
        <!--#set var="M" value="7" -->
        <!--#elif expr="$K=/${D}7/" -->
        <!--#set var="D" value="7" -->
        <!--#set var="M" value="6" -->
        <!--#elif expr="$K=/${D}6/" -->
        <!--#set var="D" value="6" -->
        <!--#set var="M" value="5" -->
        <!--#elif expr="$K=/${D}5/" -->
        <!--#set var="D" value="5" -->
        <!--#set var="M" value="4" -->
        <!--#elif expr="$K=/${D}4/" -->
        <!--#set var="D" value="4" -->
        <!--#set var="M" value="3" -->
        <!--#elif expr="$K=/${D}3/" -->
        <!--#set var="D" value="3" -->
        <!--#set var="M" value="2" -->
        <!--#elif expr="$K=/${D}2/" -->
        <!--#set var="D" value="2" -->
        <!--#set var="M" value="1" -->
        <!--#elif expr="$K=/${D}1/" -->
        <!--#set var="D" value="1" -->
        <!--#set var="M" value="0" -->
        <!--#elif expr="$K=/${D}0/" -->
        <!--#set var="D" value="0" -->
        <!--#else -->
        <!--#set var="D" value="9" -->
        <!--#set var="M" value="8" -->
        <!--#endif -->

<!--#else -->

        <!--#set var="D" value="A" -->
        <!--#set var="K" value="$QUERY_STRING" -->
        <!--#include virtual="$DOCUMENT_NAME" -->
        <!--#set var="A" value="$D" -->
        <!--#set var="Am" value="$M" -->

        <!--#set var="D" value="B" -->
        <!--#include virtual="$DOCUMENT_NAME" -->
        <!--#set var="B" value="$D" -->
        <!--#set var="Bm" value="$M" -->

        <!--#if expr="$A=0 && $B=0" -->
                <BODY BGCOLOR="BLACK" TEXT="WHITE"><B>
                No more bottles of beer...<br>
                Go to the store and buy some more...<br>
                99 bottles of beer.
                </BODY>
        <!--#else -->

                <HEAD>
                <!--#if expr="$B=0" -->
                        <!--#set var="A1" value="$Am" -->
                        <!--#set var="B1" value="9" -->
                <!--#else -->
                        <!--#set var="A1" value="$A" -->
                        <!--#set var="B1" value="$Bm" -->
                <!--#endif -->
                <META HTTP-EQUIV="Refresh" Content="1;@
URL=http://<!--#echo var="HTTP_HOST" --><!--#echo var="DOCUMENT_URI" -->?A@
<!--#echo var="A1" -->B<!--#echo var="B1" -->">
                </HEAD>

                <BODY BGCOLOR=BLACK TEXT=WHITE><B>
                <!--#if expr="$A>0" --><!--#echo var="A" --><!--#endif -->@
<!--#echo var="B" -->
                bottle<!--#if expr="$A$B>1" -->s<!--#endif -->
                of beer on the wall, <!--#if expr="$A>0" -->@
<!--#echo var="A" --><!--#endif --><!--#echo var="B" -->
                bottle<!--#if expr="$A$B>01" -->s<!--#endif --> of beer.<br>
                Take one and pass it around,<br>

                <!--#if expr="$A1$B1>00" -->
                        <!--#if expr="$A1>0" --><!--#echo var="A1" -->@
<!--#endif --><!--#echo var="B1" -->
                        bottle<!--#if expr="$A1$B1>01" -->s@
<!--#endif --> of beer on the wall.
                <!--#else -->
                        No more bottles of beer on the wall.
                <!--#endif -->
                <!--#set var="C" value="" -->
                <BR>
                </B></BODY>
        <!--#endif -->
<!--#endif -->

4. Win2000 batch file. -> www.microsoft.com

@ECHO OFF
REM Evgeny.Stepanischev at ksu.ru

FOR /L %%B IN (99,-1,1) DO CALL :PROG %%B
ECHO No more bottles of beer...
ECHO Go to the store and buy some more...
ECHO 99 bottles of beer. 
GOTO :EOF

:PROG
ECHO %1 bottle(s) of beer on the wall, %1 bottle(s) of beer.
ECHO Take one and pass it around,
SET /A S=%1-1
IF %S% EQU 0 SET S=No
ECHO %S% bottle(s) of beer on the wall.
ECHO.

5. PHP. -> www.php.net

<?
for ($s='s' and $beer=99;$beer;)
{
    echo "$beer bottle$s of beer on the wall, $beer bottle$s of beer.<br>",
    "\nTake one and pass it around,<br>";
    $beer--;
    $s = $beer==1?'':'s';
    if ($beer) echo "$beer bottle$s of beer on the wall.<br><br>";
};
?>
No more bottles of beer on the wall.<br><br>
No more bottles of beer...<br>Go to the story and buy some more...<br>
99 bottles of beer.

6. JUnix SHell. -> junix.kzn.ru
Предупреждаю: JUSH работает настолько медленно, что вы вряд ли дождетесь результата работы.
Для испытания лучше уменьшить константу "beer" до 4-х.

set beer=99
set s=s
while ($beer gt 0)
echo $beer bottle$s of beer on the wall, $beer bottle$s of beer.
echo Take one and pass it around,
set beer--
if ($beer==1) set s=
if ($beer) echo $beer bottle$s of beer on the wall.\n
end
cat <<T
No more bottles of beer on the wall.

No more bottles of beer...
Go to the store and buy some more...
99 bottles of beer.
T

11 ноября 2000 18:14

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML: