การเดิมพันที่เพิ่มขึ้น


19

หลายเดือนที่ผ่านมาฉันมีคำถามนี้เป็นปริศนาการคัดกรองเบื้องต้นสำหรับการสัมภาษณ์ เมื่อเร็ว ๆ นี้เมื่อคิดเกี่ยวกับเนื้อหาบล็อกมันโผล่ในหัวของฉันเป็นตัวอย่างที่ดีที่จะใช้สำหรับการแก้ปัญหาการทำงาน ฉันจะโพสต์วิธีแก้ไขปัญหานี้ทันทีที่ฉันเขียนบทความในบล็อกเสร็จ

หมายเหตุ: คำถามนี้ถูกถามใน StackOverflow หนึ่งปีที่ผ่านมาและถูกลดระดับลงหลังจากคำตอบ (ไม่ถูกต้อง) สองสามข้อ ฉันคิดว่ามันถูกลดระดับลงเนื่องจากการสัมภาษณ์ที่ชัดเจนหรือคำถามการบ้าน คำตอบของเราที่นี่ควรเป็นรหัสกอล์ฟลึกพอสำหรับคนที่ไม่ต้องคิดใช้!


ในการแข่งขันคุณเดิมพันโดยใช้กลยุทธ์ต่อไปนี้ เมื่อใดก็ตามที่คุณแพ้การเดิมพันคุณจะเพิ่มมูลค่าของการเดิมพันในรอบถัดไป เมื่อใดก็ตามที่คุณชนะการเดิมพันรอบต่อไปจะเป็นหนึ่งดอลลาร์ คุณเริ่มรอบโดยการเดิมพันหนึ่งดอลลาร์

ตัวอย่างเช่นหากคุณเริ่มต้นด้วย 20 ดอลลาร์และคุณชนะการเดิมพันในรอบแรกแพ้การเดิมพันในสองรอบถัดไปจากนั้นชนะการเดิมพันในรอบที่สี่คุณจะจบด้วย 20 + 1-1-2 +4 = 22 ดอลลาร์

คุณคาดว่าจะทำให้ฟังก์ชันเสร็จสมบูรณ์gซึ่งใช้เวลาสองข้อโต้แย้ง:

  1. อาร์กิวเมนต์แรกคือเลขจำนวนเต็มaซึ่งเป็นเงินเริ่มต้นที่เรามีเมื่อเราเริ่มเดิมพัน
  2. rอาร์กิวเมนต์ที่สองเป็นสตริง ตัวละครของผลลัพธ์ที่ได้จะเป็น 'W' (ชนะ) หรือ 'L' (แพ้) แสดงถึงผลลัพธ์ของรอบที่ ith

ฟังก์ชั่นของคุณควรคืนจำนวนเงินที่คุณจะได้รับหลังจากเล่นรอบทั้งหมด

หาก ณ จุดหนึ่งคุณไม่มีเงินเพียงพอในบัญชีของคุณเพื่อครอบคลุมมูลค่าของการเดิมพันคุณต้องหยุดและคืนเงินที่คุณมี ณ จุดนั้น

วิ่งตัวอย่าง

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

ฟังก์ชันจะส่งคืน1ในกรณีนี้

ผู้ชนะจะถูกกำหนดโดยจำนวนอย่างน้อยตัวละครภายในของคำนิยามฟังก์ชั่นโดยนัย ให้ความร่วมมือตามภาษาหากต้องการ ฉันรู้ว่าฉันสามารถปรับปรุงได้!


คำถามทั้งหมดบนเว็บไซต์นี้จะต้องมีเกณฑ์ชนะวัตถุประสงค์ คุณไม่ได้พูดถึงสิ่งที่เป็นตัวกำหนดผู้ชนะการท้าทาย
Howard

1
ยิ่งกว่านั้นคุณระบุว่าหน้าที่ของคุณควรคืนจำนวนเงินที่คุณจะได้รับหลังจากเล่นรอบทั้งหมด แม้ว่าคุณจะแสดงข้อมูลโดยละเอียดมากขึ้นในส่วนผลลัพธ์ที่คาดหวัง พฤติกรรมใดที่ต้องการในฟังก์ชั่น
โฮเวิร์ด

