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:
- Argumen pertama adalah bilangan bulat
a
yang merupakan jumlah uang awal yang kami miliki saat kami memulai taruhan. - 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 1
dalam 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!
Jawaban:
GolfScript, 33 karakter
Contoh ( online ):
Kode beranotasi:
sumber
Python 2,
726862 byteSebut 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:
Output sampel:
Dengan sedikit perubahan pada tester, kita bisa mendapatkan keuntungan rata-rata dari banyak proses:
Output sampel (butuh waktu cukup lama, karena kami memanggil waktu fungsi
5000000
):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.
sumber
c=='L'
denganc<'W'=
. Anda juga dapat menulisb,n=((n,1),(-n,2*n))[c<'W']
yang kemudian menghemat lebih banyak karakter (if a<-b:break
,a+=b
).b,n=
trik (dengan[
s di luar), tetapi python mengeluh. Mari coba lagi.if n<=a
dan menyelamatkan Anda beberapa arang karena Anda tidak harus melakukannyabreak
?R, 95 karakter
Bertakuk:
Pemakaian:
sumber
J -
6355 charSekarang dengan bonus tambahan untuk tidak salah! Bahkan persis seperti sebelumnya.
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.
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:
sumber
2 LW
. Sayangnya setelah kekalahan pertama Anda tidak memiliki cukup uang untuk bertaruh untuk putaran kedua.14 f 'LLWLLLLWWLWWWLWLWW'
, kami mendapatkan urutan ini:14, 13, 11, 15, 14, 12, 8, 0,..
pada saat itu0
, kami tidak memiliki cukup uang untuk menawar, sehingga program akan menampilkan0
.JavaScript (ECMAScript 6 Draft) -
625150 Karakter (dalam badan fungsi)Menentukan fungsi rekursif
g
dengan dua argumen:a
- jumlah uang saat ini yang Anda miliki; danr
- untaian kemenangan / kerugian.Dan dua argumen opsional:
t
- indeks dari ronde pertaruhan saat ini (awalnya0
)b
- jumlah uang untuk taruhan saat ini (sekali lagi awalnya1
).Tidak Disatukan:
JavaScript (ECMAScript 6) -
615854 Karakter (dalam badan fungsi)Penjelasan:
Tes
sumber
b=1,r.split('').map(
menjadi[b=1].map.call(r,
(b=1,[b=b>a?b:x>'L'?(a+=b,1):(a-=b,b*2)for(x of r)],a)
a>=b&&(c=r[t])?g((c=c>'L')?a+b:a-b,r,t+1,c||2*b):a
Python, 74 byte
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:
Saya pikir ini bisa bermain golf lebih jauh.
sumber
C, 107 karakter
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
f
diperlukan 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:
sumber
C, 90
sumber
Javascript, 63
Sampel berjalan:
JSFiddle dg masuk
Tidak Disatukan:
sumber
Javascript ( ES5 )
696460 byte dalam fungsiVariasi: ( panjang yang sama )
Test case: ( diambil dari solusi plannapus )
sumber
g(20,'WLLW')
mengembalikan 25 di konsol FireFox saya -for...in
loop mengambil tiga properti tambahan dalam string dan iterate atas mereka juga.22
ke konsol saya. Berpikir mungkin beberapa situs yang Anda aktif ketika Anda memiliki konsol terbuka memodifikasiString
prototipe. Saya tahu stackexchange memodifikasinya dan menambahkan tiga fungsi tambahan.Haskell, 62
atau dengan kedua argumen bernama (65 karakter):
Perhatikan bahwa
g a r = 1 + a + the number of Ws in r + the number of trailing Ls in r
(69):sumber
Python 2 - 65 byte
Sekarang dikalahkan oleh solusi Python terbaik saat ini, tapi saya tidak bisa tidak membagikannya:
Seperti beberapa solusi Python lainnya, saya menggunakan argumen fungsi untuk menyatakan di
b
luar 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>=b
adalah kependekan darir and a>=b
.sumber
Ruby,
7664 (dalam fungsi tubuh) byteEDIT: meningkatkan jawabannya dengan menghapus 3 byte:
menggunakan func (82 bytes):
menggunakan lambda (76 bytes):
lari :
sumber
C #, 74 karakter di dalam metode
Upaya pertama saya di situs ini ...
Atau, lebih mudah dibaca:
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.
sumber
Golfscript,
51413635 byteFungsi batin
Ini mengasumsikan bahwa kita mulai dengan jumlah uang yang positif dan string untung-rugi akan kosong, sehingga setidaknya satu taruhan dapat dilakukan.
Contoh
memberi
Cobalah online.
sumber
C #, 123
.NET Fiddle
Posting blog yang menjelaskan
sumber
Java, 95 byte (fungsi dalam)
Cobalah online!
sumber
Ruby, 84 karakter
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.
sumber
K, 76
.
sumber
Python, 86
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 yanga
dihapus, 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.sumber
C -
6459 (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
%2
dari tia untuk menyelamatkan karakter. Maaf!sumber
Gelombang - 212
Contoh -
sumber
Japt , 38 byte
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:
sumber
PowerShell ,
6881 byteCobalah 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*y
adalah 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
sumber
05AB1E , 19 byte
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:
sumber