Anda mungkin ingat di kelas satu atau dua menggunakan formulir yang diperluas untuk belajar tentang nilai tempat angka. Lebih mudah dijelaskan dengan sebuah contoh, jadi pertimbangkan nomornya 123
. Dalam bentuk diperluas itu diwakili sebagai 100 + 20 + 3
, yang membantu pikiran muda memvisualisasikan nilai tempat. Ini mengingatkan pada bagaimana Anda mengatakannya: seratus (plus) dua puluh (plus) tiga.
Kami dapat memperluas ini melewati unit tempat dengan desimal: 2.718 => 2 + 0.7 + 0.01 + 0.008
Tantangan Anda adalah untuk menulis sebuah program atau fungsi yang mengambil angka floating point positif atau nol (anggap itu sama besar atau tepat seperti bahasa Anda dapat menangani; itu tidak akan dalam notasi ilmiah) atau string dan mencetak / mengembalikannya dalam bentuk diperluas seperti yang dijelaskan di atas.
Anda tidak perlu spasi antara +
's atau nol sebelum titik desimal, jadi contoh di atas bisa 2+.7+.01+.008
. Nilai yang sama dengan nol harus dihilangkan ( 101.01 => 100 + 1 + 0.01
) kecuali jika inputnya nol (lihat di bawah).
Nilai tidak boleh memiliki lebih dari satu nol di depan sebelum koma desimal atau nol di belakangnya setelah itu (no-no:) 0060, 0000.2, 30., 30.000, .0400
. Masukan akan sesuai dengan ini juga.
Karena siswa kelas satu memiliki rentang perhatian yang pendek, kode Anda harus sesingkat mungkin.
Uji kasus
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
sumber
Jawaban:
CJam,
3326 byteIni tidak akan berfungsi dengan penerjemah Java; itu mencetak mengapung berbeda. Cobalah dengan penerjemah CJam .
Cetakan tes terakhir
9000000+9e-7
, yang telah dinyatakan valid oleh @NinjaBearMonkey .Terima kasih kepada @ jimmy23013 untuk bermain golf 7 byte!
Bagaimana itu bekerja
sumber
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 byte
Penjelasan
Membutuhkan nomor menjadi masukan sebagai string tanpa nol terkemuka (kecuali nomor adalah
0
tentu saja).Catatan: Karena keanehan floating-point beberapa angka (seperti
.3
) keluar salah, tetapi secara teoritis ini bekerja untuk nomor apa pun.Uji
Penggunaan uji
Math.pow
alih-alih**
untuk kompatibilitas browser.Tampilkan cuplikan kode
sumber
Math.floor
=>0|
...?1
itu akan pecah karenaMath.log10(n)
akan mengembalikan angka negatif dan|0
putaran ke nol bukannya lantai.0|Math.log10(n),p-=p<0
bukanMath.floor(Math.log10(n))
?n<1
karena0|
akan membuatp
persamaan0
untuk keduanya0.1
dan-0.1
. Cara terpendek yang bisa saya pikirkan adalahp=Math.log10(n),p=p-(p<0)|0
panjang yang sama dengan menggunakanMath.floor
. :(n=0.1
.Retina ,
867775 byteHitungan byte mengasumsikan bahwa sumber dikodekan sebagai ISO 8859-1.
Linefeed tambahan sangat penting.
Cobalah online.
Penjelasan
Kami mulai dengan mengubah input ke daftar komponen terpisah, meskipun hanya digit terdepan (atau trailing) yang benar. Ini dilakukan dengan menyalahgunakan split stage. Alih-alih memisahkan input, kami mencocokkan semua itu, sehingga segmen yang tersisa semuanya kosong. Kami menghapus segmen kosong itu dengan
_
opsi. Tangkapannya adalah bahwa tahap-tahap pemisahan juga mengembalikan nilai semua kelompok tangkapan. Jadi kami menggunakan lookahead di setiap pertandingan untuk menangkap bagian string yang benar: pertama kami mencoba menemukan bagian.
kiri dari pertandingan. Jika itu masalahnya, kami menangkap semuanya dari.
hingga dan termasuk digit yang saat ini kami cocokkan. Kalau tidak, kita harus berada di bagian integer dari input, jadi kami menangkap semua angka setelah pertandingan (termasuk pertandingan). Kita juga harus menghilangkan titik desimal itu sendiri, sehingga penangkapan kedua adalah opsional. Jika tidak ada yang\d
akan ditangkap, ini hanya akan menghapus kecocokan dari input.Sekarang kita menggunakan tahap transliterasi untuk mengubah semua kecuali digit awal / akhir menjadi nol. Kami mencocokkan komponen yang kurang dari 1 dengan
\..+\B
tempat\B
memastikan bahwa kami menghentikan kecocokan satu digit sebelum akhir, atau kami mencocokkan bagian bilangan bulat dengan(?<=^\d).+
tempat tampilan di belakang memastikan bahwa kami mulai satu digit ke dalam angka. Tahap transliterasi kemudian akan mengganti angka (d
) dengan nol di dalam pertandingan.Sekarang format output aktual seharusnya menggunakan
+
bukan linefeeds sebagai pemisah. The¶
pertandingan linefeed untuk melakukan substitusi itu. Sementara kami melakukannya, kami juga menghapus garis yang hanya berisi0
s dan.
s.Tahap sebelumnya tidak menghapus arahan atau jejak
0
(karena mereka tidak memiliki umpan baris sebelum dan sesudahnya), jadi kami menghapusnya secara eksplisit.sumber
Python 2,
216210196175 byteBerikut adalah beberapa kode sedikit golf yang akan saya golf lebih jauh ketika saya punya waktu. Ini menggunakan analisis string.
Penjelasan
Jadi, input dipisahkan menjadi bagian integer dan desimal. Kemudian, ada pemahaman daftar loop. Pada bagian integer, panjang string setelah karakter dalam desimal dikalikan dengan "0" untuk mendapatkan banyak nol pada akhirnya jika karakter itu.
Untuk bagian desimal, indeks karakter saat ini adalah jumlah nol sebelum dan sehingga bagian itu sederhana.
Coba dan kecuali digunakan untuk menentukan apakah ia memiliki bagian desimal atau tidak (menggunakan kesalahan).
Hasil akhir digabungkan dengan tanda plus.
Coba di sini!
sumber
o if o else ["0"]
bisao or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
, dan kurung luar dalamo=[(...)
juga, sebenarnya. Akhirnya, Anda dapat mengambil syarat akhir dari fungsi bergabung seperti ini:print"+".join(o)or"0"
karena bergabung akan mengembalikan daftar kosong jikao
kosong sehingga persyaratan akan mengevaluasi dengan cara yang sama yang menghemat satu byte.Pyth, 30 byte
Suite uji
Solusi dasar di sini adalah mengganti semua digit dalam input dengan
0
, lalu masukkan setiap digit di lokasi yang tepat, eval, saring angka nol, dan gabung dengan plus. Sayangnya, fungsi eval Pyth tidak menerima angka nol di depan saat ini. Saya akan bekerja untuk memperbaikinya.Untuk mengatasi masalah ini, saya menambahkan fungsi pembantu
y
, yang secara berulang mencoba ulang eval hingga tidak ada kesalahan yang dilemparkan, menghapus digit pertama setiap kali. Perhatikan bahwa fungsi ini akan berulang tanpa henti pada input yang tidak valid.Juga, kasus khusus diperlukan untuk input
0
.Secara keseluruhan, saya pikir kodenya cukup bagus, tetapi fasilitas bahasanya bisa lebih baik. Siapa yang mau kesalahan?
sumber
Python 3, 138
Ini secara longgar didasarkan pada pendekatan TanMath / Ogaday dalam membaca angka sebagai string dan menguraikannya seperti itu. Saya harus menggunakan tugas bintang pada
i
sehingga menangani bilangan bulat dengan benar.sumber
Python,
141132128 byteYang ini masih relatif mudah dibaca. Konversikan ke string dan pegang
>1
digit secara terpisah dari<1
digit. Kami juga memiliki kasus khusus untuk nol. Saya bisa menghapus dua ruang lagi di bawah, tapi saya suka menjaganya tetap cantik.The downside adalah bahwa itu akan rusak untuk mengapung dengan lebih dari 9 tempat desimal.
Di bawah ini adalah yang asli. Sunting pertama adalah untuk mempersingkat nol kasus khusus, sunting kedua adalah untuk menghapus 0 sebelum desimal, ketiga adalah untuk menghapus beberapa tanda kurung tambahan dan spasi.
Penjelasan:
sumber
Mathematica, 81 byte
Kasus cobaan:
sumber
CJam, 44 byte
Coba di sini.
Gagal uji kasus terakhir, dan menghasilkan yang berikut:
Tapi katakanlah itu terlalu tepat sehingga CJam tidak bisa menanganinya.
Penjelasan
sumber
Python 3,
187180173154 byteBerhasil bermain golf 19 byte berkat terima kasih atas saran @Thomas Kwa di atas
result or['0']
, ditambah pengaturan ulang beberapa aljabar ( 154 byte ):Upaya terbaik saya sejauh ini( 173 bytes ). Berdasarkan pendekatan baru, lihat bawah posting:pangkas aslinya hingga 180 byte :
Saya belajar fitur bahasa baru hari ini! Persyaratan melalui pengindeksan boolean. Saya mungkin telah sedikit berlebihan.
Saya mencoba mengabstraksi pemahaman, tetapi saya tidak bisa membuatnya lebih pendek ( 196 byte ):
(Urutan membalikkan itu mahal!)
Sementara milik saya lebih pendek untuk saat ini, saya pikir TanMath dapat golf turun untuk mencocokkan milik saya: Menggunakan
e=enumerate
, menggantipass
dengan0
, dan menggunakan'0'
di tempat['0']
dalam pernyataan kembali harus menyimpan 4 + 3 + 2 = 9 byte! Mengambilnya ke 187. Saya yakin beberapa byte lainnya dapat dicukur di suatu tempat ...edit Pendekatan baru ( 156 byte ). Namun, itu hanya dapat menangani presisi hingga 6dp mirip dengan entri CJam @ jimmy23013, sehingga gagal pada tes akhir. Saya tidak bisa memaksanya untuk mencetak lebih banyak 0s, mungkin orang lain bisa. Alih-alih, saya menggunakannya sebagai dasar upaya terbaik saya, lihat di atas (Juga, pendekatan ini mencetak 0 sebelum tempat desimal, tapi itu tampaknya juga valid.). Mengambil
try:... except:...
pendekatan dari TanMath:sumber
bash murni, 210
atau
Uji:
sumber
Python, 131 byte
Fungsi rekursif yang benar-benar berantakan, mungkin bukan cara terbaik untuk melakukannya. Masukan seperti
f("10.0203")
.sumber
C,
155153161 byte+2 untuk terhubung di perpustakaan matematika (sumbernya sendiri adalah 159).
Tidak disatukan
sumber
Dyalog APL , 47 byte
Membawa angka dalam bentuk vektor karakter, mis
'123'
.Contoh:
Catatan:
○ Alasan untuk contoh terakhir yang dimodifikasi adalah bahwa APL, seperti beberapa kiriman lainnya, secara default akan beralih ke notasi ilmiah untuk angka ekstrem tersebut.
○ Frasa
↑⍕¨f¨,¨
ini hanya diperlukan untuk memproses semua contoh sekaligus.sumber
Retina, 113 byte
Saat ini jauh lebih lama daripada solusi Martin tetapi menggunakan metode yang berbeda jadi saya memutuskan untuk mempostingnya.
Cobalah online di sini.
sumber
perl, 132 byte
131 +1 untuk
-p
sakelar.Ini berdasarkan jawaban saya sebelumnya
sed
:Test suite:
sumber
Powershell -
172166193 byteSemua dalam satu baris:
Tidak Disatukan:
Test case, plus satu tambahan:
sumber
$args = 0
. Berikut adalah perbaikan bug sederhana yang juga menghemat 3 bytePerl, 248 byte
Ew, saya noobish di golf Perl.
Coba di sini.
sumber
5
kembali50
.Jawa,
284244243 BytesSayangnya, saya tidak dapat menemukan cara yang lebih singkat untuk membuat Strings berulang:membangunchar[]
panjang yang dibutuhkangunakanArrays.fill
untuk mengatur karaktergunakannew String
sehingga bisa digabungkanDengan inspirasi oleh @Khaled A Khunaifer, saya bisa mencukur 40 Bytes.
Sunting:
indexOf
membutuhkan int, jadi saya bisa menggantinya'.'
dengan46
. Sayangnya, ini sepertinya tidak mungkin dilakukanreplace
.sumber
.replace('\0','0')
fungsi ini, ganti berharapString
tidakchar
, itu harus.replace("\0","0")
Python, 125 byte
Setelah menghapus jawaban pertama saya (sry!) Yang tidak dapat menangani sejumlah kecil karena masalah mesin epsilon, saya menemukan solusi yang berbeda. Ini menangani float serta integer, trailing zero (!) Dan ditulis sebagai fungsi.
Terima kasih kepada @ogaday untuk petunjuk yang bermanfaat dan untuk perbaikan '0' yang ringkas!
Golf:
Tidak Disatukan:
Pemakaian:
sumber
f('0')
kasus uji, dan ketika saya menyalin dan menempel langsung ke penerjemah saya, saya mendapatkan notasi ilmiah (yang saya pikir baik-baik saja). Juga,list(c)
lebih pendek. Jika Anda menggabungkan'.'
sebelum mengubahnya menjadi daftar, Anda tidak perlu menambahkan[]
keduanya. Menggunakanfind
bukannya indeks pada string sebelum mengubahnya menjadi daftar, setelah menambahkan'.'
juga menghemat satu byte. Menyusun ulang ketimpangan memungkinkan Anda untuk menghapus ruang tambahan juga:def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 byte
Solusi lurus ke depan:
Dapat dieksekusi:
Tampilkan cuplikan kode
sumber
Stax , 18 byte
Jalankan dan debug itu
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
Seperti banyak dari solusi lain yang diposting, itu menghasilkan
9000000+9e-7
kasus uji terakhir. Menurut preseden yang sudah ada, ini diperbolehkan karena test case terlalu tepat untuk bahasanya.sumber
Lua, 350 Bytes
Saya pikir ada dua cara untuk menurunkannya:
Saya dapat menggunakan
macro.define
untuk mengganti beberapa ekspresi commons (tidak dapat menguji sekarang, dan tidak yakin itu akan membuat saya mendapatkan beberapa byte)Gunakan split pada titik alih-alih iterasi pada seluruh string. Sekali lagi, saya tidak yakin ini akan mengurangi ukuran fungsi ini, karena memanipulasi string dalam lua cukup menyakitkan.
Penjelasan
Anda dapat menguji lua online dan menggunakan kode sumber berikut untuk menjalankannya dengan beberapa kasus uji
sumber
C, 253 byte
Catatan:
putchar(8)
harus melakukan backspace.Detail , coba di sini
sumber
sed,
136128 byteDikurangi oleh 8 karakter dengan menjatuhkan spasi dan tidak berguna
0
.Kasus uji:
sumber
JavaScript (ES7), 114 byte
Bekerja dengan angka panjang yang berubah-ubah karena menggunakan manipulasi string di seluruh.
Tanpa pemahaman array (122 byte):
Tidak Disatukan:
sumber
R - 133 byte
Kuat, mengabaikan Mesin Epsilon dan bekerja juga dengan nol tambahan.
a) Bermain Golf:
Tidak Disatukan:
Pemakaian:
sumber