นอกจากนี้หากทุกแท็กที่คุณใช้นั้นเป็นแท็กที่คุณสร้างขึ้นสำหรับคำถามนั้นมีบางอย่างผิดปกติ
Justin

1
ตัดสินจาก "คำตอบของเราที่นี่ควรเป็นรหัสกอล์ฟลึกพอสำหรับบางคนไม่ให้คิดเกี่ยวกับการใช้พวกเขา!" ฉันคิดว่าคุณต้องการ [รหัสกอล์ฟ] ดังนั้นฉันจึงติดแท็กเป็นเช่นนี้ นอกจากนี้ฉันปรับ "เอาท์พุทตัวอย่าง" เป็น "การเรียกใช้ตัวอย่าง" เพื่อให้ตรงกับสิ่งที่คุณต้องการ
Justin

@quincunx ขออภัยฉันไม่เคยโพสต์ที่นี่ แต่โพสต์คำถามที่น่าสนใจหลายคำถามที่ย้ายมาที่นี่เมื่อสร้างขึ้น ในทางฉันเป็นหนึ่งในเหตุผลที่การแลกเปลี่ยนนี้ถูกสร้างขึ้น ฉันคิดว่ามันเป็นรหัสกอล์ฟทั้งหมดและแบตเตอรี่แล็ปท็อปของฉันกำลังจะตายดังนั้นฉันจึงรีบไปจบ ขอโทษ คืนที่ยาวนาน.
TheSoftwareJedi

คำตอบ:


5

GolfScript, 33 ตัวอักษร

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

ตัวอย่าง ( ออนไลน์ ):

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

รหัสข้อเขียน:

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 ไบต์

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

เรียกมันว่าเป็นอย่างนั้น: g(15,'LLLWLLLL').

สิ่งนี้จะวนซ้ำไปตามสตริงเปลี่ยนค่าเงินที่เรามีตามตัวละคร

นี่คือตัวอย่างโปรแกรมที่รันการทดสอบกับฟังก์ชั่นนี้:

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)

ตัวอย่างผลลัพธ์:

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

ด้วยการเปลี่ยนแปลงเล็กน้อยในการทดสอบเราสามารถรับผลกำไรโดยเฉลี่ยของการวิ่งจำนวนมาก:

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)

เอาต์พุตตัวอย่าง (ใช้เวลาสักครู่เนื่องจากเรากำลังเรียกใช้ฟังก์ชัน5000000):

-0.0156148

แก้ไข: ขอบคุณ Howard และ Danny สำหรับการเล่นกอล์ฟต่อไป

แก้ไข: ตอนนี้โปรแกรมตรวจสอบว่ามีเงินเพียงพอที่จะทำการเดิมพันหรือไม่ วิธีนี้ช่วยประหยัดไบต์


บางส่วนเงินฝากออมทรัพย์เล็ก ๆ น้อย ๆ ที่คุณอาจแทนที่ด้วยc=='L' c<'W'=นอกจากนี้คุณยังสามารถเขียนb,n=((n,1),(-n,2*n))[c<'W']สิ่งที่จะช่วยให้คุณประหยัดอักขระได้มากขึ้น ( if a<-b:break, a+=b)
Howard

@ โฮวาร์ดอืม ฉันลองใช้b,n=เคล็ดลับ (โดยมี[s อยู่ด้านนอก) แต่หลามก็บ่น ลองอีกครั้ง
Justin

แปลกได้ดูที่นี่
Howard

1
จะไม่if n<=aและช่วยให้คุณประหยัดถ่านเพราะคุณจะไม่ต้องbreak?
Danny

1
@Quincinx: ไม่ <หมายถึงน้อยกว่า มีการจัดลำดับสตริงพจนานุกรมด้วยดังนั้น 'L' <'W' จะส่งกลับค่า True ซึ่งตีความเป็น 1 ในขณะที่ 'W' <'W' จะส่งกลับค่า False ซึ่งตีความว่าเป็น 0
isaacg

4

R, 95 ตัวอักษร

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}

เยื้อง:

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
    }

การใช้งาน:

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

