Ringkasan
Golf kode bagus. Pai bagus . Ketika Anda menggabungkan keduanya, hanya hal-hal baik yang bisa terjadi.
Spesifikasi
Dalam tantangan ini, Anda akan mengelola toko kue. Pengguna akan dapat input lima perintah yang berbeda: list
, count
, buy
, sell
, dan exit
. Berikut spesifikasi untuk masing-masing:
list
Cetak daftar semua kue yang dimiliki, dan berapa banyak. Pisahkan dengan
|
dan pad dengan spasi di kedua sisi.|
s harus disejajarkan. Jumlah pie mungkin negatif (itu berarti Anda berhutang kepada seseorang:(
). Sebagai contoh:| apple | 500 | | blueberry | 2 | | cherry | -30 |
count [type]
Cetak berapa banyak
{{type}}
pai yang ada. Cetak "Tidak ada{{type}}
kue!" jika tidak ada.{{type}}
akan selalu cocok dengan regex\w+
(yaitu, itu akan selalu menjadi satu kata). Sebagai contoh, jika saya memiliki jumlah kue yang ditunjukkan dalam daftar contoh di atas, maka> count apple 500 > count peach There is no peach pie!
buy [n] [type]
Tambahkan
{{n}}
ke hitungan{{type}}
pai, dan cetak. Buat{{type}}
pai jika tidak ada.{{n}}
akan selalu cocok dengan regex[0-9]+
(yaitu, itu akan selalu berupa angka). Berikut contoh lain (dengan inventaris pie yang sama dengan contoh sebelumnya):> count blueberry 2 > buy 8 blueberry 10
sell [n] [type]
Kurangi
{{n}}
dari jumlah{{type}}
pai, dan cetaklah. Buat{{type}}
pai jika tidak ada. Pai bisa negatif (oh tidak, itu berarti Anda berutang pai pada seseorang!).> sell 15 blueberry -5 > buy 5 blueberry 0
exit
Cetak "Toko pai telah ditutup!" dan keluar dari program.
> exit The pie store has closed!
Klarifikasi lebih lanjut
- Jika fungsi yang tidak ada disebut (kata pertama), maka cetak "Itu bukan perintah yang valid."
- Jika fungsi yang ada dipanggil dengan argumen yang tidak valid (kata-kata setelah kata pertama), bagaimana program Anda berperilaku tidak masalah. "Argumen tidak valid" mencakup terlalu banyak argumen, terlalu sedikit argumen,
{{n}}
tidak menjadi angka, dll. - Pai bagus.
- Input Anda harus dibedakan dari output Anda. Jika Anda menjalankan program pada baris perintah / terminal / shell / hal berbasis teks lainnya, Anda harus mengawali input dengan tanda "
> "
(" lebih besar dari "dan spasi) atau beberapa hal awalan input shell lainnya. - Pai bagus.
Jika semua klarifikasi ini tidak cukup baik, berikut adalah beberapa contoh keluaran:
> list > buy 10 apple 10 > sell 10 blueberry -10 > list | apple | 10 | | blueberry | -10 | > count apple 10 > count peach There is no peach pie! > exit The pie store has closed!
Jika Anda membeli menjual kue / dan jumlah bersih menjadi
0
, Anda dapat baik tetap dilist
atau tidak, dan Anda dapat baik kembali0
atauThere is no {{type}} pie!
ketika Andacount
itu.- Ini adalah kode-golf ; kode menang paling pendek.
- Apakah saya menyebutkan bahwa pai itu enak?
buy 1 apple
dansell 1 apple
. Dan apakah itu akan berlaku untukcount apple
kembali,0
bukanThere is no apple pie!
?Jawaban:
Rubi,
335330Beberapa trik di sini:
Gagasan Doorknob untuk menggunakan formatter diambil selangkah lebih jauh di sini, secara harfiah. Pertama, string terpanjang dalam hash di antara semua kunci dan nilai diformat menggunakan
" %%%ds |"
untuk menghasilkan string seperti" %6s |"
. Yap, tidak ada penyusutan setiap kolom secara terpisah. Tidak pernah ada persyaratan untuk itu. Satu ukuran cocok untuk semua. Kemudian string ini digandakan dan digunakan sebagai string pemformatan untuk array dua elemen yang berisi baris saat ini. Akhirnya,+
hampir mulai mendapatkan kata-katanya dan menambahkan satu pipa terkemuka. Oh, danputs
memiliki penanganan array yang bagus.Ruby memiliki interpolasi dalam regex literals. Ini adalah penyelamatan yang ketat, tetapi sedikit menghemat.
Ruby membutuhkan titik koma setelah
when
ekspresi, tetapi tidak sebelum kata kunci. Ini mengarah ke artefak render yang aneh ketika titik koma diganti dengan baris baru.Dan, tentu saja, perlism dikenal sebagai sihir global dan pencocokan literal regex secara otomatis terhadap mereka.
Juga, sebagian besar pernyataan termasuk
case
ekspresi.sumber
Hash.new(0)
bukannya{}
?nil
(yang tidak bolehkan penambahan.) Secara literal menggunakannil
sebagai nilai defaulth=Hash.new(0)
=>h=Hash.new 0
,print"> "
=>$><<'> '
, dan saya pikir[*h]
bisa sajah
. Saya mencoba menyusun versi tanpa pernyataan beralih karena semua teks boilerplate benar-benar bertambah: gist.github.com/chron/6315218 . Saya mencoba membuat sesuatu bekerjaruby -ap
tetapi persyaratan untuk prompt membuatnya sulit: <$><<
mencetak baris baru. Adapun saran terakhir ... sayangnya, hash tidak memiliki metode "ratakan".Ruby,
427384 karakterTerima kasih kepada Jan Dvorak untuk peningkatan besar dari 427 menjadi 384 (!)
sumber
loop{...}
bukanwhile 1do...end
.split
tanpa argumennya. Secara default, ini terbagi berdasarkan spasi putih (atau$;
jika itu diatur)p.keys.group_by(&:size).max[0]
- Apakah kamu mencarip.keys.map(&:size).max
ataup.map{|x,_|x.size}.max
? Di sini:[(t=p.values).max.to_s.size,t.min.to_s.size].max
apakah Anda mencarip.map{|_,x|x.to_s.size}.max
? Tapi saya akan mengambil ide Anda dan menyalahgunakan formatter :-)p[t]=p[t]+m
setara denganp[t]+=m
(kecualip[t]
dievaluasi dua kali alih-alih sekali) dan lebih lama. Gunakan yang terakhir.+=
operator; itu sebabnya saya tidak menggunakannya. Mungkin itu hanya untuk++
. Saya akan segera mengedit posting sayaPythonPie -thon 437Saya yakin ada beberapa kelonggaran pada baris terakhir kedua, tetapi persyaratan untuk menyelaraskan bar untuk kedua jenis dan nomor pie adalah doozy.
Sebagai per komentar Igby Largeman ini aturan tidak jelas di sekitar apa yang harus dilakukan jika ada adalah kue jenis tertentu, tetapi ada
0
sekarang. Jadi saya menafsirkannya untuk kebaikan saya.Output sampel:
sumber
> count potato
menghasilkanThat's not a valid command.
There is no potato pie!
pie.py
:: PC # -
571 568559Membawa bagian belakang seperti biasa dengan C # tanpa harapan verbose.
Saya mengambil beberapa kebebasan dengan aturan tentang output daftar. Untuk menyimpan beberapa karakter saya hardcoded lebar kolom hitung ke lebar maksimum nilai integer. (Aturan tidak mengatakan ruang ekstra tidak diperbolehkan.)
Diformat:
sumber
Python 3, 310
sumber
Jawa -
772751739713666619Saya tahu ini bukan memenangkan kontes, tetapi hanya untuk bersenang-senang!
Dengan jeda baris dan tab:
sumber
if/else
menjadi lebih murah, tetapi karena fakta yang harus saya lakukans[0]=s[0].intern()
untuk membandingkan==
, selalu selalu menjadi lebih . Saya tahu, sangat berlawanan dengan intuisi.