Taruhan Incremental


19

Beberapa bulan yang lalu saya memiliki pertanyaan ini sebagai teka-teki pra-pemutaran untuk wawancara. Baru-baru ini ketika berpikir tentang materi blog, itu muncul di kepala saya sebagai contoh yang baik untuk digunakan untuk memecahkan masalah secara fungsional. Saya akan memposting solusi saya untuk ini segera setelah saya selesai menulis posting blog saya.

CATATAN: Pertanyaan ini ditanyakan pada StackOverflow setahun yang lalu , dan diturunkan setelah beberapa (salah) jawaban. Saya menganggap itu telah dibatalkan karena wawancara yang jelas atau pertanyaan pekerjaan rumah. Jawaban kami di sini harus berupa kode golf yang cukup dalam agar seseorang tidak berpikir untuk menggunakannya!


Dalam perlombaan, Anda bertaruh menggunakan strategi berikut. Setiap kali Anda kehilangan taruhan, Anda menggandakan nilai taruhan untuk putaran berikutnya. Setiap kali Anda menang, taruhan untuk putaran berikutnya adalah satu dolar. Anda memulai putaran dengan bertaruh satu dolar.

Misalnya, jika Anda mulai dengan 20 dolar, dan Anda memenangkan taruhan di babak pertama, kalah taruhan di dua putaran berikutnya dan kemudian memenangkan taruhan di babak keempat, Anda akan berakhir dengan 20 + 1-1-2 +4 = 22 dolar.

Anda diharapkan untuk menyelesaikan fungsi g,, yang mengambil dua argumen:

  1. Argumen pertama adalah bilangan bulat ayang merupakan jumlah uang awal yang kami miliki saat kami memulai taruhan.
  2. Argumen kedua adalah string r. Karakter hasil h akan berupa 'W' (menang) atau 'L' (kalah), menunjukkan hasil dari putaran ke-i.

Fungsi Anda harus mengembalikan jumlah uang yang akan Anda miliki setelah semua putaran dimainkan.

Jika pada titik tertentu Anda tidak memiliki cukup uang di akun untuk menutupi nilai taruhan, Anda harus berhenti dan mengembalikan jumlah yang Anda miliki pada saat itu.

Contoh dijalankan

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

Fungsi kembali 1dalam hal ini

Pemenang ditentukan oleh jumlah karakter paling sedikit DI DALAM definisi fungsi tersirat. Bekerjasama dengan bahasa jika diinginkan. Saya tahu milik saya dapat ditingkatkan!


Semua pertanyaan di situs ini harus memiliki kriteria kemenangan yang objektif . Anda tidak menyebutkan apa yang menentukan pemenang tantangan.
Howard

1
Selain itu, Anda menyatakan bahwa fungsi Anda harus mengembalikan jumlah uang yang akan Anda miliki setelah semua putaran dimainkan. meskipun Anda menunjukkan informasi yang jauh lebih terperinci di bagian output yang diharapkan . Manakah perilaku fungsi yang diinginkan?
Howard

Juga, jika setiap tag yang Anda gunakan adalah salah satu yang Anda buat hanya untuk pertanyaan, ada sesuatu yang salah.
Justin

1
Menilai dari "Jawaban kami di sini harus kode golf cukup dalam bagi seseorang untuk tidak memikirkan menggunakannya!", Saya pikir Anda menginginkan [kode-golf], jadi saya menandainya seperti itu. Juga, saya menyesuaikan "Contoh Output" menjadi "Contoh Lari" agar lebih cocok dengan apa yang Anda inginkan.
Justin

@quincunx maaf, saya belum pernah memposting di sini tetapi menarik memposting banyak pertanyaan asli yang bermigrasi di sini ketika dibuat. Di satu sisi, saya salah satu alasan stackexchange ini dibuat. Saya pikir itu semua kode golf, dan baterai laptop saya sekarat jadi saya terburu-buru untuk menyelesaikannya. Maaf. Malam yang panjang.
TheSoftwareJedi

Jawaban:


5

GolfScript, 33 karakter

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

Contoh ( online ):

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

Kode beranotasi:

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 byte

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

Sebut saja seperti: g(15,'LLLWLLLL').

Ini hanya loop melalui string, mengubah nilai uang yang kita miliki berdasarkan karakter.

Berikut adalah contoh program yang menjalankan tes pada fungsi ini:

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)

Output sampel:

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