3

J - 63 55 ถ่าน

ขณะนี้มีโบนัสเพิ่มของการไม่ถูกต้อง! มันยังคงเหมือนเดิมตราบนานเท่านาน

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

รับจำนวนเงินเริ่มต้นเป็นอาร์กิวเมนต์ด้านซ้ายและแนวชนะ / แพ้ทางด้านขวา

คำอธิบาย: โปรแกรมแยกส่วนอย่างเท่าเทียมกันเป็นองค์ประกอบของสองฟังก์ชันโดยมีรายละเอียดด้านล่าง ครั้งแรกที่เปลี่ยนชนะ / แพ้แนวเป็นค่าของการเดิมพันที่มีสัญญาณที่สอดคล้องกันและจากนั้นที่สองจริงตัวเลขคำตอบที่ได้รับเงินเริ่มต้นและแนวนี้ชนะ / แพ้แปลง

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

โปรดทราบว่าเราเติมเงินให้กับการเดิมพันก่อนที่จะรับเงินก้อนบางส่วน แต่เราผนวกเงินเดิมพันที่ไม่มีที่สิ้นสุดต่อท้ายรายการค่าการเดิมพัน นี่คือสิ่งที่เปลี่ยนแปลงมูลค่าของบัญชีที่มากเกินไปของการเดิมพันครั้งต่อไปและการใช้อินฟินิตี้ช่วยให้เรามีองค์ประกอบสุดท้ายเสมอที่จะถูกจับ

การใช้งาน:

   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
ผมทดสอบโค้ดของคุณและมันยังส่งกลับ 3 2 LWกรณีทดสอบ น่าเสียดายหลังจากการสูญเสียครั้งแรกคุณไม่มีเงินมากพอที่จะเดิมพันแม้กระทั่งสำหรับการวิ่งครั้งที่สอง
Howard

ด้วยการ14 f 'LLWLLLLWWLWWWLWLWW'ที่เราได้รับลำดับนี้: 14, 13, 11, 15, 14, 12, 8, 0,..ที่เราไม่ได้มีเงินมากพอที่จะเสนอราคาเพื่อให้โปรแกรมควรเอาท์พุท0 0
Justin

รหัสนี้ถูกต้องตอนนี้หรือไม่ ฉันต้องระบุผู้ชนะและไม่มีคอมไพเลอร์ J (ไม่มีเวลาในการเริ่มต้นประสบการณ์)
TheSoftwareJedi

@TheSoftwareJedi ใช่ถูกต้อง มีจริงรุ่น Javascript ออนไลน์ของล่าม J ตอนนี้ที่คุณสามารถลองที่tryj.tk
algorithmshark

ตอนนี้ภาวะที่กลืนไม่เข้าคายไม่ออก Golfscript นับหรือไม่!
TheSoftwareJedi

3

JavaScript (ฉบับร่าง ECMAScript 6) - 62 51 50 ตัวอักษร (ในส่วนของฟังก์ชั่น)

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ด้วยสองอาร์กิวเมนต์:

  • a- จำนวนเงินปัจจุบันที่คุณมี และ
  • r - สตริงของการชนะ / การสูญเสีย

