🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
Cobalah online!
-3 byte dengan menggunakan "kurang dari atau sama dengan 1" alih-alih "kurang dari 2" karena emoji "kurang dari" memiliki pengkodean UTF-8 yang cukup panjang. Juga dibuat t
beku untuk membungkam peringatan tanpa mempengaruhi jumlah byte.
Perpanjang kelas 🚂 (integer) dengan metode bernama 🅰️. Anda dapat menulis program sederhana yang mengambil angka dari input, memanggil 🅰️ pada nomor dan mencetak hasilnya seperti ini:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Bagian ini bisa di-golf banyak dengan menghilangkan pesan dan penanganan kesalahan, tetapi itu tidak termasuk dalam skor, jadi saya lebih suka menampilkan lebih banyak fitur Emojicode sebagai gantinya, sambil meningkatkan keterbacaan sepanjang jalan.
Tidak disatukan
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Penjelasan
Catatan: banyak pilihan emoji tidak masuk akal di emojicode 0.5. Lagipula 0.x. 0,6 akan memperbaiki ini.
Emojicode adalah bahasa pemrograman berorientasi objek yang menampilkan generik, protokol, opsional, dan penutupan, tetapi program ini tidak menggunakan penutupan dan semua generik dan protokol dapat dianggap implisit, sedangkan satu-satunya opsional muncul di rintisan I / O.
Program ini beroperasi hanya pada beberapa tipe: 🚂 adalah tipe integer, 🔡 adalah tipe string dan ⏩ adalah tipe range. Beberapa booleans (👌) juga muncul, tetapi mereka hanya digunakan dalam kondisi. Boolean dapat mengambil nilai 👍 atau 👎, yang masing-masing sesuai dengan benar dan salah.
Saat ini tidak ada operator di Emojicode, jadi penambahan, perbandingan dan operasi lain yang biasanya operator diimplementasikan sebagai fungsi, secara efektif membuat ekspresi menggunakan notasi awalan . Operator juga direncanakan dalam 0,6.
Mari kita selesaikan program pengujian terlebih dahulu.
🏁
Ini adalah blok 🏁, yang dapat dibandingkan dengan main dari bahasa lain.
🍇 ... 🍉
Anggur dan semangka menyatakan blok kode dalam emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
Ini menyatakan nama "beku" str
dan menetapkan nilainya ke string baru yang dibuat menggunakan initializer (constructor) 😯, yang mengambil prompt sebagai string dan kemudian memasukkan baris dari pengguna. Mengapa menggunakan variabel beku daripada variabel? Itu tidak akan berubah, jadi variabel akan memancarkan peringatan.
🍊🍦num🚂str 10
Mari kita jabarkan. 🚂str 10
memanggil metode 🚂 pada str
beku dengan argumen 10. Dengan konvensi, metode yang dinamai dengan nama tipe mengkonversi objek ke tipe itu. 10 adalah basis yang digunakan untuk konversi integer. Metode ini mengembalikan opsional 🍬🚂
,. Opsional dapat berisi nilai dari jenis dasar atau ketiadaan, ⚡. Ketika string tidak berisi angka, ⚡ dikembalikan. Untuk menggunakan nilai, kita harus membuka bungkusan opsional menggunakan 🍺, yang memunculkan kesalahan runtime jika nilainya ⚡. Oleh karena itu, praktik yang baik untuk memeriksa ketiadaan sebelum membuka bungkus opsional. Adalah sangat umum, pada kenyataannya, bahwa Emojicode memiliki istilah untuk itu. Biasanya,🍊
adalah "jika".🍊🍦 variable expression
berarti: mengevaluasi ekspresi. Jika opsional berisi ketiadaan, kondisi dievaluasi menjadi 👎 (salah). Jika tidak, nama yang dibekukan variable
dibuat dengan nilai opsional yang terbuka, dan kondisi dievaluasi menjadi 👍, (benar). Oleh karena itu, dalam penggunaan normal, 🍇 ... 🍉
blok mengikuti persyaratan dimasukkan.
😀🔡🅰️num 10
🅰️ adalah metode yang ditambahkan kode utama 🚂 menggunakan 🐋 yang menghitung jumlah partisi. Ini memanggil 🅰️ pada num
beku yang kami nyatakan dalam kondisi dan mengubah hasilnya menjadi string menggunakan basis 10 dengan metode 🔡. Kemudian, 😀 mencetak hasilnya.
🍓🍇 ... 🍉
🍓 berarti "lain", jadi blok ini dimasukkan ketika pengguna tidak memasukkan nomor dengan benar.
😀🔤Learn what a number is, you moron!🔤
Mencetak string literal.
Sekarang, mari kita lihat program utama. Saya akan menjelaskan versi yang tidak diserang; versi golf hanya menghapus spasi dan variabel diubah namanya menjadi nama huruf tunggal.
🐋🚂🍇 ... 🍉
Perpanjang kelas 🚂. Ini adalah fitur yang tidak umum ditemukan dalam bahasa pemrograman. Alih-alih membuat kelas baru dengan 🚂 sebagai superclass, 🐋 memodifikasi 🚂 secara langsung.
🐖🅰️➡🚂🍇 ... 🍉
Menciptakan metode baru bernama 🅰️ yang mengembalikan 🚂. Ini mengembalikan jumlah partisi yang dihitung menggunakan rumusa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 mirip dengan this
atau self
dari bahasa lain dan merujuk ke objek metode dipanggil. Implementasi ini bersifat rekursif, jadi ini adalah kondisi terminating: jika jumlah metode yang dipanggil kurang dari atau sama dengan 1, kembalikan 1.
🍮sum 0
Buat variabel baru sum
dan atur ke 0. Secara implisit mengasumsikan tipe 🚂.
🔂k⏩0🐕
🔂 mengulangi apa pun yang mengimplementasikan protokol 🔂🐚⚪️, sedangkan ⏩ adalah rentang literal yang terjadi untuk mengimplementasikan 🔂🐚🚂. Rentang memiliki nilai awal, nilai berhenti dan nilai langkah, yang dianggap 1 jika start < stop
, atau -1. Satu juga dapat menentukan nilai langkah dengan menggunakan ⏭ untuk membuat rentang literal. Nilai awal inklusif, sedangkan nilai stop eksklusif, jadi ini setara dengan for k in range(n)
atau Sum_{k=0..n-1}
dalam rumus.
🍦nmk➖🐕k
Kita perlu menghitung sigma (n - k), atau jumlah pembagi n - k
dengan kata lain, dan argumen diperlukan beberapa kali, jadi ini menyimpan n - k
dalam variabel nmk
untuk menyimpan beberapa byte.
🍮sig nmk
🔂i⏩1 nmk
Ini mengatur sig
variabel ke argumen sigma dan mengulangi semua angka dari 1 hingga nmk - 1
. Saya bisa menginisialisasi variabel ke 0 dan beralih lebih dari 1..nmk tetapi melakukannya dengan cara ini lebih pendek.
🍊😛🚮nmk i 0
🚮 menghitung sisanya, atau modulus dan 😛 memeriksa kesetaraan, sehingga kondisinya akan 👍 jika i
merupakan pembagi nmk
.
🍮➕sig i
Ini adalah tugas melalui panggilan, mirip dengan += -= >>=
keluarga operator dalam beberapa bahasa inferior, bebas emoji. Baris ini juga dapat ditulis sebagai 🍮 sig ➕ sig i
. Karena itu, setelah loop dalam selesai, sig
akan berisi jumlah pembagi n - k
, atausigma(n - k)
🍮➕sum✖sig🅰️k
Tugas lain melalui panggilan, jadi ini menambah sigma(n - k) * A(k)
total, seperti dalam rumus.
🍎➗sum🐕
Akhirnya, jumlah dibagi dengan n dan hasil bagi dikembalikan. Penjelasan ini mungkin memakan waktu sebanyak tiga kali sebanyak menulis kode itu sendiri ...