Codice Golf Golf Score


22

È venerdì ... quindi andiamo a giocare a golf! Scrivi il codice che determina il punteggio del giocatore su una buca in una partita a golf. Il codice può essere una funzione o un intero programma. Come suggerisce il genere, vince il codice più corto.

Input (parametri o stdin, a scelta):

  • Un numero intero che rappresenta il valore del buco, garantito tra 3 e 6
  • Un numero intero che rappresenta il punteggio del golfista, garantito tra 1 e 64

Output (stampa su stdout o ritorno, trascinamento newline consentito ma non richiesto, a scelta):

  • se il punteggio è 1, visualizza "Hole in one"
  • se punteggio == par - 4 e par> 5, emette "Condor"
  • se punteggio == par - 3 e par> 4, output "Albatross"
  • se punteggio == par - 2 e par> 3, output "Eagle"
  • se punteggio == par - 1, output "Birdie"
  • se score == par, genera "Par"
  • se punteggio == par + 1, visualizza "Bogey"
  • se punteggio == par + 2, visualizza "Double Bogey"
  • se punteggio == par + 3, visualizza "Triple Bogey"
  • se punteggio> par + 3, stampa "Haha you perdente"

EDIT Complimenti a Dennis per avere la risposta più breve!


34
Mi sono sempre chiesto cosa fosse dopo il triplo bogey.
ThisSuitIsBlackNon

3
Per inciso il par più grande è 7 non 6.
Joshua

4
@Joshua Ero temporaneamente confuso sul perché hai commentato invece di modificare il tuo post. Poi mi ha colpito. : P
R

@RikerW i due nomi di Josh sono vicini quanto la loro reputazione: D
cat

2
L'ingresso può essere in qualsiasi ordine?
Maniglia della porta

Risposte:


6

Gelatina , 61 byte

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

Provalo online!

sfondo

Questo utilizza la compressione del dizionario statico di Jelly. Puoi trovare un compressore qui . Per di qua,

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

e

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

così come

“µḣ⁻×⁵ñBƑ»

e

“Hole in one”

sono equivalenti.

Come funziona

_«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”.

Complimenti per la risposta più breve!
Josh

13

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

echo[Condor,Albatross,Eagle,Birdie,Par,$b=Bogey,"Double $b","Triple $b","Haha you loser"][min(4+$s-$p,8)]?:"Hole in one";
Versione senza preavviso, 139 137 byte
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";

Impostare $sle $pvariabili core e ar prima di echoe il gioco è fatto.

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

Modifica
-6: non memorizza l'array, ma solo chiamandolo se necessario.
-1: capovolgendo il ternario.
-7: Il più basso $s-$pcon $s>1è -4, in modo che il max()non è necessaria, dal momento che 4+$s-$p >= 0.
-3 Array -> explode() :, grazie CoolestVeto!
-5: Costante indefinito letterale a corda economica plus $r[-1] -> false, grazie Ismael Miguel!
-24: Passaggio da una explode()funzione a un printf/ %ssetup, con alcune modifiche, più grazie a Ismael Miguel per il cambio di direzione.
-6: Swerve , siamo tornati di echonuovo!


1
Riesci a trasformarlo in una stringa e diviso per un carattere arbitrario?
Addison Crump

@CoolestVeto In effetti, posso. Stranamente, salva meno byte del previsto, ma tutti i byte sono meglio di nessun byte!
Ricdesi,

1
È possibile sostituire $b="Bogey";con $b=Bogey;per salvare 2 byte. Inoltre, sostituisci il tuo $s-1? ... : ...;con un echo ... ?: ...;. Ecco la versione lunga 151 byte: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

Non avevo idea di poter imbrogliare i letterali delle stringhe, pulito.
Ricdesi,

1
Ecco un (forse) di lavoro e più corto: 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);. Fondamentalmente: rimossa la dichiarazione di funzione, rimossa explore, rimossa le virgolette, usato un array e usato $argv. Il codice finale è lungo 139 byte.
Ismael Miguel,

10

05AB1E , 91 90 byte

Codice:

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

Spiegazione:

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 ÿ‹¶ÿ½¿ÿ”ð¡

Ciò equivale a "Condor Albatross Eagle Birdie Par 0Bogey Double0Bogey Triple0Bogey"utilizzare la compressione e l'interpolazione delle stringhe. Abbiamo quindi diviso gli spazi, 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

Scoperti molti bug, usa la codifica CP-1252 .

Provalo online!


... Whoa. Ben fatto.
gatto

2
@tac Grazie! :)
Adnan,

Questo codice sembra un po 'i messaggi Unicode casuali che ricevi quando installi una cosa .exe non inglese (se hai l'inglese come lingua nelle cose di Windows). Sembra spettacolare, però!
clismique

@DerpfacePython Haha, i messaggi unicode casuali fanno parte in parte del codice e l'altra parte fa parte di un messaggio compresso.
Adnan,