และสองข้อโต้แย้งเพิ่มเติม:

  • t- ดัชนีรอบการเดิมพันปัจจุบัน (เริ่มแรก0)
  • b- จำนวนเงินสำหรับการเดิมพันปัจจุบัน (เริ่มต้นอีกครั้ง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 ตัวอักษร (ในส่วนของฟังก์ชั่น)

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

คำอธิบาย:

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

การทดสอบ

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 ไบต์b=1,r.split('').map(เพื่อเปลี่ยนเป็น[b=1].map.call(r,
nderscore

ขอบคุณฉันไม่คิดว่าจะจัดการกับสตริงโดยตรงแบบนั้น
MT0

สับอีก 4 ไบต์โดยใช้ array comprehension :)(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)
nderscore

-1 ไบต์:a>=b&&(c=r[t])?g((c=c>'L')?a+b:a-b,r,t+1,c||2*b):a
ขีดล่าง

1

Python ขนาด 74 ไบต์

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

ฉันกำหนดฟังก์ชัน g ซึ่งใช้เวลา (จำนวนเงินที่คุณมีเมื่อเริ่มต้น) และ r (ซึ่งเป็นผลลัพธ์ของการเดิมพัน) มันเริ่มต้นจำนวนเงินของการเดิมพันครั้งแรกที่ 1 จากนั้นสำหรับแต่ละผลลัพธ์ของการเดิมพันหากเป็น a win ("W" in r) คุณได้รับเงินและการเดิมพันกลับมาที่ 1 มิฉะนั้นคุณจะเสียจำนวนเงินเดิมพันและจำนวนเงินสำหรับการเดิมพันครั้งต่อไปจะเพิ่มเป็นสองเท่า ในที่สุดมันก็คืนเงินที่คุณมี คุณสามารถใช้สิ่งนี้:

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

ฉันคิดว่านี่สามารถเล่นกอล์ฟได้อีก


นี้เป็นพื้นซ้ำcodegolf.stackexchange.com/a/26238/9498
Justin

1

C, 107 ตัวอักษร

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

ฉันใช้ฟังก์ชันเรียกซ้ำที่นี่เพราะส่วนใหญ่เวลาใช้งานจะสั้นกว่า แต่ฉันไม่แน่ใจว่ามันเป็นอย่างนี้หรือเปล่าเพราะฉันต้องการสร้างฟังก์ชั่น wrapper เพิ่มเติมเพื่อที่ว่าฟังก์ชั่นของฉันจะใช้แค่ 2 อาร์กิวเมนต์เท่านั้น อาร์กิวเมนต์ที่สามในฟังก์ชันfจำเป็นสำหรับการเดิมพันปัจจุบัน (ตัวสะสม)

หากไม่มีฟังก์ชั่น wrapper วิธีนี้จะมีความยาว 73 ตัวอักษร แต่คุณจะต้องผ่านพารามิเตอร์เพิ่มเติมด้วยค่า 1 (การเดิมพันเริ่มต้น) เพื่อให้ได้ผลลัพธ์ที่เหมาะสม

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

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}

ตัวอย่างการวิ่ง:

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

JSFiddle w / การบันทึก

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 60 ไบต์ภายในฟังก์ชัน

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}

รูปแบบ: ( ความยาวเดียวกัน )

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}

กรณีทดสอบ: ( นำมาจากสารละลายของ plannapus )

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

g(20,'WLLW')ส่งคืน 25 ในคอนโซล FireFox ของฉัน - for...inลูปรับคุณสมบัติพิเศษสามรายการในสตริงและวนซ้ำมันเช่นกัน
MT0

@ MT0 มีสิ่งเดียวกันเกิดขึ้นในคอนโซล Firefox ของฉัน อย่างไรก็ตามถ้าฉันเปิดหน้าต่างการเรียกดูแบบส่วนตัวใหม่ฉันจะได้รับ22ในคอนโซลของฉัน คิดว่าบางไซต์ที่คุณเปิดเมื่อคุณเปิดคอนโซลปรับเปลี่ยนStringต้นแบบ ฉันรู้ว่า stackexchange แก้ไขและเพิ่มฟังก์ชั่นพิเศษสามอย่าง
Danny

ด้วยเหตุผลบางอย่างมันไม่ได้เกิดขึ้นกับแท็บใหม่: 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)

หรือมีข้อโต้แย้งทั้งสองชื่อ (65 ตัวอักษร):

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

โปรดทราบว่า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

นี่เป็นเพียงวิธีการแก้ปัญหาบางส่วน มันไม่ครอบคลุมกรณีที่ผู้เล่นหมดเงิน
Petr Pudlák

มีวิธีแก้ไขปัญหานี้มากมายซึ่งทำให้นักพนันอยู่ในเชิงลบ ปัญหาไม่เคยระบุว่าคุณต้องตรวจสอบว่าเป็นกรณีนี้หรือไม่
Zaq

@zaq จริงแล้วใช่คำถามที่ระบุไว้อย่างชัดเจนว่าเป็นกรณี
TheSoftwareJedi

1

Python 2 - 65 ไบต์

