HQ9 + 인터프리터 만들기


31

이 코드 골프의 목표는 프로그래밍 언어 HQ9 +에 대한 인터프리터를 만드는 것입니다.이 프로그래밍 언어
에는 4 가지 명령이 있습니다.

  • H- "Hello, world!"를 인쇄합니다.
  • Q- 프로그램의 소스 코드를 인쇄합니다
  • 9- 노래 "99 병 맥주" 의 가사를 인쇄합니다
  • + -누산기 증가

규칙:

  1. 누산기가 정의되어 있지 않으므로 +
  2. 프로그램은 입력을 요구하거나 (이 입력은 소스 코드가됩니다) 소스 코드는 파일에서 읽습니다.
  3. 당신은 파일에 "99 병의 맥주"의 가사를 넣고 파일에서 텍스트를 읽을 수 없습니다
  4. 노래 텍스트를 압축하기 위해 GZip 또는 BZip과 같은 압축 알고리즘을 사용할 수 없습니다. 자체 압축 알고리즘을 만들어야합니다. 복잡한 알고리즘 일 필요는 없지만 가능한 많이 텍스트를 압축하십시오 (이것은 코드 골프이고 가장 적은 바이트를 가진 코드가 승리 함을 기억하십시오)
  5. 소스 코드에 H , Q , 9 또는 + 가 아닌 문자가 포함되어 있으면 명령을 실행하기 전에 "소스 코드에 유효하지 않은 문자가 포함되어 있습니다"가 출력됩니다 ! 이는 소스 코드가 H1예를 들어 출력 Hello, world!하기 전에 출력하지 않는 것을 의미합니다 Source code contains invalid characters. 아니요, 즉시 출력Source code contains invalid characters
  6. 인터프리터가 대문자와 소문자를 모두 허용하면 문자 수에 -8 을 얻습니다.

행운을 빕니다!


3
규칙 4는 "왜 그가 그것을 금지 할까?" 수평; 규칙 5는 "무엇을 의미합니까?"에 의미가 없습니다. 수평.
피터 테일러

4
규칙 5는 어떻게 이해가되지 않습니까?
Mike C

나는 단지 8자를 자유롭게 사용할 수 있다고 임의로 말하는 것보다는 대문자 만 사용하는 것이 낫다고 생각합니다. 8은 언어에 따라 다를 수 있습니다.
Mike C

10
규칙 5는 HQ9 + 사양을 위반하므로 의미가 없습니다.
boothby

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, 349346 341 자

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[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 자로 줄였습니다.
Mike C

#define을 남용하여 464를 만드십시오.
Mike C

당신은 후에 것과 같은 공백을 제거 할 수 C및 전에 부부 R;. 또한 p[s++]=0;입력 루프 후 8 개의 문자를 제거 하여 인쇄를 단순화 할 수 있습니다 p.
Daniel Lubarov

3

파이썬 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]

블리. 그것은 이미 bleh 였지만, 수정해야 할 바이트가있는 버그를 발견했습니다. 블리.

(나는 +출력에 포함하지 않았다 Q. 예를 들어 입력은 Q+++출력 을 주었다 Q.)

내가 생각했던 것처럼 잘못된 입력으로 종료하지 않고 일부 문자를 저장했습니다.

설명 된 버전이 곧 나옵니다.나는 포기 했어. 나는이 괴물이 더 이상 어떻게 작동하는지 거의 이해하지 못합니다. 수요가 있다면 다시 한 번 줄 것이지만 그때까지는 일어나지 않을 것입니다.


당신은 exit유효하지 않은 문자에 있지 않고 단지 메시지를 표시하기 때문에 7 문자를 저장할 수 있습니다.
Kyle Kanos

@KyleKanos 오, 나는 그것을 오해했다. 감사!
undergroundmonorail

당신의 가사는 현재 정확하지 않습니다 : 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.
Oliver Ni

또한 입력 할 때 오류가 발생합니다 +. +
Oliver Ni

또한 출력 사이에 아무것도 없어야합니다. 내가 들어가면 마치 HQHH말해야합니다Hello World!HQHHHelloWorld!Hello World!
Oliver Ni

3

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

루비, 364360-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...
올리버 니켈

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이 질문은 노래의 정확한 가사를 지정하지 않습니다. "더 이상"섹션을 포함 할 필요는 없습니다.
Doorknob

또한 출력 사이에 줄 바꿈이 없어야합니다.
Oliver Ni

@Oliver 도전은 어디에서 말하는가?
Doorknob

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

이것은 매우 간단합니다. %명령의 출력을 반환합니다 (에 소스 코드를 제공함 Q). d골프를 시작할 때 정크 라인이 들어간 99 병 노래를 반환합니다. 모든 것이 상호 작용에 싸여 있습니다 ( 테스트 할 때 g대신 사용하고 싶을 수도 있습니다 main)


어떻게 실행해야합니까? WinGHCi에 붙여 넣기를 시도했지만을 얻습니다 <interactive>:8:5: parse error on input ‘=’.
ProgramFOX

