Execute HQ9+: Difference between revisions
No edit summary |
(→{{header|AutoHotkey}}: added AutoHotkey) |
||
Line 1: | Line 1: | ||
{{task}}Implement a [[HQ9+]] interpreter or compiler for Rosetta Code. |
{{task}}Implement a [[HQ9+]] interpreter or compiler for Rosetta Code. |
||
=={{header|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> |
|||
=={{header|C}}== |
=={{header|C}}== |
Revision as of 04:23, 19 May 2010
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.
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>
Python
See RCHQ9+/Python.
Ruby
See RCHQ9+/Ruby.
Tcl
See RCHQ9+/Tcl.
Ursala
See RCHQ9+/Ursala.