Creazione di un interprete HQ9 +


31

L'obiettivo di questo codice golf è quello di creare un interprete per il linguaggio di programmazione HQ9 +
Ci sono 4 comandi in questo linguaggio di programmazione:

  • H - stampa "Ciao, mondo!"
  • Q - stampa il codice sorgente del programma
  • 9 - stampa il testo della canzone "99 bottiglie di birra"
  • + - aumenta l'accumulatore

Le regole:

  1. Poiché l'accumulatore non è definito, è possibile ignorare il comando +
  2. Il programma dovrebbe richiedere l'input (questo input sarà il codice sorgente) o il codice sorgente verrà letto da un file
  3. Non è consentito inserire il testo di "99 bottiglie di birra" in un file e leggere il testo dal file
  4. Non è consentito utilizzare un algoritmo di compressione come GZip o BZip per comprimere il testo del brano: è necessario creare il proprio algoritmo di compressione. Questo non deve essere un algoritmo complesso, ma cerca di comprimere il testo il più possibile (ricorda: questo è un codice-golf, vince il codice con il minor numero di byte)
  5. Se il codice sorgente contiene un carattere che non è H , Q , 9 o + , quindi emettere "Il codice sorgente contiene caratteri non validi" prima di eseguire qualsiasi comando! Ciò significa che, se il codice sorgente è H1ad esempio, non emettere Hello, world!prima dell'output Source code contains invalid characters. No, emesso immediatamenteSource code contains invalid characters
  6. Se il tuo interprete accetta caratteri sia maiuscoli che minuscoli, otterrai -8 al conteggio dei caratteri

In bocca al lupo!


3
La Regola 4 non ha senso al "perché dovrebbe proibirlo ?!" livello; la regola 5 non ha senso al "che cosa significa ?!" livello.
Peter Taylor,

4
In che modo la regola 5 non ha senso?
Mike C,

Penso che sarebbe meglio richiedere solo che usi solo lettere maiuscole, piuttosto che dire arbitrariamente che si ottengono 8 caratteri gratuiti se accetta entrambi. 8 può o meno coprirlo a seconda della lingua.
Mike C,

10
La Regola 5 non ha senso perché infrange le specifiche HQ9 +.
stand dal

2
Un interprete in HQ9 + dovrebbe vincere automaticamente.
TheNumberOne

Risposte:


16

APL (Dyalog) (326-8 = 318)

Incollalo in una finestra dell'editor e chiama H. L'input viene preso dalla tastiera.

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 caratteri

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

Molto impressionante, ma sembrano esserci alcuni gliches minori. L'h ["Q"] genera "Q". h ["9"] funziona, ma h [9] visualizza l'intero programma (non capisco come.)
DavidC

@DavidCarraher Emette il codice a causa di come StringMatchQ e If non riescono:If[StringMatchQ[3, "a"], x, y]
ssch

6

C, 599 587 487 481 467 caratteri

Sono sicuro che questo può essere battuto. Sto usando C dopo tutto. C'è una ragione per cui non vedi molte voci di golf vincenti scritte in C. Questo è ora 467 caratteri grazie all'abuso criminale di #define.

Specificare il file sorgente HQ9 + come argomento della riga di comando.

EDIT: ora accetta l'origine da stdin, non un file. Avvia il programma, inizia a digitare il codice, CTRL- Cquando hai finito di eseguirlo.

Si compila almeno in MinGW / GCC con: gcc -o hq9+.exe hq9+.c

Dovrebbe funzionare in MSVC, ma non mi andava di creare un'intera soluzione solo per questo. :)

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

O:

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

Sono arrivato a 487 caratteri usando stdin invece di un file per l'input.
Mike C,

Crea quello 464 abusando di #define.
Mike C,

Potresti liberarti degli spazi, come quelli dopo Ce un paio prima R;. Potrebbe anche radere 8 caratteri con p[s++]=0;dopo il ciclo di input per semplificare la stampa 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. Era già bleh, ma poi ho scoperto un bug che mi è costato un byte da correggere. Bleh.

(Prima non includevo +l'output per Q. Un input di ha Q+++dato l'output Q, ad esempio.)

Hai salvato alcuni personaggi non uscendo da input non validi come pensavo dovessi.

