HQ9 +インタープリターの作成


31

このゴルフの目的は、プログラミング言語HQ9 +のインタープリターを作成すること
です。このプログラミング言語には4つのコマンドがあります。

  • H-「Hello、world!」を印刷します
  • Q-プログラムのソースコードを出力します
  • 9-「99本のビール」の歌詞を印刷します
  • + -アキュムレータをインクリメントします

ルール:

  1. アキュムレーターが定義されていないため、コマンド+
  2. プログラムは入力を要求する必要があります(この入力はソースコードになります)。または、ソースコードがファイルから読み取られます。
  3. 「99本のビール」の歌詞をファイルに入れたり、ファイルからテキストを読んだりすることはできません。
  4. GZipやBZipなどの圧縮アルゴリズムを使用して曲のテキストを圧縮することはできません。独自の圧縮アルゴリズムを作成する必要があります。これは複雑なアルゴリズムである必要はありませんが、可能な限りテキストを圧縮してみてください(覚えておいてください:これはコードゴルフで、バイト数が最も少ないコードが勝ちます)
  5. ソースコードにHQ9または+以外の文字が含まれている場合、コマンドを実行する前に「ソースコードに無効な文字が含まれています」と出力してください。これは、ソースコードがH1たとえば、出力Hello, world!する前に出力しないことを意味しますSource code contains invalid characters。いいえ、すぐに出力しますSource code contains invalid characters
  6. インタープリターが大文字と小文字の両方を受け入れる場合、文字数は-8になります

がんばろう!


3
ルール4は「なぜ彼はそれを禁止するのか?!」では意味がありません。レベル; ルール5は、「彼はどういう意味ですか?」では意味がありません。レベル。
ピーターテイラー

4
ルール5はどうして意味をなさないのでしょうか?
マイクC

私は、大文字のみを使用するように要求する方が、どちらかを受け入れた場合に8文字の無料文字を取得することを勝手に言うよりも良いと思います。8は、言語に応じてカバーする場合としない場合があります。
マイクC

10
ルール5は、HQ9 +仕様に違反するため、意味がありません。
ブースバイ

2
HQ9 +のインタープリターが自動的に勝ちます。
TheNumberOne

回答:


16

APL(Dyalog)(326-8 = 318)

エディタウィンドウに貼り付けて、を呼び出しますH。入力はキーボードから取得されます。

H
⎕←'Source code contains invalid characters'/⍨~∧/'HhQq9+'∊⍨V←⍞
B←' of beer'
W←' on the wall'
L←⎕TC[2]
Z←{k←' bottle','s'/⍨⍵≠1⋄⍵<0:'99',k⋄⍵=0:'No',k⋄k,⍨⍕⍵}
{⍵∊'Hh':⎕←'Hello, world!'
⍵∊'Qq':⎕←V
⍵∊'9':{⎕←G,K,(G←Z⍵),B,L,(⊃'Go to the store and buy some more' 'Take one down and pass it around'[1+×⍵]),L,(Z⍵-1),K←B,W,L}¨1-⍨⌽⍳100}¨V

6

Mathematica、349346341文字

