Salah satu fitur unik dari bahasa pemrograman Malbolge adalah OP
operatornya yang sangat tidak intuitif , hanya disebut sebagai "op" dalam dokumentasi dan kode sumber tetapi dikenal sebagai operator "gila". Seperti dijelaskan oleh Ben Olmstead, pencipta bahasa, dalam dokumentasinya: " jangan mencari pola, itu tidak ada di sana ."
op adalah operator "tritwise" - ini beroperasi pada digit ternary yang sesuai dari dua argumennya. Untuk setiap trit (bit ternary), hasil op diberikan oleh tabel pencarian berikut:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Misalnya, untuk menghitung op(12345, 54321)
, pertama-tama tuliskan kedua angka dalam ternary dan kemudian cari setiap pasangan trit dalam tabel:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
Poin penting terakhir adalah bahwa semua nilai di Malbolge memiliki lebar 10 trit, sehingga nilai input harus diisi dengan nol hingga lebar 10. (Misalnya, op(0, 0)
berada 1111111111
di ternary.)
Tugas Anda adalah mengambil dua bilangan bulat 0 ≤ a
, b
<59049 sebagai input, dan menghasilkan nilai integer sebesar op(a,b)
.
Kasus uji (dalam format a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Berikut ini adalah implementasi referensi (disalin langsung dari kode sumber Malbolge).
54616_3
tidak berarti "hal lain ini adalah angka desimal 54616, tetapi diwakili sebagai basis tiga". Ini berarti "Baca54616
sebagai basis 3". Yang tentu saja tidak bisa Anda lakukan (ada angka yang tidak bisa dihitung oleh Valve di sana). Mungkin masih akan sama jelasnya jika Anda menyingkirkan_3
seluruhnya, dan lebih akurat.Jawaban:
C (gcc) ,
999896 byte19683
untukL'䳣'
.108609
untukL''
.Cobalah online!
sumber
JavaScript (ES7), 56 byte
Cobalah online!
Bagaimana?
Diberikan dan dalam , kami menghitung:b [ 0..2 ]a b [0..2]
Menuju ke:
Pilihan fungsi
Ada beberapa kemungkinan fungsi kandidat lainnya dari formulir:
Salah satu yang terpendek adalah:
Tetapi hal baiknya tentang adalah dapat dilakukan dengan operator bitwise, sehingga secara implisit membuang bagian desimal dari dan . Inilah mengapa kita bisa membaginya dengan tanpa pembulatan di antara setiap iterasi.(a+512b+8) a b 3
Berkomentar
sumber
(1581093>>b%3*2+a%3*8&3)
menghemat seluruh byte!a/3
danb/3
tanpa pembulatan. Itu akan gagal karena itu.k = 9 ... => ~k && ...
kek = 10 ... => k && ...
?for(k=9;k>=0;k--)
daripadafor(k=10;k>=1;k--)
.05AB1E , 18 byte
Kode:
Menggunakan penyandian 05AB1E . Cobalah online!
Penjelasan Algoritma
Untuk mendapatkan nomor yang diisi dengan angka nol, kita perlu menambahkan 59049 ke kedua angka (karena 59049 di ternary adalah 10000000000 ). Kita tidak harus meninggalkan yang pertama sebagai . Kami mengonversi angka dari desimal ke terner dan bergabung dengan setiap pasangan sebagai masing-masing nomor sendiri.(1,1)→0
Misalnya, untuk input 12345 dan 54321 , ini dipetakan ke:
Yang memberikan daftar bilangan bulat gabungan berikut:
Bilangan bulat ini perlu dipetakan oleh tabel pencarian yang diberikan di OP. Rumus yang saat ini kami gunakan yang memetakan angka-angka ini ke catatan yang sesuai ( ) adalah:0→1,10→0,…
Sedangkan menunjukkan fungsi xor bitwise .⊕
Akhirnya setelah memetakan fungsi ini pada daftar bilangan bulat yang bergabung, kami memperlakukan daftar yang dihasilkan ini sebagai angka yang diwakili dalam basis 3 dan mengubahnya dari basis 3 ke desimal.
Penjelasan Kode
sumber
3Tm+3Bø19sm74%3%3β
bermain golf?R ,
6462 byteCobalah online!
Terima kasih kepada JAD untuk beberapa trik golf
sihir hitamdan -2 byte!30801
, ketika dikonversi ke bilangan bulat ternary 10-trit, adalah1120020210
yang hanya menambahkan nol tambahan ke tabel operasi, saat membaca kolom. Kemudian kita mengonversi digit ternera
danb
elementwise menjadi integer dan menggunakannya sebagai indeks ke digit terner30801
.sumber
x
menggunakan indeks pertama kali[.*]
. Lalu semua%any%
operasi terjadi. Bagian yang menyenangkan adalah bahwa jika Anda melihat30801%/%x%%3
sebagaif=function(x)30801%/%x%%3
, ituf(x[index]) == (f(x))[index]
. Menyimpan kawat gigi :)C (gcc) ,
747271 byteCobalah online!
Kerusakan
Tabel kebenaran
Dapat dianggap sebagai array 3x3, di mana a adalah kolom, dan b adalah baris. Mengubah itu menjadi daftar satu dimensi memberi kita 100102221. Untuk menghemat ruang, kita menghindari daftar dan string dan menjadikannya sebagai angka. Untuk melakukan itu, kami membalik urutan dan mengubah setiap trit menjadi angka 2-bit. Rekatkan keduanya dan kita memiliki angka biner yang dapat kita "indeks" dengan menggesernya ke kanan dengan
2 * (b * 3 + a)
dan menutupi:Selanjutnya, kita memijat ekspresi menggunakan kekuatan operasi yang diutamakan untuk menjadi kekejian di atas.
3 ^ 9 = 19683 sehingga itu adalah batas loop yang baik. Karena kita mengalikan penghitung dengan 3 setiap kali, kita dapat menulis batas sebagai2e4
gantinya. Kami juga menyelamatkan diri dari gangguanpow()
atau serupa.Setelah dipikir-pikir, mari kita mulai dari 3 ^ 10 dan bekerja ke bawah dengan pre-loop divide-and-test.
sumber
Haskell , 108 byte
Cobalah online!
sumber
APL (Dyalog) ,
4125 byte9 byte disimpan berkat @ Adám
Cobalah online!
sumber
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Jelly ,
2318 byte-1 berkat Erik the Outgolfer (mengatur ulang
3*⁵¤
untuk⁵3*
)Tautan monadik yang menerima daftar dua bilangan bulat.
Cobalah online! Atau lihat test-suite .
⁹*%733%3
byte lebih panjang dariị⁽½Ṡb3¤
:(Bagaimana?
Juga 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(menggunakan formula ajaib setelah mendapatkan pasangan-bijaksana dari mengkonversi dari basis sepuluh kemudian mengambil 19 untuk kekuatan itu, modulo 74, modulo 3 untuk mendapatkan catatan yang diperlukan dari output - ditemukan menggunakan pencarian dengan Python)sumber
y
0
built-in "prepend s")Python 2 ,
79656361 byteterima kasih kepada Arnauld untuk formulanya (-2 byte).
Cobalah online!
sumber
J , 37 byte
Penjelasan:
Akhirnya menjadi relatif mudah dibaca, tbh.
sumber
Python 2 ,
9087 byteCobalah online!
sumber
Arang , 31 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Solusi alternatif, juga 31 byte:
Cobalah online! Tautan adalah untuk mengucapkan versi kode.
sumber
Ruby , 70 byte
Cobalah online!
Mengurai
a
danb
secara rekursif sampai kita mendapatkan masing-masing 10 digit.6883
memberikan tabel terner rata (terbalik). Merekonstruksi dari ternary ke desimal dengan mengalikan dengan3**(10-l)
.sumber
Cjam, 31 byte
Cobalah online!
sumber
J , 43 byte
Tentu saja bisa bermain golf lebih lanjut.
Penjelasan:
Cobalah online!
sumber
Stax , 22 byte
Jalankan dan debug itu
sumber
Pyth
26 2524 byteDisimpan 1 byte, terima kasih kepada @ErikTheOutgolfer
Simpan byte lain, terinspirasi oleh jawaban @ JonathanAllan
Input adalah daftar elemen 2
[a,b]
. Cobalah online di sini , atau verifikasi semua test case di sini .sumber
.T
bisaC
.K (ngn / k) ,
2522 byteCobalah online!
sumber
Japt ,
2423 byteMendapatkan bola bergulir pada lari Japt sebagai bahasa bulan ini - Saya sepenuhnya berharap akan kalah dalam hal ini!
Mengambil input dalam urutan terbalik sebagai array integer (yaitu,
[b,a]
).Cobalah
sumber
Perl 5
-p
, 102 byteCobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
757260 byteCobalah online!
versi tidak golf:
Keduanya
a
danb
dikonversi ke daftar sepuluh-trit, kemudian digunakan berpasangan sebagai indeks 2D ke dalam tabel pencarian angka{1, 0, 0, 1, 0, 2, 2, 2, 1}
. Hasilnya ditafsirkan kembali sebagai daftar sepuluh-trit dan dikonversi kembali ke bentuk integer.Tabel pencarian dikodekan sebagai
IntegerDigits[6883,3]
, yang singkat karena kita mendaur ulangIntegerDigits
simbol.sumber