Artımlı Bahisler


19

Birkaç ay önce bu soruyu bir röportaj için ön tarama bulmacası olarak aldım. Son zamanlarda blog materyalini düşünürken, bir problemi işlevsel olarak çözmek için kullanmak için iyi bir örnek olarak kafamda ortaya çıktı. Blog gönderimi yazmayı bitirir bitirmez çözümümü buna göndereceğim.

Not: Bu soru, bir yıl önce StackOverflow soruldu ve birkaç (yanlış) cevap sonra indirildi. Açık bir röportaj veya ev ödevi sorusu olarak kabul edilmediğini düşünüyorum. Buradaki cevaplarımız, birisinin onları kullanmayı düşünmemesi için yeterince derin bir şekilde kodlanmalıdır!


Bir yarışta aşağıdaki stratejiyi kullanarak bahis oynarsınız. Bir bahsi kaybettiğinizde, bir sonraki tur için bahsin değerini iki katına çıkarırsınız. Ne zaman kazanırsanız, bir sonraki tur için bahis bir dolar olacaktır. Tura bir dolar bahis yaparak başlıyorsunuz.

Örneğin, 20 dolar ile başlar ve ilk turda bahsi kazanırsanız, sonraki iki turda bahsi kaybederseniz ve dördüncü turda bahsi kazanırsanız, 20 + 1-1-2 ile bitirirsiniz. +4 = 22 dolar.

gİki argüman alan işlevi tamamlamanız bekleniyor :

  1. İlk argüman, abahse başladığımızda sahip olduğumuz ilk para olan bir tamsayıdır .
  2. İkinci argüman bir dizedir r. Sonucun ith karakteri 'W' (galibiyet) veya 'L' (kaybetmek) olacak ve dördüncü turun sonucunu gösterecektir.

İşleviniz tüm turlar oynandıktan sonra sahip olacağınız para miktarını iade etmelidir.

Bir noktada hesabınızda bahsin değerini karşılayacak kadar paranız yoksa, o noktada sahip olduğunuz meblağı durdurmanız ve iade etmeniz gerekir.

Örnek çalışma

1st round - Loss: 15-1 = 14
2nd round - Loss: 14-2 = 12 (Bet doubles)
3rd round - Loss: 12-4 = 8
4th round - Win: 8 + 8 = 16
5th round - Loss:16-1 = 15 (Since the previous bet was a win, this bet has a value of 1 dollar)
6th round - Loss: 15-2 = 13
7th round - Loss: 13-4 = 9
8th round - Loss: 9-8 = 1

1Bu durumda işlev geri döner

Kazanan, zımni fonksiyon tanımının İÇİNDEKİ en az karakter sayısına göre belirlenir. İsterseniz dil ile işbirliği yapın. Benimkinin geliştirilebileceğini biliyorum!


Bu sitedeki tüm soruların objektif kazanma kriteri olmalıdır . Yarışmanın galibini neyin belirlediğinden bahsetmedin.
Howard

1
Dahası, tüm turlar oynandıktan sonra işlevinizin sahip olacağınız para miktarını iade etmesi gerektiğini belirtirsiniz . Beklenen çıktı bölümünde çok daha ayrıntılı bir bilgi göstermenize rağmen . Fonksiyonun istenen davranışı hangisidir?
Howard

Ayrıca, kullandığınız her etiket yalnızca soru için oluşturduğunuz etiketse, bir sorun vardır.
Justin

1
"Buradaki cevaplarımız birisinin onları kullanmayı düşünmemesi için yeterince derin bir şekilde kodlanmalıdır!" Ayrıca, "Örnek Çıktı" yı istediğiniz gibi daha iyi eşleşmesi için "Örnek Çalışma" olarak ayarladım.
Justin

@quincunx üzgünüm, burada hiç yayınlamadım, ancak oluşturulduğunda buraya taşınan orijinal soruların çoğunu ilginç bir şekilde gönderdim. Bir bakıma, bu yığın değiş tokuşunun yapılmasının nedenlerinden biriyim. Ben tüm kod golf olduğunu düşündüm, ve ben bitirmek için acele oldu bu yüzden laptop bataryam ölüyordu. Afedersiniz. Uzun gece.
TheSoftwareJedi