Versione spiegata in arrivo.Ho mollato. Capisco a malapena come funziona più questa mostruosità. Se c'è richiesta, ci proverò ancora, ma fino ad allora non sta succedendo.


Non si utilizza exitil carattere non valido, basta visualizzare il messaggio, quindi è possibile salvare 7 caratteri lì.
Kyle Kanos,

@KyleKanos Oh, l'ho capito male. Grazie!
undergroundmonorail,

I tuoi testi non sono corretti, attualmente dice: 99 bottles of beer on the wall, 99 bottles of beer. Take one down, pass it around, *99* bottles of beer on the wall. Dovrebbe dire: 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

Dà anche un errore quando entro +. Dovresti ignorare + , non dare un errore
Oliver Ni

Inoltre non dovrebbe esserci nulla tra le uscite. Come se entrassi HQHH, dovrebbe direHello 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}

Allargato:

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

Rubino, 364 360 - 8 = 352

Ha ancora molto margine di miglioramento. 99 bottiglie rubate da qui .

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

Dovrebbe esserci No more bottles of beer on the walldopo la 1 bottlesezione. allora èGo to the store...
Oliver Ni il

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 La domanda non specifica il testo esatto della canzone. In nessun luogo è necessario includere la sezione "non più".
Maniglia della porta

Ok, ma non dovrebbe esserci una nuova riga tra le uscite.
Oliver Ni

@Oliver Dove lo dice la sfida?
Maniglia della porta

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

questo è abbastanza semplice. %restituisce l'output di un comando (dato il codice sorgente da usare su Q). drestituisce la canzone delle 99 bottiglie con una linea spazzatura all'inizio per motivi di golf. tutto è racchiuso in un'interazione (potresti voler usare ginvece che maindurante il test)


Come dovrei eseguirlo? Ho provato a incollarlo in WinGHCi, ma ho capito <interactive>:8:5: parse error on input ‘=’.
Programma FOX il

@ProgramFOX non ne ho idea ... Ill controllo quando posso
orgoglioso haskeller

@ProgramFOX mi dispiace che ci sia voluto molto :-). non stai usando GHCi correttamente. in GHCi non è possibile inserire in modo irriverente le definizioni poiché si aspettano espressioni. è possibile utilizzare a letper inserire definizioni (ciò si interrompe quando si inseriscono più definizioni non separate da ;) o eseguire il codice da un file.
orgoglioso haskeller il

Vedo. Tuttavia, non riesco ancora a provarlo; quando carico il file e chiamo main, dice che il codice sorgente contiene caratteri non validi quando provo ad eseguire H. Quando provo a eseguire ginvece di main, dà immediatamente un errore.
Programma FOX il

@ProgramFOX mainnon funziona perché la nuova riga aggiunta non è un comando legale. Ecco perché ho raccomandato di utilizzare ginvece. Per quanto riguarda g, putStrLn $ g "H" non funziona correttamente?
orgoglioso haskeller il

2

J - 444 byte

Mi è piaciuto il numero, quindi ho smesso di giocare a golf. Ecco qui, funzione di singola espressione!

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

Esempi:

   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

E no, non scriverò una spiegazione per questo. Troppo lungo.
Seequ,

Aspetta, perché questo è downvoted?
Seequ,

2

Fortran 528 470 481

Richiede la compilazione con -fppflag (+3 per segnare) 1 per usare le direttive di preelaborazione (che consente di risparmiare più di 3 caratteri, quindi sono del tutto a posto). Non fa distinzione tra maiuscole e minuscole, quindi c'è -8: D. Hai salvato 5 caratteri non preelaborando il modo endifin cui viene utilizzato una volta comunque .

Richiede che il file abbia .F90un'estensione (ha senso chiamarlo hq9+.F90) in modo che il compilatore imponga la preelaborazione. Il codice fa distinzione tra maiuscole e minuscole; renderlo senza distinzione tra maiuscole e minuscole aggiunge qualcosa come 16 caratteri, quindi non vale davvero la pena salvare 8 caratteri. La mia risposta precedente non spiegava i cambiamenti plurali in bottlesper 9; questa versione lo corregge (e purtroppo aggiunge molti più personaggi).

#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

Sembra molto meglio ungolfed e non preelaborato (probabilmente perché puoi vedere cosa sta succedendo):

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