Dengan sedikit perubahan pada tester, kita bisa mendapatkan keuntungan rata-rata dari banyak proses:

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)

Output sampel (butuh waktu cukup lama, karena kami memanggil waktu fungsi 5000000):

-0.0156148

Sunting: Terima kasih kepada Howard dan Danny untuk bermain golf lebih lanjut.

EDIT: sekarang program memeriksa apakah ada cukup uang untuk membuat taruhan. Ini sebenarnya menghemat byte.


Beberapa penghematan kecil: Anda dapat menggantinya c=='L'dengan c<'W'=. Anda juga dapat menulis b,n=((n,1),(-n,2*n))[c<'W']yang kemudian menghemat lebih banyak karakter ( if a<-b:break, a+=b).
Howard

@Hardard Hmm. Saya mencoba b,n=trik (dengan [s di luar), tetapi python mengeluh. Mari coba lagi.
Justin

Aneh, lihat di sini .
Howard

1
Bukankah if n<=adan menyelamatkan Anda beberapa arang karena Anda tidak harus melakukannya break?
Danny

1
@Quincinx: Tidak, <hanya berarti kurang dari. String diurutkan secara leksikografis, sehingga 'L' <'W' mengembalikan True, yang ditafsirkan sebagai 1, sedangkan 'W' <'W' mengembalikan False, yang ditafsirkan sebagai 0.
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}

Bertakuk:

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
    }

Pemakaian:

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

3

J - 63 55 char

Sekarang dengan bonus tambahan untuk tidak salah! Bahkan persis seperti sebelumnya.

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

Mengambil jumlah awal uang sebagai argumen kiri dan garis untung / rugi di sebelah kanan.

Penjelasan: Program ini terbagi rata menjadi sesuatu seperti komposisi dua fungsi, keduanya dirinci di bawah ini. Yang pertama mengubah kemenangan / kerugian beruntun menjadi nilai-nilai taruhan, dengan tanda yang sesuai, dan yang kedua benar-benar mencari tahu jawaban yang diberikan uang awal dan ini mengubah kemenangan / kerugian berurutan.

;@('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

Perhatikan bahwa kami menambahkan uang ke taruhan sebelum mengambil jumlah parsial, tetapi kami menambahkan taruhan tanpa batas ke akhir daftar nilai taruhan. Inilah yang menggeser nilai melampaui akun dari taruhan berikutnya, dan menggunakan infinity memungkinkan kita untuk selalu memiliki elemen terakhir sebagai catch-all.

Pemakaian:

   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
Saya menguji kode Anda dan juga mengembalikan 3 untuk test case 2 LW. Sayangnya setelah kekalahan pertama Anda tidak memiliki cukup uang untuk bertaruh untuk putaran kedua.
Howard

Dengan 14 f 'LLWLLLLWWLWWWLWLWW', kami mendapatkan urutan ini: 14, 13, 11, 15, 14, 12, 8, 0,..pada saat itu 0, kami tidak memiliki cukup uang untuk menawar, sehingga program akan menampilkan 0.
Justin

Apakah kode ini benar sekarang? Saya perlu menunjuk pemenang dan tidak memiliki kompiler J (atau waktu untuk memulai pengalaman).
TheSoftwareJedi

@TheSoftwareJedi Ya, itu benar. Sebenarnya ada versi Javascript online penafsir J, sekarang, bahwa Anda dapat mencoba di tryj.tk .
algorithmshark

Sekarang dilema, apakah Golfscript masuk akal ?!
TheSoftwareJedi

3

JavaScript (ECMAScript 6 Draft) - 62 51 50 Karakter (dalam badan fungsi)

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

Menentukan fungsi rekursif gdengan dua argumen:

  • a- jumlah uang saat ini yang Anda miliki; dan
  • r - untaian kemenangan / kerugian.

Dan dua argumen opsional:

  • t- indeks dari ronde pertaruhan saat ini (awalnya 0)
  • b- jumlah uang untuk taruhan saat ini (sekali lagi awalnya 1).

Tidak Disatukan:

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 Karakter (dalam badan fungsi)

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

Penjelasan:

(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.

Tes

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

Anda dapat menyimpan 3 byte perubahan b=1,r.split('').map(menjadi[b=1].map.call(r,
nderscore

Terima kasih, saya tidak mempertimbangkan memanipulasi String secara langsung seperti itu.
MT0

Cacah 4 byte lagi menggunakan pemahaman array :)(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)
nderscore

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

1

Python, 74 byte

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

Saya mendefinisikan fungsi g yang mengambil (jumlah uang yang Anda miliki di awal) dan r (yang merupakan hasil dari taruhan) Ini menginisialisasi jumlah taruhan pertama pada 1. Kemudian untuk setiap hasil taruhan, jika itu adalah menang ("W" dalam r) Anda mendapatkan uang dan taruhan kembali ke 1. Lain kali Anda kehilangan jumlah taruhan, dan jumlah untuk taruhan berikutnya berlipat ganda. Akhirnya mengembalikan uang yang Anda miliki. Anda bisa menggunakannya seperti ini:

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

Saya pikir ini bisa bermain golf lebih jauh.


Ini pada dasarnya adalah duplikat dari codegolf.stackexchange.com/a/26238/9498 .
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);}

Saya menggunakan fungsi rekursif di sini, karena sebagian besar waktu implementasi lebih pendek. Tetapi saya tidak begitu yakin apakah itu yang terjadi di sini, karena saya perlu membuat fungsi pembungkus tambahan sehingga fungsi saya sebenarnya hanya mengambil 2 argumen. Argumen ketiga dalam fungsi fdiperlukan untuk taruhan saat ini (akumulator).

Tanpa fungsi wrapper, solusi ini hanya akan memiliki 73 karakter, tetapi Anda harus melewati parameter tambahan dengan nilai 1 (taruhan awal) untuk mendapatkan hasil yang tepat.

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}

