HQ9 + tercüman oluşturma


31

Bu golf kodunun amacı, programlama dili için bir tercüman oluşturmaktır HQ9 +
Bu programlama dilinde 4 komut vardır:

  • H - "Merhaba dünya!"
  • Q - programın kaynak kodunu yazdırır
  • 9 - "99 şişe bira" şarkısının sözlerini basıyor
  • + - akümülatörü artırır

Kurallar:

  1. Akümülatör tanımlanmadığından, + komutunu yok sayabilirsiniz.
  2. Programınız girdi ister (bu girdi kaynak kod olacaktır) veya kaynak kod bir dosyadan okunur.
  3. "99 şişe bira" nın sözlerini bir dosyaya koymanız ve dosyadaki metni okumanız yasaktır.
  4. Şarkı metnini sıkıştırmak için GZip veya BZip gibi bir sıkıştırma algoritması kullanmanıza izin verilmez: kendi sıkıştırma algoritmanızı oluşturmanız gerekir. Bu karmaşık bir algoritma olmak zorunda değildir, ancak metni mümkün olduğunca sıkıştırmaya çalışın (unutmayın: bu bir kod golfüdür, en az baytlık kod olan koddur)
  5. Kaynak kodu H , Q , 9 veya + olmayan bir karakter içeriyorsa , herhangi bir komutu çalıştırmadan önce "Kaynak kodu geçersiz karakterler içeriyor" ifadesini verin! Bu, eğer kaynak kodu H1mesela, Hello, world!çıkmadan önce çıktı almadığı anlamına gelir Source code contains invalid characters. Hayır, hemen çıktıSource code contains invalid characters
  6. Tercümanınız hem büyük hem küçük harfli karakterleri kabul ederse , karakter sayınıza -8 eklersiniz .

İyi şanslar!


3
Kural 4 "Bunu neden yasaklıyor ki ?!" anlamında bir anlam ifade etmiyor. seviye; Kural 5, "ne demek istiyor ?!" anlamında bir anlam ifade etmiyor. seviyesi.
Peter Taylor

4
Kural 5 nasıl bir anlam ifade etmiyor?
Mike C,

Bence sadece büyük harf kullanmasını istemenin daha iyi olacağını düşünüyorum, ya da eğer kabul ederse, serbestçe 8 karakter alabileceğinizi söylemek yerine. 8, dile bağlı olarak onu kapsayabilir veya içermeyebilir.
Mike C

10
Kural 5, HQ9 + şartnamesi ihlal ettiği için bir anlam ifade etmiyor.
23.03.2013’deki standby

2
HQ9 + 'daki bir tercüman otomatik olarak kazanmalıdır.
TheNumberOne

Yanıtlar:


16

APL (Dyalog) (326 - 8 = 318)

Bir editör penceresine yapıştırın ve arayın H. Giriş klavyeden alınır.

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, 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"] &

Çok etkileyici ama bazı küçük lekeler var gibi görünüyor. 'H ["Q"] "Q" çıktısı veriyor. h ["9"] çalışıyor, ancak h [9] tüm programı
çıkardı (

@DavidCarraher StringMatchQ ve If'in başarısız olmasına bağlı olarak kod çıktısı alır:If[StringMatchQ[3, "a"], x, y]
ssch 23:03

6

C, 599 587 487 481 467 karakter

Bunun yenilebilir olduğuna eminim. Sonuçta C kullanıyorum. C ile yazılmış çok sayıda kazanılan golf girişini görmemenizin bir nedeni var. Bu şimdi küfürlü taciz nedeniyle 467 karakterdir #define.

HQ9 + kaynak dosyasını komut satırı argümanı olarak belirtin.

EDIT: Şimdi bir dosya değil, stdin kaynağını kabul ediyor. Programı başlatın, kodu yazmaya başlayın CTRL- - Cçalıştırmayı tamamladığınızda.

En azından MinGW / GCC’de aşağıdakilerle derlenir: gcc -o hq9+.exe hq9+.c

MSVC'de çalışmalıyım, ancak bunun için tam bir çözüm oluşturmak istemedim. :)

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

Veya:

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

Girdi dosyası yerine stdin kullanarak 487 karaktere indirdi.
Mike C,

Bunu 464'ü kötüye kullanarak tanımlayın.
Mike C,

Sonra Cve bir kaç evvelki gibi uzaylardan kurtulabilirsin R;. p[s++]=0;Yazdırma işlemini kolaylaştırmak için giriş döngüsünden sonra 8 karakterle de tıraş olabilir p.
Daniel Lubarov

3

Python 2 - 452 453 443 bayt

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. Çoktan kanıyordu, ama sonra düzeltmem için bir bayta mal olan bir hata keşfettim. Bleh.

(Eskiden +çıktıya dahil etmiyordum Q. Örneğin bir girdi Q+++çıktı verdi Q.)

Bazı karakterleri, sanmanız gerektiğini düşündüğüm gibi geçersiz girişten çıkmadan kurtardı.

Açıklanan sürüm birazdan geliyor.Pes ettim. Bu canavarlığın artık nasıl çalıştığını bile anlayamadım. Eğer talep varsa, başka bir yol daha vereceğim ama o zamana kadar gerçekleşmiyor.


exitGeçersiz karakterde değilsiniz , mesajı görüntülemeniz yeterlidir, böylece 7 karakter kaydedebilirsiniz.
Kyle Kanos

@KyleKanos Oh, bunu yanlış anladım. Teşekkürler!
undergroundmonorail

Sözlerin doğru değil - şu anda yazıyor: 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall. Söylemesi gerekiyor: 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

Ayrıca girdiğimde hata veriyor +. Sen zannediyorsunuz görmezden + değil, bir hata vermek
Oliver Ni

Ayrıca çıktılar arasında bir şey olmaması gerekiyordu. Sanki HQHHHello 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}

