एक HQ9 + दुभाषिया बनाना


31

इस कोड गोल्फ का लक्ष्य प्रोग्रामिंग भाषा HQ9 के लिए एक दुभाषिया बनाना है +
इस प्रोग्रामिंग भाषा में 4 कमांड हैं:

  • एच - प्रिंट "हैलो, दुनिया!"
  • 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 कैसे समझ में नहीं आता है?
माइक सी

मुझे लगता है कि यह बेहतर होगा कि इसे केवल अपरकेस का उपयोग करने की आवश्यकता है, बजाय मनमाने ढंग से कहने पर कि यदि आप इसे स्वीकार करते हैं तो आपको मुफ्त में 8 वर्ण मिलेंगे। 8 भाषा के आधार पर इसे कवर कर सकते हैं या नहीं कर सकते हैं।
माइक सी।

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

गणितज्ञ, 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"] &

बहुत ही प्रभावशाली लेकिन कुछ छोटी-मोटी झलकियाँ दिखाई देती हैं। '' ["क्यू"] आउटपुट "क्यू"। एच ["९"] काम करता है, लेकिन एच [९] पूरे कार्यक्रम का आउटपुट देता है (मुझे समझ में नहीं आता।)
डेविड १

@DavidCarraher यह StringMatchQ के कारण कोड आउटपुट करता है और यदि विफल रहता है:If[StringMatchQ[3, "a"], x, y]
ssch

6

सी, 599 587 487 481 467 अक्षर

मुझे यकीन है कि यह पीटा जा सकता है। मैं आखिरकार सी का इस्तेमाल कर रहा हूं। ऐसा कारण है कि आप सी में लिखी गई गोल्फ प्रविष्टियों को बहुत अधिक नहीं देखते हैं। यह अब 467 अक्षरों का आपराधिक दुरुपयोग है #define

HQ9 + स्रोत फ़ाइल को कमांड लाइन तर्क के रूप में निर्दिष्ट करें।

EDIT: अब स्रोत को फ़ाइल से नहीं, बल्कि स्टड से स्वीकार करता है। प्रोग्राम शुरू करें, कोड लिखना शुरू करें 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 वर्णों तक ले जाएं।
माइक सी।

# 4fine का दुरुपयोग करके उस 464 बनाओ।
माइक सी

आप रिक्त स्थान से छुटकारा पा सकते हैं, जैसे Cपहले और एक जोड़े के बाद R;p[s++]=0;मुद्रण को आसान बनाने के लिए इनपुट लूप के बाद 8 वर्णों से दाढ़ी बना सकते हैं p
डैनियल लुबरोव

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। यह पहले से ही दोषपूर्ण था, लेकिन फिर मैंने एक बग की खोज की, जिसे ठीक करने के लिए मुझे एक बाइट की कीमत चुकानी पड़ी। Bleh।

(मैं +आउटपुट में शामिल नहीं था । उदाहरण के लिए, आउटपुट दिया गया Qइनपुट ।)Q+++Q

अवैध इनपुट पर बाहर नहीं आने से कुछ पात्रों को बचाया जैसे मैंने सोचा था कि आप करने वाले थे।

शीघ्र ही आने वाले संस्करण की व्याख्या की।मैंने हार मान लिया। मुझे बमुश्किल यह भी समझ में आता है कि कैसे यह राक्षसी किसी और काम करती है। अगर कोई मांग करता है तो मैं इसे एक और जाने दूंगा लेकिन तब तक ऐसा नहीं हो रहा है।


आप exitअमान्य वर्ण पर नहीं हैं , बस संदेश प्रदर्शित करते हैं, इसलिए आप वहां 7 वर्ण सहेज सकते हैं।
काइल कानोस

@KyleKanos ओह, मैं गलत समझा है कि। धन्यवाद!
अंडरग्राउंडोरेल

आपके गीत सही नहीं हैं- वर्तमान में यह कहता है: 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall. यह कहना चाहिए: 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *98* bottles of beer on the wall.
ओलिवर नी

प्रवेश करने पर यह एक त्रुटि भी देता है +। आपको नजरअंदाज करना चाहिए +, एक त्रुटि नहीं देना चाहिए
ओलिवर नी

इसके अलावा आउटपुट के बीच कुछ भी नहीं माना जाता है। जैसे अगर मैं प्रवेश HQHHकरता हूं तो कहना चाहिएHello World!HQHHHelloWorld!Hello World!
ओलिवर नी

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

रूबी, 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...
ओलिवर नी

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.
ओलिवर नी

@ ओलिवर प्रश्न गीत के सटीक गीत को निर्दिष्ट नहीं करता है। किसी भी स्थान पर इसे शामिल करने के लिए "कोई और अधिक" अनुभाग की आवश्यकता नहीं होती है।
दरवाज़े

ठीक है, लेकिन यह भी, वहाँ outputs के बीच एक नई रेखा नहीं माना जाता है।
ओलिवर नी

@ ओलिवर चुनौती कहां से कहता है?
दरवाज़े

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 खेद है कि इसमें लंबा समय लगा :-) आप GHCi का ठीक से उपयोग नहीं कर रहे हैं। GHCi में आप अप्रत्यक्ष रूप से इनपुट परिभाषाओं को नहीं कर सकते क्योंकि यह अभिव्यक्ति की अपेक्षा करता है। आप या तो letपरिभाषाएँ सम्मिलित करने के लिए उपयोग कर सकते हैं (यह तब टूटता है जब कई परिभाषाएँ अलग नहीं की जाती हैं ;) या किसी फ़ाइल से कोड चलाएँ।
गर्वित हैकेलर

