Código Golf Pontuação de golfe

22

É sexta-feira ... então vamos jogar golfe! Escreva um código que determine a pontuação do jogador em um buraco em uma partida de golfe. O código pode ser uma função ou um programa inteiro. Como o gênero sugere, o código mais curto vence.

Entrada (parâmetros ou stdin, sua escolha):

  • Um número inteiro representando o par do furo, com garantia entre 3 e 6
  • Um número inteiro representando a pontuação do jogador, garantido entre 1 e 64

Saída (impressão em stdout ou retorno, nova linha final permitida, mas não obrigatória, sua escolha):

  • se a pontuação for 1, digite "Hole in one"
  • se pontuação == par - 4 e par> 5, emita "Condor"
  • se pontuação == par - 3 e par> 4, produz "Albatroz"
  • se pontuação == par - 2 e par> 3, produza "Eagle"
  • se pontuação == par - 1, saída "Birdie"
  • se pontuação == par, gerar "Par"
  • se pontuação == par + 1, saída "Bogey"
  • se pontuação == par + 2, produz "Bogey duplo"
  • se pontuação == par + 3, produz "Bogey triplo"
  • se pontuação> par + 3, emita "Haha, seu perdedor"

EDIT Parabéns a Dennis por ter a resposta mais curta!

Josh
fonte
34
Eu sempre me perguntei o que era depois do truque triplo.
precisa saber é o seguinte
3
Aliás, o maior par é 7 não 6.
Joshua
4
@ Joshuaua Fiquei temporariamente confuso sobre o motivo pelo qual você comentou em vez de editar sua própria postagem. Então isso me atingiu. : P
Rɪᴋᴇʀ 04/0316
@RikerW os dois nomes de Josh são tão parecidos quanto sua reputação: D
cat
2
A entrada pode estar em qualquer ordem?
Maçaneta

Respostas:

6

Geléia , 61 bytes

_«4ị“Ƙḷ“&SẆ@ẓ“&T¡UQ“½⁽Ð'÷ṿɼ“½Œż“¡œM“v⁵“¥⁻c“£Ḋ⁶»
瓵ḣ⁻×⁵ñBƑ»’?

Experimente online!

fundo

Isso usa a compactação estática do dicionário de Jelly. Você pode encontrar um compressor aqui . Deste jeito,

“Ƙḷ“&SẆ@ẓ“&T¡UQ“½⁽Ð'÷ṿɼ“½Œż“¡œM“v⁵“¥⁻c“£Ḋ⁶»

e

“Bogey“Double Bogey“Triple Bogey“Haha you loser“Condor“Albatross“Eagle“Birdie“Par”

assim como

“µḣ⁻×⁵ñBƑ»

e

“Hole in one”

são equivalentes.

Como funciona

_«4ị“Ƙḷ“&SẆ@ẓ“&T¡UQ“½⁽Ð'÷ṿɼ“½Œż“¡œM“v⁵“¥⁻c“£Ḋ⁶»  Helper link. Arguments: score, par

_                                                Subtract the par from the score.
 «4                                              Cap the difference at 4.
   ị                                             Index into the list at the right.
    “Ƙḷ“&SẆ@ẓ“&T¡UQ“½⁽Ð'÷ṿɼ“½Œż“¡œM“v⁵“¥⁻c“£Ḋ⁶»  Yield a list of strings.


瓵ḣ⁻×⁵ñBƑ»’?  Main link. Arguments: score, pair

            ?  If...
           ’   the decremented score if non-zero:
ç                Call the helper link on both input arguments.
 “µḣ⁻×⁵ñBƑ»      Else, return “Hole in one”.
Dennis
fonte
Parabéns pela resposta mais curta!
21416 Josh
13

PHP 5.3+, 173 167 166 159 159 156 151 127 121 bytes

echo[Condor,Albatross,Eagle,Birdie,Par,$b=Bogey,"Double $b","Triple $b","Haha you loser"][min(4+$s-$p,8)]?:"Hole in one";
Versão sem aviso prévio, 139 137 bytes
echo$s-1?["Condor","Albatross","Eagle","Birdie","Par",$b="Bogey","Double $b","Triple $b","Haha you loser"][min(4+$s-$p,8)]:"Hole in one";

Defina $sas $pvariáveis core e ar antes do echoe você está fora.

vista expandida
echo [Condor,
      Albatross,
      Eagle,
      Birdie,
      Par,
      $b = Bogey,
      "Double $b",
      "Triple $b",
      "Haha you loser"][ min( 4+$s-$p,8 ) ]
  ?: "Hole in one";

