การสร้างล่าม 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 ไม่สมเหตุสมผลที่ "เขาหมายถึงอะไร! ชั้น
Peter Taylor

4
กฎ 5 ไม่สมเหตุสมผลอย่างไร
Mike C

ฉันคิดว่ามันจะดีกว่าถ้าต้องการเพียงใช้ตัวพิมพ์ใหญ่แทนที่จะเขียนโดยไม่ตั้งใจว่าคุณจะได้รับตัวอักษรฟรี 8 ตัวถ้ายอมรับเช่นกัน 8 อาจหรืออาจจะไม่ครอบคลุมมันขึ้นอยู่กับภาษา
Mike 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, 349 346 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"] &

น่าประทับใจมาก แต่ดูเหมือนจะมี gliches รองอยู่บ้าง '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++;}}}

รับได้ถึง 487 ตัวอักษรโดยใช้ stdin แทนไฟล์สำหรับการป้อนข้อมูล
Mike C

ทำ 464 นั้นด้วยการใช้ #define ในทางที่ผิด
Mike C

คุณอาจจะได้รับการกำจัดของพื้นที่เช่นคนหลังและทั้งคู่ก่อนC R;ยังอาจโกน 8 ตัวอักษรด้วยหลังจากที่วงป้อนข้อมูลเพื่อลดความซับซ้อนของการพิมพ์p[s++]=0; p
Daniel Lubarov

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]

bleh มันดูไม่น่าอยู่แล้ว แต่แล้วฉันก็ค้นพบข้อผิดพลาดที่ทำให้ฉันต้องเสียค่าไบต์ไปแก้ไข 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

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...
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 คำถามไม่ได้ระบุเนื้อเพลงที่แน่นอนของเพลง ไม่รวมอยู่ในที่ที่ไม่ต้องรวมส่วน "no more"
Doorknob

ตกลง แต่ยังไม่ควรมีการขึ้นบรรทัดใหม่ระหว่างเอาต์พุต
Oliver Ni

@Oliver ความท้าทายบอกว่าที่ไหน
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

ค่อนข้างตรงไปตรงมา %ส่งคืนเอาต์พุตของคำสั่ง (ให้ cod cod สำหรับใช้บน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

@ProgramFOX mainไม่ทำงานเนื่องจากการขึ้นบรรทัดใหม่ไม่ใช่คำสั่งทางกฎหมาย นั่นเป็นเหตุผลที่ฉันแนะนำให้ใช้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

Fortran 528 470 481

มันต้องการการคอมไพล์ด้วย-fppแฟล็ก (+3 ให้คะแนน) 1เพื่อใช้คำสั่ง preprocessing (ซึ่งช่วยประหยัดวิธีมากกว่า 3 ตัวอักษรดังนั้นฉันจึงไม่เป็นไร) มันเป็นแบบตายตัวดังนั้นขนาด -8: D บันทึก 5 ตัวอักษรโดยไม่ประมวลผลล่วงหน้าendifเป็นที่ใช้ครั้งเดียวแล้วล่ะค่ะ

ต้องใช้ไฟล์ที่จะมี.F90ส่วนขยาย (ทำให้รู้สึกที่จะเรียกมันhq9+.F90) เพื่อให้กองกำลังคอมไพเลอร์ประมวลผลก่อน รหัสเป็นกรณี ๆ ไป; การเพิ่มขนาดตัวอักษรให้ตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็กจึงไม่คุ้มกับการบันทึกตัวอักษร 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

ดูดีขึ้นมากและไม่ได้รับการประมวลผลล่วงหน้า (อาจเป็นเพราะคุณสามารถเห็นสิ่งที่เกิดขึ้น):

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

ฉันคิดว่าเป็นที่ยอมรับได้ที่จะต้องมีส่วนขยายเฉพาะเพื่อให้คอมไพเลอร์ทราบว่ากำลังรวบรวมอะไร อะนาล็อกอาจต้องการชื่อไฟล์ C ++ .ccเพื่อหลีกเลี่ยงการ-lstdc++ตั้งค่าสถานะ
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

ฉันจัดการเพื่อประหยัด 21 ตัวอักษรโดยใช้หลายif-ends 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 ขวดรหัสเบียร์ได้รับการแก้ไขจากคำตอบนี้โดยเลสซานโดร เราโชคร้ายที่มี

-- 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'
Oliver Ni

มันช่วยประหยัด 8 ตัวอักษร
Oliver Ni

@ MCParadox: เอ้อนั่นคือ Python ที่คุณคิดถึงLua inนั้นใช้สำหรับการวนซ้ำวนซ้ำไม่ใช่การเปรียบเทียบ คุณจะได้รับข้อผิดพลาดถ้าคุณติดที่นั่น มีสามตัวเลือกที่นี่: (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คุณสามารถลบบรรทัดแรกและฝังไว้ที่พารามิเตอร์สุดท้ายของ คุณสามารถเล่นกอล์ฟของฉันได้ 99 เบียร์บน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``}

ไม่ได้เลือกใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่จะมีค่าใช้จ่ายมากเกินไป ไม่ได้ใกล้เคียงกับรายการอื่น ๆ แต่ก็สนุกดี!

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

หากคุณซื้อเพิ่มอีกจะยังคงไม่มีอีกต่อไปได้อย่างไร
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

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

แจ้งให้เราทราบหาก args ของบรรทัดคำสั่งไม่เป็นที่ยอมรับ สนุกมากเลย!


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ด้วยh "+++++++++Your Code"
ซึ่งจะทำงานกับแอปพลิเคชั่นสำนักงานอื่น ๆ โดยเปลี่ยนActiveWorkbookเป็นประเภทเอกสารที่เหมาะสม


โปรดทราบว่า excel จะเพิ่มช่องว่างและขยายตัวย่อดังนั้นภายใน excel รหัสคือ 531 ตัวอักษร
SeanC

Thats 636 ตัวละคร
Oliver Ni

ลบช่องว่างทั้งหมดออกจากการเยื้องของฉัน @oliver
SeanC

คุณสามารถหลวม 3 ไบต์โดยการแปลงอินสแตนซ์ทั้งหมดของFor n=1 Toเป็นFor n=1To(ลบช่องว่างก่อนหน้าTo) และ 4 ไบต์โดยแปลงอินสแตนซ์ทั้งหมดของDebug.? 2;เป็นDebug.?2;(ลบช่องว่างหลัง?คำหลัก)
Taylor Scott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.