Yanıtlar:


5

GolfScript, 33 karakter

{
1\{2$2$<!{1&{+1}{:b-b.+}if.}*;}/;
}:g;

Örnekler ( çevrimiçi ):

> 13 'LLLWLLLL'
6
> 4 'LWWLWLWWWL'
9
> 5 'LLLWWWLLWLWW'
2
> 2 'LW'
1

Açıklamalı kod:

1\            # prepare stack a b r
{             # for each char in r
  2$2$<!{     #   if a>=b  
    1&        #     take last bit of character (i.e. 0 for L and 1 for W)
    {         #     if W
      +       #       a <- a+b
      1       #       b <- 1
    }{        #     else
      :b-     #       a <- a-b
      b.+     #       b <- 2*b
    }if       #     end if
    .         #     create dummy value
  }*          #   end if
  ;           #   drop (i.e. either the dummy or the character)
}/            # end for
;             # discard current bet value

5

Python 2, 72 68 62 bayt

def g(a,s,n=1):
 for c in s:
    if a>=n:a,n=((a+n,1),(a-n,2*n))[c<'W']
 return a

Şöyle diyelim: g(15,'LLLWLLLL').

Bu, karaktere dayanarak sahip olduğumuz paranın değerini değiştirerek dizeden geçer.

İşte bu işlev üzerinde testler çalıştıran örnek bir program:

import random
def g(a,s,n=1):
 for c in s:
    if a>=n:a,n=((a+n,1),(a-n,2*n))[c<'W']
 return a

for i in range(14):
    s=''.join(('L','W')[random.randint(0, 1)] for e in range(random.randint(10, 15)))
    print'g(%i,%s):'%(i,`s`),
    print g(i,s)

Örnek çıktı:

g(0,'LLWWWWWWLWWWWW'): 0
g(1,'WLLWWWWWWWW'): 1
g(2,'WWWLLLWLLW'): 2
g(3,'LLLLWLWLWWWWLL'): 0
g(4,'LWWWWLWLWWW'): 12
g(5,'WWLWWLLWWW'): 12
g(6,'LLLWWWLLLLWLLWL'): 3
g(7,'WWLLWWLWLWLWLLL'): 7
g(8,'WLLLWWWWWLLWLL'): 2
g(9,'WWWLLWLLLLLWL'): 6
g(10,'LWWWWLLLWL'): 7
g(11,'WLLLLWLWWWW'): 5
g(12,'WLLWWLWWWL'): 17
g(13,'LLLWLLWLWLWLWW'): 6

Test cihazında küçük bir değişiklik yaparak, birçok çalışmanın ortalama kârını elde edebiliriz:

import random
def g(a,s,n=1):
 for c in s:
    if a>=n:a,n=((a+n,1),(a-n,2*n))[c<'W']
 return a

r=[]
for i in range(5000):
    for i in range(1000):
        s=''.join(('L','W')[random.randint(0, 1)] for e in range(random.randint(10, 15)))
        r+=[i-g(i,s)]
a=0
for n in r:
    a+=n
print float(a)/len(r)

Örnek çıktı (işlev 5000000zamanlarını çağırdığımız için oldukça uzun sürdü ):

-0.0156148

Düzenleme: Daha fazla golf için Howard ve Danny'ye teşekkürler.

EDIT: şimdi program bahsi yapmak için yeterli para olup olmadığını kontrol eder. Bu aslında bayt tasarrufu sağlar.


Bazı küçük tasarrufları: Eğer değiştirebilir c=='L'ile c<'W'=. Ayrıca b,n=((n,1),(-n,2*n))[c<'W']daha sonra size daha fazla karakter ( if a<-b:break, a+=b) kazandırır.
Howard