@ProgramFOX 나는 모른다 ... 내가 할 수있을 때 내가 확인
자랑스럽게 haskeller

@ProgramFOX 죄송합니다. 시간이 오래 걸렸습니다 :-). GHCi를 올바르게 사용하고 있지 않습니다. GHCi에서는 표현식을 기대할 때 정의를 정확하게 입력 할 수 없습니다. 를 사용하여 let정의를 삽입 ;하거나 (로 구분되지 않은 여러 정의를 삽입 할 때 중단됨 ) 파일에서 코드를 실행할 수 있습니다.
자부심을 가진 haskeller

내가 참조. 나는 여전히 그것을 실행하려고하는데 실패합니다. 파일을로드하고 호출 main하면 실행하려고 할 때 소스 코드에 잘못된 문자가 포함되어 있습니다 H. g대신 실행하려고 main하면 즉시 오류가 발생합니다.
ProgramFOX

main추가 된 줄 바꿈이 올바른 명령이 아니므로 @ProgramFOX 가 작동하지 않습니다. 그래서 g대신 사용 하는 것이 좋습니다 . 에 관해서는 g, 않습니다 putStrLn $ 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

잠깐, 왜 이것이 다운 보트입니까?
seequ

2

(528) 포트란 (470) (481)

사전 처리 지시문을 사용 하려면 -fpp플래그 (점수 +3) 1 로 컴파일해야합니다 ( 3 자 이상을 절약하므로 완전히 괜찮습니다). 대소 문자를 구분하지 않으므로 -8 : D가 있습니다. 어쨌든 한 번 사용 된대로 전처리하지 않음으로써 5 개의 문자를 절약 endif했습니다 .

컴파일러가 전처리를 강제로 수행하도록 파일에 .F90확장자 가 있어야합니다 (이를 호출하는 것이 좋습니다 hq9+.F90). 코드는 대소 문자를 구분합니다. 대소 문자를 구분하지 않으면 16자를 추가 할 수 있으므로 8자를 절약 할 가치가 없습니다. 나의 이전의 대답은에 bottles대한 복수의 변화를 설명하지 않았다 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

ungolfed & non-preprocessed 훨씬 나아 보입니다 (아마도 무슨 일이 일어나고 있는지 볼 수 있기 때문에).

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가 필요하지 않도록 아날로그에 C ++ 파일의 이름 을 지정해야 할 수도 있습니다 -lstdc++.
primo

2

파이썬 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

루아 443-8 = 435464-8-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 문자 절약
Oliver Ni

@MCParadox : Er, 그것은 당신이 생각하는 Python입니다. Lua in는 for-loop 반복자를위한 것이며 비교는 아닙니다. 거기에 넣으면 오류가 발생합니다. 여기에는 세 가지 선택이 있습니다. (1) match각 라인에서 사용 , (2) s=='h'or s=='H'각 라인에서 사용자 , (3) 내가 한 방식으로 수행합니다. 분명히 (3)은 (1)과 (2)보다 짧습니다.
Kyle Kanos

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 사용을 중단해야합니다.
Mike C

첫 번째 줄을 제거하고의 마지막 매개 변수에 포함시킬 수 있습니다 regexp. codegolf.stackexchange.com/a/109818/29325
sergiol

1

자바 스크립트 (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``}

대소 문자를 구분하지 않으면 너무 많은 문자가 필요합니다. 다른 출품작들과도 가깝지는 않지만 그럼에도 불구하고 재미있었습니다!

자바 스크립트, 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
올리버 니켈

더 구입하면 어떻게 더 이상 없을 수 있습니까?
Oliver Ni

또한 Q나를 위해 작동하지 않습니다.
Oliver Ni

@Oliver는 그때 당신이 이것에 대해 언급하지 않았다 ... 나는 Q그 시간을 할 것으로 예상 되었을 때 완전히 오해 하고 입력 대신 함수의 소스 코드를 제공했다. JS에서는 그 부분이 쉬울 것이지만, 이제는 그것이 전혀 필요하지 않다는 것을 알고 있습니다!
Dom Hastings

@Oliver가 가사를 업데이트했습니다!
Dom Hastings

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 + 프로그램입니다. 실제 누산기와 함께. 나는 define 문을 사용하지 말라고 스스로를 속였다.

언 골프 버전 :

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

자바, 546 바이트

이것은 첫 번째 코드 골프 제출입니다. 우리가 더 많은 것을 할 수 있다고 확신합니다. 입력을 명령 행 인수로 읽습니다. "99 Bottles of Beer" 에서 "차입 된"맥주 코드 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

기본 모듈 1M
통화로 이름 바꾸기이 기능h "+++++++++Your Code"
은 다른 사무실 응용 프로그램에서도 작동하며 ActiveWorkbook 을 적절한 문서 유형으로 변경 합니다.


Excel은 공백을 추가하고 약어를 확장하므로 Excel 내에서 코드는 531 자입니다.
SeanC


들여 쓰기에서 공백을 모두 제거합니다. @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.