Saya mencoba menyelesaikan tantangan Codewars berikut Vasya - Petugas:

Film baru "Avengers" baru saja dirilis! Ada banyak orang di box office bioskop berdiri dalam antrean besar. Masing-masing dari mereka memiliki uang kertas 100, 50 atau 25 dolar. Tiket "Avengers" berharga 25 dolar.

Vasya saat ini bekerja sebagai juru tulis. Dia ingin menjual tiket ke setiap orang di baris ini.

Bisakah Vasya menjual tiket ke setiap orang dan memberikan kembalian jika dia awalnya tidak punya uang dan menjual tiket secara ketat sesuai urutan antrian orang?

Kembali YA, jika Vasya dapat menjual tiket ke setiap orang dan memberikan kembalian dengan tagihan yang dimilikinya saat itu. Jika tidak, kembalikan NO.

Kode saya lulus uji sampel, tetapi kiriman saya ditolak untuk tiga kasus uji.

Masalah

Tidak ada informasi tentang kasus uji yang menyebabkan program saya gagal.

Bagaimana saya bisa memperbaiki kode saya saat ini untuk lulus tes?

 Passed: 17 Failed: 3 Exit Code: 1

enter image description here

Program

def tickets(people):
    Vasya_wallet = 0
    if len(people) <0:
        return "NO"

    for i in range(len(people)):
        if people[i] != 25 and Vasya_wallet <= (people[i]-25):
            return "NO"

        elif Vasya_wallet >= (people[i] - 25):
             Vasya_wallet = Vasya_wallet + 25 - (people[i] - 25)

    return "YES"
-2
NPP 29 Januari 2020, 14:44

2 jawaban

Jawaban Terbaik
  • Anda sebenarnya mengumpulkan uang dan hanya menambahkannya di Vasya_wallet yang bukan merupakan pertanyaan yang diminta untuk Anda lakukan.

  • Pertanyaannya lebih lanjut tentang apakah Anda dapat memberikan perubahan kepada pengguna dalam hal catatan $50 dan $25.

  • Jadi, kita harus mengumpulkannya dalam variabel yang berbeda, memeriksa ketersediaannya dan mengembalikan YES atau NO untuk memenuhi semuanya.

Logika:

  • Jika pengguna membayar $25, tidak ada perubahan yang harus dikembalikan karena ini adalah harga tiket. Namun, kami meningkatkan jumlah var_25 sebanyak 1 seperti yang ditunjukkan pada kode di bawah ini.

  • Jika kami menerima $50, kami mengembalikan kembali $25 perubahan hanya jika kami memilikinya. Jika tidak, kami mengembalikan NO jika tidak memungkinkan. Perhatikan bahwa dalam konteks ini, pengguna harus segera membayar uang kembalian daripada harus menunggu beberapa saat untuk mengembalikan uang kembaliannya. Itu membuat masalah ini lebih sederhana.

  • Jika kami menerima $100, kami harus mengembalikannya kembali sebesar $75 dalam bentuk $50,$25 atau $25,$25,$25 tergantung ketersediaan. Namun, kami menggunakan pendekatan serakah untuk mengembalikan $50,$25 jika kami memilikinya. Kami melakukan ini karena $25 adalah faktor persekutuan tertinggi dari $25,$50,$75 yang berarti, kami dapat membuat salah satu dari mereka dengan $25 tetapi tidak mungkin untuk membuat perubahan lain dengan ini.

Cuplikan:

def tickets(people):
    var_25 = 0
    var_50 = 0
    for i in range(len(people)):
        if people[i] == 25:
            var_25 += 1
        elif people[i] == 50:
            if var_25 == 0: # if we have no change to give back, we return NO
                return "NO"
            var_25 -= 1 #we give the user $25 change back
            var_50 += 1 # now, we have a $50 change with us
        else: # if the user gives $100 to us
            if var_25 == 0 or var_25 * 25 + var_50 * 50 < 75: # if we can't give $75 change back
                return "NO"
            if var_50 > 0:
                var_50 -= 1 # we give him one $50 and one $25 change back
                var_25 -= 1
            else:
                var_25 -= 3 # or we give 3 $25 change as we don't have $50 change

    return "YES"
2
nice_dev 29 Januari 2020, 12:52

Karena ini adalah sistem pengujian "kotak hitam" (sistem memberikan beberapa contoh tetapi secara khusus tidak mempublikasikan apa yang sebenarnya digunakan untuk validasi untuk menghindari coba-coba atau casing khusus dari setiap kasus uji), Anda perlu menulis kasus Anda sendiri berdasarkan pada spesifikasi untuk mencoba dan memperbaiki kondisi batas.

Semacam generator acak (atau alat pengujian properti lengkap seperti hipotesis) bisa sangat berguna jika Anda berhasil mendefinisikan properti yang masuk akal.

Kebetulan dan selain kode yang bisa diperdebatkan, masalahnya adalah Anda salah menghitung masalah dan memperlakukan tagihan sebagai angka yang sepadan.

Pertama adalah

Vasya_wallet + 25 - (people[i] - 25)

Di sini jika orang tersebut memiliki $100, Vasya harus berakhir di +25 (mendapat 100, mengembalikan 75) namun Anda mengatakan bahwa Vasya kehilangan 50 (+25 - 100 +25), pelindung mendapat tiket gratis dan 50 dolar.

Kedua, Anda salah memahami masalahnya: tagihan adalah tagihan, sekali Anda mendapatkan 100 lembar Anda memiliki 100 lembar yang tidak dapat dibagi Anda tidak bisa hanya mengambil 100 dan membuat 4x25 dari udara tipis, jadi Anda harus perhitungkan tagihan yang Anda miliki secara khusus, dan tarik dari mereka untuk mengembalikan uang kepada pelanggan (meskipun Anda mungkin dapat mengabaikan tagihan $ 100 karena tidak berguna untuk perubahan). Itu tidak berarti penghasilan Anda berkurang, harus tetap meningkat sebesar 25 per pelanggan. Itu berarti cek "Vasya_wallet" Anda juga salah, Vasya dapat memiliki $25.000 di kasir dan masih tidak dapat memberikan perubahan pada uang $50 jika mereka hanya memiliki 50-an dan 100-an.

1
Masklinn 29 Januari 2020, 11:57