Execute HQ9+: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added PicoLisp)
(→‎{{header|PicoLisp}}: Added PureBasic)
Line 200: Line 200:
("+" (inc 'Accu)) ) )
("+" (inc 'Accu)) ) )
Accu ) )</lang>
Accu ) )</lang>
=={{header|PureBasic}}==
<lang PureBasic>Procedure hq9plus(code.s)
Protected accumulator, i, bottles
For i = 1 To Len(code)
Select Mid(code, i, 1)
Case "h", "H"
PrintN("Hello, world!")
Case "q", "Q"
PrintN(code)
Case "9"
bottles = 99
While bottles
PrintN(Str(bottles) + " bottles of beer on the wall, " + Str(bottles) + " bottles of beer,")
bottles - 1
PrintN("Take one down, pass it around, " + Str(bottles) + " bottles of beer on the wall.")
Wend
Case "+"
accumulator + 1
EndSelect
Next i
EndProcedure

If OpenConsole()
Define testCode.s = "hq9+HqQ+Qq"
hq9plus(testCode)
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
CloseConsole()
EndIf</lang>


=={{header|Python}}==
=={{header|Python}}==

Revision as of 21:26, 18 July 2010

Task
Execute HQ9+
You are encouraged to solve this task according to the task description, using any language you may know.

Implement a HQ9+ interpreter or compiler for Rosetta Code.

AutoHotkey

<lang AutoHotkey>; http://www.autohotkey.com/forum/viewtopic.php?p=356268#356268

testCode := "hq9+HqQ+Qq"

MsgBox % RunHQ9Plus(testCode)

---------------------------------

RunHQ9Plus(input) {

 Loop, Parse, input
   If ( A_LoopField = "+" )
     acc++
   Else If ( A_LoopField = "H" )
     output .= "Hello, world!`n"
   Else If ( A_LoopField = "Q" )
     output .= input "`n"
   Else If ( A_LoopField = "9" )
     Loop, 99
     {
       ; following 4 lines could be only 1 long line
       output .= (99+1-A_Index) " bottles of beer on the wall`n"
       output .= (99+1-A_Index) " bottles of beer`n"
       output .= "Take one down, pass it around`n"
       output .= (99-A_Index) " bottles of beer on the wall`n`n"
     }
 Return output

}</lang>

C

<lang c>void runCode(char *code) {

   int c_len = strlen(code);
   int i, accumulator, bottles;
   for(i=0;i<c_len;i++)
   {
       switch(code[i])
       {
           case 'Q':
               printf("%s\n", code);
               break;
           case 'H':
               printf("Hello, world!\n");
               break;
           case '9':
               //Nice bottles song alg. from RC :)
               bottles = 99;
               do {
                   printf("%d bottles of beer on the wall\n", bottles);
                   printf("%d bottles of beer\n", bottles);
                   printf("Take one down, pass it around\n");
                   printf("%d bottles of beer on the wall\n\n", --bottles);
               } while( bottles > 0 );
               break;
           case '+':
               //Am I the only one finding this one weird? :o
               accumulator++;
               break;
       }
   }

};</lang>

C++

Basically the same as the C example, although this has been C++'ified with strings and streams. <lang cpp>void runCode(string code) {

   int c_len = code.length();
   int accumulator, bottles;
   for(int i=0;i<c_len;i++)
   {
       switch(code[i])
       {
           case 'Q':
               cout << code << endl;
               break;
           case 'H':
               cout << "Hello, world!" << endl;
               break;
           case '9':
               //Nice bottles song alg. from RC :)
               bottles = 99;
               do {
                   cout << bottles << " bottles of beer on the wall" << endl;
                   cout << bottles << " bottles of beer" << endl;
                   cout << "Take one down, pass it around" << endl;
                   cout << --bottles << " bottles of beer on the wall" << endl << endl;
               } while( bottles > 0 );
               break;
           case '+':
               //Am I the only one finding this one weird? :o
               accumulator++;
               break;
       }
   }

};</lang>

Common Lisp

See RCHQ9+/Common Lisp.

E