ตอนนี้ถูกทุบด้วยโซลูชั่น Python ที่ดีที่สุดในปัจจุบัน แต่ฉันไม่สามารถแบ่งปันได้:

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

ในฐานะที่เป็นโซลูชั่น Python อื่น ๆ ฉันใช้อาร์กิวเมนต์ฟังก์ชั่นสำหรับการประกาศ bนอกนิยามฟังก์ชั่น แต่เมื่อฟังก์ชั่นซ้ำแล้วซ้ำอีกสิ่งนี้ให้บริการวัตถุประสงค์อื่นนอกเหนือจากการเล่นกอล์ฟที่นี่

ฉันยังต้องเปลี่ยนลำดับของฟังก์ชันอาร์กิวเมนต์เพื่อให้tuple ที่เปิดออกเป็นอาร์กิวเมนต์ของฟังก์ชันเพื่อทำงาน

ในกรณีที่คุณสงสัยสั้นสำหรับr>"">a>=br and a>=b


1

ทับทิม, 76 64 (ในส่วนของฟังก์ชัน) ไบต์

แก้ไข: ปรับปรุงคำตอบโดยการลบ 3 ไบต์:

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



ใช้ func (82 ไบต์):

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

ใช้แลมบ์ดา (76 ไบต์):

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}

วิ่ง :

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

1

วิธี C #, 74 ตัวอักษรภายใน

ความพยายามครั้งแรกของฉันในเว็บไซต์นี้ ...

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

หรืออ่านได้มากขึ้น:

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;

ไร้เดียงสาน่ารักไม่ใช่ว่ามีกลอุบายมากมาย ... โดยหลัก ๆ แล้วการใช้ประโยชน์จากถ่านเป็นอันดับและสายอักขระนับไม่ถ้วน ประหยัดอักขระสองสามตัวโดยการวนลูปนอกเมื่อผู้เล่นไม่มีเงิน


1

Golfscript, 51 41 36 35 ไบต์

ฟังก์ชั่นด้านใน

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

นี่ถือว่าเราเริ่มต้นด้วยจำนวนเงินที่เป็นบวกและสตริงการชนะจะไม่ว่างเปล่าเพื่อให้สามารถทำการเดิมพันอย่างน้อยหนึ่งครั้ง

ตัวอย่าง

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

จะช่วยให้

[22 1 7 0]

ลองออนไลน์


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 ซอ

โพสต์บล็อกอธิบาย


แทนที่จะโพสต์ลิงก์ทั้งสองพร้อมรหัสให้นำคำอธิบายมาไว้ตรงนี้
Justin

ฉันชอบผู้ชายและจะแก้ไขใน AM มันเป็นเรื่องเร่งรีบและเสร็จสิ้นการทดสอบ ฉันไม่ได้ใช้งาน SO ดังนั้นในขณะที่ทนกับฉันเพราะฉันยอมรับว่ามันไม่ได้อยู่ในวัยเด็กอีกต่อไป :)
TheSoftwareJedi

ตาม. NET Fiddle ของคุณคุณกำลังโต้แย้งของคุณไปข้างหลัง สิ่งนี้ได้รับอนุญาตหรือไม่?
Justin

ฉันต้องการนิยามฟังก์ชันที่ไม่เกี่ยวข้องกับวิธีแก้ปัญหาในคำถาม ซอไม่ได้เป็นส่วนหนึ่งของคำตอบเพียงวิธีดำเนินการ
TheSoftwareJedi


0

Ruby, 84 ตัวอักษร

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 แต่ฉันต้องการลองทับทิมสำหรับ Code-Golfing ข้อดีของรุ่น C คือฉันไม่จำเป็นต้องสร้างฟังก์ชั่น wrapper ฉันสามารถใช้ค่าเริ่มต้นสำหรับพารามิเตอร์ได้


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