6

Vitsy, 131 byte

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

Spiegazione:

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.

Questo funziona capendo quale sia il punteggio relativo al par, quindi eseguendo linee diverse (e ottenendo stringhe diverse).

Provalo online!

Modalità dettagliata (per cacca e risatine):

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;

"Premi 9. In questo modo tutti gli oggetti maggiori di 8 saranno 9." Wat?
gatto

@tac Questo serve a forzare l'input che comporterebbe "Haha you perdente" per passare alla riga contenente "Haha you perdente".
Addison Crump

5

JavaScript (ES6), 125 124 byte

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

Assegna a una variabile f=p=>s=>, ad es. , Quindi chiamala così: f(6)(2)Par prima, quindi segna.

Può essere abbreviato combinando la "Bogey"s.


Un esempio di combinazione dei carrelli è: ",Double ,Triple ".split`,`[k-1]+"Bogey"dove k=s-p.
user48538

Posso usare il tuo approccio nella mia soluzione?
user48538

@ zyabin101 che non è scoraggiato, a patto che non sia un vero plagio
cat

@ zyabin101 Grazie, vedrò se questo lo rende più breve. E sì, sentiti libero di usare questo approccio nella tua risposta.
ETHproductions

Sto già usando questo.
user48538

4

LittleLua - 160 byte (non 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])

Sono relativamente certo di aver fatto bene.

Accetta due numeri interi, pari e punteggio del giocatore.

La versione di Little Lua che ho usato per fare questo è stata caricata dopo che questa sfida è stata pubblicata, ma non è stata modificata in seguito. Dal codice è relativamente ovvio che non è stato aggiunto nulla per semplificare questa sfida

LittleLua Info:

Una volta che sono soddisfatto dei dettagli integrati e delle funzionalità di Little Lua, la fonte sarà disponibile insieme a un infopage.

LittleLua V0.02


2
Questo non è competitivo perché il file è stato caricato su Dropbox 2 ore dopo la pubblicazione della sfida.
Mego

2
github.com è molto meglio nell'hosting di codici ...
cat

Assolutamente, non ho mai avuto la possibilità di installarlo.
Skyl3r

3

Mouse-2002 , 223 207 byte

La rimozione di commenti probabilmente aiuterebbe ...

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


$

2

bash, 150 136 byte

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

Prova:

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

Grazie a Dennis per 14 byte!


1

Python 2, 186 179 158 byte

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: aggiunto il caso "hole in one" mancante ...

EDIT 2: risolto alcuni byte (grazie a tac)


1
Una lambda sarebbe più corta, vedi anche consigli per giocare a golf in Python
cat

puoi lasciare spazio tra 4eelse
cat

1
Se modifichi l'algoritmo, puoi semplicemente indicizzare un elenco anziché un dict
cat

puoi rilasciare lo spazio tra printe {, e se usi un punto e virgola per mettere il a=e printsulla stessa linea, puoi radere un byte di spazio bianco
cat

1
@tac in realtà "c = lambda x, y:" è più lungo di "def c (x, y):", grazie per gli altri suggerimenti
Max

1

Haskell - 131 byte (contando la nuova riga)

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è l'unico modo in cui riesco a pensare al golf in un elenco di stringhe che devono contenere spazi con accesso solo a Preludecosì bloccato con delimitatori di due caratteri.

Tuttavia, Haskell non è di solito così competitivo (almeno contro le lingue generali).


Puoi importtutto quello che ti piace, non solo i builtin
cat

1

Python 2.7, 226 byte

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]

Difficile trovare un breve codice Python quando sei in ritardo alla festa, meglio che mi venga in mente.


Le ultime due righe dovrebbero essere cambiate in una:[print r for r in l if r]
cat

1

C, 198 byte

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

0

Japt, 97 byte

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

Contiene un mucchio di non stampabili. Provalo online!

Come funziona

`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

0

Python 2.7.2, 275 byte

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 / ha spiegato:

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?

La mia seconda risposta, ironicamente, sono entrambi in Python. Suggerimenti per il golf apprezzati!


Suggerimento: non è nemmeno necessario b.
Leaky Nun,

Ho intenzione di modificare, solo nrn.
OldBunny2800,

Dai un'occhiata a questo .
Leaky Nun,

Inoltre, ho pensato che Python 2 lancia intautomaticamente i tuoi input .
Leaky Nun,

-2

Python 2, 302 284 byte

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 fosse consentito lo spazio bianco iniziale, sarebbero 282 byte:

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"

12
L'uso di un array di stringhe ti aiuterebbe seriamente qui.
Addison Crump

D'accordo, questo sembrava davvero non ottimizzato. Qualsiasi combinazione di termini / risultati accorcerebbe la risposta.
Ricdesi,

Perché hai bisogno di raw_input ()? Non puoi semplicemente usare input ()?
OldBunny2800

@ricdesi Ho combinato i carrelli.
user48538
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.