Sampel berjalan:

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

JSFiddle dg masuk

Tidak Disatukan:

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 60 byte dalam fungsi

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}

Variasi: ( panjang yang sama )

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 case: ( diambil dari solusi plannapus )

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

g(20,'WLLW')mengembalikan 25 di konsol FireFox saya - for...inloop mengambil tiga properti tambahan dalam string dan iterate atas mereka juga.
MT0

@ MT0 hal yang sama terjadi di konsol Firefox saya. Namun jika saya membuka jendela penjelajahan pribadi yang baru, saya masuk 22ke konsol saya. Berpikir mungkin beberapa situs yang Anda aktif ketika Anda memiliki konsol terbuka memodifikasi Stringprototipe. Saya tahu stackexchange memodifikasinya dan menambahkan tiga fungsi tambahan.
Danny

Untuk beberapa alasan, itu tidak terjadi dengan tab baru: 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)

atau dengan kedua argumen bernama (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

Perhatikan bahwa 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

Ini hanya solusi parsial. Ini tidak mencakup kasing ketika pemain kehabisan uang.
Petr Pudlák

Ada banyak solusi untuk masalah ini yang memungkinkan petaruh berada di negatif. Masalahnya tidak pernah menyatakan bahwa Anda harus memeriksa apakah ini masalahnya.
Zaq

@zaq Sebenarnya ya, pertanyaannya secara eksplisit menyatakan itu yang terjadi.
TheSoftwareJedi

1

Python 2 - 65 byte

Sekarang dikalahkan oleh solusi Python terbaik saat ini, tapi saya tidak bisa tidak membagikannya:

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

Seperti beberapa solusi Python lainnya, saya menggunakan argumen fungsi untuk menyatakan di bluar definisi fungsi, tetapi karena fungsinya rekursif, ini sebenarnya melayani beberapa tujuan selain bermain golf di sini.

Saya juga perlu mengubah urutan argumen fungsi agar tuple membongkar argumen fungsi agar berfungsi.

Jika Anda bertanya-tanya, r>"">a>=badalah kependekan dari r and a>=b.


1

Ruby, 76 64 (dalam fungsi tubuh) byte

EDIT: meningkatkan jawabannya dengan menghapus 3 byte:

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



menggunakan func (82 bytes):

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

menggunakan lambda (76 bytes):

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}

lari :

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

1

C #, 74 karakter di dalam metode

Upaya pertama saya di situs ini ...

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

Atau, lebih mudah dibaca:

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;

Cukup naif, tidak banyak trik ... terutama mengambil keuntungan dari char menjadi ordinal dan string menjadi enumerable. Menyimpan beberapa karakter dengan perulangan asing saat pemain kehabisan uang.


1

Golfscript, 51 41 36 35 byte

Fungsi batin

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