Expanded:

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

Ruby, 364 360 - 8 = 352

Hala iyileştirme için çok yer var. Buradan 99 şişe kod çalındı .

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

Bölümden No more bottles of beer on the wallsonra olması gerekiyordu 1 bottle. o zamanGo 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 Soru, şarkının tam sözlerini belirtmiyor. Hiçbir yerde "artık" bölümünün yer alması gerekmez.
Doorknob

Tamam, ama aynı zamanda, çıktılar arasında yeni bir satır olmaması gerekiyordu.
Oliver Ni

@Oliver Mücadelesi nerede diyor?
Doorknob

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

bu oldukça basittir. %bir komutun çıktısını döndürür (kullanım için kaynak kod kodunu verilen Q). dGolf nedenleriyle 99 şişe şarkıyı başlangıçta önemsiz bir çizgi ile birlikte verir. Her şey bir etkileştiği sarılır (Kullanmak isteyebileceğiniz gyerine maintest ederken)


Nasıl çalıştırmalıyım? WinGHCi'ye yapıştırmayı denedim, ama anladım <interactive>:8:5: parse error on input ‘=’.
ProgramFOX

@ProgramFOX hiçbir fikrim yok ... Yapabileceğim zaman kontrol
gurur verici haskeller 9

@ProgramFOX üzgünüm :-) uzun sürdü. GHCi'yi doğru kullanmıyorsunuz. GHCi'de, ifadeleri beklediği gibi tanımları doğru bir şekilde giremezsiniz. lettanımları eklemek için a kullanabilirsiniz (ayrılmamış çoklu tanımları eklerken bu kesilir ;) veya kodu bir dosyadan çalıştırın.
Gurur haskeller,

Anlıyorum. Yine de çalıştırmaya çalışmakta başarısız oluyorum; Dosyayı yüklediğimde ve mainçalıştırdığımda, yürütmeye çalıştığımda kaynak kodun geçersiz karakterler içerdiğini söylüyor H. gBunun yerine koşmaya çalıştığımda main, hemen bir hata veriyor.
ProgramFOX

@ProgramFOX mainçalışmıyor, çünkü eklenen yeni satır yasal bir komut değil. Bu yüzden kullanmamı tavsiye ettim g. Gelince g, putStrLn $ g "H" düzgün çalışmıyor mu?
gururlu haskeller

2

J - 444 bayt

Sayıyı beğendim, bu yüzden golf oynamayı bıraktım. Buyrun, tek ifade işlevi!

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

Örnekler:

   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

Ve hayır, bunun için bir açıklama yazmayacağım. Çok uzun.
seequ

Bekle, neden bu indirildi?
saat

2

Fortran 528 470 481

Ön işleme direktiflerini kullanmak -fppiçin bayrak (+3 puan) 1 ile derlenmeyi gerektirir ( 3 karakterden daha fazla tasarruf sağlar, bu yüzden bu konuda tamamen iyiyim). Aynı zamanda büyük / küçük harf duyarsız, bu yüzden -8: D var. Yine de bir kez kullanılmış olanı ön işleme tabi tutmadan 5 karakter kurtardıendif .

Derleyicinin ön işlemeye zorlayabilmesi için dosyanın bir .F90uzantısına sahip olmasını gerektirir (onu çağırmak mantıklıdır hq9+.F90). Kod büyük / küçük harf duyarlıdır; Büyük / küçük harfe duyarlı olmayan, 16 karakter gibi bir şey ekler, bu yüzden 8 karakter kazanmak için gerçekten değmez. Benim daha önceki cevabı vermedi değişen çoğul hesaba bottlesiçin 9; Bu sürüm onu ​​düzeltir (ve ne yazık ki daha fazla karakter ekler).

