Anda dan seorang teman berjalan ke bar. Bartender itu memperlakukan Anda dengan baik, sehingga Anda memutuskan untuk memberi tip padanya. Jadi, Anda mengeluarkan komputer saku tepercaya dan menulis program cepat untuk menghitung tip untuk Anda karena tidak memiliki kalkulator bawaan. Tapi tunggu! Kunci operator Anda rusak! Tugas Anda adalah menghitung tip 20% untuk jumlah input yang diberikan. Input tes akan berupa xx.xx misalnya 20,96. Berikut aturannya:
- Tidak ada penggunaan berikut ini di operator bentuk matematika:
+ - * / %
(Terima kasih Wally Barat) - Tidak menggunakan fungsi atau API bawaan
- Tidak mengakses jaringan
- Tidak ada penggunaan
eval
atau serupa - Tidak ada Kalkulator Windows (ya orang sudah menjawabnya sebelumnya)
- Tidak ada fungsi tip bawaan (Bukan berarti bahasa apa pun akan memilikinya)
Output harus dibulatkan hingga dua tempat desimal.
Skor didasarkan pada panjang dalam byte.
-20% jika program Anda dapat menerima jumlah tip apa pun. Input untuk jumlah akan diberikan dalam bentuk xx misalnya 35 bukan 0,35
*
?Jawaban:
Javascript 81
EDIT : Hasilnya sekarang pembulatan nyata, tidak terpotong.
Jangan gunakan matematika APA SAJA di sini, hanya manipulasi string dan operator bitwise.
Semua
+
char adalah string concatenation, atau string to float conversion.Berfungsi untuk input dan output xx.xx dalam format (x) x.xx
Trick menjelaskan: 20% dibagi 10 dan dikalikan 2.
sumber
99.99
, ini kembali19.998
, jadi itu tidak "dibulatkan ke dua tempat desimal" sesuai OP.J (9 karakter)
Jawaban singkat dalam J:
sumber
^
tetapi di sini~
menunjukkan urutan harus dibalik;(^.2)
adalah log (.2), dan inisial^.
yang dieksekusi terakhir adalah logaritma dari semua yang dihitung dpreviously: demikian log (32 ^ log (.2))Bash murni,
5043 karakterCukup yakin ini akan dikalahkan, tapi ini awal:
Sesuai komentar:
/
bukan operator divisi di sini, ini adalah bagian dari perluasan parameter substitusi pola%
bukan operator modulo di sini, ini adalah bagian dari ekspansi parameter-
bukan operator pengurangan di sini, ini adalah negasi, yang diizinkan sesuai komentarKeluaran:
sumber
/
merupakan bagian dari ekspansi parameter bash dan bukan operator divisi. Boleh atau tidak?Python 98 * 0.8 = 78.4
Python 74 (tanpa bonus)
Catatan
+
digunakan untuk penggabungan string*
digunakan untuk membuat salinan stringTidak disatukan
Catatan
Dalam semangat pertanyaan, saya percaya solusi berikut meskipun mengikuti semua aturan pertanyaan adalah penyalahgunaan
Python 41
Akhirnya
Jika Anda bersikeras bahwa simbol matematika dilarang, dia adalah solusi 90 karakter
Python 90 (tanpa simbol matematika)
sumber
*
dan+
KUNCI rusak (apa pun yang Anda gunakan untuk).No use of the following in mathematical form operators: + - * / % (Thanks Wally West)
. Dengan kata lain, pertanyaan itu perlu diulang. Dan saya belum menggunakannya dalam bentuk matematika0.05
.`input`
(termasuk backticks) alih-alihraw_input
.APL (9 karakter, kode baru dengan 7 karakter, diperbaiki dengan 13 karakter)
Hitung 20% dari jumlah yang diberikan.
Dalam APL
*
adalah operator eksponensial.Cobalah online .
Tetapi mengapa menggunakan fungsi untuk itu? Lihat versi baru ini:
Cobalah online .
Tolong, sebelum downvoting,
*
itu tidak dilarang sebagai KUNCI dan itu tidak berarti multiplikasi di sini.OK, ini adalah versi pembulatan ke 2 desimal (Dyalog APL):
sumber
*
tidak diizinkan dalam bentuk matematika apa pun sesuai aturan tantangan.*
dilarang sebagai kunci dan bukan sebagai makna matematisnya.^
) untuk operator seperti itu, atau panggilan fungsi digunakan. Tidak ada spesifikasi oleh OP yang*
dilarang hanya jika digunakan dalam konteks perkalian. Saya menduga akan sangat membantu jika OP memutuskan hal ini, untuk menyelesaikan salah satu dari kita yang salah mengartikan aturan tantangan dan untuk menghilangkan kebingungan.×
dan÷
diizinkan, itu tidak terdaftar.R,
30273634Diperbarui menjadi 2 angka desimal
Disimpan 2 karakter berkat plannapus
Membuat vektor dari 0 hingga x dan mengambil elemen ke-2.
Contoh:
Penjelasan lebih lanjut:
menciptakan vektor dengan panjang 6 dari 0 hingga nilai input x, dengan nilai di antara spasi yang sama.
Nilai pertama adalah 0%, 20% kedua, ketiga 40%, dll.
sumber
dc + sed + pipes (44 karakter)
Jawaban ketiga saya (satu APL, satu J, dan sekarang satu dengan yang lama dan terhormat dc).
Ini akan meminta input INTEGER dan menghitung 20% dengan cara yang rumit. Input dikonversi ke basis 5 (mudah dilakukan dengan banyak alat lain tetapi tunggu ...); sebuah titik ditambahkan sebelum digit terakhir dengan sed (sayangnya, dc tidak dapat menangani string dengan sangat baik), dan MAKA, dc mengkonversi kembali dari basis 5 pada angka float (tidak semua alat dapat melakukan itu).
sumber
dc -e 5o?p|sed 's/\(.\)\./.\1/'|dc -e 5i?p
. Dengan ini dan menghapussed
s-e
, ini adalah 42. Tetapi hasilnya masih tidak spesifik (bukan 2 tempat desimal)Python, 88
Ini bukan tempat yang dekat pendek, tetapi ini menunjukkan bagaimana pembagian mental normal oleh lima harus dilakukan. Ini mengasumsikan bahwa input harus berupa xx.xx
Atau untuk input dengan panjang berapa pun, diperlukan penambahan 3 karakter.
Penjelasan: Kami mengambil input sebagai string, lalu memindahkan titik desimal satu tempat ke depan (dibagi 10). Kami kemudian melemparkannya ke pelampung, dan menggunakan
ldexp
fungsi untuk melipatgandakannya dengan 2.Perhatikan bahwa dalam jawaban ini,
+
operator rangkaian string, dan%
digunakan untuk memformatprint
.Jika Anda bersikeras untuk tidak menggunakan salah satu dari karakter ini, berikut adalah solusi 159 karakter:
sumber
+
dan-
diizinkan karena tombol-tombol rusak (apa pun artinya dalam potongan kode Anda)..split('.')
dalam jawaban saya, cincang satu chardc + sed - 45 * 0.8 = 36
(Terinspirasi oleh jawaban oleh ברוכאל )
Contoh berjalan (input diterima melalui STDIN):
sumber
.0+
idea is great; I voted up for your solution inspired by mine, but some may tell you are using addition; maybe some workaround? I trieddc -e 9k5o?v2^p
but it is 2 characters more.-20%
!Mathematica, 19
No use of the mathematical operators of
+
,-
,*
,/
, or%
. Uses properties of logarithms to calculate the answer; when you simplify the expression, you get.2*Input[]
With the bonus (30 * 0.8 = 24):
Input the percentage first, then the amount.
When you simplify the expression, you get
Input[]*Input[]*.01
.Thanks to ברוכאל for help with shortening the code.
sumber
Log[E^2]
atauLog[E^Input[]]
bisa ditulis lebih singkat. Bahkan10^-1
dapat ditulis.01
(meskipun saya tidak menggunakan Mathematica tapi saya cukup yakin itu bisa). Seluruh ekspresi(E^10^-1)^Log[E^2]
sepertinya sepertiE^.2
, bukan?TI-89 Basic - 39 * 0.8 = 31.2
Bekerja dengan memasukkan dua angka, kemudian menggunakan properti logaritma untuk menghitung
x * y / 100
.Jika saya dapat menerima input dari penempatan dalam variabel global
x
dany
, maka ini jauh lebih pendek, untuk skor 17 * 0,8 = 13,6 :Tanpa bonus ( 12 ):
But if it needs to be wrapped in a function, then this works (38 chars, for 30.4):
sumber
Input x,y
??? Works in 83/84.Input{x,y}
(apakah 83/84ln
?)žr¹msmžr.n
- Port tanpa malu-malu dari kode ini ke 05AB1E.PHP 107 * .8 = 85.6
tidak bisa menjalankan kode-golf dengan PHP, tapi setidaknya saya bisa beroperasi dengan string. menerima kedua angka sebagai argumen baris perintah.
harus membalikkannya dua kali karena saya tidak bisa menggunakan -2 :(
sumber
Python,
81 8089 karakterPenjelasan
Secara teknis, ini curang karena memotong ke dua desimal daripada membulatkannya tetapi saya bisa berpendapat bahwa itu membulat (Lebih baik untuk Anda, kurang tip).
sumber
[-3:]
daripada[-3:-1]
JavaScript 251 (pembatasan paksa: no +, -, *,? Atau% dengan cara apa pun)
Meskipun saya tahu ini tidak akan menang, saya pikir saya akan mencoba untuk mendapatkan poin brownies melalui mengambil pendekatan yang sangat ketat dan bahkan tidak berpikir tentang menggunakan operator terbatas dalam bentuk atau bentuk apa pun ... sebagai hasilnya, saya datang dengan keindahan ini ...
Saya menggunakan operasi bitwise untuk membuat fungsi Add
A
, dan kemudian mulai chaining dari sana:Fungsi pembagian integer
D
menggunakan serangkaian Penambahan Negatif (pengurangan dalam bentukA(x,A(~y,1)
lebih dari satu loop; sisanya adalah manipulasi string dan penggabungan sehingga untuk menghindari menggunakan+
operator ...Nomor harus diberikan dalam bentuk desimal dengan dua tempat desimal agar ini berfungsi ...
sumber
Perl,
5060 byteMasukan diharapkan pada STDIN. Itu harus mengandung pemisah desimal dengan dua digit desimal. Outputnya ditulis ke STDOUT.
Pembaruan: Langkah ini
$_<<=1
menghapus nol terkemuka. Karenanyam|\d{3}$|
tidak akan cocok dengan tagihan <1. Oleh karena itu sepuluh byte$_="00$
ditambahkan, Sekarang genap0.00
berfungsi.Contoh:
20.96
output:4.19
12.34
output:2.47
Versi tidak disatukan:
Pertama nomornya dibaca dari STDIN. Kemudian titik desimal dihapus, yang dikalikan dengan 100. Kemudian jumlahnya dua kali lipat oleh operator yang menggeser. Kemudian titik desimal dimasukkan kembali dan hasilnya dicetak dan dibulatkan menjadi dua digit desimal.
50 byte, jika tagihan ≥ 1:
Jika
x.xx
lebih besar atau sama dari1.00
, maka 10 byte dapat dihapus:sumber
JavaScript (ES6) (Regex) 142
Regex hebat dan dapat melakukan banyak hal. Ia bahkan bisa mengerjakan matematika!
Versi yang dapat dibaca:
The
tip()
mengharapkan fungsi String argumen, bukan Nomor.Semua contoh
*
,/
,+
tidak berhubungan dengan operasi matematika.+
adalah rangkaian string dalam semua kasus yang digunakan.*
adalah bagian dari sintaks RegExp/
adalah pembatas dari literal RegExpInput harus digunakan
.
sebagai titik desimal, dan harus ada 2 digit setelah titik desimal.Cuplikan Stack
sumber
Haskell 32 Chars -20% = 25,6 Chars
Menyalahgunakan fakta bahwa eksponen menjadi multiplikasi dalam logaritma.
sumber