Golfception tiba

8

Mari kita bermain golf sambil bermain golf.

Masalah:

  • Jarak ke lubang awalnya adalah 700m
  • Setiap pukulan ke bola akan membuatnya maju ke lubang 250-350m, ini harus acak.
  • Setiap hit memiliki probabilitas 5% masuk ke air, ini akan membuat jumlah hit meningkat sebesar 1 sebagai penalti.
  • Ketika bola di bawah 250m itu akan maju 70% hingga 90% (acak lagi) dari jarak yang hilang dengan probabilitas 80%, Maju 90% menjadi 99% dengan 14% Probabilitas, 1% dari melakukan 10% (dan finishing) dan 5 % pergi ke air dan meningkatkan jumlah hit sebanyak 1 sebagai penalti.
  • Saat bola berada di bawah 10m, bola memiliki 95% masuk ke lubang (finishing) dan 5% memajukan 75% dari lintasan yang hilang. Tidak ada kemungkinan air mengalir.

Klarifikasi:

-Imagine bola adalah 270m dari lubang, jika kita menekan 300m, jarak ke lubang sekarang 30, ini berarti, jarak akan menjadi nilai absolut.

-Jumlah akan selalu bilangan bulat karena menangani probabilitas memukul misalnya 300m ketika bola adalah 300m dari lubang.

-Turunkan jumlah m hit, bayangkan Anda berada pada 1m, jika Anda jatuh pada 5% dari tidak masuk ke lubang, itu akan maju 0.

Memasukkan:

Tidak ada

Keluaran:

Jarak ke lubang di setiap hit / n

Total jumlah klik

Keluaran contoh (jangan cetak komentar)

433m // Hit untuk 267m (700-267 = 433)

130m // Hit untuk 303m (433-303 = 130)

130m // Bola di atas air, tendangan penalti +1

35m // Hit untuk 95m (130-95 = 35)

7m // Hit untuk 28m (35-28 = 7

0m // Ball on hole

Total hit 7 // 6 hits +1 penalti

Ini adalah codegolf!

Java Gonzar
sumber
Bisakah Anda menambahkan pekerjaan penuh melalui contoh? Jika bola masuk ke dalam air adalah jarak di mana saat itu mengenai bola atau di mana seharusnya bola itu berada di dalam air?
TheLethalCoder
@TheLethalCoder jika pergi ke air jarak tidak berubah, ulangi hit terakhir
Java Gonzar
@NeilSlater masalahnya adalah Anda tidak tahu berapa banyak hit akan ada berapa banyak input?
Java Gonzar
Hei! Selamat datang di PPCG! Menurut pendapat saya, ini adalah tantangan pertama yang bagus! Semoga sukses untuk masa depan! :)
Arjun
Ketika bola di bawah 10m, apakah masih ada peluang 5% bola masuk ke dalam air?
musicman523

Jawaban:

1

JavaScript, 204 198 byte

P=console.log
r=x=>Math.random()*x
for(d=700,h=0;d;)x=r(100),D=d>=250?r(20)<1?h++*0:250+r(100):d*(d<10?x<5?.75:1:x<5?h++*0:x<6?1:.9+r(x<20?.09:-.2)),d=Math.abs(d-D|0),h++,P(d+'m')
P('Total hits '+h)

Kurang golf:

r=x=>Math.random()*x
for(d=700,h=0;d;){
    x=r(100),
    D=
        d>=250
            ? r(20)<1
                ? h++*0
                : 250+r(100)
        : d * (d<10
            ? x<5
                ? .75
                : 1
        : x<5
            ? h++*0
        : x<6
            ? 1
        : .9 + r(
            x<20
                ? .09
                : -.2
            )
        ),
    d=Math.abs(d-D|0),
    h++,
    console.log(d+'m')
}

console.log('Total hits '+h)
Darrylyeo
sumber
Menjalankan kode Anda, saya mendapat hasil ini sekali. Saya tidak berpikir jarak dapat meningkat setelah Anda mencapai 250 meter, dapatkah Anda menjelaskan bagaimana kode Anda memenuhi kriteria masalah?
musicman523
1
@ musicman523 Tampaknya saya menambahkan nilai persentase jarak daripada persentase dari kejauhan. Saya sekarang sudah memperbaikinya.
darrylyeo
3

Python 3.6 , 250 byte

Disimpan 4 byte berkat isaacg, dan 1 berkat KoishoreRoy!

d=700                    # Current distance
from random import*
r=randrange              # Function that gets a random value in the range [0, input)
i=0                      # Number of strokes
while d:
 i+=1;x=r(20)<1          # x is False 95% of the time
                         # My justification for reusing this random value
                         # is that it's used once and only once, separate by if/elif
 if d<10:d-=[d,d*.75][x] # We're within putting range; goes in if x is true; otherwise makes 75% progress
 elif x:i+=1             # Goes in the water, add a stroke
 elif d<250:
  s=r(95);d-=[d,d*[.7+r(21)/100,.9*r(10)/100][s<15]][s>0]
                         # Only 95 because we already checked to see if it would go in the water
                         # 99% of the time (s>0), it doesn't go in
                         # 14% of the time (s<15), it makes 90-99% progress
                         # Otherwise, it makes 70-90% progress
 else:d-=250+r(101)      # Lose 250-350 yards
 d=int(abs(d));print(f'{d}m')
print(f'Total hits {i}')

Cobalah online! (Menggunakan sintaks pencetakan Python 3.5 dengan biaya 6 byte karena TIO belum mendukung Python 3.6.)

musicman523
sumber
Anda kehilangan jumlah hit (ingat bola bisa berair dan tambahkan hit)
Java Gonzar
Diperbarui dan bermain golf sedikit lebih jauh!
musicman523
1
@ KoishoreRoy Anda benar, tidak. Sepertinya saya tidak tahu mengapa. Ini pasti berhasil sebelum saya mulai menggunakan titik koma, tetapi mengeluarkannya sepertinya tidak membantu. Adakah pikiran?
musicman523
1
itu menandai kesalahan pada akhirnya. Saya mencoba mengganti semua spasi dengan tab dan itu tidak membantu saya mencari tahu juga. Selain itu, tidak terkait dengan jalannya kode, Anda dapat menyimpan beberapa byte dengan menggunakanfrom random import randrange as r
Koishore Roy
1
Salahku. Apa yang saya katakan sebelumnya sebenarnya bertambah 1 byte! Gunakan from random import*;r=randrangesebagai gantinya. Itu mengurangi 1 byte.
Koishore Roy
2

Perl 6 , 212 byte

my&p=(^*).pick;say 'Total hits ',(700,->\d{my \n=d>249??abs d-(p(20)??250+p
100!!0)!!d>9??d-(|((d*(70+p 21)div 100) xx 80),|((d*(90+p 10)div 100) xx
14),d,|(0 xx 5))[p 100]!!p(20)??d div 4!!0;"{n}m".say;n}...0)-1

&padalah fungsi pembantu yang mengambil nomor acak dari 0satu menjadi kurang dari argumennya. Ekspresi sesudahnya 'Total hits 'adalah daftar yang dibuat dengan malas yang menghasilkan setiap elemen berdasarkan elemen sebelumnya. Elemen dicetak saat dihasilkan, yang tidak terlalu fungsional, tetapi lebih pendek daripada menyimpannya dalam array perantara.

Sean
sumber