Edições
-6: Não armazenando a matriz, apenas chamando, se necessário.
-1: Virando o ternário.
-7: O menor $s-$pcom $s>1é -4, então max()não é necessário, desde 4+$s-$p >= 0.
-3 Array -> explode() :, obrigado CoolestVeto!
-5: String Cheaty literal indefinida constante mais $r[-1] -> false, obrigado Ismael Miguel!
-24: Mudando de uma explode()função para a printf/ %ssetup, com alguns ajustes, mais graças a Ismael Miguel pela mudança de direção.
-6: Swerve , estamos de volta echo!

ricdesi
fonte
1
Você pode transformá-lo em uma string e dividir por um caractere arbitrário?
Addison Crump
@CoolestVeto Na verdade, eu posso. Estranhamente, ele economiza menos bytes do que o esperado, mas quaisquer bytes são melhores que nenhum bytes!
Ricdesi
1
Você pode substituir $b="Bogey";por $b=Bogey;para salvar 2 bytes. Além disso, substitua o seu $s-1? ... : ...;por um echo ... ?: ...;. Aqui está a versão longa, com 151 bytes:function g($s,$p){$b=Bogey;echo explode("-","Condor-Albatross-Eagle-Birdie-Par-$b-Double $b-Triple $b-Haha you loser")[min(4+$s-$p,8)]?:"Hole in one";}
Ismael Miguel
Não tinha idéia de que você poderia enganar literais de string, puro.
Ricdesi 04/03/16
1
Aqui está uma (possivelmente) de trabalho e mais curto: printf([Condor,Albatross,Eagle,Birdie,Par,'%s','Double %s','Triple %s','Haha you loser'][min(4+$argv[1]-$argv[2],8)]?:'Hole in one',Bogey);. Basicamente: Removida a declaração da função, removida explore, removida as aspas, usada uma matriz e usada $argv. O código final tem 139 bytes.
Ismael Miguel
10

05AB1E , 91 90 bytes

Código:

-5+U“¥Ê€†€µ“ª"0Bogey"ДCondor Albatross²è Birdie Par ÿ‹¶ÿ½¿ÿ”ð¡“Haha€î loser“X0¹1Qm*@0ð:ðÛ

Explicação:

Parte 1:

-5+                          # Computes Score - Par + 5
   U                         # Store in X
    “¥Ê€†€µ“ª                # Short for "Hole in one"
             "0Bogey"        # Push this string
                     Ð       # Triplicate

Parte 2:

”Condor Albatross²è Birdie Par ÿ‹¶ÿ½¿ÿ”ð¡

É o mesmo que "Condor Albatross Eagle Birdie Par 0Bogey Double0Bogey Triple0Bogey"usar compactação e interpolação de cadeias. Em seguida, dividimos os espaços usando ð¡.

Parte 3:

“Haha€î loser“                # Push "Haha you loser"
              X               # Push X
               0¹1Qm          # Compute 0 ^ (score == 1), this translates 1 to 0 and 
                                everything else to 1.
                    *         # Multiply the top two items
                     @        # Get the string from that position
                      0ð:     # Replace zeros with spaces
                         ðÛ   # Trim off leading spaces

Descobriu muitos bugs, usa a codificação CP-1252 .

Experimente online!

Adnan
fonte
...Uau. Bem feito.
cat
2
@tac Obrigado! :)
Adnan
Esse código parece com as mensagens aleatórias Unicode que você recebe quando instala um arquivo .exe que não é o inglês (se você tiver o inglês como idioma nas coisas do Windows). Parece espetacular!
Clismique 9/03/16
@DerpfacePython Haha, as mensagens unicode aleatórias são parcialmente parte do código e a outra parte faz parte de uma mensagem compactada.
Adnan
6

Vitsy, 131 bytes

D1-)["eno ni eloH"rZ;]r-5+D9/([X9]mZ
"rodnoC"
"ssortablA"
"elgaE"
"eidriB"
"raP"
"yegoB"
4m" elbuoD"
4m" elpirT"
"resol uoy ahaH"

Explicação:

D1-)["eno ni eloH"rZ;]r-5+D9/([X9]mZ
D1-)[                ]      If the second input is 1, do the bracketed stuff.
     "eno ni eloH"rZ;       Output "Hole in one" and quit.
