Code Golf Golf Puanı


22

Bugün cuma ... haydi golf oynayalım! Bir golf oyununda oyuncunun çukurdaki atışını belirleyen kodu yazın. Kod bir işlev veya tüm program olabilir. Türün önerdiği gibi, en kısa kod kazanır.

Giriş (parametreler veya stdin, seçiminiz):

  • Deliğin eşini temsil eden bir tamsayı, 3 ile 6 arasında olması garanti edilir
  • Golfçünün puanını temsil eden bir tamsayı, 1 ile 64 arasında olması garanti edilir

Çıktı (stdout'a veya dönüşe yazdırın, takip eden yeni satıra izin verilir, ancak zorunlu değil, seçiminiz):

  • Eğer skor 1 ise, "Birde Delik" çıkar
  • eğer skor == par - 4 ve par> 5 ise, "Condor" çıktısını alın
  • puan == par - 3 ve par> 4 ise, "Albatros" çıktısı alın.
  • puan == par - 2 ve par> 3 ise, "Kartal" çıktısını alın
  • puan == par - 1 ise, "Birdie" çıktı
  • eğer puan == par, çıktı "Par"
  • puan == par + 1 ise, "Bogey" çıktısını alın
  • puan == par + 2 ise, "Double Bogey" çıktısını alın
  • puan == par + 3 ise, "Üçlü Bogey" çıktı
  • puan> par + 3 ise, "Haha size kaybeden" şeklinde çıktı

EDIT En kısa cevabı verdiğin için Dennis'e tebrikler!


34
Üçlü öcülerin peşinden ne geldiğini merak etmiştim.
KıyafetSiyahBeyaz

3
Bu arada en büyük par 7 7 değil.
Joshua

4
@Joshua Kendi yayınınızı düzenlemek yerine neden yorum yaptığınız konusunda geçici olarak kafam karıştı. Sonra bana çarptı. : P
Rɪᴋᴇʀ

@RikerW iki Josh'un adı, ünleri kadar yakın: D
cat

2
Giriş herhangi bir sırayla olabilir mi?
Doorknob

Yanıtlar:


6

Jöle , 61 bayt

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

Çevrimiçi deneyin!

Arka fon

Bu Jelly'in statik sözlük sıkıştırmasını kullanır. Burada bir kompresör bulabilirsiniz . Bu yoldan,

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

ve

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

Hem de

“µḣ⁻×⁵ñBƑ»

ve

“Hole in one”

eşdeğerdir.

Nasıl çalışır

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

En kısa cevap için tebrikler!
Josh,

13

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

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

Set $sçekirdek ve $par değişkenler önce echove gidiyoruz.

parçalarına ayrıştırılmış görünüm
echo [Condor,
      Albatross,
      Eagle,
      Birdie,
      Par,
      $b = Bogey,
      "Double $b",
      "Triple $b",
      "Haha you loser"][ min( 4+$s-$p,8 ) ]
  ?: "Hole in one";

Düzenlemeler
-6: Diziyi kaydetme, yalnızca gerekirse çağırma.
-1: Üçlü parçanın etrafında döndürülmesi.
7: düşük $s-$polan $s>1olan -4, bu yüzden max(), çünkü gerekli değildir 4+$s-$p >= 0.
-3:, Array -> explode() teşekkürler CoolestVeto!
-5: Cheaty string değişmez tanımsız sabiti artı $r[-1] -> false, teşekkürler Ismael Miguel!
-24: Yön değiştirmesi için Ismael Miguel'e teşekkür ederek, bir explode()fonksiyondan a printf/ %skuruluma, bazı düzeltmelere geçiş.
-6: Döndür , echotekrar döndük !


1
Onu bir dizgeye çevirip rastgele bir karaktere ayırabilir misiniz?
Addison Crump,

@CoolestVeto Aslında, yapabilirim. Garip bir şekilde, beklenenden daha az bayt tasarrufu sağlar, ancak herhangi bir bayt hiçbir bayttan daha iyidir!
ricdesi,

1
Sen değiştirebilirsiniz $b="Bogey";ile$b=Bogey;2 bayt kaydetmek için . Ayrıca, yerini $s-1? ... : ...;bir ile echo ... ?: ...;. İşte 151 bayt uzunluğunda bir sürüm: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

Dize değişmezlerini aldatabileceğinizi bilmiyordum.
ricdesi,

1
İşte (muhtemelen) çalışma ve daha kısa bir tane: 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);. Temel olarak: İşlev bildirimi kaldırıldı explore, kaldırıldı, tırnak işaretleri kaldırıldı, bir dizi kullanıldı ve kullanıldı $argv. Son kod 139 bayttır.
Ismael Miguel,

10

05AB1E , 91 90 bayt

Kod:

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

Açıklama:

Bölüm 1:

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

Bölüm 2:

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

Bu "Condor Albatross Eagle Birdie Par 0Bogey Double0Bogey Triple0Bogey"string sıkıştırma ve string enterpolasyonu ile aynıdır . Sonra boşlukları kullanarak ayrıldık.ð¡ .

Bölüm 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

Bir keşfedilen çok böcek kullanan CP-1252 kodlaması.

Çevrimiçi deneyin!


... Vay. Güzel bitti.
kedi,

2
@tac Teşekkürler! :)
Adnan

