Suatu hari guru kimia saya menjelaskan kepada kami tentang notasi ilmiah (menggunakan sejumlah kecil dan mengalikannya dengan kekuatan sepuluh untuk mengekspresikan jumlah besar lebih mudah), yang membawa saya kembali beberapa tahun ketika saya pertama kali mempelajarinya. Setelah mempelajari dasar-dasarnya, kami telah melakukan banyak pertanyaan matematika yang khas, beberapa di antaranya seperti berikut:
Mewakili yang berikut dalam notasi ilmiah:
a) 50000000
b) 120000000000000
c) 9000000000000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vektor
...
z) 200
...
Dan saya berpikir, "Apa? Kami diberi tahu bahwa notasi ilmiah digunakan untuk membuat penulisan angka besar lebih efisien, tetapi beberapa kasus sama sekali tidak lebih efisien!"
Pertimbangkan angkanya
300
dan perwakilannya dalam notasi ilmiah:
3x10^2
Apa, versi yang dicatat secara ilmiah ini sebenarnya menghabiskan lebih banyak ruang? Kita tidak bisa memilikinya sekarang, kan? (Ruang layar sangat berharga.)
Kita dapat menentukan sendiri apakah lebih efisien ruang untuk menulis nomor dalam notasi ilmiah atau tidak, atau ...
Tugas
Program atau fungsi Anda harus menggunakan satu nomor positif n
ukuran arbitrer (hingga apa yang didukung bahasa Anda) sebagai input dan menampilkan versi nomor yang dicatat secara ilmiah.
Namun, jika nomor asli n
, setelah menghilangkan nol jejak dan tempat desimal, membutuhkan lebih sedikit atau jumlah karakter yang sama untuk ditampilkan daripada versi yang dicatat secara ilmiah, Anda harus menampilkan nomor asli itu n
sebagai gantinya.
Kode Anda harus sesingkat mungkin karena outputnya juga harus sesingkat mungkin.
Spesifikasi
Notasi Ilmiah yang Efisien didefinisikan sebagai berikut:
bx10^e
b
adalah nomor input dibagi dengan tepat oleh kekuatan 10 sedemikian rupa sehingga 1 <= b < 10
. Angka ini harus menghapus semua nol trailing (dan titik desimal jika diperlukan), tetapi harus memiliki ketepatan angka aslinya (tentu saja, hingga batas titik desimal dalam bahasa Anda). Yaitu 90000
menjadi 9
, 13.500
menjadi 1.35
, 0.000675
menjadi 6.75
dll. Jika angka ini akhirnya mengandung lebih banyak tempat desimal daripada bahasa Anda dapat menangani, itu harus dibulatkan ke jumlah tempat desimal maksimum itu.
e
adalah eksponen di mana sepuluh dinaikkan sedemikian rupa n = b x 10^e
(ingat bahwa angka ini harus negatif jika n
lebih kecil dari 1). Angka ini seharusnya tidak memiliki angka nol atau tempat desimal (terutama karena jika bukan bilangan bulat, ada sesuatu yang salah ...).
Karakter x10^
harus tetap seperti dalam string antara b
dan e
.
Uji kasus
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Aturan dan klarifikasi lainnya
- Nol trailing (dan / atau trailing tempat desimal) tidak dihitung terhadap jumlah karakter dari nomor input asli
n
. Ingatlah itu untuk kasus-kasus seperti test case 6 - Anda dapat mengasumsikan bahwa jika nomor input kurang dari 1, itu akan selalu mulai dengan 0 di tempat untuk digit tersebut (seperti dalam kasus uji 5-8).
- Nomor input tidak akan pernah negatif
- Built-in yang membuat tantangan ini sepele dan celah standar tidak diijinkan
- Baris baru yang tertinggal di output OK
EDIT
Terima kasih kepada pengguna81655 untuk menunjukkan kasus uji 7 dan 8 memiliki kekuatan sepuluh yang salah. Saya sekarang telah memperbaikinya jadi pastikan kode Anda mengevaluasi mereka dengan benar.
pi^e^i^j^k^std::vector
?e
:9000 -> 9e3
(hampir lebih dari 9.000 !)x10^
. Dan itu akan menjadi sedikit adil pada pertanyaan, yang saya pikir tidak sepantasnya sekarang dipostingJawaban:
ES6,
8381 byteMungkin gagal untuk beberapa kasus tepi di mana
toString
bersikeras pada format eksponensial.Sunting: Disimpan 2 byte berkat @ user81655.
sumber
/
pada akhir regex.x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
Python 3,
346342319302 byteMungkin bermain golf yang mengerikan, tapi hei, ini adalah percobaan pertama saya pada sesuatu seperti ini. Sulit dibaca, jadi pasti bagus.
Sejauh yang saya ketahui, ini harus bekerja pada setiap kasus, bahkan dengan kecenderungan Python untuk secara otomatis mengubah angka yang melewati ambang apa pun menjadi notasi ilmiah (kecuali dengan 'e' yang keren dan mewah). Saya tidak ingat persis bagaimana saya membuatnya bisa mengembalikan angka formulir standar, tetapi itu berhasil.
sumber
Perl 6,
9690 byteSaya merasa ini bisa lebih pendek, tapi ini yang terbaik untuk saat ini
penggunaan : Tetapkan ini ke variabel
Ini dia ungolfed sedikit dengan beberapa komentar buruk:
sumber
$_ <1
dengan1>$_
dan1 <=* <10
dengan10>*>=1
TI BASIC (nspire): 112 byte
Penjelasan
Mengonversi input ke notasi ilmiah dengan fungsi format jika sudah tidak dalam format tersebut - karena desimal kecil dikonversi secara otomatis.
Menemukan posisi fancy E yang menunjukkan eksponen dan menggantinya dengan "x10 ^".
Periksa output mana yang lebih besar dan mengembalikan yang optimal. Kecuali jika itu adalah desimal kecil, yang lebih kecil secara default.
sumber
Python (3.5) 177 byte
Solusi menggunakan ekspresi reguler
Penjelasan
Impor modul regexp
Pengganti fungsi lambda untuk menggantikan
e
olehx10^
Konversi string dalam notasi ilmiah
Hapus 0 padding dalam string asli
bandingkan panjangnya
Hasil
sumber