En iyi Yahtzee puanı


26

Yahtzee beş altı yüzlü zarla oynanan bir oyundur ve bir puanı doldurmak için on üç farklı kutusuyla bir skor çizelgesidir. Her kutunun kendi puanlama kuralları vardır:

  • 1s, 2s, 3s, 4s, 5s, 6s, ilgili zarların toplamına eşit puanlar (yani, 3s olarak atılan bir [3, 2, 3, 1, 5] rulosuna 6 puan verilir: 3 her biri için 3).
  • 3'lü ve 4'lü (üçü, dörtü aynı zar atıldıkları gibi) beş zarın toplamına eşit puan aldı.
  • Full ev (iki zar bir değeri gösterirken, diğer üçü diğerini gösterir) 25 puan alır
  • Küçük düz (art arda dört değer) 30 puan
  • Büyük düz (tüm ardışık değerler) 40 puan
  • Yahtzee (tüm zarlar aynı değeri gösterir) puanları 50 puan

Onüçüncü (şans) oyun içi anlam ifade eder, ancak bu zorluk için çok fazla bir şey ifade etmez; Ayrıca oyunun burada anlam ifade etmeyen ekstra Yahtze'ler için bonusları var. Çünkü zorluk ...

Giriş olarak beş zar verildiğinde (beş tam sayı 1-6, ancak giriş uygunsa, girişin her zaman geçerli olduğunu varsayabilirsiniz), bu 'el' için mümkün olan en yüksek puanı alın. Bu zorluğun amaçları için, sadece yukarıdaki listedeki puanlama yöntemleri geçerlidir (özellikle, bu zorlama için şans geçerli bir puan kutusu değildir ). Her ne olursa olsun, bir tamsayı veya bir dize temsili olsun, skor, ondalık sayısal değeri olarak verilmelidir. Hemen bir sayı olarak tanınabilmelidir. Lider / takip eden boşluk, sorun değil, puanlama ve sunum değil.

Golf kodlayın, böylece verilen dilde en az bayt olan cevap kazanır. Standart boşluklar yasaktır.

Test durumları

(Bunların hepsinin bağımsız olduğuna dikkat edin, zorluk, zarların bir 'elini' almaktır):

in: 1 5 4 3 2
out: 40
in: 1 1 4 3 1
out: 10
in: 2 2 6 5 3
out: 6
in: 2 4 2 4 6
out: 8
in: 1 1 1 1 1
out: 50
in: 5 2 5 3 6
out: 10
in: 1 6 3 4 2
out: 30
in: 1 3 1 1 3
out: 25
in: 6 5 5 6 6
out: 28
in: 1 2 3 5 6
out: 6

3
bunun yerine eski soruyu kapatmalı mıyız? IMO bu daha iyi bir soru ...
Giuseppe

5
IMO, bu, hiç bir skorun kopyası değil yahtzee oyununun bir kopyası değildir. Bu, açıkça, bir diğerinin kalıp rulo listesinden bir puanın tamamını istediği en yüksek puan olduğunu belirtir. Son olarak, ve en önemlisi, burada "kopyala-yapıştır" senaryosunda kullanılabilecek muhtemel dupe ile ilgili herhangi bir cevap görmüyorum. Lütfen tekrar açmayı düşünün.
Geliştiriciyi Geliştirme


2
FWIW, bunu bir araya getirdiğimde eski sorunun farkındaydım. Düşüncelerim @GelelopingDeveloper'ın söylediklerini tekrarladı. Bunu daha önce bir egzersiz olarak yaptıktan sonra, bu süreci optimize etmek için bazı ilginç fırsatlar buldum. Ayrıca bunun daha derli toplu bir meydan okuma olduğunu düşünüyorum.
brhfl

“Onüçüncü (şans) oyunda anlam ifade ediyor, ancak bu zorluk için çok fazla değil” Yani sayılıyor mu?
Unihedron

Yanıtlar:


6

R , 146 141 bayt

function(d)max(unique(d<-sort(d))*(g=table(d)),any(g>2)*sum(d),all(2:3%in%g)*25,(s=sum((R=diff(d))==1))<4&all(R<2)*30,(s>3)*40,(0==sd(d))*50)

Çevrimiçi deneyin!

Plannapus tarafından aşıldı

Listeyi girdi olarak alır ve puanı döndürür.

biraz kurtulmuş:

function(d){
 d <- sort(d)
 u <- unique(d)                  # unique dice
 g <- table(d)                   # table of counts
 Ns <- u*g                       # scores as 1s, 2s, ... etc.
 NKind <- any(g>2)*sum(d)        # 3 or 4 of a kind if any counts are at least 3
 FHouse <- all(2:3%in%g)*25      # full house is 25 if 2 & 3 are in counts
 R <- diff(d)                    # consecutive differences
 s <- sum(R==1)                  # sum of differences equal to 1
 sStraight <- s<4 &              # if the number of 1s is 3 and
               all(R<2)*30       # no consecutive numbers are 2 apart
 bStraight <- (s>3)*40           # all 1s means big straight
 Yahtzee <- sd(d)==0             # sd = 0 means all are equal
 max(Ns,NKind,FHouse,sStraight,bStraight,Yahtzee)
}


f(c(1,2,3,5,6))başarısız - 6 vermeli ve 30 verim vermelidir. Görünüşe göre bu, kaç tane çiftin (sıralama sonrası) bir farklılık gösterdiğini sayıyorsunuzdur; bu, bir düzlem olmasa da, yukarıdaki sıra için dördüncü dört. Sanırım bunu bir süre önce bir egzersiz olarak yaptığım zaman bunu yaptım ve muhtemelen bunu bir test davası olarak eklemeliyim ...
brhfl

@ brhfl bu şimdi sabittir.
Giuseppe


4

R, 136 134 bayt

function(n,y=table(factor(n,1:6)),z=sum(!diff(diff(sort(n)))))max(1:6*y,c(25,sum(n),10*3:5)[c(all(y<4&y-1),any(y>2),z>1,z>2,any(y>4))])

@Giuseppe sayesinde 2 byte golf oynadı !

girintili,

function(n, #vector of die scores
         y=table(factor(n,1:6)), #Contingency table
         z=sum(!diff(diff(sort(n))))) #Diff of diff of ordered scores
    max(1:6*y,
        c(25,sum(n),10*3:5)*c(all(y<4&y-1), #Full house
                            any(y>2), #3 and 4 of a kind
                            z>1, #Small straight
                            z>2, #Long straight
                            any(y>4))] #Yahtzee

Birkaç test durumu:

> f=function(n,y=table(factor(n,1:6)),z=sum(!diff(diff(sort(n)))))max(1:6*y,c(25,sum(n),10*3:5)*c(all(y<4&y-1),any(y>2),z>1,z>2,any(y>4)))
> f(c(2,4,2,4,6))
[1] 8
> f(c(1,2,3,5,6))
[1] 6
> f(c(6,5,5,6,6))
[1] 28
> f(c(6,5,3,1,4))
[1] 30
> f(c(6,5,3,2,4))
[1] 40

1
Huh, dikkatim factordağılmadan önce sıcak bir saniye düşünün . Ama bence yaklaşımını z( scevabımla) kullanırsam, benimkini 134'e düşürebilirim ...
Giuseppe

Ek olarak, yerine kullanıp all(y<4&y-1)kullanıp , işlev argümanı yerine satır içi olarak ayarlayarak üç bayt kaydedebilirsiniz ve yine de tüm sınama durumlarını geçmektedir: Çevrimiçi deneyin! *[y
Giuseppe,

ayrıca yeniden yapılandırdım maxve baytı ysatır içi ayarlardan kurtardığını düşünüyorum .
Giuseppe,

3

Toplu, 359 bayt

@echo off
set/at=s=m=r1=r2=r3=r4=r5=r6=0
for %%r in (%*)do set/a"m+=!(m-r%%r),r%%r+=1,t+=%%r,p=s-r%%r*%%r,p&=p>>9,s-=p
goto %m%
:1
if %r1% neq %r6% set s=40&goto g
:2
set/at=r3*r4*(r2*(r1+r5)+r5*r6)
if %t% gtr 0 set s=30
goto g
:3
set/a"s=r1^r2^r3^r4^r5^r6"
if %s%==1 if %t% lss 25 set s=25&goto g
:4
set/as=t
goto g
:5
set s=50
:g
echo %s%

Açıklama:

@echo off
set/at=s=m=r1=r2=r3=r4=r5=r6=0
for %%r in (%*)do set/a"m+=!(m-r%%r),r%%r+=1,t+=%%r,p=s-r%%r*%%r,p&=p>>9,s-=p
goto %m%

Her sayı için zar sayısını, artı maksimum, artı tüm zarların toplamını artı aynı sayıdaki en yüksek zar sayısını hesaplayın.

:1
if %r1% neq %r6% set s=40&goto g

Eğer bütün zarlar farklıysa, bu uzun bir düz olabilir, ama bunun ya hayır 1ya da yok olması gerekir 6.

:2
set/at=r3*r4*(r2*(r1+r5)+r5*r6)
if %t% gtr 0 set s=30
goto g

Aksi takdirde, veya en fazla iki zar aynı ise, o zaman bu hala kısa bir düz olabilir. En az a 3ve a 4ve ayrıca diğer dört sayının bir kombinasyonu olmalıdır.

:3
set/a"s=r1^r2^r3^r4^r5^r6"
if %s%==1 set s=25&goto g

Üç zar aynı ise, o zamandan beri dolu bir ev olup olmadığını kontrol edin 3^2==1. Ancak, 6 ve 5'ler gibi bazı tam evler, türünün 3'ünden daha yüksek puan alıyor.

:4
set/as=t
goto g

Aksi takdirde, veya dördü aynıysa, toplamı puanlayın.

:5
set s=50

Ve eğer aynı beş varsa, Yahtzee!

:g
echo %s%

En iyi skoru alın.


1
Bana potansiyel olarak 5,5,6,6,6] puanını hatırlattığın için teşekkür ederim. Unuttuğum birkaç tuhaf saçak vakası olduğunu biliyordum.
brhfl

