Pengantar dan kredit
Anggaplah Anda seorang bartender. Anda memiliki banyak orang yang bahagia di bar Anda paling sering, tetapi banyak yang hanya minum minuman yang sama dan terlalu sedikit untuk selera Anda dan Anda ingin mengubahnya. Jadi Anda memperkenalkan sistem di mana harga minuman bervariasi, tergantung pada berapa banyak yang telah terjual, tetapi tidak pernah lebih atau lebih murah daripada ambang batas tertentu. Untuk beberapa alasan aneh Anda selalu lupa untuk melacak dengan benar semua minuman yang dijual dan harga dan dengan demikian Anda perlu memikirkan sepotong kode pendek (= mudah diingat!) Yang menghitung untuk Anda mengingat jumlah minuman yang dikonsumsi.
Tantangan ini telah muncul dalam ujian tengah semester pada tahun 2012 di kursus pemrograman fungsional di uni saya dan profesor saya boleh saja mempostingnya di sini. Kami telah memberikan contoh solusi dalam bahasa ujian.
Memasukkan
Masukan Anda akan menjadi daftar string yang tidak mengandung spasi - ini adalah nama minuman yang dijual. Ambil input menggunakan metode input yang disukai dan diterima secara umum.
Keluaran
Output Anda akan menjadi satu nomor - ini adalah pendapatan yang Anda hasilkan malam ini. Berikan output menggunakan pilihan Anda, metode output diterima secara umum.
Apa yang harus dilakukan?
Ini berlaku untuk setiap minuman secara individual:
- Harga awal adalah 10.
- Setiap kali minuman dibeli, harganya ditabrak oleh 1 untuk pembeli berikutnya.
- Harga maksimal adalah 50. Jika minuman telah dibeli seharga 50, harga baru akan menjadi 10 lagi.
Tugas Anda adalah menemukan pendapatan keseluruhan, yang dihasilkan oleh daftar input minuman mengingat aturan di atas.
Jika Anda bertanya-tanya: "50 dolar benar-benar mahal untuk minum!", Ini adalah 50-deci Bucks, jadi 50 * 0,1 * Unit, tapi saya memilih untuk menggunakan 10-50 untuk tidak mengecualikan bahasa tanpa aritmatika floating point.
Yang menang?
Ini adalah kode-golf , jadi kode terpendek dalam byte menang! Aturan standar berlaku.
Kasus Pojok Potensial
Jika daftar input kosong, output harus 0.
Daftar input tidak dapat dianggap disortir berdasarkan minuman.
Contohnya
[] -> 0
["A"] -> 10
["A","B"] -> 20
["A","A","B"] -> 31
["A","B","A"] -> 31
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1240
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"] -> 1304
["D","A","A","C","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"] -> 1304
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1304
Jawaban:
JavaScript (ES6), 50 byte
sumber
d[x]
ke 10?d[x]
belum diatur, ituundefined
; ini membuatd[x]<50
return false, jadid[x]=d[x]<50?d[x]+1:10
setd[x]
to10
.undefined
. :)Python 2,
79745448 BytesPeningkatan jumlah byte masif dengan memikirkan kembali masalah.
Saya ingin menyingkirkan para. Memanfaatkanint
pemain tetapi otak saya tidak berfungsil.pop()
untuk menghindari pemangkasan daftar dua kali dan beberapa rekursi lambda yang baik :)terima kasih kepada Jonathan Allan untuk menghemat 6 byte :)
Versi 54-byte lama saya cukup saya banggakan :)
sumber
...l>[]and 1*~...
untuk menyimpan 3 byte yang Anda tahu Anda bisa.f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
Pyth, 15 byte
Program yang mengambil input daftar dan mencetak hasilnya.
Test suite (Baris pertama untuk memungkinkan beberapa input)
Bagaimana itu bekerja
sumber
Jelly ,
14 1110 byteTryItOnline!
Bagaimana?
sumber
05AB1E ,
1615 byteTerima kasih kepada Emigna karena telah menghemat satu byte!
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
ÎÙv¹y¢L<41%T+OO
harus bekerja selama 1 byte disimpanPerl 41 Bytes
Termasuk +1 untuk
-p
Mengambil input pada baris baru.
Menambahkan nilai hash dengan:
10
jika ituundef
,-40
apakah itu> 49
yaitu50
, atau1
sebaliknya. Ini kemudian ditambahkan ke$\
, pemisah keluaran, yang-p
dicetak.Contoh:
sumber
05AB1E , 13 byte
Penjelasan
["A","B","A"]
digunakan sebagai contoh.sumber
C ++ 14, 105 byte
Sebagai lambda tanpa nama generik kembali melalui parameter referensi. Membutuhkan input untuk menjadi wadah
string
yang dimilikipush_back
, sepertivector<string>
.Menggunakan
%41+10
trik dari jawaban Python Kade .Membuat wadah kosong
P
sebagai memori yang sudah dilayani. Harga dihitung dengan menghitungx
masukP
.Tidak digabungkan dan digunakan:
sumber
Mathematica, 64 byte
Terasa seperti itu harus lebih pendek.
Length/@Gather@#
menghitung pengulangan setiap minuman.//.z_/;z>41:>Sequence[41,z-41]
membagi setiap bilangan bulat yangz
melebihi 41 dalam ini menjadi41
danz-41
, untuk mencerminkan penurunan harga. Kemudian masing-masing penghitungan dicolokkan ke dalam formula(19+#)#/2
, yang merupakan total biaya#
minuman#
paling lama 41. Akhirnya,Tr
jumlahkan semua biaya itu.sumber
k, 22 byte
Argumen dapat berupa daftar apa saja - string, angka, dll.
The
q
terjemahan lebih mudah dibaca:sumber
C #, 193 byte + 33
Tambahan 33 byte untuk
using System.Collections.Generic;
Saya yakin ini bisa dilupakan untuk bermain golf, Kamus jelas bukan cara terbaik untuk melakukan ini dan saya mungkin bisa bekerja ternary ke if saya. Selain itu saya pikir tidak apa-apa!
Contoh:
Tidak disatukan
sumber
Clojure, 79 byte
Hitung frekuensi minuman, lalu hitung harga dasar sebagai
10 + (i % 41)
.mapcat
menggabungkannya danapply +
menghitung jumlahnya.sumber
PHP, 47 byte
mengambil input dari argumen baris perintah; jalankan bersama
-r
.sumber