Membuat juru bahasa HQ9 +

31

Tujuan dari kode golf ini adalah untuk membuat juru bahasa untuk bahasa pemrograman HQ9 +
Ada 4 perintah dalam bahasa pemrograman ini:

  • H - mencetak "Halo, dunia!"
  • Q - mencetak kode sumber program
  • 9 - mencetak lirik lagu "99 botol bir"
  • + - menambah akumulator

Aturan:

  1. Karena akumulator tidak ditentukan, Anda dapat mengabaikan perintah +
  2. Program Anda harus meminta input (input ini akan menjadi kode sumber) atau kode sumber dibaca dari file
  3. Anda tidak diperbolehkan memasukkan lirik "99 botol bir" ke dalam file, dan membaca teks dari file tersebut
  4. Anda tidak diperbolehkan menggunakan algoritma kompresi seperti GZip atau BZip untuk mengompresi teks lagu: Anda harus membuat algoritma kompresi Anda sendiri. Ini tidak harus berupa algoritme yang rumit, tetapi cobalah untuk mengompresi teks sebanyak mungkin (ingat: ini adalah kode-golf, kode dengan byte paling sedikit menang)
  5. Jika kode sumber berisi karakter yang bukan H , Q , 9 atau + , maka keluaran "Kode sumber berisi karakter yang tidak valid" sebelum menjalankan perintah apa pun! Ini berarti bahwa, jika kode sumbernya adalah H1contoh, maka jangan menghasilkan Hello, world!sebelum Anda mengeluarkan Source code contains invalid characters. Tidak, segera outputSource code contains invalid characters
  6. Jika penerjemah Anda menerima karakter huruf besar dan kecil, maka Anda mendapatkan -8 ke jumlah karakter Anda

Semoga berhasil!

ProgramFOX
sumber
3
Aturan 4 tidak masuk akal di "mengapa dia melarang itu ?!" tingkat; aturan 5 tidak masuk akal di "apa maksudnya ?!" tingkat.
Peter Taylor
4
Bagaimana aturan 5 tidak masuk akal?
Mike C
Saya pikir akan lebih baik untuk hanya membutuhkannya hanya menggunakan huruf besar, daripada secara sewenang-wenang mengatakan Anda mendapatkan 8 karakter gratis jika menerima baik. 8 mungkin atau mungkin tidak menutupinya tergantung pada bahasa.
Mike C
10
Aturan 5 tidak masuk akal karena melanggar spesifikasi HQ9 +.
stan
2
Seorang juru bahasa di HQ9 + harus secara otomatis menang.
TheNumberOne

Jawaban:

16

APL (Dyalog) (326 - 8 = 318)

Rekatkan di jendela editor dan panggil H. Input diambil dari keyboard.

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
marinus
sumber
6

Mathematica, 349 346 341 karakter

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"] &
alephalpha
sumber
Sangat mengesankan tetapi tampaknya ada beberapa gliches kecil. 'H ["Q"] menampilkan "Q". h ["9"] berfungsi, tetapi h [9] mengeluarkan seluruh program (Saya tidak mengerti caranya.)
DavidC
@DavidCarraher Ini mengeluarkan kode karena bagaimana StringMatchQ dan If gagal:If[StringMatchQ[3, "a"], x, y]
ssch
6

C, 599 587 487 481 467 karakter

Saya yakin ini bisa dikalahkan. Saya menggunakan C setelah semua. Ada alasan mengapa Anda tidak melihat banyak entri golf yang menang ditulis dalam C. Ini sekarang 467 karakter berkat pelecehan kriminal #define.

Tentukan file sumber HQ9 + sebagai argumen baris perintah.

EDIT: Sekarang menerima sumber dari stdin, bukan file. Mulai program, mulai ketikkan kode, CTRL- Csetelah selesai menjalankannya.

Itu mengkompilasi setidaknya di MinGW / GCC dengan: gcc -o hq9+.exe hq9+.c

Seharusnya bekerja di MSVC, tapi saya tidak merasa ingin membuat solusi lengkap hanya untuk ini. :)

#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++;
    }
}
}

Atau:

#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++;}}}
Mike C
sumber
Dapatkan hingga 487 karakter dengan menggunakan stdin, bukan file untuk input.
Mike C
Buat itu 464 dengan menyalahgunakan #define.
Mike C
Anda bisa menyingkirkan ruang, seperti yang terjadi setelah Cdan pasangan sebelumnya R;. Bisa juga mencukur 8 karakter dengan p[s++]=0;setelah loop input untuk mempermudah pencetakan p.
Daniel Lubarov
3

Python 2 - 452 453 443 byte

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]

Bleh. Sudah bleh, tapi kemudian saya menemukan bug yang saya biaya byte untuk memperbaikinya. Bleh.

(Dulu saya tidak termasuk +dalam output untuk Q. Input dari Q+++memberi output Q, misalnya.)

Menyimpan beberapa karakter dengan tidak keluar pada input yang tidak valid seperti yang saya kira seharusnya.