3

Jöle , 58 bayt

ċЀ`Ṁ>2ȧS
ṢI=1Ạµ-ƤẸ,E;ṢI$E$;⁸Lƙ`Ṣ⁼2,3¤a3,5,4,2.Ṁ×⁵»Ç»Sƙ`Ṁ$

Çevrimiçi deneyin!


Tamamen geçerli, ama merak ediyorum ve Jelly'i kendi başıma kesecek kadar iyi tanımıyorum ... neden 25.0başka hiçbir dava izlemeden tam ev dönüyor .0?
saat

@ brhfl Çünkü, 2.5 × 10 = 25.0(float aritmetik) olarak çıkarılırken, diğerleri (integer aritmetik) 30olarak çıkarılır 3 × 10 = 30.
Outgolfer Erik,

2
Teşekkürler! Gerçekten sorumu iyi konuşmadım; Matematiği farklı yapmakla sonuçlanan tam bir evi saptamak için hangi yöntemi kullandığınızı daha merak ettim - ama şimdi düşünüyorum, sanırım 2.5, 3, 4, 5 * 10 vs 25, 30, 40, 50. Sanırım kendi soruma cevap verdim.
brhfl

@brhfl Kesinlikle, çünkü × 10, 2 bayt 2.52 bayt gibi bulun 25ve 3,5,43 bayt üzerinde kaydeder 30,50,40, böylece 3 + 0-2 = 1 bayt kaydedildi.
Outgolfer Erik,

2

Perl 6 , 159 bayt

->\b{max map {$_(b)},|(1..6).map({*{$_}*$_}),{.kxxv.sum*?.values.grep(*>2)},{25*(6==[*]
.values)},30*?*{3&4&(1&2|2&5|5&6)},40*?*{2&3&4&5&(1|6)},50*(*.keys==1)}

Çevrimiçi deneyin!

Girdi kabul edilebildiği için "ancak elverişlidir", fonksiyonum bunu Bagçokluğu olan bir kap olan sınıfın bir örneği olarak kabul ediyor . A Bagaynı zamanda bir birleştirici kaptır; çantada $bag{$key}kaç kez $keymeydana geldiğini döndürür .

İşlevin büyük bir kısmı, her bir Yahtzee elini değerlendiren, elin koşulları karşılanmazsa o elin puanını döndüren sadece bir fonksiyonlar listesidir.

  • |(1..6).map({ *{$_} * $_ })1-6 sayılarının tekrarlanan çalışmalarına dayanarak elleri değerlendiren altı işlevin bir listesidir. Lider |çevreleyen listesine bu listeyi düzleştirir.
  • {.kxxv.sum * ?.values.grep(* > 2) }3 ve 4'lü eşlerin ellerini değerlendirir. .kxxvbir Bagiadede, her birinin çokluğu ile tekrarlanan, orijinal kalıp merdaneleri listesini geri kazanan ve .sumtabii ki zarları toplayan anahtarlar . Bu toplam, ?çantanın .values(yani, çoklukların) 2'den büyük bir değer içermesi durumunda geçerli olan bir boolean değeri ( ) ile çarpılır.
  • { 25 * (6 == [*] .values) }evin tamamını değerlendirir. 25, eğer çarpımların çarpımı 6 ise, beş zar için sadece biri 3, diğeri 2 ise gerçekleşebilen doğru olan bir boolean değeri ile çarpılır.
  • 30 * ?*{ 3 & 4 & (1 & 2 | 2 & 5 | 5 & 6) }küçük düz eli değerlendirir. Bu bir WhateverCodeişlevdir; İkinci yıldızı *olduğunu Bag. Parantezler arasındaki ifade, 3 ve 4 değerlerinin ve 1 ve 2 veya 2 ve 5 veya 5 ve 6 değerlerinin Bagbirleşimiyle ilgilidir. 3 ve 4, ve en az 1 ve 2 veya 2 ve 5 veya 5 ve 6'dan birinin çokluğu sıfır değilse, bağlantı bir boole (ile ?) zorlandığında doğru olur ve bu boole 30 ile çarpılır. puan almak için.
  • 40 * ?*{ 2 & 3 & 4 & 5 & (1 | 6) }Benzer şekilde büyük düz eli de değerlendirir. Daha basittir çünkü zar her 2-5 ve 1 veya 6 sayılarını içermelidir.
  • 50 * (*.keys == 1)Yahtzee'nin elini değerlendirir. Farklı zar sayısının bir olması halinde doğru olan bir boolean değerinin sadece 50 katıdır.

2

Pip , 65 63 bayt

n:_NgM\,6MXn*\,6AL[2<MXn23=JSNn3<Y#MX Jn^0MXn=5]*[$+g25--y*t50]

Zarları beş komut satırı argümanı olarak alır. Çevrimiçi deneyin!

Ungolfed + açıklama

(Bu orjinal versiyondur.)

                    g is list of cmdline args; t is 10 (implicit)

Y                   Yank into y:
  _Ng                function that counts occurrences of its argument in g
 M                   mapped to
  \,6                inclusive range from 1 to 6
                    This gives us how many dice are showing each number 1-6

s:                  Assign to s:
  # MX               length of max of
      Jy ^ 0         join y into string and split on zeros
                    This gives us the length of the longest straight

MX                  Max of
   y * \,6           each die frequency in y, times its value
 AL                  to which list append
   [                 this list:
                      3- and 4-of-a-kind:
    MXy > 2 & $+g      If max frequency is 3 or more, sum of g (else 0)
                      Full house:
    23 = J SNy & 25    Sort y and join into string; if it's 000023, 25 (else 0)
                      Straights:
    s > 3 & --s*t      If s is 4 or more, (s-1)*10 (else 0)
                      Yahtzee:
    MXy = 5 & 50       If max frequency is 5, 50 (else 0)
   ]
                    The result of the last expression is autoprinted

1

Ruby , 184 bayt

Tam program Girişi test etmeyi kolaylaştırmak için $/=' ', "boşluklarla ayrılmış basamak" biçiminde okumak için üste ekleyin . (191 karakter)

a=$<.map &:to_i
b=a.|c=[]
d=(1..6).map{|x|e=a.count x
c<<x*e
e}
e=a.sum
p !b[1]?50:b[4]&&!(a&[1,6])[1]?40:(1..3).any?{|x|(a&[*x..x+3])[3]}?30:(d-[0,2,3])[0]?d.max>2?e:c.max: [25,e].max

200 baytlık bariyeri kırmaya başladım ve bir düzine bayt ile kolayca yok etmeyi başardım!

Çevrimiçi deneyin!

açıklama

Çok da iyi değil. Umarım biraz Ruby bilgin vardır ~

a=$<.map &:to_i # a: input as [number]*5
b=a.|c=[]       # c: [], b: a.uniq
d=(1..6).map{|x|
    e=a.count x # e: occurrence count in a 
    c<<x*e      # add (number * occurrence count) to c
    e           # return value in d
}
e=a.sum         # e: sum of input
p !b[1] ? 50 :  #   condition to print 50 <= if a.uniq has length 0 (el 1 is nil)
  b[4] &&       #   condition to print 40 <= if a.uniq has length 5 (el 4 exists)
  !(a&[1,6])[1] ? 40 : # <- arr & [mask]  # and a does not have both 1 and 6
  (1..3).any?{|x| # condition to print 30 <= if any of 1..4, 2..5, 3..6
  (a&[*x..x+3])[3]} ? 30 : # [3] to assert entire mask is found in a
  (d-[0,2,3])[0] ? # if, after removing 0 (not found) 2 (a pair) 3 (a triple)
                   # and something is found, this is not full house
  d.max > 2 ?   # is triple / quadruple ?
     e :        # weakly dominating alternatives
     c.max      # choose best by-suit
  : [25,e].max  # choose best by-score
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.