Bu kod, İngilizce olmayan bir .exe şeyi yüklediğinizde aldığınız rastgele Unicode iletilerine benziyor (Windows'taki diliniz İngilizce ise). Yine de muhteşem görünüyor!
clismique

@DerpfacePython Haha, rastgele unicode mesajları kısmen kodun bir kısmı, diğer kısmı ise sıkıştırılmış bir mesajın bir parçasıdır.
Adnan

6

Vitsy, 131 bayt

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

Açıklama:

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.

Bu, puanın parla göreceli olarak ne olduğunu bulmak, sonra farklı satırları (ve farklı dizeleri kazanmak) bulmak suretiyle çalışır.

Çevrimiçi Deneyin!

Ayrıntılı Mod (kakalar ve kıkırdamalar için):

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;

"İtme 9. Bu, 8'den büyük öğeleri 9 olmaya zorlar." Wat?
kedi,

@tac Bu, "Haha kaybedersiniz" ile sonuçlanacak girdiyi "Haha kaybedersiniz" içeren satıra zorlamaktır.
Addison Crump,

5

JavaScript (ES6), 125 124 bayt

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

Bir değişkene örneğin atayın f=p=>s=>, sonra şöyle f(6)(2)söyleyin : Önce Par, sonra skor.

"Bogey"S birleştirilerek kısaltılabilir .


Öcüleri birleştirmenin bir örneği şudur: ",Double ,Triple ".split`,`[k-1]+"Bogey"where k=s-p.
user48538

Yaklaşımınızı çözümümde kullanabilir miyim?
user48538

@ zyabin101, tamamen intihal olmadıkça, cesareti kırılmaz
kedi

@ zyabin101 Teşekkürler, bunun daha kısa sürede yapıp yapmadığını göreceğim. Ve evet, cevabınızda bu yaklaşımı kullanmaktan çekinmeyin.
ETHproductions

Bunu zaten kullanıyorum.
user48538,

4

LittleLua - 160 Bayt (rekabetçi değil)

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

Bunu doğru yaptığımdan eminim.

İki tamsayı kabul eder, eşit ve oyuncunun puanı.

Bunu yapmak için kullandığım Little Lua sürümü, bu zorluğun yayınlanmasından sonra yüklendi, ancak daha sonra düzenlenmedi. Bu zorluğu basitleştirmek için hiçbir şey eklenmemiş olduğu kodundan oldukça açık.

LittleLua Bilgi:

Little Lua'nın yerleşiklerinden ve işlevselliğinden memnun olduğumda, kaynak bir bilgi ile birlikte mevcut olacak.

LittleLua V0.02


2
Bu rekabetçi değildir, çünkü meydan okuma yapıldıktan 2 saat sonra dosya Dropbox'a yüklenmiştir.
Mego

2
github.com kod barındırma konusunda çok daha iyi ...
cat

Kesinlikle, sadece kurma şansım olmadı.
Skyl3r

3

Fare-2002 , 223 207 bayt

Yorumları kaldırmak muhtemelen yardımcı olacaktır ...

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

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

Test sürüşü:

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

14 bayt için Dennis'e teşekkürler!


1

Python 2, 186 179 158 bayt

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

1 EDIT: eksik "bir delik" durumda ekledi ...

2 EDIT: bazı baytları dışarı attı (tac sayesinde)


1
Bir lambda daha kısa olurdu, Python'da golf
kedi

4ve arasındaki boşluğu bırakabilirsinizelse
kedi

1
Algoritmayı değiştirirseniz, dikte yerine sadece bir listeyi indeksleyebilirsiniz
cat

Eğer arasındaki boşluğu bırakın printve {ve bir noktalı virgül kullanırsanız koymak a=ve printaynı satırda, sen boşluk bir bayt tıraş edebilirsiniz
cat

1
@tac aslında "c = lambda x, y:", "def c (x, y):" den daha uzun, diğerlerinin önerileri için teşekkürler
Max

1

Haskell - 131 bayt (yeni satır sayıyor)

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

linesSadece Preludeiki karakter sınırlayıcı ile sıkışmış yerlere sahip olması gereken teller listesinde golf oynamayı düşünmenin tek yolu bu.

Yine de, Haskell genellikle bu kadar rekabetçi değildir (en azından genel dillere karşı).


importSadece yerleşiklere değil, istediğiniz her şeye sahip olabilirsiniz
kedi

1

Python 2.7, 226 bayt

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]

Partiye geç kaldığında kısa bir python kodu bulmak zor, aklıma gelen en iyi şey.


Son iki satır bir ile değiştirilmelidir:[print r for r in l if r]
cat

1

C, 198 Bayt

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 bayt

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

Bir sürü yazdırılamaz. Çevrimiçi test edin!

Nasıl çalışır

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

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 / açıkladı:

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?

İkinci cevabım, ironik olarak ikisi de Python'da. Golf ipuçları takdir!


İpucu: İhtiyacınız bile yok b.
Sızdıran Rahibe,

Düzenleyeceğim, sadece nrn.
OldBunny2800

Göz at bu .
Sızdıran Rahibe,

Ayrıca, Python 2'nin girişinizi intotomatik olarak attığını düşündüm .
Sızdıran Rahibe,

-2

Python 2,302 284 bayt

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"

Önde gelen beyaz boşluklara izin verilirse, bu 282 bayt olurdu:

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
Bir dizge dizisinin kullanılması burada size ciddi şekilde yardımcı olacaktır.
Addison Crump,

Kabul, bu gerçekten korumasız görünüyordu. Terim / sonuçların herhangi bir kombinasyonu cevabı kısaltacaktır.
ricdesi,

Neden raw_input () 'a ihtiyacınız var? İnput () işlevini kullanamaz mısınız?
OldBunny2800 23.03

@ricdesi Ben öcüleri birleştirdim.
user48538
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.