Ini mengasumsikan bahwa kita mulai dengan jumlah uang yang positif dan string untung-rugi akan kosong, sehingga setidaknya satu taruhan dapat dilakukan.

Contoh

{
  # 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.

memberi

[22 1 7 0]

Cobalah online.


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 Fiddle

Posting blog yang menjelaskan


Alih-alih hanya memposting dua tautan dengan kode, bawalah penjelasannya ke sini.
Justin

Saya suka pria, dan akan mengedit di pagi. Itu terburu-buru dan menyelesaikan cobaan. Saya sudah lama tidak aktif menggunakan SO, bersamaku karena saya menerima bahwa itu tidak lagi dalam masa pertumbuhan. :)
TheSoftwareJedi

Menurut .NET Fiddle Anda, Anda mengambil argumen Anda ke belakang. Apakah ini diizinkan?
Justin

Saya telah membuat definisi fungsi tidak relevan dengan solusi dalam pertanyaan. Biola bukan bagian dari jawaban, hanya cara untuk mengeksekusinya.
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

Pendekatan yang sama dengan jawaban saya yang lain di C, tetapi saya ingin mencoba ruby ​​untuk Code-Golfing. Keuntungan dari versi C adalah saya tidak perlu membuat fungsi wrapper, saya cukup menggunakan nilai default untuk parameter.


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

Saya tahu ini bukanlah solusi yang paling dekat, tetapi saya ingin menunjukkan pendekatan yang berbeda, yang lebih menekankan pada kerugian beruntun daripada taruhan individu. int(bin(a)[3:],2)memberikan bilangan bulat dengan bit paling signifikan dari representasi biner yang adihapus, yang merupakan jumlah uang yang akan dimiliki seseorang setelah kehilangan kekuatan 2 yang meningkat hingga dia tidak dapat lagi bertaruh, karena a saat ini 1 lebih tinggi daripada dia jumlah uang aktual. Versi ini mengasumsikan modal awal positif.


0

C - 64 59 (Fungsi bagian dalam)

Namun satu lagi jawaban C. Itu mengambil keuntungan dari fakta bahwa nilai variabel tetap di stack. Jadi ini saya gagal dengan beberapa kompiler, tetapi itu berfungsi dengan baik di mana pun saya menguji. Juga, saya mengambil %2dari tia untuk menyelamatkan karakter. Maaf!

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

Gelombang - 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%

Contoh -

H:\uprof>bet.bat 15 LLLWLLLL
1

0

Japt , 38 byte

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

Cobalah

Mungkin butuh golf :) Tapi sepertinya mendapatkan hasil yang benar.

CATATAN Ini adalah program lengkap yang sepele untuk berubah menjadi fungsi dengan menambahkan terlebih dahulu UV{. Jumlah byte di dalam fungsi akan sama.

Dijelaskan JS Dijelaskan:

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


Pertanyaan ini memiliki semacam persyaratan aneh bahwa Anda harus menulis "fungsi". Saya mungkin harus menerjemahkan jawaban saya ke suatu fungsi, tetapi saya pikir beberapa byte tambahan diperlukan. Ini mungkin akan baik-baik saja: petershaggynoble.github.io/Japt-Interpreter/…
dana

0

PowerShell , 68 81 byte

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

Cobalah online!

Tantangan ini membutuhkan beberapa tugas yang sangat canggung yang berarti saya tidak dapat membuat satu pembaruan besar secara bersamaan. Itu memang menggunakan fakta bahwa 'W' adalah 87 di ASCII dan 'L' adalah 76 sehingga modding by 2 memberi Anda akses ke nilai true / false yang mudah. |% t*yadalah cara pintas toCharArray standar dan memperbarui taruhan menggunakan pembagian ternyata cara termurah yang bisa saya temukan (membaginya menjadi setengah dari kerugian (menggandakannya), atau membaginya dengan sendirinya pada kemenangan (mengaturnya menjadi 1) ).

Ditambah banyak byte karena saya melewatkan kendala. Akan bekerja bermain golf di patch


0

05AB1E , 19 byte

vDX@iy'WQiX+1UëXxU-

Pelabuhan @Howard 's GolfScript jawaban , jadi pastikan untuk upvote dirinya juga!

Perhatikan bahwa 05AB1E tidak memiliki fungsi, jadi ini adalah program lengkap.
Mengambil input string terlebih dahulu, dan input integer kedua (baris baru dibatasi pada STDIN).

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.