Penso che sia accettabile richiedere un'estensione specifica per far sapere al compilatore cosa sta compilando. Un analogo potrebbe richiedere un nome C ++ .ccper evitare di aver bisogno del -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

1

Lua 443-8 = 435 464-8 = 456

Sono riuscito a salvare 21 caratteri usando più if-ends invece di if-elseif-end. Avevo anche degli spazi bianchi extra che galleggiavano dopo alcuni ).

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

Sono abbastanza contento di questo, anche se non è molto più breve della mia risposta Fortran . Le 99 bottiglie di codice birra sono state modificate da questa risposta di Alessandro . Ungolfed, abbiamo

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

Il codice per minuscole l'input costa 12 caratteri, quindi il bonus non ne vale la pena.
nyuszika7h,

Non è necessario minuscoli gli input, puoi semplicemente fare qualcosa del genereif s in'Hh'
Oliver Ni

Salva 8 caratteri
Oliver Ni

@MCParadox: Ehm, è Python che stai pensando, Lua inè per gli iteratori for-loop e non per i confronti; riceverai un errore se lo attacchi lì. Ci sono tre opzioni qui: (1) usa matchsu ogni linea, (2) utente s=='h'or s=='H'su ogni linea, (3) fallo come ho fatto io. Chiaramente (3) è più corto di (1) e (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

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

Solo un po 'golfato, ancora più piccolo di C e le 99 bottiglie corrette di birra finiscono verso.


Bene, ora quello è legittimo. Ottimo lavoro, mi hai battuto. Dovrei smettere di usare C per il golf.
Mike C,

È possibile rimuovere la prima riga e incorporarla nell'ultimo parametro di regexp. Puoi giocare a golf con 99 birre su 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``}

Non optare per la distinzione tra maiuscole e minuscole, sarebbe costato troppi personaggi. Nemmeno vicino ad alcune delle altre voci, ma è stato comunque divertente!

JavaScript, 344

Ho realizzato una versione con una versione meno completa della canzone:

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

ma dopo aver visto le altre voci (e aver visto il testo reale, chi lo sapeva!), ho pensato che fosse un po 'un poliziotto!


Dovrebbe essere Go to the store, buy some more, *99* bottles of beer on the wall, non*No more* bottles of beer on the wall
Oliver Ni

Se acquisti un po 'di più, come può non essercene più?
Oliver Ni

E inoltre, Qnon funziona per me.
Oliver Ni

@Oliver non si è accorto del tuo commento su questo ... Allora ho capito male quando il tempo Qavrebbe dovuto farlo e ho fornito il codice sorgente della funzione invece dell'input ... Questo era originariamente il mio motivo per farlo in JS, quella parte sarebbe facile, tuttavia ora so che non è affatto necessario!
Dom Hastings,

@Oliver ha aggiornato il testo!
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]:""));}}

Come un programma completo. Il primo argomento è il programma HQ9 +. Con un vero accumulatore. Mi sono sfidato a non usare dichiarazioni di definizione.

Versione non golfata:

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 byte

Questa è la mia prima presentazione di golf in codice. Sono sicuro che potremmo farne di più. Legge l'input come argomento della riga di comando. Codice birra "preso in prestito" dalla risposta java "99 Bottiglie di birra" (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);}}}

Fammi sapere se la riga di comando args non è accettabile. È stato molto divertente!


CLA stanno bene. Bella risposta.
Rɪᴋᴇʀ

0

Excel VBA, 489 byte

Unindented:

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

(rientrato per leggibilità)

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

Rinomina la chiamata predefinita da Module1 a M
con h "+++++++++Your Code"
Ciò funzionerà anche su altre applicazioni d'ufficio, cambiando ActiveWorkbook con il tipo di documento appropriato


nota che Excel aggiungerà spazi ed espanderà le abbreviazioni, quindi all'interno di Excel il codice è 531 caratteri
SeanC

Quello è 636 personaggi
Oliver Ni

Rimuovi tutto lo spazio bianco dal mio rientro, @oliver
SeanC

Si può perdere 3 byte convertendo tutte le istanze di For n=1 Toa For n=1To(rimuovendo gli spazi bianchi prima To) e 4 byte convertendo tutte le istanze di Debug.? 2;a Debug.?2;(rimuovendo gli spazi bianchi dopo la ?parola chiave)
Taylor Scott
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.