Versi yang dijelaskan akan segera hadir.Aku menyerah. Aku bahkan nyaris tidak mengerti bagaimana cara kerja monster ini lagi. Jika ada permintaan saya akan mencoba lagi tetapi sampai saat itu tidak terjadi.

monmon bawah tanah
sumber
Anda tidak exitmenggunakan karakter yang tidak valid, cukup tampilkan pesannya, sehingga Anda dapat menyimpan 7 karakter di sana.
Kyle Kanos
@KyleKanos Oh, saya salah paham. Terima kasih!
undergroundmonorail
Lirik Anda tidak benar - saat ini dikatakan: 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall. Seharusnya dikatakan: 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *98* bottles of beer on the wall.
Oliver Ni
Itu juga memberikan kesalahan saat saya masuk +. Anda seharusnya mengabaikan + , tidak memberikan kesalahan
Oliver Ni
Juga tidak seharusnya ada apa pun di antara output. Seperti jika saya memasukkannya HQHHharus mengatakanHello World!HQHHHelloWorld!Hello World!
Oliver 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}

Diperluas:

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
}
faubi
sumber
2

Ruby, 364 360 - 8 = 352

Masih memiliki banyak ruang untuk perbaikan. Kode 99 botol dicuri dari sini .

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
Gagang pintu
sumber
Seharusnya ada No more bottles of beer on the wallsetelah 1 bottleseksi. maka ituGo to the store...
Oliver 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.
Oliver Ni
@Oliver Pertanyaannya tidak menentukan lirik lagu yang tepat. Di mana pun tidak memerlukan bagian "tidak lebih" untuk dimasukkan.
Gagang pintu
Ok, tetapi juga, seharusnya tidak ada garis baru antara output.
Oliver Ni
@Oliver Di mana tantangan mengatakan itu?
Gagang pintu
2

Haskell, 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

ini cukup mudah. %mengembalikan output perintah (diberi kode sumber untuk digunakan Q). dmengembalikan lagu 99 botol dengan garis sampah di awal karena alasan golf. semuanya terbungkus dalam suatu interaksi (Anda mungkin ingin menggunakan galih-alih mainsaat menguji)

haskeller bangga
sumber
Bagaimana saya menjalankannya? Saya mencoba menempelkannya di WinGHCi, tetapi saya mengerti <interactive>:8:5: parse error on input ‘=’.
ProgramFOX
@ProgramFOX saya tidak tahu ... Saya akan memeriksa kapan saya bisa
bangga haskeller
@ProgramFOX maaf butuh waktu lama :-). Anda tidak menggunakan GHCi dengan benar. di GHCi Anda tidak dapat memasukkan definisi secara tidak benar karena mengharapkan ekspresi. Anda dapat menggunakan a letuntuk menyisipkan definisi (ini terputus ketika memasukkan beberapa definisi yang tidak dipisahkan oleh ;) atau menjalankan kode dari file.
haskeller bangga
Saya melihat. Saya masih gagal mencoba menjalankannya; ketika saya memuat file dan panggilan main, ia mengatakan bahwa kode sumber berisi karakter yang tidak valid ketika saya mencoba mengeksekusi H. Ketika saya mencoba menjalankan galih-alih main, itu langsung memberikan kesalahan.
ProgramFOX
@ProgramFOX maintidak berfungsi karena baris baru yang ditambahkan bukan perintah hukum. Itu sebabnya saya merekomendasikan menggunakan gsebagai gantinya. Adapun g, putStrLn $ g "H" tidak berfungsi dengan baik?
haskeller bangga
2

J - 444 byte

Saya suka nomornya, jadi berhentilah bermain golf. Ini dia, fungsi ekspresi tunggal!

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+')

Contoh:

   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
sumber
Dan tidak, saya tidak akan menulis penjelasan untuk ini. Terlalu panjang.
seequ
Tunggu, mengapa ini diturunkan?
seequ
2

Fortran 528 470 481

Membutuhkan kompilasi dengan -fppflag (+3 untuk mencetak skor) 1 untuk menggunakan arahan preprocessing (yang menghemat lebih dari 3 karakter, jadi saya benar-benar setuju dengan itu). Itu juga case-sensitive, jadi ada -8: D. Disimpan 5 karakter dengan tidak memproses endifseperti yang digunakan sekali saja .

Membutuhkan file untuk memiliki .F90ekstensi (masuk akal untuk memanggilnya hq9+.F90) sehingga kompilator memaksa preprocessing. Kode ini peka terhadap huruf besar-kecil; membuatnya case-insensitive menambahkan sekitar 16 karakter, jadi tidak benar-benar layak untuk menyimpan 8 karakter. Jawaban saya sebelumnya tidak menjelaskan perubahan bentuk jamak bottlesuntuk 9; versi ini mengoreksinya (dan sayangnya menambahkan lebih banyak karakter).

#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

Terlihat jauh lebih baik ungolfed & non-preprocessed (mungkin karena Anda dapat melihat apa yang terjadi):

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
Kyle Kanos
sumber
Saya pikir itu dapat diterima untuk memerlukan ekstensi spesifik untuk membiarkan kompiler tahu apa yang dikompilasi. Analog mungkin memerlukan file C ++ untuk dinamai .ccagar tidak perlu -lstdc++flag.
Primo
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
Oliver Ni
sumber
1

