Diberikan dua bilangan bulat lebih besar dari satu, A dan B, menghasilkan empat ekspresi matematika dalam urutan ini:
Ekspresi sederhana A ^ B (A ke kekuatan B). misal jika A = 2 dan B = 3
2^3
,.Perluasan A ^ B dalam hal perkalian berulang A. misalnya
2*2*2
.Perluasan A ^ B dalam hal penambahan berulang A. misalnya
2+2+2+2
.Perluasan A ^ B dalam hal penambahan berulang 1. misalnya
1+1+1+1+1+1+1+1
.
Keempat ungkapan itu bisa berupa keluaran dengan cara apa pun yang masuk akal asalkan teratur dan jelas berbeda. Misalnya, Anda dapat memasukkannya dalam daftar, atau mencetaknya pada baris yang berbeda
2^3
2*2*2
2+2+2+2
1+1+1+1+1+1+1+1
atau mungkin pada satu baris dipisahkan oleh tanda sama dengan:
2^3=2*2*2=2+2+2+2=1+1+1+1+1+1+1+1
Spasi dapat dimasukkan di sebelah operator matematika
2^3 = 2 * 2 * 2 = 2 + 2 + 2 + 2 = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
akan menjadi output yang sama-sama valid ketika A = 2 dan B = 3.
Anda dapat menggunakan simbol sebagai alternatif untuk ^
,, *
dan +
, tetapi hanya jika simbol baru lebih idiomatis untuk bahasa Anda (misalnya, **
bukan ^
dalam Python).
Anda dapat mengasumsikan bahwa A dan B cukup kecil sehingga A ^ B tidak akan melimpahi tipe integer default bahasa Anda (mengingat bahwa tipe tersebut memiliki maksimum yang masuk akal, setidaknya 255).
Kode terpendek dalam byte menang.
Uji Kasus
Satu output per baris. Input dapat disimpulkan karena ekspresi pertama selalu A ^ B.
2^2 = 2*2 = 2+2 = 1+1+1+1
2^3 = 2*2*2 = 2+2+2+2 = 1+1+1+1+1+1+1+1
2^4 = 2*2*2*2 = 2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
2^5 = 2*2*2*2*2 = 2+2+2+2+2+2+2+2+2+2+2+2+2+2+2+2 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^2 = 3*3 = 3+3+3 = 1+1+1+1+1+1+1+1+1
3^3 = 3*3*3 = 3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^4 = 3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
3^5 = 3*3*3*3*3 = 3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3+3 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^2 = 4*4 = 4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
4^3 = 4*4*4 = 4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
10^2 = 10*10 = 10+10+10+10+10+10+10+10+10+10 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
13^2 = 13*13 = 13+13+13+13+13+13+13+13+13+13+13+13+13 = 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
sumber
=
di sebelah kiri3
.2^3
format input yang valid? Atau harus dipisahkan dengan spasi / koma / linefeed atau semacamnya?Jawaban:
Python 3.6 ,
8874 byte-2 byte terima kasih kepada Dada (gunakan
~
)-5 byte terima kasih kepada Erwan (gunakan f-string dari Python 3.6)
ide online siapa pun?
Bagaimana?
Ini adalah fungsi tanpa nama yang mengambil dua input integer
a
danb
masing - masing lebih besar dari0
(meskipun spesifikasinya hanya untuk yang lebih besar dari1
).Dalam Python 3.6 tersedia fitur baru, yaitu string string yang diformat atau "f-string". Ini memungkinkan run-time dievaluasi konstruksi string. Seorang pemimpin
f
(atauF
) menciptakan konstruksi seperti itu, misalnyaf"blah"
atauf'blah'
. Di dalam apa pun f-string antara sepasang kawat gigi{...}
,, adalah ekspresi yang harus dievaluasi.Dengan demikian
f"{a}^{b}={a}{f'*{a}'*~-b}={a}{f'+{a}'*~-a**~-b}=1"
mengevaluasi masing-masinga
,b
,a
,f'*{a}'*~-b
,a
, danf'+{a}'*~-a**~-b}
sebagai ekspresi, menjaga^
,=
,=
, dan=1
sebagai string, yang semuanya akan concatenated bersama-sama.The
a
danb
ekspresi mengevaluasi ke representasia
danb
masing-masing.The
f'*{a}'
danf'+{a}'
pada gilirannya juga f-string dalam ungkapan-ungkapan ini, yang mengevaluasia
dengan terkemuka'*'
dan terkemuka'+'
masing-masingUntuk membuat jumlah
a
s dan operasi yang diperlukan untuk*
dan+
bagian perhatikan bahwa akan adab
a
yang dikalikan bersama dana**(b-1)
a
ditambahkan bersama. Setiap kasing kemudian membutuhkan satu tanda operator lebih sedikit dari jumlaha
s. Jadi kita dapat mengulangi string-ff'*{a}
danf'+{a}'
(menggunakan*
) sebanyak yang ada operator dan masing-masing prepend dengan satua
.(b-1)
adalah~-b
dan(a**(b-1))-1
sekarang~-a**~-b
.Hal yang sama dilakukan untuk
1
s menggunakan(a**b)-1
makhluk~-**b
, tapi kita tidak perlu overhead f-string karena1
adalah konstan, sehingga string standar diulang concatenated dengan+
.Versi Python sebelumnya, 81:
Cobalah online!
sumber
(b-1)
dengan~-b
?lambda a,b:f"{a}^{b}={(f'*{a}'*b)[1:]}={(f'+{a}'*a**~-b)[1:]}=1"+'+1'*~-a**b
Cubix,
238 234 217 151 110100 byteDisimpan 14 byte berkat ETHProductions
Diperluas:
Cobalah online!
Coba di sini
Penjelasan
Kode terdiri dari 8 langkah, dengan dua loop. Saya akan membahas bagian kode bagian demi bagian.
Langkah 1 (A ^ B)
Ini adalah kubus dengan bagian-bagian yang tidak relevan dengan langkah pertama yang dihapus. Tanda tanya menunjukkan no-ops yang akan dikunjungi IP, untuk membuat jalurnya lebih jelas.
Sekarang, tumpukan terlihat seperti ini:
A, B, A, B
Langkah 2 (bersiap untuk loop cetak)
Loop cetak memakan waktu 3 argumen (bagian atas 3 elemen pada stack):
P
,Q
danR
.P
adalah jumlah pengulangan,Q
adalah pemisah (kode karakter) danR
merupakan angka yang harus diulang. Untungnya, loop juga menangani persyaratan bahwa string yang dihasilkan harus diakhiriR
, bukanQ
.Kami ingin mengulang
A*
tepatB
waktu, jadi pemisahnya*
. Perhatikan bahwa tumpukan dimulai sebagaiA, B, A, B
. Sekali lagi, saya menghapus semua instruksi yang tidak relevan. IP mulai diS
menunjuk utara.Tumpukan sekarang
A, B, B, *, A
.Langkah 3/6/8 (lingkaran cetak)
Konsep
IP memasuki loop through
S
, menunjuk ke utara, dan keluar dari loop padaE
, menunjuk ke utara lagi. Untuk penjelasan ini, tumpukan diatur ke[..., A, B, C]
. Instruksi berikut dijalankan. Perhatikan bahwa IP tidak dapat meninggalkan loop sebelum tanda tanya, jadi empat instruksi pertama akan selalu dieksekusi.Pelaksanaan
Inilah kubus lagi, dengan bagian-bagian yang tidak relevan dihapus. IP dimulai
S
, menunjuk ke timur.Seperti yang Anda lihat, IP menemukan empat instruksi sebelum memasuki loop. Karena kode karakter dihapus lagi, kita mencapai loop dengan tumpukan yang sama persis seperti yang kita masukkan bagian ini.
Di dalam loop, penjelasan di atas berlaku.
Langkah 4 (membedakan IP)
Karena kita menggunakan loop di atas beberapa kali, dan mereka semua menyebabkan IP berakhir di tempat yang sama, kita harus membedakan antara beberapa run. Pertama, kita dapat membedakan antara separator (run pertama memiliki
*
, sedangkan run dua dan tiga memiliki+
sebagai separator). Kita dapat membedakan antara run 2 dan 3 dengan memeriksa nilai angka yang diulang. Jika itu salah, program harus diakhiri.Perbandingan pertama
Inilah yang terlihat seperti pada kubus. IP dimulai pada S dan menunjuk ke utara. Tumpukan berisi
[..., * or +, A or 1, 0]
. Angka 1 menunjukkan di mana IP akan berakhir jika ini adalah loop pertama (menunjuk ke utara) dan angka 2 menunjukkan di mana IP akan berakhir jika ini adalah loop kedua (atau ketiga) (menunjuk ke timur).Jika IP sekarang di
1
, tumpukan adalah[A, *, +, -1]
. Jika tidak, tumpukannya[A or 1, +, +, 0]
. Seperti yang Anda lihat, masih ada yang tidak diketahui dalam tumpukan kasus kedua, jadi kita harus melakukan perbandingan lain.Perbandingan kedua
Karena IP telah melalui langkah 5, tumpukan terlihat seperti ini:
[A^(B-1) or nothing, A or 1, +, +, 0]
. Jika elemen pertama adalahnothing
, elemen kedua adalah1
, dan kebalikannya juga berlaku. Kubus terlihat seperti ini, dengan IP mulai dari S dan menunjuk ke timur. Jika ini adalah loop kedua, IP berakhir diE
, menunjuk ke barat. Jika tidak, program akan menyentuh@
dan berakhir.Instruksi yang dijalankan yang tidak melakukan apa pun untuk aliran kontrol tercantum di bawah ini.
Tumpukan sekarang
[A^B, +, A^(B-1), A-1]
, asalkan program tidak berhenti.Langkah 5 (mempersiapkan "A +" (ulangi A ^ (B-1)))
Sayangnya, Cubix tidak memiliki operator listrik, jadi kita perlu loop lain. Namun, kita perlu membersihkan tumpukan dulu, yang sekarang berisi
[B, A, *, +, -1]
.Membersihkan
Ini kubusnya lagi. Seperti biasa, IP dimulai pada S (menunjuk ke utara), dan berakhir di E, menunjuk ke barat.
Menghitung A ^ (B-1)
Loop lain yang bekerja kurang lebih sama dengan loop cetak, tetapi sedikit lebih kompak. IP dimulai
S
, menunjuk ke barat, dengan tumpukan[B, A, *]
. IP keluar diE
menunjuk utara.Badan loop adalah sebagai berikut.
Tumpukan yang dihasilkan adalah
[A, A^(B-1), 0]
.Membersihkan tumpukan (lagi)
Sekarang kita perlu kembali ke loop cetak, dengan bagian atas tumpukan berisi
[..., A^(B-1), +, A]
. Untuk melakukan ini, kami menjalankan yang berikut ini. Ini kubusnya lagi,Langkah 7 (mempersiapkan loop terakhir)
Tumpukannya sekarang
[A^B, +, A^(B-1), A-1]
, IP mulaiS
, ke barat, dan berakhir padaE
, ke kanan.Instruksi dijalankan:
Tumpukan sekarang terlihat seperti
[A^B, +, 1]
, dan IP akan memasuki lingkaran cetak, jadi kita sudah selesai.sumber
MATL , 46 byte
Cobalah online!
Membentang batas "cara yang masuk akal" di sini, tetapi ungkapannya terpisah.
Penjelasan
Ekspresi pertama:
Ekspresi kedua:
Ekspresi ketiga:
Ekspresi keempat:
sumber
JavaScript (ES7), 78 byte
Mengambil input dalam sintaks currying
(a)(b)
. Menghasilkan string.Uji kasus
Tampilkan cuplikan kode
sumber
Ruby, 52 byte
sumber
05AB1E , 30 byte
Penjelasan:
Cobalah online!
sumber
¹²'^ý ¹'*¹«²<׫¹²m¹÷¹s×S'+ý 1¹²m×S'+ý»
, mengapa Anda mengalahkan saya dengan 5 byte :(?¹²«¹²×¹¹²m©¹÷×1®×)vySN"^*++"èý,
lebih dekat ;). Anda hanya menang dengan 1 sekarang;).C (gcc) ,
156149 byte-2 byte jika kita dapat mengabaikan 0 kekuatan;
y=!!i
mungkin menjadiy=1
Cobalah online!
sumber
Java 7, 170 byte
Tidak Disatukan:
Kode uji:
Coba di sini.
Keluaran:
sumber
Pip ,
383534 byte33 byte kode, +1 untuk
-n
bendera.Mengambil A dan B sebagai argumen baris perintah; mencetak satu ekspresi per baris. Cobalah online!
Penjelasan
Ya**b
adalah kode penyiapan: tarika**b
ke dalamy
variabel. Setelah itu, kami memiliki daftar yang[]
berisi empat ekspresi kami:gJ'^
: ambilg
daftar ar lengkap (di sini, daftar yang berisia
danb
) danJ
nyalakan^
aRLbJ'*
: gunakanR
epeatL
ist untuk membuat daftar denganb
salinana
, laluJ
nyalakan*
aRLy/aJ'+
: gunakanRL
untuk membuat daftar dengany/a
(yaitua**(b-1)
) salinana
, laluJ
nyalakan+
1XyJ'+
:1
, string-dikalikan dengany
,J
diaktifkan+
Daftar dicetak dengan baris baru sebagai pemisah berkat
-n
bendera.sumber
Javascript
115113104 byteTerima kasih kepada @Neil dan @TuukkaX untuk bermain golf masing-masing satu byte dan @ETHproductions dan Luke untuk bermain golf dengan 9 byte
Cobalah secara Online
sumber
a=>b=>
.'=1'+'+1'.repeat
?.join
:a=>b=>[a+'^'+b,(a+'*').repeat(b-1)+a,(a+'+').repeat(Math.pow(a,b-1)-1)+a,1+'+1'.repeat(Math.pow(a,b)-1)].join`=`
.join()
...Jelly , 29 byte
Cobalah online!
Bagaimana?
sumber
tinylisp repl,
178186 bytesMenggunakan repl menghemat 8 byte dalam tanda kurung tersirat di ujung garis. Menentukan fungsi
X
yang mengambil dua angka dan mengembalikan daftar ekspresi. Setiap ekspresi dikurung, dengan spasi di sekitar operator (sebenarnya, itu adalah daftar angka dan simbol operator):Semoga format output ini dapat diterima. Cobalah online! (dengan beberapa kasus uji).
Penjelasan
Kami membutuhkan dua fungsi dari pustaka standar:
list
dan*
.Tentukan fungsi
W
(kependekan dari "weave") yang mengambil akumulator_
, angkaN
, simbolS
, dan hitungan#
. Kami akan menggunakan fungsi ini untuk menghasilkan sebagian besar ekspresi kami: misalnya,(W () 2 (q +) 3)
akan menghasilkan(2 + 2 + 2)
.Jika hitungnya 1
(e # 1)
, maka konsirmasikan angka ke depan akumulator(c N _)
dan kembalikan itu. Jika tidak, kambuh:(c S(c N _))
: simbol dan nomor dituju ke depan akumulator sebelumnya;N
danS
sama;(s # 1)
: hitungan - 1.Ungkapan akumulator diperlukan untuk mencapai rekursi ekor yang tepat , mencegah kesalahan kedalaman rekursi. (Perubahan ini bertanggung jawab untuk +8 ke jumlah byte.
13^2
Kasing tidak bekerja di versi sebelumnya.)Sayangnya, perpustakaan tidak memiliki fungsi eksponensial saat ini, jadi kami harus mendefinisikannya.
^
mengambilx
dany
. Jikay
benar (bukan nol), kita kambuh dengany-1
((s y 1)
) dan kalikan hasilnya denganx
. Kalau tidak,y
nol dan kami kembali1
.(Catatan: Fungsi ini tidak menggunakan rekursi ekor yang tepat. Saya berasumsi bahwa eksponen akan cukup kecil sehingga tidak masalah. Beberapa percobaan di TIO menunjukkan eksponen maksimum 325, yang menurut saya cukup untuk pertanyaan ini. Jika OP tidak setuju, saya akan mengubahnya.)
Akhirnya, fungsi kita tertarik,
X
, mengambilA
danB
dan kembali daftar empat item:(list A(q ^)B)
: daftar yang berisiA
, literal^
, danB
;(W()A(q *)B)
: panggilanW
untuk mendapatkan daftarB
salinanA
, terjalin dengan literal*
;(W()A(q +)(^ A(s B 1)))
: panggilanW
untuk mendapatkan daftarA^(B-1)
salinanA
, terjalin dengan literal+
;(W()1(q +)(^ A B))
: panggilanW
untuk mendapatkan daftarA^B
salinan1
, terjalin dengan literal+
.sumber
Brainfuck , 372 byte
Cobalah online!
Catatan
A**B
tidak melebihi255
. Ini karena brainfuck hanya dapat menyimpan nilai satu byte.10
menjadi:
,11
menjadi;
dll. Ini karena Brainfuck hanya dapat mengambil input satu byte.Penjelasan
Ini kode saya yang agak dikomentari. Saya akan memperluas ini nanti.
sumber
Pyth,
3231 byteMengambil input as
[2,10]
, output as["2^10", "2*2*2*2*2*2*2*2*2*2", "2+2+...
Penjelasan:
Coba di sini.
sumber
Perl , 81 byte
78 byte kode +
-n
bendera (dihitung sebagai 3 byte karena mengandung kode$'
).Cobalah online!
sumber
R, 147 byte
Fungsi anonim yang menampilkan yang diperlukan, baik, keluaran, baris demi baris. Solusi ini memanfaatkan
switch
fungsi secara luas.The
switch
Fungsi mengambil ekspresi (di sini,s
) yang mengevaluasi ke nomor atau string karakter (lihat?switch
), diikuti oleh alernatives sesuai dengans
. Jika suatu alternatif hilang (misalnyaswitch(s, a=, b= "PPCG")
, alternatif tidak hilang berikutnya dievaluasi (dalam contoh,s="a"
keluaran"PPCG"
).The
rep
fungsi mengulangi (ulangan, sebenarnya) argumen pertama jumlah kali ditunjukkan dalam argumen kedua.cat
, untuk menyelesaikan, menggabungkan dan mencetak objek, dengan pemisah yang dapat dipilih dengansep =
argumen. Fungsi kedua dicat
sini untuk jeda baris.Tidak Disatukan:
sumber
CJam , 42 byte
Cobalah online!
sumber
k, 44 byte
Uji kasus.
sumber
Kardinal 202 byte
Hanya akan berfungsi untuk angka-angka di mana nilai yang dihitung <256 karena keterbatasan dalam nilai-nilai yang dapat dipegang oleh pointer di Cardinal
Cobalah secara Online
Penjelasan:
Langkah 1
Menerima dua angka a dan b sebagai input dan output sebagai "a ^ b ="
Melewati sebuah pointer dengan nilai aktif a dan nilai tidak aktif b
Langkah 2
Menerima pointer dengan nilai aktif a dan nilai tidak aktif b mencetak "a" + ("* a") (b-1) kali
Melewati pointer dengan nilai aktif a ^ (b-1) ke bagian selanjutnya
Langkah 3
Menerima pointer dengan nilai a ^ (b-1) dan output "= a" + ("+ a") diulang (a ^ (b-1) -1) kali + "="
Melewati sebuah pointer dengan nilai a ^ b ke bagian selanjutnya
Langkah 4
Menerima pointer dengan nilai a ^ b dan mencetak "1" + ("+ 1") diulangi ^ b-1 kali
sumber
Retina,
8988 byteInput adalah nomor unary yang dipisahkan koma.
Cobalah online!
sumber