Створення інтерпретатора 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 не має сенсу?
Майк C

Я думаю, що було б краще просто вимагати, щоб він використовував лише великі регістри, а не довільно казати, що ви отримуєте вільні 8 символів, якщо він приймає будь-який. 8 може або не може охоплювати його залежно від мови.
Майк C

10
Правило 5 не має сенсу, оскільки воно порушує специфікацію HQ9 +.
виставка

2
Перекладач у HQ9 + повинен автоматично перемагати.
TheNumberOne

Відповіді:


16

APL (Діалог) (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"] &

Дуже вражаюче, але, мабуть, є деякі незначні гліки.'h ["Q"] виводить "Q". h ["9"] працює, але h [9] видає всю програму (не розумію як.)
DavidC

@DavidCarraher Він виводить код через те, як StringMatchQ і If виходить з ладу:If[StringMatchQ[3, "a"], x, y]
ssch

6

C, 599 587 487 481 467 символів

Я впевнений, що це можна побити. Зрештою, я використовую C. Є причина, що ви не бачите багато виграшних записів про гольф, написаних на C. Це зараз 467 символів завдяки злочинному зловживанню #define.

Вкажіть вихідний файл HQ9 + як аргумент командного рядка.

EDIT: Тепер приймається джерело зі 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 замість файлу для введення.
Майк C

Зробіть це 464, зловживаючи #define.
Майк C

Ви могли позбутися просторів, як і після, Cі пару раніше R;. Можна також відбрити 8 символів p[s++]=0;після циклу введення для спрощення друку p.
Даніель Любаров

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, але потім я виявив помилку, яка коштувала мені байта, щоб виправити. 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.
Олівер Ні

@Oliver Питання не визначає точну лірику пісні. Ні в якому разі не потрібно включати розділ «не більше».
Дверна ручка

Добре, але також не повинно бути нового рядка між результатами.
Олівер Ні

@Oliver Де виклик говорить про це?
Дверна ручка

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 ви не можете помилково вводити визначення, оскільки він очікує виразів. ви можете використовувати a 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

Фортран 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

Виглядає набагато краще неперероблений та неперероблений (можливо, тому, що ви можете бачити, що відбувається):

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++прапора.
примо

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

Мені вдалося зберегти 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'
Олівер Ні,

Це економить 8 годин
Олівер Ні

@MCParadox: Ер, це Python, про який ви думаєте, Lua 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 пляшок пивного кінця вірша.


Гаразд, тепер цей законний. Гарна робота, ти мене побив. Я повинен перестати використовувати C для гольфу.
Майк 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
Олівер Ні

Якщо ви купуєте ще трохи, як все ще не може бути більше?
Олівер Ні

А також Qне працює для мене.
Олівер Ні

@Oliver тоді не помітив, що ти коментуєш це ... Я абсолютно не зрозумів, коли Qповинен був це робити час і надав вихідний код функції замість введення ... Це спочатку було моєю причиною цього робити. в JS ця частина була б легкою, однак тепер я знаю, що зовсім не те, що потрібно!
Дом Гастінгс

@Oliver оновив текст пісні!
Дом Гастінгс

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 +. З фактичним акумулятором. Я спровокував себе не використовувати оператори визначення.

Безгольова версія:

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 байт

Це моє перше подання коду для гольфу. Я впевнений, що ми могли б зробити більше з цим. Він читає вхід як аргумент командного рядка. Код пива, "запозичений" у відповіді java "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);}}}

Повідомте мене, якщо аргументи командного рядка неприйнятні. Це було дуже весело!


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
символу

Thats 636 Персонажі
Олівер Ні

Видаліть усі пробіли з мого відступу, @oliver
SeanC

Ви можете втратити 3 байти, перетворивши всі екземпляри For n=1 Toдо For n=1To(видаляючи пробіли раніше To) і 4 байти, перетворивши всі екземпляри Debug.? 2;на Debug.?2;(видалення пробілів за ?ключовим словом)
Тейлор Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.