#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

İşlenmemiş ve önceden işlenmemiş çok daha iyi görünüyor (muhtemelen neler olduğunu görebildiğiniz için):

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

Derleyiciye ne derlediğini bildirmek için belirli bir uzantı gerektirilmesi kabul edilebilir. Bir analog .cc, -lstdc++bayrağa ihtiyaç duymamak için bir C ++ dosyasının adlandırılmasını gerektiriyor olabilir .
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

1

Lua 443 - 8 = 435 464 - 8 = 456

Bunun if-endyerine birden çok s kullanarak 21 karakter kaydetmeyi başardım if-elseif-end. Ayrıca birkaç dakika sonra etrafında yüzen fazladan beyaz boşluklar vardı ).

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 cevabımdan daha kısa olmasa da, bundan çok mutluyum . 99 şişe bira kodu bu cevaptan Alessandro tarafından değiştirildi . Ungolfed, sahibiz

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

Girdiyi küçük düşürmek için gereken kod 12 karakterdir, yani bonus buna değmez.
nyuszika7h

Girdiyi küçük harf yapmanız gerekmez, sadece bir şeyler yapabilirsiniz if s in'Hh'
Oliver Ni

8 karakter kazandırıyor
Oliver Ni

@MCParadox: Er, bu düşündüğün Python, Lua in, döngüsel yineleyiciler içindir , karşılaştırmalar yapmaz; Oraya sokarsan bir hata alırsın. Burada üç seçenek var: (1) matchher satırda kullanım , (2) s=='h'or s=='H'her satırda kullanıcı , (3) yaptığım gibi yap. Açıkça (3), (1) ve (2) 'den daha kısa.
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

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."}}

Sadece biraz golf oynadı, hala C'den daha küçük ve doğru 99 Şişe bira ayeti.


Tamam, şimdi bu okunaklı. İyi iş, beni yendin. Golf için C kullanmayı bırakmalıyım.
Mike C

İlk satırı kaldırabilir ve son parametresine gömebilirsiniz regexp. 99 bira golfümü 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``}

Büyük / küçük harf duyarlılığı tercih etmedi, çok fazla karakter maliyeti olurdu. Diğer bazı girişlere bile yakın olmasa da yine de eğlenceliydi!

JavaScript, 344

Şarkının daha az eksiksiz bir versiyonunu içeren bir versiyon yaptım:

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

ama diğer girişleri gördükten sonra (ve gerçek şarkı sözlerine bakıp, bilen!), bir parça polis olduğunu düşünmüştüm!


O olmalı Go to the store, buy some more, *99* bottles of beer on the wall, değil*No more* bottles of beer on the wall
Oliver Ni

Biraz daha alırsan, nasıl daha fazla olamaz?
Oliver Ni

Ve ayrıca, Qbenim için çalışmıyor.
Oliver Ni

@Oliver bu konuda bir yorum yapmadığınızı fark etmedi ... Bu Qzamanı ne zaman yapması gerektiğini ve girdi yerine işlevin kaynak kodunu verdiğini tamamen yanlış anladım. JS’de bu kısım kolay olacaktır, ancak bunun artık gerekli olmadığını biliyorum!
Dom Hastings,

@Oliver şarkı sözlerini güncelledi!
Dom Hastings,

1

C, 562 bayt

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

Tam bir program olarak. İlk argüman HQ9 + programıdır. Gerçek bir akümülatör ile. Tanım deyimlerini kullanmama konusunda kendime meydan okudum.

Ungolfed versiyonu:

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 bayt

Bu benim ilk kod golf gönderim. Bununla daha fazlasını yapabileceğimize eminim. Girişi komut satırı argümanı olarak okur. "99 Şişe Bira" dan "ödünç alınan" bira kodu java yanıtı (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);}}}

Komut satırının kabul edilebilir olmaması durumunda bana bildirin. Bu çok eğlenceliydi!


CLA iyi. Güzel cevap
Rɪᴋᴇʀ

0

Excel VBA, 489 Bayt

girintilendirilmedi:

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

(okunabilirlik için girintili)

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

Varsayılan Modül1 ila M
çağrısını yeniden adlandır h "+++++++++Your Code"
Bu, diğer ofis uygulamalarında da çalışarak ActiveWorkbook'u uygun doküman türüne değiştirir



Thats 636 Karakterler
Oliver Ni

Tüm boşlukları benim girinti alanımdan
çıkar

Sen tüm örneklerini dönüştürerek 3 bayt gevşek olabilir For n=1 Toiçin For n=1To(daha önce boşluk çıkarmadan Totüm örneklerini dönüştürerek ve 4 bayt) Debug.? 2;için Debug.?2;(sonra gelen boşlukları kaldırarak ?anahtar kelime)
Taylor Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.