Tantangan
Diberi angka (floating-point / desimal), kembalikan timbal baliknya, yaitu 1 dibagi dengan angka. Output harus berupa floating-point / angka desimal, bukan hanya bilangan bulat.
Spesifikasi detail
- Anda harus menerima input dalam bentuk angka floating-point / desimal ...
- ... yang memiliki setidaknya 4 digit presisi signifikan (jika perlu).
- Lebih banyak lebih baik, tetapi tidak diperhitungkan dalam skor.
- Anda harus mengeluarkan, dengan metode keluaran apa pun yang dapat diterima ...
- ... kebalikan dari nomor tersebut.
- Ini dapat didefinisikan sebagai 1 / x, x⁻¹.
- Anda harus mengeluarkan setidaknya 4 digit presisi (jika perlu).
Input akan positif atau negatif, dengan nilai absolut dalam kisaran [0,0001, 9999] inklusif. Anda tidak akan pernah diberikan lebih dari 4 digit melewati titik desimal, atau lebih dari 4 digit mulai dari angka pertama yang bukan nol. Output harus akurat hingga digit ke-4 dari yang bukan nol pertama.
(Terima kasih @MartinEnder)
Berikut beberapa contoh input:
0.5134
0.5
2
2.0
0.2
51.2
113.7
1.337
-2.533
-244.1
-0.1
-5
Perhatikan bahwa Anda tidak akan pernah diberi input yang memiliki presisi di atas 4 digit.
Berikut adalah contoh fungsi di Ruby:
def reciprocal(i)
return 1.0 / i
end
Aturan
- Semua bentuk output yang diterima diizinkan
- Celah standar dilarang
- Ini adalah kode-golf , jawaban terpendek dalam byte menang, tetapi tidak akan dipilih.
Klarifikasi
- Anda tidak akan pernah menerima input
0
.
Bounties
Tantangan ini jelas sepele di sebagian besar bahasa, tetapi dapat menawarkan tantangan yang menyenangkan dalam bahasa yang lebih esoteris dan tidak biasa, sehingga beberapa pengguna bersedia memberikan poin untuk melakukan hal ini dalam bahasa yang sangat sulit.
@DJMcMayhem akan memberikan hadiah +150 poin untuk jawaban brain-flak terpendek, karena brain-flak terkenal sulit untuk angka floating-point@ L3viathan akan memberikan hadiah +150 poin untuk jawaban OIL terpendek . OIL tidak memiliki tipe floating point asli, juga tidak memiliki divisi.
@Riley akan memberikan hadiah +100 poin untuk jawaban sed terpendek.
@EriktheOutgolfer akan memberikan hadiah +100 poin untuk jawaban Sesos tersingkat. Pembagian dalam turunan brainfuck seperti Sesos sangat sulit, apalagi divisi titik-mengambang.
Saya ( @Mendeleev ) akan memberikan hadiah +100 poin untuk jawaban Retina terpendek.
Jika ada bahasa yang Anda pikir akan menyenangkan untuk melihat jawabannya, dan Anda bersedia membayar perwakilan, jangan ragu untuk menambahkan nama Anda ke dalam daftar ini (diurutkan berdasarkan jumlah hadiah)
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan ikhtisar pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
# Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
sumber
1/x
.Jawaban:
Brain-Flak ,
772536530482480 + 1 = 481 byteKarena Brain-Flak tidak mendukung angka floating point, saya harus menggunakan
-c
flag untuk input dan output dengan string, maka +1.Cobalah online!
Penjelasan
Hal pertama yang perlu kita tangani adalah kasus negatif. Karena kebalikan dari angka negatif selalu negatif, kita bisa berpegangan pada tanda negatif sampai akhir. Kami mulai dengan membuat salinan bagian atas tumpukan dan mengurangi 45 (nilai ASCII
-
) dari itu. Jika ini yang kita masukkan nol di atas tumpukan, jika tidak kita tidak melakukan apa-apa. Kemudian kita mengambil bagian atas tumpukan untuk diletakkan di akhir program. Jika input dimulai dengan-
ini masih-
namun jika tidak kita akhirnya mengambil nol yang kita tempatkan.Sekarang setelah keluar dari jalan, kita perlu mengubah realisasi ASCII dari setiap digit menjadi nilai aktual di sana (0-9). Kami juga akan menghapus titik desimal
.
untuk mempermudah perhitungan. Karena kita perlu tahu di mana titik desimal dimulai ketika kita memasukkan kembali nanti, kita menyimpan angka untuk melacak berapa digit di depan.
offstack.Berikut adalah bagaimana kode melakukan itu:
Kita mulai dengan mengurangi 46 (nilai ASCII
.
) dari setiap elemen di stack (secara bersamaan memindahkan semuanya ke offstack). Ini akan membuat setiap digit dua lebih dari yang seharusnya tetapi akan menghasilkan.
nol.Sekarang kita memindahkan semuanya ke tumpukan kiri sampai mencapai nol (mengurangi dua dari setiap digit saat kita pergi):
Kami merekam ketinggian tumpukan
Pindahkan segala sesuatu yang lain ke tumpukan kiri (sekali lagi kurangi dua terakhir dari setiap digit saat kita memindahkannya)
Dan menempatkan ketinggian tumpukan yang kami rekam
Sekarang kami ingin menggabungkan digit ke dalam basis 10 nomor tunggal. Kami juga ingin membuat kekuatan 10 dengan dua kali digit sebagai angka untuk digunakan dalam perhitungan.
Kita mulai dengan mengatur 1 di atas tumpukan untuk menghasilkan kekuatan 10 dan mendorong tinggi tumpukan minus satu ke tumpukan di atas untuk penggunaan perulangan.
Sekarang kita memutar tinggi tumpukan minus 1 kali,
Setiap kali kita mengalikan elemen teratas dengan 100 dan di bawahnya mengalikan elemen berikutnya dengan 10 dan menambahkannya ke nomor di bawah ini.
Kami mengakhiri lingkaran kami
Sekarang kita akhirnya selesai dengan pengaturan dan dapat memulai perhitungan yang sebenarnya.
Itu dia ...
Kami membagi kekuatan 10 oleh versi modifikasi dari masukan menggunakan 0 ' 's algoritma pembagian integer seperti yang ditemukan di wiki . Ini mensimulasikan pembagian 1 dengan input satu-satunya cara Brain-Flak tahu caranya.
Terakhir kita harus memformat output kita ke ASCII yang sesuai.
Sekarang kami telah menemukan
ne
kami perlu mengambile
. Langkah pertama untuk ini adalah mengubahnya menjadi daftar digit. Kode ini adalah versi modifikasi dari 0 ' 's algoritma divmod .Sekarang kita ambil nomornya dan tambahkan titik desimal kembali ke tempatnya. Hanya dengan memikirkan bagian kode ini akan memunculkan sakit kepala kembali, jadi untuk sekarang saya akan membiarkannya sebagai latihan bagi pembaca untuk mengetahui bagaimana dan mengapa ia bekerja.
Letakkan tanda negatif ke bawah atau karakter nol jika tidak ada tanda negatif.
sumber
I don't know what this does or why I need it, but I promise it's important.
1.0
atau10
-c
flag untuk dijalankan dengan ASCII masuk dan keluar. Karena Brain-Flak tidak mendukung angka mengambang, saya harus menggunakan IO sebagai string.Python 2 , 10 byte
Cobalah online!
sumber
Retina ,
9991 byteCobalah online!
Woohoo, sub-100! Ini sangat efisien, mengingat ia menciptakan (dan kemudian cocok dengan) string dengan lebih dari 10 7 karakter pada satu titik. Saya yakin itu belum optimal, tetapi saya cukup senang dengan skor saat ini.
Hasil dengan nilai absolut kurang dari 1 akan dicetak tanpa nol di depan, misalnya
.123
atau-.456
.Penjelasan
Ide dasarnya adalah menggunakan pembagian integer (karena itu cukup mudah dengan regex dan aritmatika unary). Untuk memastikan bahwa kami mendapatkan angka signifikan yang cukup, kami membagi input menjadi 10 7 . Dengan begitu, setiap input hingga 9999 masih menghasilkan angka 4 digit. Secara efektif, itu berarti kita mengalikan hasilnya dengan 10 7 sehingga kita perlu melacaknya ketika nanti masukkan kembali titik desimal.
Kita mulai dengan mengganti titik desimal, atau akhir string jika tidak ada titik desimal dengan 8 titik koma. Yang pertama dari mereka pada dasarnya adalah titik desimal itu sendiri (tapi saya menggunakan titik koma karena mereka tidak perlu melarikan diri), 7 lainnya menunjukkan bahwa nilai telah dikalikan dengan 10 7 (ini belum terjadi, tapi kami tahu kami akan melakukannya nanti).
Kami pertama-tama mengubah input menjadi bilangan bulat. Selama masih ada digit setelah titik desimal, kami memindahkan satu digit ke depan dan menghapus salah satu dari titik koma. Ini karena memindahkan titik desimal ke kanan mengalikan input dengan 10 , dan karenanya membagi hasilnya dengan 10 . Karena batasan input, kami tahu ini akan terjadi paling banyak empat kali, jadi selalu ada cukup titik koma untuk dihapus.
Sekarang inputnya adalah integer, kami mengonversinya menjadi unary dan menambahkan 10 7
1
s (dipisahkan oleh a,
).Kami membagi bilangan bulat menjadi 10 7 dengan menghitung berapa banyak referensi yang cocok (
$#2
). Ini adalah divisi integer standar unarya,b
->b/a
. Sekarang kita hanya perlu memperbaiki posisi titik desimal.Ini pada dasarnya kebalikan dari tahap kedua. Jika kita masih memiliki lebih dari satu titik koma, itu artinya kita masih perlu membagi hasilnya dengan 10 . Kami melakukan ini dengan memindahkan titik koma satu posisi ke kiri dan menjatuhkan satu titik koma hingga kami mencapai ujung kiri angka tersebut, atau kami hanya memiliki satu titik koma (yang merupakan titik desimal itu sendiri).
Sekarang adalah saat yang tepat untuk mengubah yang pertama (dan mungkin hanya)
;
kembali.
.Jika masih ada titik koma yang tersisa, kami telah mencapai ujung kiri angka tersebut, jadi membaginya dengan 10 lagi akan memasukkan nol di belakang titik desimal. Ini mudah dilakukan dengan mengganti setiap sisa
;
dengan0
, karena mereka tetap setelah titik desimal.sumber
\B;
dengan^;
untuk menyimpan 1 byte?-
di depan;
.yup , 5 byte
Cobalah online! Ini mengambil input dari atas tumpukan dan meninggalkan output di atas tumpukan. TIO link mengambil input dari argumen baris perintah, yang hanya mampu mengambil input integer.
Penjelasan
yup hanya memiliki beberapa operator. Yang digunakan dalam jawaban ini adalah ln (x) (diwakili oleh
|
), 0 () (konstan, fungsi nilary kembali0
), - (pengurangan), dan exp (x) (diwakili olehe
).~
mengaktifkan dua anggota teratas di tumpukan.Ini menggunakan identitas
yang menyiratkan itu
sumber
LOLCODE ,
63, 56 byte7 byte disimpan berkat @devRicher!
Ini mendefinisikan fungsi 'r', yang dapat dipanggil dengan:
atau yang lainnya
NUMBAR
.Cobalah online!
sumber
ITZ A NUMBAR
dalam penugasanI
?HOW DUZ I r YR n VISIBLE QUOSHUNT OF 1 AN n IF U SAY SO
(tambahkan baris baru) lebih pendek beberapa byte dan dapat dipanggil denganr d
, di manad
adaNUMBAR
.IZ
alih-alihDUZ
karena aturan juru bahasased , 575 +1 (
-r
bendera) =723718594588576 byteCobalah online!
Catatan: mengapung yang nilai absolut kurang dari 1 akan harus ditulis tanpa awalan 0 seperti
.5
bukan0.5
. Juga jumlah tempat desimal sama dengan , di manan
jumlah tempat desimal dalam angka (jadi memberi13.0
sebagai input akan memberi lebih banyak tempat desimal daripada memberi13
sebagai input)Ini adalah pengajuan sed pertama saya di PPCG. Gagasan untuk konversi desimal ke unaris diambil dari jawaban yang luar biasa ini . Terima kasih kepada @seshoumara karena membimbing saya melalui sed!
Kode ini melakukan pembagian panjang berulang untuk mendapatkan hasilnya. Divisi ini hanya membutuhkan ~ 150 byte. Konversi unimal-desimal mengambil sebagian besar byte, dan beberapa byte lainnya digunakan untuk mendukung angka negatif dan input floating-point
Penjelasan
Penjelasan tentang TIO
Suntingan
s:s/(.)/(.)/g:y/\1/\2/g:g
untuk menyimpan 1 byte di setiap substitusi (total 5)\n
alih-alih;
sebagai pemisah, maka saya dapat mempersingkat substitusi "kalikan dengan 10" untuk menghemat 12 byte (terima kasih kepada @Riley dan @seshoumara karena menunjukkan kepada saya ini)sumber
JSFuck , 3320 byte
JSFuck adalah gaya pemrograman esoterik dan pendidikan yang didasarkan pada bagian atom JavaScript. Hanya menggunakan enam karakter berbeda
()[]+!
untuk menulis dan mengeksekusi kode.Cobalah online!
sumber
return 1/this
akan menjadi sekitar 76 byte lebih lama darireturn+1/this
.[].fill.constructor('alert(1/prompt())')
2929 bytes paste.ubuntu.com/p/5vGTqw4TQQ tambahkan()
2931MINYAK ,
14281420 byteBaiklah. Saya pikir saya mungkin juga mencobanya, dan pada akhirnya saya berhasil. Hanya ada satu kelemahan: Butuh waktu hampir lama untuk berjalan seperti yang dibutuhkan untuk menulis.
Program ini dipisahkan menjadi beberapa file, yang memiliki semua nama file 1-byte (dan menghitung satu byte tambahan dalam perhitungan byte saya). Beberapa file adalah bagian dari contoh file dari bahasa OIL, tetapi tidak ada cara nyata untuk memanggil mereka secara konsisten (belum ada jalur pencarian atau semacamnya di OIL, jadi saya tidak menganggapnya sebagai perpustakaan standar), tetapi itu juga berarti bahwa (pada saat memposting) beberapa file lebih bertele-tele daripada neccessary, tetapi biasanya hanya dengan beberapa byte.
Perhitungannya akurat hingga 4 digit presisi, tetapi menghitung bahkan timbal balik sederhana (seperti input
3
) membutuhkan waktu yang sangat lama (lebih dari 5 menit) untuk diselesaikan. Untuk tujuan pengujian, saya juga membuat varian minor yang akurat hingga 2 digit, yang hanya membutuhkan beberapa detik untuk menjalankannya, untuk membuktikan bahwa itu berfungsi.Maaf atas jawaban yang sangat besar, saya berharap saya bisa menggunakan semacam tag spoiler. Saya juga bisa meletakkan sebagian besar di gist.github.com atau yang serupa, jika diinginkan.
Kita mulai
main
:, 217 byte (nama file tidak masuk hitungan untuk byte):a
(memeriksa apakah string yang diberikan dalam string lain yang diberikan), 74 + 1 = 75 byte:b
(bergabung dengan dua string yang diberikan), 20 + 1 = 21 byte:c
(diberi simbol, pisahkan string yang diberikan pada kemunculannya yang pertama), 143 +1 = 144 byte (yang ini jelas masih golf):d
(diberi string, dapatkan 4 karakter pertama), 22 + 1 = 23 byte:e
(divisi tingkat tinggi (tetapi dengan bahaya nol divisi)), 138 +1 = 139 byte:f
(memindahkan posisi titik 4 ke kanan; "membagi" dengan 10.000), 146 +1 = 147 byte:g
(memeriksa apakah sebuah string dimulai dengan karakter yang diberikan), 113 + 1 = 114 byte:h
(mengembalikan semuanya kecuali karakter pertama dari string yang diberikan), 41 + 1 = 42 byte:i
(kurangi dua angka), 34 + 1 = 35 byte:j
(divisi tingkat rendah yang tidak berfungsi dalam semua kasus), 134 + 1 = 135 byte:k
(penggandaan), 158 + 1 = 159 byte:l
(kembalikan nilai absolut), 58 + 1 = 59 byte:m
(tambahan), 109 + 1 = 110 byte:sumber
J, 1 byte
%
adalah fungsi memberikan kebalikan dari inputnya. Anda bisa menjalankannya seperti inisumber
Taksi , 467 byte
Cobalah online!
Tidak Disatukan:
sumber
Vim,
108 byte / penekanan tombolKarena V kompatibel dari belakang, Anda dapat mencobanya secara online!
sumber
=
. Hanya mengandalkan makro lain, register untuk menyimpan memori, dan kunci untuk menavigasi dan memodifikasi data. Akan jauh lebih kompleks tetapi saya pikir itu akan sangat keren! Saya pikirf
akan memainkan peran besar sebagai ujian bersyarat.6431.0
sehingga diperlakukan sebagai angka floating pointx86_64 Bahasa mesin Linux, 5 byte
Untuk menguji ini, Anda dapat mengkompilasi dan menjalankan program C berikut
Cobalah online!
sumber
rcpss
hanya menghitung perkiraan timbal balik (sekitar presisi 12 bit). +1C,
1512 byteCobalah online!
1613 byte, jika perlu menangani input integer juga:Jadi Anda bisa menyebutnya dengan
f(3)
alih - alihf(3.0)
.Cobalah online!
Terima kasih kepada @hvd untuk bermain golf 3 byte!
sumber
f(x)
dengan1/x
. Ketika "fungsi" dijalankan, yang dapat terjadi selambat runtime atau pada saat kompiler Anda merasa (dan dapat membuktikan benar), secara teknis bukan langkah preprosesor.2
dan-5
sebagai masukan. Keduanya2
dan-5
desimal, yang mengandung angka dalam rentang 0 hingga 9.#define f 1./
berfungsi juga.MATLAB / Oktaf, 4 byte
Membuat gagang fungsi (bernama
ans
) keinv
fungsi bawaanDemo online
sumber
05AB1E , 1 byte
Cobalah online!
sumber
GNU sed ,
377362 +1 (r flag) = 363 bytesPeringatan: program akan memakan semua memori sistem yang mencoba dijalankan dan membutuhkan lebih banyak waktu untuk menyelesaikan daripada yang Anda tunggu! Lihat di bawah untuk penjelasan dan versi yang cepat, tetapi kurang tepat.
Ini didasarkan pada jawaban Retina oleh Martin Ender. Saya menghitung
\t
dari baris 2 sebagai tab literal (1 byte).Kontribusi utama saya adalah metode konversi dari desimal ke polos unary (baris 2), dan sebaliknya (baris 5). Saya berhasil secara signifikan mengurangi ukuran kode yang diperlukan untuk melakukan ini (gabungan ~ 40 byte), dibandingkan dengan metode yang ditunjukkan pada tip sebelumnya . Saya membuat jawaban tip terpisah dengan detail, tempat saya memberikan cuplikan yang siap pakai. Karena 0 tidak diizinkan sebagai input, beberapa byte lagi disimpan.
Penjelasan: untuk lebih memahami algoritma pembagian, baca jawaban Retina terlebih dahulu
Program ini secara teori benar, alasan mengapa ia menghabiskan begitu banyak sumber daya komputasi adalah bahwa langkah pembagian dijalankan ratusan ribu kali, lebih atau kurang tergantung pada input, dan regex yang digunakan menimbulkan mimpi buruk yang melenceng. Versi cepat mengurangi presisi (karenanya jumlah langkah pembagian), dan mengubah regex untuk mengurangi backtracking.
Sayangnya, sed tidak memiliki metode untuk secara langsung menghitung berapa kali backreference cocok dengan suatu pola, seperti di Retina.
Untuk versi program yang cepat dan aman, tetapi kurang tepat, Anda dapat mencoba ini secara online .
sumber
Japt , 2 byte
Solusi yang jelas akan menjadi
yang secara harfiah
1 / input
,. Namun, kita dapat melakukan yang lebih baik:Ini setara dengan
input ** J
, danJ
diatur ke -1 secara default.Cobalah online!
Fakta menyenangkan: seperti
p
fungsi daya, demikianq
juga fungsi root (p2
=**2
,q2
=**(1/2)
); ini berarti bahwaqJ
akan bekerja juga, karena-1 == 1/-1
, dan karena itux**(-1) == x**(1/-1)
.sumber
Javascript ES6, 6 byte
Cobalah online!
Default Javascript untuk pembagian floating point.
sumber
APL, 1 byte
÷
Menghitung timbal balik saat digunakan sebagai fungsi monadik. Cobalah online!Menggunakan set karakter Dyalog Classic.
sumber
Cheddar , 5 byte
Cobalah online!
Ini menggunakan
&
, yang mengikat argumen ke suatu fungsi. Dalam hal ini,1
terikat ke sisi kiri/
, yang memberi kita1/x
, untuk sebuah argumenx
. Ini lebih pendek dari kanonx->1/x
sebesar 1 byte.Atau, dalam versi yang lebih baru:
sumber
(1:/)
untuk jumlah byte yang samaJava 8, 6 byte
Hampir sama dengan jawaban JavaScript .
sumber
MATL , 3 byte
Cobalah di MATL Online
Penjelasan
sumber
Python, 12 byte
Satu untuk 13 byte:
Satu untuk 14 byte:
sumber
Mathematica, 4 byte
Memberi Anda rasional yang tepat jika Anda memberikan rasional yang tepat, dan dengan hasil floating-point jika Anda memberikannya hasil floating-point.
sumber
ZX Spectrum BASIC, 13 byte
Catatan:
SGN PI
bukannya literal1
.Versi ZX81 untuk 17 byte:
sumber
LET A=17
dan memperbaiki aplikasi Anda menjadi satu baris1 PRINT SGN PI/A
, Anda perlu mengubah nilai A dengan lebih banyak mengetik setiap kali Anda ingin menjalankan program Anda.Haskell , 4 byte
Cobalah online!
sumber
R, 8 byte
Cukup mudah. Langsung menampilkan kebalikan dari input.
Solusi lain, tetapi 1 byte lebih lama bisa:,
scan()^-1
atau bahkanscan()**-1
untuk byte tambahan. Keduanya^
dan**
simbol kekuatan.sumber
TI-Basic (TI-84 Plus CE),
652 byte-1 byte terima kasih kepada Timtech .
-3 byte dengan
Ans
terima kasih kepada Григорий Перельман .Ans
dan⁻¹
merupakan token satu byte .TI-Basic secara implisit mengembalikan nilai terakhir yang dievaluasi (
Ans⁻¹
).sumber
Ans
, sehingga Anda dapat menggantinya denganAns⁻¹
Jelly , 1 byte
Cobalah online!
sumber
Jelly programs consist of up to 257 different Unicode characters
.¶
dan karakter linefeed dapat digunakan secara bergantian , jadi sementara mode Unicode "memahami" 257 karakter yang berbeda, mereka memetakan ke 256 token.C, 30 byte
sumber
0
untuk menyimpan satu byte. Dengan1.
itu masih akan dikompilasi sebagai dobel.1.
masih diperlakukan seperti bilangan bulat.echo -e "#include <stdio.h>\nfloat f(x){return 1./x;}main(){printf(\"%f\\\\n\",f(5));}" | gcc -o test -xc -
Output of./test
adalah0.200000
float f(float x){return 1/x;}
akan bekerja dengan benar..
- C dengan senang hati akan dikonversi(int)1
ke(float)1
karena tipex
.