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