h = If[StringMatchQ[#, ("H" | "Q" | "9" | "+") ...], 
   b = If[# > 0, ToString@#, "No"] <> " bottle" <> 
      If[# == 1, "", "s"] <> " of beer" &; 
   w = b@# <> " on the wall" &; 
   Print /@ 
    StringCases[#, {"H" -> "Hello, world!", "Q" -> #, 
      "9" -> "" <> 
        Table[w@n <> ",\n" <> b@n <> 
          ".\ntake one down, pass it around,\n" <> w[n - 1] <> 
          If[n == 1, ".", ".\n\n"], {n, 99, 1, -1}]}];, 
   "Source code contains invalid characters"] &

非常に印象的ですが、いくつかのマイナーなグリーチがあるようです。'h["Q"]は "Q"を出力します。h ["9"]は機能しますが、h [9]はプログラム全体を出力します(方法はわかりません。)
DavidC

@DavidCarraher StringMatchQおよびIfが失敗する方法によりコードを出力しますIf[StringMatchQ[3, "a"], x, y]
。– ssch

6

C、599 587 487 481 467文字

これは破られると確信しています。私は結局Cを使用しています。Cで書かれた多くの受賞ゴルフエントリが表示されない理由があります。これは、の犯罪的虐待のおかげで467文字になりました#define

HQ9 +ソースファイルをコマンドライン引数として指定します。

編集:ファイルではなく、stdinからのソースを受け入れるようになりました。プログラムを起動し、コードの入力を開始し、CTRL- Cそれを実行するために行わとき。

少なくともMinGW / GCCで以下をコンパイルします。 gcc -o hq9+.exe hq9+.c

MSVCで動作するはずですが、これだけのソリューションを作成する気はありませんでした。:)

#define B "bottles of beer"
#define C case
#define P printf
#define R break
a,i,j,s;
main(){
char p[9999],c;
for(;;) {
    switch(c=getch()){
    C 'H':C 'Q':C '9':C '+': C 3: R;
    default:P("Source code contains invalid characters\n");
    }
    if (c==3) R;
    p[s++]=c;
}
for(i=0;i<s;i++){
    c = p[i];
    switch(c){
    C 'H':
        P("Hello world!");
        R;
    C 'Q':
        for(j=0;j<s;j++)putchar(p[j]);
        R;
    C '9':
        j=99;
        while(j){
            P("%d "B" on the wall,\n%d "B".\nTake one down, pass it around,\n%d "B".\n",j,j,j-1);
            j--;
        }
        R;
    C '+':
        a++;
    }
}
}

または:

#define B "bottles of beer"
#define C case
#define P printf
#define R break
a,i,j,s;main(){char p[9999],c;for(;;){switch(c=getch()){C 'H':C 'Q':C '9':C '+': C 3: R;default:P("Source code contains invalid characters\n");}if (c==3) R;p[s++]=c;}for(i=0;i<s;i++){c = p[i];switch(c){C 'H':P("Hello world!");R;C 'Q':for(j=0;j<s;j++)putchar(p[j]);R;C '9':j=99;while(j){P("%d "B" on the wall,\n%d "B".\nTake one down, pass it around,\n%d "B".\n",j,j,j-1);j--;}R;C '+':a++;}}}

入力にファイルの代わりにstdinを使用して、487文字まで下げました。
マイクC

#defineを悪用して464にします。
マイクC

後のスペースCや数個前のスペースなど、スペースを取り除くことができますR;p[s++]=0;入力ループの後で8文字を削って印刷を簡素化できましたp
ダニエルルバロフ

3

Python 2-452 453 443バイト

q=raw_input()
if set(q)-set('HQ9+'):print'Source code contains invalid characters'
b=' bottles of beer'
b=[b,b.replace('s','')]
w=[a+' on the wall'for a in b]
t='Take one down, pass it around,\n'
c={'H':'Hello, world!','Q':q,'9':''.join(`i`+w[i<2]+',\n'+`i`+b[i<2]+'.\n'+t+(`i`if i>1 else'No')+w[0]+'.\n'for i in range(1,100)[::-1])+'No'+w[0]+',\nNo'+b[0]+'.\n'+'Go to the store, buy some more,\n99'+w[0]+'.'}
for d in q:
 if d in c:print c[d]

ブレー。それはすでに問題でしたが、修正するのに1バイトかかるバグを発見しました。ブレー。

(以前は+、の出力に含めませんでしたQ。たとえばQ+++、の入力は出力を与えましたQ。)

私があなたがするべきだと思ったように、無効な入力で終了しないことによって、いくつかの文字を保存しました。

説明版は近日公開予定です。私はあきらめた。この怪物がどのように機能するのか、私はほとんど理解していません。要望があれば、もう一度やりますが、それまではそうではありません。


あなたはしていないexitあなたがそこに7つの文字を保存することができますので、無効な文字には、単に、メッセージを表示します。
カイルカノス14年

@KyleKanosああ、私はそれを誤解しました。ありがとう!
地下

あなたの歌詞は正しくありません99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall. 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *98* bottles of beer on the wall.
オリバーNi

また、を入力するとエラーが発生します+。あなたがすることになっている無視し +、エラーを与えていない
オリバーニッケル

また、出力間には何も想定されていません。私が入力HQHHした場合のように言う必要がありますHello World!HQHHHelloWorld!Hello World!
オリバーNi

3

Perl、325-8 = 317

sub p{print@_}$_=<>;$a=' on the wall';$b=' bottle';$e=' of beer';$c='Take one down, pass it around';if(!/^[hqHQ9+]+$/){p"Source code contains invalid characters";exit}$k=$_;for(/./g){/H|h/&&p"Hello, World!";if(/9/){$i=99;$d=$b."s$e";while($i>0){p"$i$d$a
$i$d
$c
";$q=--$i==1?'':'s';$d="$b$q$e";$i||=No;p"$i$d$a
"}}/Q|q/&&p$k}

拡張:

sub p{print@_}
$_=<>;
$a=' on the wall';
$b=' bottle';
$e=' of beer';
$c='Take one down, pass it around';
if(!/^[hqHQ9+]+$/){
    p"Source code contains invalid characters";
    exit
}
$k=$_;
for(/./g){
    /H|h/&&p"Hello, World!";
    if(/9/){
        $i=99;
        $d=$b."s$e";
        while($i>0){
            p"$i$d$a
$i$d
$c
";
            $q=--$i==1?'':'s';
            $d="$b$q$e";
            $i||=No;
            p"$i$d$a
"
        }
    }
    /Q|q/&&p$k
}

2

ルビー、364 360-8 = 352

まだ改善の余地がたくさんありますここから盗まれた99本のコード。

p=gets.upcase
if p=~/[^HQ9+
]/
puts"Source code contains invalid characters"else
p.each_char{|x|case x
when ?H
puts"Hello, world!"
when ?Q
puts p
when ?9
def c;"#{$n} bottle#{'s'if$n>1} of beer on the wall"end
($n=99).times{puts"#{c}, #{c[0..-13]}.
#{$n<2?"Go to the store and buy some more":"Take one down and pass it around"}, #{$n=($n-2)%99+1;c}.

"}end}end

セクションのNo more bottles of beer on the wall後にあるはず1 bottleです。それからGo to the store...
オリバーNi

1 bottle of beer on the wall, 1 bottle of beer on the wall, take one down, pass it around, no more bottles of beer on the wall. No more bottles of beer on the wall, no more bottles of beer, go to the store, buy some more, 99 bottles of beer on the wall.
オリバーNi

@Oliver質問は、曲の正確な歌詞を指定していません。どこにも「これ以上」セクションを含める必要はありません。
ドアノブ

わかりました、しかし、また、出力間に改行があるはずではありません。
オリバーNi

@Oliver課題はどこでそれを言っていますか?
ドアノブ

2

ハスケル、298

main=interact g
g s|all(`elem`"HQ9+")s=s>>=(%s)|0<1="Source code contains invalid characters"
'H'%_="hello World!"
'Q'%s=s
'9'%_=drop 32$d 99
_%_=""
k=" bottles of beer on the wall"
d 0="No more"++k++"."
d n|a<-shows n k=[a,".\n\n",a,",\n",take 18a,".\ntake one down, pass it around\n",d$n-1]>>=id

これは非常に簡単です。%コマンドの出力を返します(ソースcodで使用する場合Q)。dゴルフの理由で、開始時にジャンクラインを含む99本のボトルの歌を返します。すべてがインタラクションにラップされます(テストするg代わりに使用したいmain場合があります)


どうすれば実行できますか?私はWinGHCiでそれを貼り付けてみましたが、私は得ます<interactive>:8:5: parse error on input ‘=’
ProgramFOX

@ProgramFOX私にはわからない...いつできるのかチェックする
誇りに思ってhaskeller

@ProgramFOXすみません、時間がかかりました:-)。GHCiを適切に使用していない。GHCiでは、式を期待するように定義を直接入力することはできません。a letを使用して定義を挿入するか(で区切られていない複数の定義を挿入すると中断します;)、ファイルからコードを実行できます。
誇りに思ってhaskeller

そうですか。それでも私はそれを実行しようとして失敗します。ファイルを読み込んで呼び出すとmain、実行しようとするとソースコードに無効な文字が含まれていると表示されますH。のg代わりに実行しようとするとmain、すぐにエラーが発生します。
ProgramFOX

main付加された改行は有効なコマンドではないため、@ ProgramFOX は機能しません。そのため、g代わりに使用することをお勧めします。に関してはgputStrLn $ g "H" 正しく動作しませんか?
誇りに思ってhaskeller

2

J-444バイト

数字が好きだったので、ゴルフをやめました。ここに行く、単一の式関数!

f=:'Source code contains invalid characters'"_`('Hello, world!'"_`[`((((s=:(<:@[s],L,(v,LF,'Take one down and pass it around, '"_,b@<:,' of beer on the wall.'"_)@[,''"_)`(],(L=:LF,LF),(v=:1&b,' of beer on the wall, '"_,b,' of beer.'"_)@[)@.([<1:))''"_),LF,'Go to the store and buy some more, '"_,(b=:({&'Nn'@([=0:),'o more'"_)`(":@])@.(]>0:),{.&' bottles'@(8:-=&1@])),' of beer on the wall.'"_)@(99"_))`]@.('HQ9+'&i.@])"0 1 0])@.(*./@e.&'HQ9+')

例:

   hq9 '9QHHQ+'
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.

...

3 bottles of beer on the wall, 3 bottles of beer.
Take one down and pass it around, 2 bottles of beer on the wall.

2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.

1 bottle of beer on the wall, 1 bottle of beer.
Take one down and pass it around, no more bottles of beer on the wall.

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 on the wall.
9QHHQ+
Hello, world!
Hello, world!
9QHHQ+
+
   hq9 '9QHHaQ'
Source code contains invalid characters

いいえ、これについては説明しません。長すぎる。
seequ 14年

待って、なぜこれがダウン投票されたのですか?
seequ

2

Fortran 528 470 481

プリプロセッシングディレクティブを使用するには、-fppフラグ(+3でスコア)1でコンパイルする必要があります(3文字以上節約できるため、まったく問題ありません)。また、大文字と小文字が区別されないため、-8:Dがあります。とにかく一度使用されるものを前処理しないことで5文字を保存しましendif

コンパイラーが前処理を強制するように、ファイルに.F90拡張子を付ける必要があります(呼び出すのが理にかなっていますhq9+.F90)。コードでは大文字と小文字が区別されます。大文字と小文字を区別しないようにすると、16文字などが追加されるため、8文字を節約する価値はありません。私の以前の答えは、bottlesforの複数形の変化を説明していませんでした9。このバージョンはそれを修正します(悲しいことにもっと多くのキャラクターを追加します)。

#define P print*,
#define W " of beer on the wall"
#define N print'(x,i0,a,a)',
#define e enddo
#define S case
#define J len(trim(c))
character(len=99)::c,b=" bottles";read*,c;do i=1,J;if(all(c(i:i)/=["H","Q",'9',"+"])) then;P"Source code contains invalid characters";exit;endif;e;do i=1,J;select S(c(i:i));S("H");P"Hello, world!";S("Q");P c;S("9");l=8;do k=99,1,-1;N k,b(1:l),W;N k,b(1:l)," of beer";P "Take one down, pass it around";if(k==2)l=l-1;if(k==1)exit;N k-1,b(1:l),W;P"";e;P"No more",trim(b),W;S default;endselect;e;end

未処理および前処理なしの方がはるかによく見えます(おそらく、何が起こっているのかがわかるからです):

program hq9
   character(len=99)::c,b=" bottles"
   read*,c
   do i=1,len(trim(c))
! change the below to ["H","h","Q","q","9","+"] to be case-insensitive
      if(all(c(i:i)/=["H","Q","9","+"]))then
         print*,"Source code contains invalid characters"
         exit
      endif
   enddo
   do i=1,len(trim(c))
      select case(c(i:i))
        case("H")                ! change to case("H","h") for case-insensitive
           print*,"Hello, world!"
        case("Q")                ! change to case("Q","q") for case-insensitive
           print*, c
        case("9")
           l=8
           do k=99,1,-1
              print'(x,i0,a,a)', k,b(1:l)," of beer on the wall"
              print'(x,i0,a)', k,b(1:l)," of beer"
              print*,"Take one down, pass it around"
              if(k==2) l=l-1
              if(k==1) exit
              print'(x,i0,a)', k-1,b(1:l)," of beer on the wall"
              print*,""
           enddo
           print*,"No more",trim(b)," of beer on the wall"
        case default
           ! do nothing
      endselect
   enddo
end program hq9

コンパイラにコンパイル内容を知らせるために特定の拡張機能を要求することは許容できると思います。アナログでは.cc-lstdc++フラグの必要性を回避するために、C ++ファイルに名前を付ける必要があります。
primo 14年

2

Python 2、340-8 = 332

s,o=raw_input(),''
for z in s:
 if z in'Hh':o+='Hello World!'
 elif z in'Qq':o+=s
 elif'9'==z:
  i=298
  while~-i:print i/3or 99,'bottle'+'s of beer on the wall.\n'[2<i<6:9+i%3*12]+'..\nGToa kteo  otnhee  dsotwonr,e ,p absusy  isto maer omuonrde,,'[(i>3)+i%3*68::2];i-=1
 elif'+'!=z:o='Source code contains invalid characters';break
print o

1

Lua 443-8 = 435 464-8 = 456

if-endの代わりに複数のを使用して21文字を保存することができましたif-elseif-end。また、いくつかの後に余分な空白が浮かんでいました)

p=print o=" of beer"t=" on the wall"B=" bottle"b=" bottles"l=io.read("*l");g=l:lower()if g:match"[^hq9+]"then p("Source code contains invalid characters")end for i=1,#g do s=g:sub(i,i)if s=='h'then p("Hello, world")end if s=='q'then p(l)end if s=='9'then n=99 repeat p(n..b..o..t..", "..n..b..o)n=n-1 p("Take one down, pass it around, "..n..b..o..t..".")p()until n==1 p("1"..B..o..t..", 1"..B..o)p("No more"..b..o..t..", no more"..b..o)end end

Fortranの回答よりも短くはありませんが、これにはかなり満足しています。99本のビールコードは、Alessandroによるこの回答から変更されています。Ungolfed、私たちは持っています

-- reuse stuff
p=print
o=" of beer"
t=" on the wall"
B=" bottle"
b=" bottles"
-- read the line & then lowercase it for case insensitivity
l=io.read("*l");g=l:lower()
if g:match"[^hq9+]" then -- horray for basic regex
   p("Source code contains invalid characters")
end
for i=1,#g do
   s=g:sub(i,i)               -- take substring
   if s=='h' then p("Hello, world") end
   if s=='q' then p(l) end
   if s=='9' then
      n=99
      repeat
         p(n..b..o..t..", "..n..b..o)
         n=n-1
         p("Take one down, pass it around, "..n..b..o..t..".")
         p()
      until n==1
      p("1"..B..o..t..", 1"..B..o)
      p("No more"..b..o..t..", no more"..b..o)
   end
end

入力を小文字にするコードには12文字のコストがかかるため、ボーナスには価値がありません。
nyuszika7h

あなたは、あなただけのような何か行うことができ、入力を小文字にする必要はありませんif s in'Hh'
オリバー・ニッケル

8文字を節約
オリバーNi

@MCParadox:Pythonのあなたのしている考え方だErが、Luaの者は、inforループのイテレータのためではなく比較。そこに固定するとエラーが発生します。ここには3つの選択肢があります:(1)match各行で使用、(2)s=='h'or s=='H'各行でユーザー、(3)私がやったようにそれを行います。明らかに(3)は(1)および(2)よりも短い。
カイルカノス

1

ジュリア、362

s = chomp(readline(STDIN))
l=""
z=" of beer"
q,r,w,t=" bottles$z"," bottle$z"," on the wall.\n","take one down, pass it around,\n"
for j=99:-1:2
b="$j$q"
l*="$b$w$b.\n$t"
end
l*="1$r$(w)1$r.\n$(t)No$q$w"
p=println
all(c->c in "HQ9+", s)||p("Source code contains invalid characters")
for c in s
    c=='Q'&&p(s)
    c=='H'&&p("Hello, world!")
    c=='9'&&p(l)
end

1

Tcl、515

set d [read stdin]
if {![regexp {^[hq9\+HQ]*$} $d]} {puts "Source code contains invalid characters"}
lmap c [split $d {}] {set b { bottles of beer}
switch -- $c H {puts "Hello, world"} Q {puts $d} 9 {for {set i 99} {$i>2} {incr i -1} {puts "$i$b on the wall,
$i$b.
Take one down, pass it around,
[expr $i-1]$b on the wall.
"}
puts "2$b on the wall,
2$b.
Take one down, pass it around,
1 bottle of beer on the wall.

1 bottle of beer on the wall,
1 bottle of beer.
Take one down, pass it around,
No$b on the wall."}}

ほんの少しゴルフをしただけで、まだCより小さく、正しい99本のビールの終わりの詩です。


さて、今は合法です。よくやった、あなたは私を打ち負かした。ゴルフにCを使うのをやめるべきです。
マイクC

最初の行を削除して、の最後のパラメーターに埋め込むことができますregexpcodegolf.stackexchange.com/a/109818/29325
sergiol

1

JavaScript(ES6)、385

s=>{n=99,b=' bottle',j=' of beer',d=' on the wall',e='Take one down, pass it around',k='Go to the store, buy some more',l='No',o='s',f=', ';for(i=s.split(m=v='');~n;)v+=[n||l,b,n-1?o:m,j,d,f,n||l,b,n-1?o:m,j,f,n?e:k,f,--n<1?99:n,b,n-1?o:m,j,d,'! '].join(m);return s.match(/[^HQ9\+]/,r='')?'Source code contains invalid characters':[...s].map(c=>({H:'Hello World!',9:v,Q:s})[c]).join``}

大文字と小文字を区別しないことを選択しなかった場合、文字数が多すぎます。他のエントリのいくつかにも近くありませんでしたが、それでも楽しかったです!

JavaScript、344

曲の完全性の低いバージョンでバージョンを作成しました。

(function(i){if(s.match(/[^HQ9\+]/)){m='Source code contains invalid characters'}else{n=99,b=' bottles of beer ',d='on the wall',e='take one down, pass it around',f=', ';for(;n;)v+=[n,b,d,f,n,b,f,e,f,--n||'no more',b,d,'! '].join(m);h={H:'Hello World!',Q:arguments.callee+m,9:v};for(;c=i[n++];)m+=h[c]||''}alert(m)})((s=prompt()).split(m=v=''))

しかし、他のエントリーを見た後(そして実際の歌詞を見て、誰が知っていたのか!)、それはちょっとした警戒だと思いました!


そうではありGo to the store, buy some more, *99* bottles of beer on the wallません*No more* bottles of beer on the wall
オリバーNi

さらに購入した場合、どうしてこれ以上ないのでしょうか?
オリバーNi

また、Q私にとってはうまくいきません。
オリバーNi

@Oliverは当時あなたがこれについてコメントしていることに気づいていませんでした...私Qはその時それを行うべきであると完全に誤解し、入力の代わりに関数のソースコードを提供しました...それは元々それを行う理由でしたJSでは、その部分は簡単ですが、今ではそれがまったく必要なものではないことがわかりました!
ドムヘイスティングス

@Oliverが歌詞を更新しました!
ドムヘイスティングス

1

C、562バイト

char*c="%1d %3$s of %4$s on the %5$s, %1d %3$s of %4$s.\n\0Take one down and pass it around, %2d %3$s of %4$s on the %5$s.\n\0Go to the store and buy some more, %1d %3$s of %4$s on the %5$s.\n";main(int a,char**b){int x=0;for(int i=0;i<strlen(b[1]);i++){if(b[1][i]=='+')x++;else if(b[1][i]=='9'){int k=99;while(1){printf(&c[0],k,k,k==1?"bottle":"bottles","beer","wall");if(k!=1){printf(&c[49],k,k,"bottles","beer","wall");k--;}else{k=99;printf(&c[114],k,k,"bottles","beer","wall");break;}}}else printf("%s",b[1][i]=='H'?"Hello, world!":(b[1][i]=='Q'?b[1]:""));}}

完全なプログラムとして。最初の引数はHQ9 +プログラムです。実際のアキュムレーターで。私は定義ステートメントを使用しないように挑戦しました。

ゴルフされていないバージョン:

char* c = "%1d %3$s of %4$s on the %5$s, %1d %3$s of %4$s.\n\0Take one down and pass it around, %2d %3$s of %4$s on the %5$s.\n\0Go to the store and buy some more, %1d %3$s of %4$s on the %5$s.\n";
main (int a, char** b) {
    int x = 0;
    for (int i = 0; i < strlen(b[1]); i++) {
        if (b[1][i] == '+')
            x++;
        else if (b[1][i] == '9') {
            int k = 99;
            while (1) {
                printf(&c[0], k, k, k == 1 ? "bottle" : "bottles", "beer", "wall");
                if (k != 1) {
                    printf(&c[49], k, k, "bottles", "beer", "wall");
                    k--;
                } else {
                    k=99;
                    printf(&c[114], k, k, "bottles", "beer", "wall");
                    break;
                }
            }
        } else
            printf("%s",b[1][i] == 'H' ? "Hello, world!" : (b[1][i] == 'Q' ? b[1] : ""));
    }
}

0

Java、546バイト

これは私の最初のコードゴルフの提出です。私たちはそれでもっとできると確信しています。入力をコマンドライン引数として読み取ります。「99本のビールの瓶」から「借りた」ビールコードjava回答(クリエイティブコモンズ)

class a{public static void main(String[] a){if(a[0].matches("^[HQ9\\Q+\\E]+$")){for(char c:a[0].toCharArray()){if(c=='H')p("Hello, world!");if(c=='Q')p(a[0]);if(c=='9')b();}}else{System.out.println("Source code contains invalid characters");}}static void p(String s){System.out.println(s);}static void b(){String b=" of beer",c=" on the wall",n=".\n",s;for(int i=100;i-->1;){s=" bottle"+(i>1?"s":"");p(i+s+b+c+", "+i+s+b+n+(i<2?"Go to the store and buy some more, 99":"Take one down and pass it around, "+(i-1))+" bottle"+(i!=2?"s":"")+b+c+n);}}}

コマンドライン引数が受け入れられない場合は教えてください。これはとても楽しかったです!


CLAは大丈夫です。いい答えだ。
Rɪᴋᴇʀ

0

Excel VBA、489バイト

インデントなし:

Sub h(s)
For c=1 To Len(s)
Select Case Mid(s,c,1)
Case "H"
Debug.? "Hello,World!"
Case "Q"
Set v=ActiveWorkbook.VBProject.VBComponents("M").CodeModule:For n=1 To v.countoflines:Debug.? v.Lines(n,1):Next
Case "+"
a=a+1
Case "9"
s=" Bottles of Beer":o=" Bottle of Beer":w=" on the wall":t=". Take 1 down pass it around,":p=",":d=".":For n=99 To 3 Step -1:Debug.? n;s;w;p;n;s;t;n-1;s;w;d:Next:Debug.? 2;s;w;p;2;s;t;1;o;w;d:Debug.? 1;o;w;p;1;o;t;"No";s;w;d
End Select
Next
End Sub

(読みやすいようにインデントされています)

Sub h(s)
For c=1 To Len(s)
Select Case Mid(s,c,1)
    Case "H"
        Debug.? "Hello,World!"
    Case "Q"
        Set v=ActiveWorkbook.VBProject.VBComponents("M").CodeModule
        For n=1 To v.countoflines
            Debug.? v.Lines(n,1)
        Next
    Case "+"
        a=a+1
    Case "9"
        s=" Bottles of Beer"
        o=" Bottle of Beer"
        w=" on the wall"
        t=". Take 1 down pass it around,"
        p=","
        d="."
        For n=99 To 3 Step -1
            Debug.? n;s;w;p;n;s;t;n-1;s;w;d
        Next
        Debug.? 2;s;w;p;2;s;t;1;o;w;d
        Debug.? 1;o;w;p;1;o;t;"No";s;w;d
End Select
Next
End Sub

デフォルトのModule1の名前をM
callに変更します。h "+++++++++Your Code"
これは他のオフィスアプリケーションでも機能し、ActiveWorkbookを適切なドキュメントタイプに変更します。


Excelはスペースを追加し、略語を展開するため、Excel内ではコードは531文字です
-SeanC

Thats 636文字
オリバーNi

インデントからすべての空白を削除します、@ oliver
SeanC

あなたはすべてのインスタンス変換することにより、3つのバイトを失う可能For n=1 ToFor n=1To(前に空白を取り除くToのすべてのインスタンス変換することによって)と4バイトDebug.? 2;にするDebug.?2;(後に空白を取り除く?キーワード)
テイラー・スコットは、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.