ฉันรู้ว่านี่ไม่มีที่ไหนใกล้ทางออกที่สั้นที่สุด แต่ฉันต้องการแสดงให้เห็นถึงวิธีการที่แตกต่างกันซึ่งจะทำซ้ำมากกว่าการสูญเสียมากกว่าการเดิมพันแบบเดี่ยว int(bin(a)[3:],2)ให้จำนวนเต็มกับบิตที่สำคัญที่สุดจากการเป็นตัวแทนไบนารีของการaลบซึ่งเป็นจำนวนเงินที่บุคคลจะมีหลังจากสูญเสียพลังที่เพิ่มขึ้นของ 2 จนกว่าเขาหรือเธอจะไม่สามารถเดิมพันได้อีกต่อไปเพราะปัจจุบันคือ 1 สูงกว่าของเขาหรือเธอ จำนวนเงินจริง รุ่นนี้จะถือว่าทุนเริ่มต้นเป็นบวก


0

ค - 64 59 (ฟังก์ชั่นภายใน)

อีกคำตอบ C ใช้ประโยชน์จากความจริงที่ว่าค่าของตัวแปรยังคงอยู่ในสแต็ก ดังนั้นนี่คือความล้มเหลวของฉันกับคอมไพเลอร์บางส่วน แต่มันทำงานได้อย่างถูกต้องทุกที่ที่ฉันทดสอบ นอกจากนี้ฉันยังเอา%2จากเตี้ยเพื่อบันทึกตัวละคร ขออภัย!

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

รุ่นที่ - 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%

ตัวอย่าง -

H:\uprof>bet.bat 15 LLLWLLLL
1

0

Japtap , 38 ไบต์

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

ลองมัน

อาจต้องมีการเล่นกอล์ฟ :) แต่ดูเหมือนว่าจะได้ผลลัพธ์ที่ถูกต้อง

บันทึกนี่เป็นโปรแกรมเต็มรูปแบบที่ไม่สำคัญที่จะเปลี่ยนเป็นฟังก์ชั่นโดยการเติมUV{prepending จำนวนไบต์ภายในฟังก์ชั่นจะเท่ากัน

Transpiled JS อธิบาย:

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


คำถามนี้มีข้อกำหนดแปลก ๆ ที่คุณต้องเขียน "ฟังก์ชั่น" ฉันอาจแปลคำตอบของฉันเป็นฟังก์ชัน แต่ฉันคิดว่าจำเป็นต้องใช้ไบต์พิเศษบางอย่าง นี่อาจจะไม่เป็นไรแม้ว่า: petershaggynoble.github.io/Japt-Interpreter/ …
dana

0

PowerShell , 68 81 ไบต์

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

ลองออนไลน์!

ความท้าทายนี้ต้องการการมอบหมายที่น่าอึดอัดใจมากซึ่งหมายความว่าฉันไม่สามารถรวมการอัปเดตใหญ่ ๆ เข้าด้วยกันได้ มันใช้ความจริงที่ว่า 'W' คือ 87 ใน ASCII และ 'L' คือ 76 ดังนั้นการแก้ไขด้วย 2 ช่วยให้คุณเข้าถึงค่าจริง / เท็จได้ง่าย|% t*yเป็นทางลัดมาตรฐาน toCharArray และอัพเดทการเดิมพันโดยใช้การแบ่งออกเป็นวิธีที่ถูกที่สุดที่ฉันสามารถหาได้ (หารครึ่งด้วยการสูญเสียครึ่งหนึ่ง (เพิ่มเป็นสองเท่า) หรือหารด้วยตัวเองเมื่อชนะ (ตั้งค่าเป็น 1) )

บวกหลายไบต์เพราะฉันพลาดข้อ จำกัด จะทำงานเกี่ยวกับการเล่นกอล์ฟลงแพทช์


0

05AB1E , 19 ไบต์

vDX@iy'WQiX+1UëXxU-

คำตอบของGolfScript ที่ Port of @Howardดังนั้นอย่าลืมโหวตให้ดีเช่นกัน!

โปรดทราบว่า 05AB1E ไม่มีฟังก์ชั่นดังนั้นจึงเป็นโปรแกรมเต็มรูปแบบแทน
รับอินพุตสตริงก่อนและอินพุตจำนวนเต็มวินาที (คั่นด้วยบรรทัดใหม่ใน STDIN)

ลองออนไลน์หรือตรวจสอบกรณีทดสอบบางมากขึ้น

คำอธิบาย:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.