समझा। मैं अभी भी इसे चलाने की कोशिश में विफल रहता हूं; जब मैं फ़ाइल और कॉल लोड करता हूं main, तो यह कहता है कि जब मैं निष्पादित करने का प्रयास करता हूं तो स्रोत कोड में अमान्य वर्ण हैं H। जब मैं gइसके बजाय चलाने की कोशिश करता हूं main, तो यह तुरंत एक त्रुटि देता है।
ProgramFOX

@ProgramFOX mainकाम नहीं करता है क्योंकि नई लाइन में जोड़ा गया एक कानूनी आदेश नहीं है। इसलिए मैंने gइसके बजाय उपयोग करने की सिफारिश की है । के रूप में g, putStrLn $ g "H" ठीक से काम नहीं करता है?
गर्वित हैकेलर

2

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

और नहीं, मैं इसके लिए स्पष्टीकरण नहीं लिखूंगा। बहुत लंबा।
देखिए

ठहरो, यह क्यों ठुकराया गया है?
देखिए

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 और गैर-पूर्वनिर्मित दिखता है (शायद इसलिए कि आप देख सकते हैं कि क्या चल रहा है):

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++
प्रिमो

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 = 435 464 - 8 = 456

मैंने if-endइसके बजाय एकाधिक एस का उपयोग करके 21 वर्णों को बचाने में कामयाब रहा if-elseif-end। मेरे पास कुछ अतिरिक्त सफेद स्थान भी थे, कुछ के बाद तैरते हुए )

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

मैं इस एक के साथ काफी खुश हूँ, भले ही यह मेरे फोरट्रान जवाब से बहुत कम नहीं है । अल्सेन्ड्रो द्वारा इस उत्तर से 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'
ओलिवर नी

यह 8 चार्ट बचाता है
ओलिवर नी

@ मैकराडॉक्स: एर, वह पायथन है जिसके बारे में आप सोच रहे हैं, लुआ inहै इसके लिए लूप पुनरावृत्तियों के लिए और तुलना नहीं; यदि आप उस में छड़ी करते हैं तो आपको एक त्रुटि मिलेगी। यहां तीन विकल्प हैं: (1) matchप्रत्येक पंक्ति में उपयोग , (2) s=='h'or s=='H'प्रत्येक पंक्ति में उपयोगकर्ता , (3) इसे वैसे ही करें जैसे मैंने किया था। स्पष्ट रूप से (3) (1) और (2) से छोटा है।
काइल कानोस

1

जूलिया, 362

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

1

Tcl, 515

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

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

बस थोड़ा सा गोल्फ, अभी भी सी से छोटा और सही 99 बोतल बीयर अंत कविता।


ठीक है, अब वह कानूनी है। अच्छा काम है, तुमने मुझे हरा दिया। मुझे गोल्फ के लिए सी का उपयोग करना बंद कर देना चाहिए।
माइक सी

आप पहली पंक्ति को हटा सकते हैं और इसे अंतिम पैरामीटर पर एम्बेड कर सकते हैं regexp। आप कोडरगॉल्फ.स्टैकएक्सचेंज.com
a/

1

जावास्क्रिप्ट (ईएस 6), 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
ओलिवर नी

यदि आप कुछ और खरीदते हैं, तो अभी भी कैसे नहीं हो सकता है?
ओलिवर नी

और भी, Qमेरे लिए काम नहीं करता है।
ओलिवर नी

@ ऑलिवर ने आपको इस पर टिप्पणी करने की सूचना नहीं दी थी ... मैं पूरी तरह से गलत समझा गया Qथा जब कि उस समय को माना जाता था और इनपुट के बजाय फ़ंक्शन का स्रोत कोड प्रदान किया गया था ... मूल रूप से ऐसा करने का मेरा कारण था जेएस में, यह हिस्सा आसान होगा, लेकिन अब मुझे पता है कि ऐसा बिल्कुल नहीं है!
डोम हेस्टिंग्स

@ ओलिवर ने बोल अपडेट किए!
डोम हेस्टिंग्स

1

सी, 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 + प्रोग्राम है। एक वास्तविक संचायक के साथ। मैंने परिभाषित बयानों का उपयोग न करने के लिए खुद को इनवाइट किया।

Ungolfed संस्करण:

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 बोतल" जावा उत्तर (रचनात्मक कॉमन्स) से "उधार"

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

मुझे बताएं कि क्या कमांड लाइन आर्गन्स स्वीकार्य नहीं है। इसमें बड़ा मज़ा आया!


सीएलए ठीक हैं। अच्छा जवाब।
R

0

एक्सेल 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

डिफ़ॉल्ट मॉड्यूल 1 से एम
कॉल को पुनर्नामित करें h "+++++++++Your Code"
यह अन्य कार्यालय अनुप्रयोगों पर भी काम करेगा, सक्रिय दस्तावेज़ को उपयुक्त दस्तावेज़ प्रकार में बदल रहा है


ध्यान दें कि एक्सेल रिक्त स्थान जोड़ देगा, और संक्षिप्त रूप में विस्तार करेगा, इसलिए एक्सेल के भीतर, कोड 531 वर्ण है
SeanC

Thats 636 वर्ण
ओलिवर नी

मेरे इंडेंटेशन से सभी व्हाट्सएप को हटाएं, @oliver
SeanC

आप के सभी उदाहरणों में कनवर्ट करके 3 बाइट्स ढीला कर सकते हैं For n=1 Toकरने के लिए For n=1To(से पहले सफेद स्थान को निकाल Toके सभी उदाहरणों में कनवर्ट करके और 4 बाइट्स) Debug.? 2;के लिए Debug.?2;(के बाद सफेद स्थान को निकाल ?कीवर्ड)
टेलर स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.