@Howard Hmm. b,n=Hile denedim ( [dışarıda s ile), ama python şikayet etti. Tekrar deneyelim.
Justin

Tuhaf, buraya bir bak .
Howard

1
O zaman gerekmeyeceğinden if n<=asana biraz karakter kazandırmaz breakmıydın?
Danny

1
@Quincinx: Hayır, <sadece daha az demektir. Dizeler sözlükbilimsel olarak sıralanmıştır, bu nedenle 'L' <'W', 1 olarak yorumlanan True değerini döndürürken, 'W' <'W', 0 olarak yorumlanan False değerini döndürür.
isaacg

4

R, 95 karakter

g=function(a,r){n=1;for(i in 1:nchar(r)){s=substr(r,i,i);if(s=='L'){a=a-n;n=n*2}else{a=a+n;n=1};if(n>a)break};a}

Girintili'ye:

g=function(a,r){
    n=1
    for(i in 1:nchar(r)){
        s=substr(r,i,i)
        if(s=='L'){
            a=a-n
            n=n*2
            }else{
                a=a+n
                n=1
                }
        if(n>a)break
        }
    a
    }

Kullanımı:

> g(15,'LLWLLLL')
[1] 1
> g(20,'WLLW')
[1] 22
> g(13,'LLWLLLLWWLWWWLWLWW')
[1] 7

3

J - 63 55 karakter

Şimdi yanlış olmama bonusu ile! Hatta eskisi kadar uzun.

((+/\@,(0{<#[)_,~|@]);@('W'<@(2^i.@#);.1@,}:)*_1^=&'L')

Başlangıçtaki para miktarını sol argüman olarak alır ve sağdaki kazanç / kayıp çizgisini alır.

Açıklama: Program, her ikisi de aşağıda ayrıntıları verilen iki işlevden oluşan bir kompozisyon gibi eşit bir şekilde bölünür. Birincisi, kazanma / kaybetme çizgisini bahislerin değerlerine, karşılık gelen işaretle dönüştürür ve ikincisi aslında ilk para ve bu dönüştürülmüş kazanma / kaybetme çizgisi verilen cevabı bulur.

;@('W'<@(2^i.@#);.1@,}:)*_1^=&'L'   NB. win/loss as sole argument
                         _1^=&'L'   NB. -1 for every L, +1 for W
      <@(      );.1                 NB. split vector into streaks:
   'W'              ,}:             NB.  cut on wins, shift right by 1
         2^i.@#                     NB. for each, make doubling run
;@(                    )*           NB. unsplit, multiply by signs

(+/\@,(0{<#[)_,~|@])   NB. money on left, above result on right
                |@]    NB. absolute value of bets 
             _,~       NB. append infinity to end
 +/\@,                 NB. partial sums with initial money
      (  <  )          NB. 1 whenever money in account < bet
          #[           NB. select those money values corresp. to 1s
       0{              NB. take first such item

Kısmi toplamları almadan önce parayı bahislerin önüne koyarız, ancak sonsuz bahsi bahis değerleri listesinin sonuna ekleriz. Hesabın değerini bir sonraki bahsin üstüne geçiren şey budur ve sonsuzluğu kullanmak her zaman bir catch-all olarak son öğeye sahip olmamızı sağlar.

Kullanımı:

   15 ((+/\@,(0{<#[)_,~|@]);@('W'<@(2^i.@#);.1@,}:)*_1^=&'L') 'LLLWLLLL'
1
   NB. naming for convenience
   f =: ((+/\@,(0{<#[)_,~|@]);@('W'<@(2^i.@#);.1@,}:)*_1^=&'L')
   20 f 'WLLW'
22
   2 f 'LW'
1
   13 f 'LLWLLLLWWLWWWLWLWW'
7
   12 13 14 15 28 29 30 31 (f"0 _) 'LLWLLLLWWLWWWLWLWW'  NB. for each left argument
6 7 0 1 14 15 39 40

2
Kodunuzu test ettim ve ayrıca test durumu için 3 döndürür 2 LW. Ne yazık ki ilk kayıptan sonra ikinci koşuya bahis yapmak için yeterli paranız yok.
Howard

İle 14 f 'LLWLLLLWWLWWWLWLWW', bu diziyi olsun: 14, 13, 11, 15, 14, 12, 8, 0,..at 0, biz teklife yeterince param yok, bu yüzden programın çıktısı olmalıdır 0.
Justin

Bu kod şimdi doğru mu? Bir kazanan belirlemem gerekiyor ve bir J derleyicisine sahip değilim (ne de deneyime başlama zamanı).
TheSoftwareJedi

@TheSoftwareJedi Evet, doğru. Aslında, j yorumlayıcısının tryj.tk'de deneyebileceğiniz çevrimiçi bir Javascript sürümü var .
algorithmmshark

Şimdi ikilem, Golfscript önemli mi ?!
TheSoftwareJedi

3

JavaScript (ECMAScript 6 Taslak) - 62 51 50 Karakter (işlev gövdesinde)

function g(a,r,t=0,b=1)
a>=b&&(c=r[t])?g((c=c>'L')?a+b:a-b,r,t+1,c||2*b):a

gİki argümanla özyinelemeli bir işlev tanımlar :

  • a- Şu anda sahip olduğunuz para miktarı; ve
  • r - kazanç / kayıp dizisi.

Ve iki isteğe bağlı argüman:

  • t- mevcut bahis turunun endeksi (başlangıçta 0)
  • b- geçerli bahis için para miktarı (yine başlangıçta 1).

Ungolfed:

function g(a,r,t=0,b=1){      // declare a function g with arguments a,r,t,b where
                              // t defaults to 0 and b defaults to 1
c = r[t];                     // get the character in the win/loss string for the current
                              // round.
if (   a>=b                   // check if we have enough money
    && c )                    // and if the string has not ended
{
  if ( c > 'L' )              // check if we've won the round
  {
    return g(a+b,r,t+1,1);    // if so call g again adding the winnings and resetting the
                              // cost.
  } else {
    return g(a-b,r,t+1,2*b);  // otherwise, subtract from the total money and double the
                              // cost.
  }
} else {
  return a;                   // If we've run out of money or got to the end then return
                              // the current total.
}}

JavaScript (ECMAScript 6) - 61 58 54 Karakterler (işlev gövdesinde)

function g(a,r)
(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)

Açıklama:

(b=1,                        // Initialise the cost to 1
 [                           // for each character x of r using array comprehension
     b=
       b>a?b                 // if we have run out of money do b=b
       :x>'L'?(a+=b,1)       // else if we've won collect the winnings and reset b=1
             :(a-=b,2*b)     // else subtract the cost from the total money and double
                             // the cost for next round.
  for(x of r)]               // Repeat for each character
                             // array.
,a)                          // Finally, return a.

Testler

console.log(g(0,'LLLLLWWLWWLW')) // 0
console.log(g(1,'WWWLLLWWWWLLWW')) //1
console.log(g(2,'LLWLWWWWWWWL')) //1
console.log(g(3,'WWWWWWWLLLWL')) //3
console.log(g(4,'LWWLWLWWWL')) //9
console.log(g(5,'LLLWWWLLWLWW')) //2
console.log(g(6,'LWLLLLWWLWWW')) //0
console.log(g(7,'WWLWWLLLWLWLW')) //4
console.log(g(8,'WWLWWLLWLWL')) //13
console.log(g(9,'WWWLLLWLLWLWWW')) //5
console.log(g(10,'WLWLLWWWWWWWL')) //18
console.log(g(11,'WLWLWLWLLLWLLW')) //17
console.log(g(12,'WWLWWWLLWL')) //17
console.log(g(13,'WWWWLWLWWW')) //21
console.log(g(15,'LLLW')) //16
console.log(g(15,'LLLL')) //0
console.log(g(14,'LLLL')) //7
console.log(g(2,'LW')) //1
console.log(g(2,'LL')) //1
console.log(g(2,'WLL')) //0

3 bayt değiştirerek kaydedebilirsiniz b=1,r.split('').map(için[b=1].map.call(r,
nderscore

Teşekkürler, String'i doğrudan bu şekilde manipüle etmeyi düşünmemiştim.
MT0

Dizi anlama kullanarak başka bir 4 bayt doğrayın :)(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)
nderscore

-1 bayt:a>=b&&(c=r[t])?g((c=c>'L')?a+b:a-b,r,t+1,c||2*b):a
nderscore

1

Python, 74 bayt

def g(a,r,b=1):
 for l in r:
  if l>"L":a+=b;b=1
  else:a-=b;b*=2
 return a

Ben (başlangıçta sahip olduğunuz para miktarı) ve r (bahislerin sonuçlarıdır) alan g işlevini tanımladım. İlk bahis miktarını 1'de ilklendirir. Sonra, bahislerin her sonucu için, eğer bir kazanç ("W" cinsinden r), parayı kazanırsınız ve bahis 1'e geri döner. Sonunda sahip olduğunuz parayı geri verir. Bu şekilde kullanabilirsiniz:

print g(20,"WLLW") # 22
print g(15,"LLLWLLLL") # 1

Bu daha da golf olabilir düşünüyorum.


Bu temelde codegolf.stackexchange.com/a/26238/9498'in bir kopyasıdır .
Justin

1

C, 107 karakter

f(int a,char*r,int n){return*r&&n<a?*r<77?f(a-n,r+1,n*2):f(a+n,r+1,1):a;}g(int a, char*r){return f(a,r,1);}

Çoğu zaman uygulama daha kısa olduğu için burada özyinelemeli bir işlev kullanıyorum. Ama burada durumdan emin değilim, çünkü fonksiyonum aslında sadece 2 argüman almak için ek bir sarmalayıcı işlevi yapmam gerekiyordu. İşlevdeki üçüncü argüman fmevcut bahis (akümülatör) için gereklidir.

Sarıcı işlevi olmadan bu çözüm sadece 73 karakter uzunluğunda olurdu, ancak doğru sonucu elde etmek için 1 değerine (inital bahis) ek bir parametre iletmeniz gerekir.

ungolfed:

f(int a,char*r,int n){
    return *r&&n<a
                ?*r<77
                    ?f(a-n,r+1,n*2)
                    :f(a+n,r+1,1)
                :a;
}
g(int a,char*r){
    return f(a,r,1);
}

1

C, 90

g(int a,char*r){int c=1;while(*r){*r++%2?c=1,a++:(c*=2);if(c>a){c/=2;break;}}return++a-c;}

1

Javascript, 63

function g(a,s){x=1;for(i in s)if(x<=a)s[i]>'L'?(a+=x,x=1):(a-=x,x*=2);return a}

Örnek çalışmalar:

console.log(g(15, 'LLLWLLLL'));  //1
console.log(g(20, 'WLLW'));  //22
console.log(g(13, 'LLWLLLLWWLWWWLWLWW')); //7

Günlük kaydı ile JSFiddle

Ungolfed:

function g(a,s){
  x=1;                //bet starts at 1
  for(i in s)         //loop through win/lose string
    if(x<=a)          //check if we still have money to bet
      s[i]>'L'?
        (a+=x,x=1):   //win: add the bet amount to your total, and reset bet to 1
        (a-=x,x*=2);  //lose: subtract the bet amount from your total, and double your bet
  return a            //return your money
}

1

Javascript ( ES5 ) 69 64 İşlev içinde 60 bayt

function g(a,r){b=1;for(i in r)b=b>a?b:r[i]>'L'?(a+=b,1):(a-=b,b*2);return a}

Varyasyon: ( aynı uzunluk )

function g(a,r,b){for(i in r)b=b?b>a?b:r[i]>'L'?(a+=b,1):(a-=b,b*2):1;return a}

Test vakaları: ( plannapus çözeltisinden alınır )

g(15,'LLWLLLL'); // 1
g(20,'WLLW'); // 22
g(13,'LLWLLLLWWLWWWLWLWW'); // 7

g(20,'WLLW')FireFox konsolumda 25 döndürür - for...indöngü dizede üç ekstra özellik alır ve bunların üzerinde de yinelenir.
MT0

@ MT0, Firefox konsolumda da aynı şey oluyor. Ancak yeni bir özel tarama penceresi 22açarsam konsoluma girerim. Konsept açıldığında açık olan sitenin Stringprototipi değiştirdiğini düşünmek olabilir . Stackexchange bunu değiştirdiğini ve üç ekstra işlev eklediğini biliyorum.
Danny

Nedense, yeni bir sekmede olmaz: i.imgur.com/BgSUSIe.png
nderscore

1

Haskell, 62

g a=fst.foldl(\(t,b)l->if l=='W'then(t+b,1)else(t-b,2*t))(a,1)

veya her iki argümanla (65 karakter):

g a r=fst$foldl(\(t,b)l->if l=='W'then(t+b,1)else(t-b,2*t))(a,1)r

Unutmayın g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r(69):

g a r=a+1+l(filter(=='W')r)-2^l(takeWhile(/='W')(reverse r))
l=length

Bu sadece kısmi bir çözümdür. Oyuncu parası bittiğinde durumu kapsamaz.
Petr Pudlák

Bu soruna, bahisçinin olumsuz olmasını sağlayan birçok çözüm vardır. Sorun, durumun böyle olup olmadığını kontrol etmek zorunda olduğunuzu asla belirtmedi.
Zaq

@zaq Aslında evet, soru açıkça böyle olduğunu belirtti.
TheSoftwareJedi

1

Python 2-65 bayt

Şimdi mevcut en iyi Python çözümü tarafından dövüldü, ancak paylaşamam:

def g(r,a,b=1):
    if r>"">a>=b:a=g(r[1:],*[(a+b,1),(a-b,b*2)][r[0]<"W"])
    return a

Diğer bazı Python çözümleri olarak, bişlev tanımının dışında bildirmek için işlev bağımsız değişkenlerini kullanıyorum , ancak işlev özyinelemeli olduğundan, bu aslında burada golf dışında bir amaca hizmet eder.

Ayrıca, grubun işlev bağımsız değişkenlerine açılması için işlev bağımsız değişkenlerinin sırasını değiştirmem gerekiyordu .

Merak ediyorsanız r>"">a>=b, kısadır r and a>=b.


1

Ruby, 76 64 (işlev gövdesinde) bayt

EDIT: 3 bayt kaldırarak cevabı geliştirdi:

n=1;r.each_char{|c|;c>'L'?(a+=n;n=1):(a-=n;n*=2);break if n>a};a



func (82 bayt) kullanarak:

def g(a,r);n=1;r.each_char{|c|;c>'L'?(a,n=a+n,1):(a,n=a-n,n*2);break if n>a};a;end

lambda (76 bayt) kullanarak:

g=->a,r{n=1;r.each_char{|c|;c>'L'?(a,n=a+n,1):(a,n=a-n,n*2);break if n>a};a}

koşmak :

p g.call(15, 'LLLWLLLL') # 1
p g.call(20, 'WLLW') # 22
p g.call(13, 'LLWLLLLWWLWWWLWLWW') # 7

1

C #, yöntem içinde 74 karakter

Bu sitedeki ilk girişimim ...

int b=1;foreach(var c in r)if(b<=a){a+=c>'L'?b:-b;b=c>'L'?1:b*2;}return a;

Veya daha okunabilir:

int bet = 1;
foreach (var chr in r)
{                       // these brackets are left out in short version
   if (bet <= a)
   {
       a += chr > 'L' ? bet : -bet;
       bet = chr > 'L' ? 1 : bet * 2;
   }
}
return a;

Oldukça naif, o kadar çok numara değil ... esas olarak char ordinal ve string numaralandırılabilir olmak yararlanan. Oyuncunun parası bittiğinde fazladan döngü yaparak birkaç karakter kaydetme


1

Golfscript, 51 41 36 35 bayt

İç fonksiyon

1\{@2$-@2*@(1&{@@+1@}*.3$3$<!*}do;;

Bu, pozitif miktarda para ile başladığımızı ve kazanç-kayıp dizesinin boş olmayacağını varsayar, böylece en az bir bahis yapılabilir.

Misal

{
  # Push initial bet amount.
  1\
  # STACK: Money Bet Outcomes
  {
    # Subtract bet amount from money.
    @2$-
    # STACK: Bet Outcomes Money
    # Double bet amount.
    @2*
    # STACK: Outcomes Money Bet
    # Remove first character from win-loss string and check if its ASCII code is odd.
    @(1&
    # STACK: Money Bet Outcomes Boolean
    # If it is, we've won, so add the doubled bet amount to the money and push 1 as the
    # new bet amont.
    {@@+1@}*
    # STACK: Money Bet Outcomes
    # Duplicate win-loss string, bet amonut and money.
    .3$3$
    # STACK: Money Bet Outcomes Outcomes Bet Money
    # If the next bet amount is less than our money and the win-loss string is not empty,
    # repeat the loop.
    <!*
    # STACK: Money Bet Outcomes Boolean
  }do
  # STACK: Money Bet Outcomes
  ;;
  # STACK: Money
}:f                                      # Define function.

];                                       # Clear stack.

20 'WLLW'               f
2  'LW'                 f
13 'LLWLLLLWWLWWWLWLWW' f
14 'LLWLLLLWWLWWWLWLWW' f

]p                                       # Print results as array.

verir

[22 1 7 0]

Çevrimiçi deneyin.


1

C #, 123

return q.Aggregate(new{b=1,c=w,x=1},(l,o)=>l.x<0?l:o=='W'?new{b=1,c=l.c+l.b,x=1}:new{b=l.b*2,c=l.c-l.b,x=l.c-l.b-l.b*2}).c;

.NET Keman

Açıklayan bir blog yazısı


Bu iki bağlantıyı kodla birlikte göndermek yerine, açıklamaları buraya getirin.
Justin

Erkek olmak isterdim ve AM'de düzenleyeceğim. Acele et ve çile bitirdi. Bir süredir SO'da aktif değilim, artık bebeklik döneminde olmadığını kabul ettiğim için yanımda ol. :)
TheSoftwareJedi

.NET Fiddle'ınıza göre, argümanlarınızı geri alırsınız. Buna izin veriliyor mu?
Justin

İşlev tanımını sorudaki çözümle alakasız hale getirmiştim. Keman, cevabın bir parçası değildir, sadece onu yürütmenin bir yoludur.
TheSoftwareJedi


0

Ruby, 84 karakter

def g(a,r,n=1)
return a if !r[0]||n>a
s=r[1..-1]
r[0]<?M?g(a-n,s,n*2):g(a+n,s,1)
end

C'deki diğer cevabımla aynı yaklaşım, ama Code-Golfing için yakut denemek istedim. C sürümünün avantajı, bir sarıcı işlevi oluşturmam gerekmiyor, sadece parametreler için varsayılan değerleri kullanabilirim.


0

K, 76

g:{x+/-1_last'{(,1_*x),(("LW"!/:((2*;{1});(-:;::)))@\:**x)@\:x 1}\[(y;1;0)]}

.

k)g[15;"LLLWLLLL"]
1
k)g[20;"WLLW"]
22
k)g[50;"WLLLWLWLWLWLW"]
56

0

Python, 86

def y(a,s):
 for l in s.split('W'):
    a+=1;k=2**len(l)
    if k>a:return int(bin(a)[3:],2)
 return a-k

Bunun en kısa çözüme yakın bir yerde olmadığını biliyorum, ancak bireysel bahislerden ziyade kayıp çizgilerini yineleyen farklı bir yaklaşım göstermek istedim. int(bin(a)[3:],2)tamsayı asilinmiş ikili temsilinden en önemli biti verir , bu da kişinin artık daha fazla bahis yapamayana kadar artan güçlerini kaybettikten sonra sahip olacağı para miktarıdır, çünkü a şu anda kendisinden 1 daha yüksektir gerçek para miktarı. Bu versiyon ilk sermayenin pozitif olduğunu varsayar.


0

C - 64 59 (İç fonksiyon)

Yine başka bir C cevabı. Değişkenin değerinin yığın üzerinde kalması avantajından yararlanır. Bu yüzden bazı derleyicilerde başarısızım, ancak test ettiğim her yerde düzgün çalıştı. Ayrıca, %2bir karakteri kurtarmak için tia'dan aldım . Afedersiniz!

f(int s,char*r){
    int a=1;
    for(;*r&&(*r++%2?s+=a,a=1:s<a?0:(s-=a,a*=2)););
    a=s;
}

0

Parti - 212

@echo off&setlocal enabledelayedexpansion&set r=%2&set a=%1&set c=1&powershell "&{'%2'.length-1}">f&set/pl=<f
for /l %%a in (0,1,%l%)do if "!r:~%%a,1!"=="L" (set/aa-=!c!&set/ac*=2) else set/aa+=!c!&set c=1
echo %a%

Örnek -

H:\uprof>bet.bat 15 LLLWLLLL
1

0

Japt , 38 bayt

V¬r@Z=WX<Z?X:Y¶'L?W=ZÑX-Z:(W=1X+Z}UW=1

Dene

Muhtemelen bazı golf ihtiyacı var :) Ama doğru sonuçlar elde gibi görünüyor.

NOT Bu, ekleyerek bir işleve dönüştürmek için önemsiz olan tam bir programdır.UV{ . İşlevin içindeki bayt sayısı aynı olacaktır.

Aktarılan JS Açıklaması:

// V: input string of W's and L's
V
  // split V into an array of characters
  .q()
  // reduce
  .r(function(X, Y, Z) {
    return
      // W contains the current bet,
      // save it to a temp variable Z
      Z = W,
      // do we have enough to bet?
      X < Z
        // not enough to bet, return the previous amount
        ? X
         // we can bet, did we lose this round
         : Y === "L"
           // we lost, increment bet and decrease holdings
           ? (W = Z * 2, X - Z)
           // we won, reset bet and increase holdings
           : (W = 1, X + Z)
   },
   // U: initial holdings
   U,
   // initialize bet to 1
   W = 1
 )


Bu sorunun bir "işlev" yazmanız gereken garip bir gereksinimi vardır. Muhtemelen cevabımı bir fonksiyona çevirmeliyim, ama ekstra baytlardan bazılarının gerekli olduğunu düşünüyorum. Bu muhtemelen iyi olur: petershaggynoble.github.io/Japt-Interpreter/…
dana

0

PowerShell , 68 81 bayt

param($n,$s)$w=1;$s|% t*y|%{if($n-ge$w){$n+=(-$w,$w)[$_%2];$w/=(.5,$w)[$_%2]}};$n

Çevrimiçi deneyin!

Bu zorluğun bazı çok garip ödevlere ihtiyacı var, yani büyük bir güncellemeyi bir araya getiremedim. ASCII'de 'W' 87 ve 'L' 76 olduğu gerçeğini kullanır, böylece 2 ile modifikasyon size kolay doğru / yanlış değerlere erişmenizi sağlar. |% t*ystandart toCharArray kısayoludur ve bölümü kullanarak bahsi güncellemek, bulabildiğim en ucuz yol olduğu ortaya çıktı (bir kayıpta yarıya böler (ikiye katlar) veya bir kazançta kendi kendine böler (1 olarak ayarlanır) ).

Artı birçok bayt çünkü kısıtlamayı kaçırdım. Yama aşağı golf üzerinde çalışacak


0

05AB1E , 19 bayt

vDX@iy'WQiX+1UëXxU-

Port of @Howard'ın GolfScript cevabı , bu yüzden onu da oyladığınızdan emin olun!

05AB1E'nin herhangi bir işlevi olmadığını unutmayın, bu yüzden bunun yerine tam bir programdır.
Önce dize girdisini ve ikinci tamsayı girdisini (STDIN'de ayrılmış yeni satır) alır.

Çevrimiçi deneyin veya daha fazla test vakası doğrulayın .

Açıklama:

v               # Loop over each character `y` of the (implicit) input-string:
 D              #  Duplicate the current integer
                #  (which is the implicit input-integer in the first iteration)
  X@i           #  If the integer is larger than or equal to variable `X`:
                #  (NOTE: variable `X` is 1 by default)
     y'WQi     '#   If the current character `y` is a 'W':
          X+    #    Increase the integer by `X`
          1U    #    And reset variable `X` to 1
         ë      #   Else (the current character `y` is an 'L' instead):
          X  -  #    Decrease the integer by `X`
           xU   #    And set variable `X` to double its current value
                # (the integer at the top of the stack is implicitly output after the loop)
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.