Lua 443 - 8 = 435 464 - 8 = 456

Saya berhasil menyimpan 21 karakter dengan menggunakan banyak if-ends alih-alih if-elseif-end. Saya juga memiliki beberapa ruang putih ekstra yang mengambang setelah beberapa ).

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

Saya cukup senang dengan yang satu ini, meskipun tidak jauh lebih pendek dari jawaban Fortran saya . 99 botol kode bir telah dimodifikasi dari jawaban ini oleh Alessandro . Tidak ada yang kita miliki

-- 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
Kyle Kanos
sumber
Kode untuk mengurangi input biaya 12 karakter, jadi bonus tidak sepadan.
nyuszika7h
Anda tidak perlu mengecilkan input, Anda bisa melakukan sesuatu sepertiif s in'Hh'
Oliver Ni
Menghemat 8 karakter
Oliver Ni
@MCParadox: Eh, itu Python yang Anda pikirkan, Lua inadalah untuk iterator for-loop dan bukan perbandingan; Anda akan mendapatkan kesalahan jika menempel di sana. Ada tiga pilihan di sini: (1) gunakan matchdi setiap baris, (2) pengguna s=='h'or s=='H'di setiap baris, (3) lakukan dengan cara yang saya lakukan. Jelas (3) lebih pendek dari (1) dan (2).
Kyle Kanos
1

Julia, 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
gggg
sumber
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."}}

Hanya sedikit bermain golf, masih lebih kecil dari C dan 99 botol bir yang benar.

Johannes Kuhn
sumber
Oke, sekarang yang itu sah. Kerja bagus, kau mengalahkanku. Saya harus berhenti menggunakan C untuk golf.
Mike C
Anda dapat menghapus baris pertama dan menyematkannya pada parameter terakhir dari regexp. Anda bisa mendapatkan 99 bir saya di codegolf.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``}

Tidak memilih untuk case-insensitive, akan membutuhkan terlalu banyak karakter. Bahkan tidak dekat dengan beberapa entri lainnya, tetapi tetap menyenangkan!

JavaScript, 344

Saya membuat versi dengan versi lagu yang kurang lengkap:

(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=''))

tetapi setelah melihat entri lain (dan melihat lirik yang sebenarnya, siapa yang tahu!), saya pikir itu sedikit keluar!

Dom Hastings
sumber
Seharusnya Go to the store, buy some more, *99* bottles of beer on the wall, bukan*No more* bottles of beer on the wall
Oliver Ni
Jika Anda membeli lebih banyak, bagaimana mungkin masih ada lagi?
Oliver Ni
Dan juga, Qtidak berhasil untuk saya.
Oliver Ni
@Liver tidak melihat Anda mengomentari ini saat itu ... Saya benar-benar salah paham ketika Qseharusnya melakukan itu waktu dan memberikan kode sumber fungsi bukan input ... Itu awalnya alasan saya untuk melakukannya di JS, bagian itu akan mudah, namun sekarang saya tahu itu tidak diperlukan sama sekali!
Dom Hastings
@Oliver memperbarui lirik!
Dom Hastings
1

C, 562 byte

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]:""));}}

Sebagai program lengkap. Argumen pertama adalah program HQ9 +. Dengan akumulator yang sebenarnya. Saya menantang diri saya sendiri untuk tidak menggunakan pernyataan define.

Versi tidak disatukan:

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] : ""));
    }
}
Kue kering
sumber
0

Java, 546 byte

Ini adalah pengiriman kode golf pertama saya. Saya yakin kita bisa berbuat lebih banyak dengannya. Bunyinya input sebagai argumen baris perintah. Kode bir "dipinjam" dari jawaban java "99 Botol Bir" (creative commons)

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);}}}

Beritahu saya jika args baris perintah tidak dapat diterima. Ini sangat menyenangkan!

Rohan Jhunjhunwala
sumber
PKB baik-baik saja. Jawaban bagus.
Rɪᴋᴇʀ
0

Excel VBA, 489 Bytes

Tidak ada indentasi:

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

(indentasi agar mudah dibaca)

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

Ganti nama standar Module1 ke M
call dengan h "+++++++++Your Code"
Ini juga akan berfungsi pada aplikasi kantor lainnya, mengubah ActiveWorkbook ke tipe dokumen yang sesuai

SeanC
sumber
perhatikan bahwa excel akan menambah spasi, dan memperluas singkatan, jadi dalam excel, kodenya 531 chars
SeanC
Thats 636 Characters
Oliver Ni
Hapus semua spasi putih dari indentasi saya, @oliver
SeanC
Anda dapat kehilangan 3 Bytes dengan mengonversikan semua instance dari For n=1 Toke For n=1To(menghapus spasi kosong sebelumnya To) dan 4 byte dengan mengubah semua instance Debug.? 2;ke Debug.?2;(menghapus spasi dengan ?kata kunci)
Taylor Scott