See RCHQ9+/E.

Forth

<lang forth>variable accumulator

H cr ." Hello, world!" ;
Q cr 2dup type ;
9 99 verses ; \ http://rosettacode.org/wiki/99_Bottles_of_Beer#Forth
+ 1 accumulator +! ;
hq9+ ( "code" -- )
 parse-word 2dup bounds ?do
   i 1 [ get-current literal ] search-wordlist
   if execute else true abort" invalid HQ9+ instruction"
 then loop 2drop ;</lang>

Haskell

See RCHQ9+/Haskell.

J

From 99 Bottles of Beer <lang J>bob =: ": , ' bottle' , (1 = ]) }. 's of beer'"_ bobw=: bob , ' on the wall'"_ beer=: bobw , ', ' , bob , '; take one down and pass it around, ' , bobw@<:</lang>

The rest of the interpreter: <lang J>H=: smoutput bind 'Hello, world!' Q=: smoutput @ [ hq9=: smoutput @: (beer"0) bind (1+i.-99) hqp=: (A=:1)1 :'0 0$A=:A+m[y'@]

hq9p=: H`H`Q`Q`hq9`hqp@.('HhQq9+' i. ])"_ 0~</lang>

Example use:

<lang J> hq9p 'hqQQq' Hello, world! hqQQq hqQQq hqQQq hqQQq</lang>

Java

See RCHQ9+/Java.

JavaScript

The function below executes a HQ9+ program and returns the program output as a string. <lang javascript>function hq9plus(code) {

 var out = ;
 var acc = 0;
 
 for (var i=0; i<code.length; i++) {
   switch (code.charAt(i)) {
     case 'H': out += "hello, world\n"; break;
     case 'Q': out += code + "\n"; break;
     case '9':
       for (var j=99; j>1; j--) {
         out += j + " bottles of beer on the wall, " + j + " bottles of beer.\n";
         out += "Take one down and pass it around, " + (j-1) + " bottles of beer.\n\n";
       }
       out += "1 bottle of beer on the wall, 1 bottle of beer.\n" +
           "Take one down and pass it around, no more bottles of beer on the wall.\n\n" +
           "No more bottles of beer on the wall, no more bottles of beer.\n" +
           "Go to the store and buy some more, 99 bottles of beer on the wall.\n";
       break;
     case '+': acc++; break;
   }
 }
 return out;

}</lang>

PicoLisp

<lang PicoLisp>(de hq9+ (Code)

  (let Accu 0
     (for C (chop Code)
        (case C
           ("H" (prinl "Hello, world"))
           ("Q" (prinl Code))
           ("9"
              (for (N 99 (gt0 N))
                 (prinl N " bottles of beer on the wall")
                 (prinl N " bottles of beer")
                 (prinl "Take one down, pass it around")
                 (prinl (dec 'N) " bottles of beer on the wall")
                 (prinl) ) )
           ("+" (inc 'Accu)) ) )
     Accu ) )</lang>

PureBasic

<lang PureBasic>Procedure hq9plus(code.s)

 Protected accumulator, i, bottles
 For i = 1 To Len(code)
   Select Mid(code, i, 1)
     Case "h", "H"
       PrintN("Hello, world!")
     Case "q", "Q"
       PrintN(code)
     Case "9"
       bottles = 99
       While bottles
         PrintN(Str(bottles) + " bottles of beer on the wall, " + Str(bottles) + " bottles of beer,")
         bottles - 1
         PrintN("Take one down, pass it around, " + Str(bottles) + " bottles of beer on the wall.")
       Wend
     Case "+"
       accumulator + 1
   EndSelect
 Next i

EndProcedure

If OpenConsole()

 Define testCode.s = "hq9+HqQ+Qq"
 hq9plus(testCode)
 
 Print(#CRLF$ + #CRLF$ + "Press ENTER to exit"): Input()
 CloseConsole()

EndIf</lang>

Python

See RCHQ9+/Python.

Ruby

See RCHQ9+/Ruby.

Tcl

See RCHQ9+/Tcl.

Ursala

See RCHQ9+/Ursala.