๐๐๐๐๐
ฐ๏ธโก๐๐๐โฌ
๐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 ...