r                           Reverse the stack.
 -                          Subtract the top two items.
  5+                        Add 5 to fix for negative values of score.
    D9/([  ]                If the result of that is greater than 8, do the stuff in brackets.
         X                  Remove the top item.
          9                 Push 9. This forces any items greater than 8 to be 9.
            m               Execute this number line.
             Z              Output everything in the stack.

Isso funciona descobrindo qual é a pontuação em relação ao par e, em seguida, executando diferentes linhas (e ganhando diferentes strings).

Experimente Online!

Modo verboso (para cocô e risadinhas):

duplicate top item;
push 1;
subtract top two;
if (int) top is not 0;
begin recursive area;
toggle double quote;
push 14;
eval(stack);
capture stack as object with next;
 ;
eval(stack);
push input item;
 ;
push 14;
push length of stack;
capture stack as object with next;
push all ints between second to top and top;
toggle double quote;
reverse stack;
output stack as chars;
generic exit;
end recursive area;
reverse stack;
subtract top two;
push 5;
add top two;
duplicate top item;
push 9;
divide top two;
if (int) top is 0;
begin recursive area;
remove top;
push 9;
end recursive area;
goto top method;
output stack as chars;
:toggle double quote;
reverse stack;
capture stack as object with next;
push 13;
eval(stack);
capture stack as object with next;
push cosine of top;
toggle double quote;
:toggle double quote;
push inverse sine of top;
push inverse sine of top;
capture stack as object with next;
reverse stack;
push inverse tangent of top;
push 10;
push 11;
push length of stack;
push inverse cosine of top;
toggle double quote;
:toggle double quote;
push 14;
push length of stack;
g;
push 10;
push e;
toggle double quote;
:toggle double quote;
push 14;
push input item;
push 13;
reverse stack;
push input item;
B;
toggle double quote;
:toggle double quote;
reverse stack;
push 10;
push pi;
toggle double quote;
:toggle double quote;
push number of stacks;
push 14;
g;
capture stack as object with next;
B;
toggle double quote;
:push 4;
goto top method;
toggle double quote;
 ;
push 14;
push length of stack;
push 11;
flatten top two stacks;
capture stack as object with next;
duplicate top item;
toggle double quote;
:push 4;
goto top method;
toggle double quote;
 ;
push 14;
push length of stack;
push whether (int) top item is prime;
push input item;
reverse stack;
push tangent of top;
toggle double quote;
;
;
:toggle double quote;
reverse stack;
push 14;
push inverse sine of top;
capture stack as object with next;
push length of stack;
 ;
flatten top two stacks;
capture stack as object with next;
push number of stacks;
 ;
push 10;
factorize top item;
push 10;
push all ints between second to top and top;
toggle double quote;
Addison Crump
fonte
"Push 9. Isso força todos os itens maiores que 8 a 9". Wat?
gato
@tac Isso é forçar a entrada que resultaria em "Haha, seu perdedor" para ir para a linha que contém "Haha, seu perdedor".
Addison Crump
5

JavaScript (ES6), 125 124 bytes

p=>s=>"Hole in one,Condor,Albatross,Eagle,Birdie,Par,Bogey,Double Bogey,Triple Bogey".split`,`[s-1&&s-p+5]||"Haha you loser"

Atribua a uma variável f=p=>s=>, por exemplo , em seguida, chame-a assim: f(6)(2)Par primeiro e depois marque.

Pode ser encurtado combinando os "Bogey"s.

ETHproductions
fonte
Um exemplo de combinação dos truques é: ",Double ,Triple ".split`,`[k-1]+"Bogey"onde k=s-p.
user48538
Posso usar sua abordagem na minha solução?
user48538
@ zyabin101 que não está desanimado, contanto que não é completamente plágio
cat
@ zyabin101 Obrigado, vou ver se isso diminui. E sim, sinta-se à vontade para usar essa abordagem em sua resposta.
ETHproductions
Eu já estou usando isso.
user48538
4

LittleLua - 160 bytes (não competitivo)

r()P=I B="Bogey"r()Z={"Hole in one","Condor","Albatross","Eagle","Birdie","Par",B,"Double "..B,"Triple "..B,"Haha, you loser"}p(I=='1'a Z[1]or Z[I-P+6]or Z[10])

Estou relativamente certo de que fiz isso certo.

Aceita dois números inteiros, par e pontuação do jogador.

A versão do Little Lua que eu usei para fazer isso foi carregada após o lançamento deste desafio, mas não foi editada posteriormente. É relativamente óbvio a partir do código que nada foi adicionado para simplificar esse desafio

LittleLua Info:

Quando estiver satisfeito com os recursos internos e a funcionalidade de Little Lua, a fonte estará disponível juntamente com uma infopage.

LittleLua V0.02

Skyl3r
fonte
2
Isso não é competitivo porque o arquivo foi carregado no Dropbox 2 horas após o lançamento do desafio.
Mego
2
github.com é muito melhor para o código de hospedagem ...
cat
Absolutamente, eu apenas não tive a chance de configurá-lo.
precisa saber é o seguinte
3

Mouse-2002 , 223 207 bytes

A remoção de comentários provavelmente ajudaria ...

??s:p:s.1=["Hole in one"]s.p.4-=p.5>["Condor"]s.p.3-=p.4>["Albatross"]s.p.2-=p.3>["Eagle"]s.p.1-=["Birdie"]s.p.=["Par"]s.p.1+=["Bogey"]s.p.2+=["Double Bogey"]s.p.2+=["Double Bogey"]s.p.3+>["Haha you loser"]$

Ungolfed:

? ? s: p:

s. 1 = [
  "Hole in one"
]

~ 1
s. p. 4 - = p. 5 > [
  "Condor"
]

~ 2
s. p. 3 - = p. 4 > [
  "Albatross"
]

~ 3
s. p. 2 - = p. 3 > [
  "Eagle"
]

~ 4
s. p. 1 - = [
  "Birdie"
]

~ 5
s. p. = [
  "Par"
]

~ 6
s. p. 1 + = [
  "Bogey"
]

~ 7
s. p. 2 + = [
  "Double Bogey"
]

~ 8
s. p. 2 + = [
  "Double Bogey"
]

s. p. 3 + > [
  "Haha you loser"
]


$
gato
fonte
2

bash, 150 136 bytes

b=Bogey
(($2<2))&&echo Hole in one||tail -$[$2-$1+5]<<<"Haha you loser
Triple $b
Double $b
$b
Par
Birdie
Eagle
Albatross
Condor"|head -1

Execução de teste:

llama@llama:...code/shell/ppcg74767golfgolf$ for x in {1..11}; do bash golfgolf.sh 6 $x; done                                                          
Hole in one
Condor
Albatross
Eagle
Birdie
Par
Bogey
Double Bogey
Triple Bogey
Haha you loser
Haha you loser

Agradecimentos a Dennis por 14 bytes!

Maçaneta da porta
fonte
1

Python 2, 186 179 158 bytes

def c(s,p):a="Bogey";print["Condor","Albatross","Eagle","Birdie","Par",a,"Double "+a,"Triple "+a,"Haha you loser","Hole in one"][([[s-p+4,8][s-p>3],9][s==1])]

EDIT 1: adicionada a caixa "hole in one" ausente ...

EDIT 2: extraiu alguns bytes (graças ao tac)

Máx.
fonte
1
Um lambda seria mais curto, veja também dicas para jogar golfe em Python #
cat cat
você pode deixar o espaço entre 4eelse
cat
1
Se você modificar o algoritmo, poderá indexar uma lista em vez de um dict
cat
você pode soltar o espaço entre printe {, e se você usar um ponto e vírgula para colocar o a=e printna mesma linha, você pode raspar um byte de espaço em branco
gato
1
@tac realmente "c = lambda x, y:" é mais do que "def c (x, y):" graças para as outras sugestões
Max
1

Haskell - 131 bytes (contando nova linha)

1%p="Hole in one"
s%p=lines"Condore\nAlbatros\nEagle\nBirdie\nPar\nBogey\nDouble Bogey\nTriple Bogey\nHaha you loser"!!min(4-p+s)8

linesé a única maneira em que posso pensar em jogar golfe em uma lista de strings que precisam conter espaços com acesso apenas para Preludeficar presos a delimitadores de dois caracteres.

Ainda assim, Haskell não costuma ser tão competitivo (pelo menos contra os idiomas gerais).

Steven Armstrong
fonte
Você pode importqualquer coisa que você gosta, não apenas os builtins
cat
1

Python 2.7, 226 bytes

p,s=input()
b="Bogey"
l={s==1:"Hole in one",5<p==s+4:"Condor",4<p==s+3:"Albatross",3<p==s+2:"Eagle",s==p-1:"Birdie",s==p:"Par",s==p+1:b,s==p+2:"Double "+b,s==p+3:"Triple "+b,s>p+3:"Haha you loser"}
for r in l:
 if r:print l[r]

Difícil de criar um código python curto quando você está atrasado para a festa, o melhor que eu conseguia pensar.

janrn
fonte
As duas últimas linhas devem ser alteradas para uma:[print r for r in l if r]
cat
1

C, 198 bytes

main(){char s=8,p=4,m[]="Hole in one.Condor.Albatross.Eagle.Birdie.Par.Bogey.Double Bogey.Triple Bogey.Haha you loser",*t,*x,i=0;for(x=m;t=strtok(x,".");x=0,i++)if((s-1?s-p>3?9:s-p+5:0)==i)puts(t);}
Johan du Toit
fonte
0

Japonês, 97 bytes

`Ho¤  e
CÆBr
AlßNoss
Eag¤
Bir¹e
P
zD½e zTp¤ zHa y lo r`rz"Bogey
" ·g9m´V©V-U+6

Contém vários não imprimíveis. Teste online!

Como funciona

`Ho¤  e\nCÆBr\nAlßNoss\nEag¤\nBir¹e\nP\nzD½e zTp¤ zHa y lo r`                        rz"Bogey\n" ·  g9m´ V© V-U+6
"Hole in one\nCondor\nAlbatross\nEagle\nBirdie\nPar\nzDouble zTriple zHaha you loser"rz"Bogey\n" qR g9m--V&&V-U+6

              // Implicit: U = par, V = score
"..."         // Take this long, compressed string.
rz"Bogey\n"   // Replace each instance of "z" with "Bogey\n".
qR            // Split at newlines.

--V&&V-U+6    // If V is 1, take 0; otherwise, take V-U+5.
9m            // Take the smaller of this and 9.
g             // Get the item at this index in the previous list of words.
              // Implicit output
ETHproductions
fonte
0

Python 2.7.2, 275 bytes

s=int(input())
p=int(input())
a="Bogey"
if s==1:b="Hole in one"
elif p-4==s:b="Condor"
elif p-3==s:b="Albatross"
elif p-2==s:b="Eagle"
elif p-1==s:b="Birdie"
elif p==s:b="Par"
elif p+1==s:b=a
elif p+2==s:b="Double "+a
elif p+3==s:b="Triple "+a
else:b="Haha you loser"
print b

Ungolfed / explicou:

score = int(input())
par = int(input)
foo = "Bogey" # a shortcut for 3 of the outputs
if score == 1:
    output = "Hole in one"
elif par - 4 == score:
    output = "Condor"
...
elif par == score:
    output = "Par"
elif par + 1 == score:
    output = foo # See what I mean?
elif par + 2 == score:
    output = "Double " + foo # Huh? Huh?
elif par + 3 == score:
    output = "Triple " + foo # That makes 3.
else:
    output = "Haha you loser"
print output # Make sense?

Minha segunda resposta, ironicamente, ambas estão em Python. Dicas de golfe apreciadas!

OldBunny2800
fonte
Dica: você nem precisa b.
Leaky Nun
Vou editar, apenas nrn.
OldBunny2800
Dê uma olhada nisso .
Leaky Nun
Além disso, eu pensei que o Python 2 lança sua entrada intautomaticamente.
Leaky Nun
-2

Python 2, 302 284 bytes

i=input();j=input()
if j==1:print"Hole in one"
if(j==i-4)&(i>5):print"Condor"
if(j==i-3)&(i>4):print"Albatross"
if(j==i-2)&(i>3):print"Eagle"
if j==i-1:print"Birdie"
if j==i:print"Par"
if j>i:
 k=j-i
 if k<4:
  print["","Double ","Triple "][k-1]+"Bogey"
 else:
  print"Haha you loser"

Se o espaço em branco à esquerda fosse permitido, seriam 282 bytes:

i=input();j=input()
if j==1:print"Hole in one"
if(j==i-4)&(i>5):print"Condor"
if(j==i-3)&(i>4):print"Albatross"
if(j==i-2)&(i>3):print"Eagle"
if j==i-1:print"Birdie"
if j==i:print"Par"
if j>i:
 k=j-i
 if k<4:
  print["","Double","Triple"][k-1],"Bogey"
 else:
  print"Haha you loser"
user48538
fonte
12
O uso de uma matriz de cadeias seria muito útil aqui.
Addison Crump
Concordo, isso parecia realmente não otimizado. Qualquer combinação de termos / resultados reduziria a resposta.
Ricdesi
Por que você precisa de raw_input ()? Você não pode simplesmente usar input ()?
OldBunny2800
@ricdesi Eu combinei os truques.
user48538