Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

99 бутылок: PostgreSQL, MySQL, xSSI, CMD, PHP, JUnix Shell

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

6. JUnix SHell junix.kzn.ru https://github.com/bolknote/junix
Предупреждаю: 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


5. PHP http://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.


4. Win2000 batch file (CMD)

@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.


3. xSSI для Apache https://httpd.apache.org/
Знаком «█» обозначено место, где перевод строки не нужен,
просто строчки такие длинные, что пришлось их разбить.

<!-- 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 -->


2. MySQL (СУБД) http://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;


1. PostgreSQL (СУБД) http://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
Ctrl ←1/IX-00
Ctrl →26/XI-00