var QUESTION_ID=84260,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
5 16
dimasukkan sebagai005 016
Jawaban:
Jelly , 1 byte
Cobalah online!
Juga bekerja di 05AB1E, Sebenarnya, APL, Braingolf, ,,, (Commata), Factor, Forth, Implisit, J, Julia, K, kdb +, Tong, Ly, MATL, Pyke, Deorst, dan Q.
sumber
Minecraft 1.10, 221 karakter (tidak bersaing)
Lihat, ini yang harus kita hadapi ketika kita membuat peta Minecraft.
Selain: Tidak ada cara untuk mengambil input string di Minecraft, jadi saya sedikit curang dengan membuat Anda memasukkan angka ke dalam program itu sendiri. (Ini agak bisa dibenarkan karena beberapa peta, seperti Minecraft Bingo Lorgon111, mengharuskan Anda untuk menyalin dan menempelkan perintah ke dalam obrolan untuk memasukkan nomor.)
Terima kasih sebelumnya untuk filter Block Labels MCEdit.
Non-bersaing karena kesulitan dalam input, dan saya tidak tahu bagaimana cara menghitung byte dalam hal ini (sistem blytes cacat untuk blok perintah).
sumber
0,1,2
Solusi lain adalah dengan mengambil dalam 2 byte dan output pada 9 kawat, tapi akan jauh lebih sedikit Golfy.Kalkulus biner biner , 4,125 byte
Input dan output sebagai angka Gereja .
Dalam kalkulus lambda , itu adalah λ m . λ n . λ f . λ x . m f ( n f x ).
Indeks De Bruijn : λ λ λ λ 4 2 (3 2 1)
Kalkulus Lambda adalah cara ringkas untuk menggambarkan pemetaan (fungsi).
Misalnya, tugas ini dapat ditulis sebagai λ x . λ y . x + y
Yang perlu diperhatikan adalah, bahwa ini bukan lambda (fungsi) yang membutuhkan dua argumen. Ini sebenarnya lambda bersarang. Namun, ia berperilaku seperti lambda yang membutuhkan dua argumen, sehingga dapat digambarkan secara informal. Setiap lambda secara formal hanya membutuhkan satu argumen.
Misalnya, jika kita menerapkan lambda ini ke 3 dan 4:
Jadi, lambda pertama sebenarnya mengembalikan lambda lain.
Angka Gereja adalah cara menghilangkan tanda-tanda tambahan, hanya menyisakan simbol dan variabel lambda.
Setiap angka dalam sistem Gereja sebenarnya adalah lambda yang menentukan berapa kali fungsi diterapkan pada suatu item.
Biarkan fungsi menjadi f dan item menjadi x .
Jadi, angka 1 akan sesuai dengan λ f . λ x . f x , yang berarti menerapkan f ke x tepat sekali.
Angka 3, misalnya, adalah λ f . λ x . f ( f ( f x )), yang berarti menerapkan f ke x tepat tiga kali.
Oleh karena itu, untuk menambahkan dua angka Gereja (katakanlah, m dan n ) bersamaan, itu sama dengan menerapkan f ke x , m + n kali.
Kita dapat mengamati bahwa ini sama dengan pertama kali menerapkan f ke x , n kali, dan kemudian menerapkan f pada item yang dihasilkan m kali.
Misalnya, 2 berarti
f(f(x))
dan 3 berartif(f(f(x)))
, jadi 2 + 3 adalahf(f(f(f(f(x)))))
.Untuk menerapkan f ke x , n kali, kita memiliki n f x .
Anda dapat melihat m dan n sebagai fungsi yang mengambil dua argumen, secara informal.
Kemudian, kami menerapkan f lagi ke item yang dihasilkan ini, m kali: m f ( n f x ).
Kemudian, kami tambahkan kembali pelat untuk mendapatkan λ m . λ n . λ f . λ x . m f ( n f x ).
Sekarang, kita harus mengubahnya menjadi indeks De Bruijn .
Pertama, kami menghitung "jarak relatif" antara setiap variabel ke deklarasi lambda. Misalnya, m akan memiliki jarak 4, karena dinyatakan 4 lambdas "lalu". Demikian pula, n akan memiliki jarak 3, f akan memiliki jarak 2, dan x akan memiliki jarak 1.
Jadi, kami menuliskannya sebagai bentuk peralihan ini: λ m . λ n . λ f . λ x . 4 2 (3 2 1)
Kemudian, kita menghapus deklarasi variabel, meninggalkan kita dengan: λ λ λ λ 4 2 (3 2 1)
Sekarang, kami mengubahnya menjadi kalkulus lambda biner .
Aturannya adalah:
00
.01 m n
.1
i kali +0
, misalnya 4 menjadi11110
.λ λ λ λ 4 2 (3 2 1)
≡ λ λ λ λ
11110
110
(1110
110
10
)≡ λ λ λ λ
11110
110
0101 111011010
≡ λ λ λ λ
0101
111101100101111011010
≡
00
00
00
00
0101
111101100101 111011010
≡
000000000101111101100101111011010
sumber
Gangguan Umum, 15 byte
sumber
(+(read)(read))
Stack Cats , 8 + 4 = 12 byte
Jalankan dengan
-mn
bendera. Cobalah online!Bermain golf di Stack Cats sangat berlawanan dengan intuisi, jadi program ini ditemukan dengan beberapa hari pemaksaan kasar. Sebagai perbandingan, solusi yang lebih intuitif, yang ditulis manusia menggunakan
*(...)>
templat lebih panjang dua bytedengan
-ln
bendera sebagai gantinya (lihat bagian bawah posting ini untuk penjelasan).Penjelasan
Berikut adalah primer pada Stack Cats:
-m
atau-l
. Di sini-m
bendera digunakan, sehingga setengah program di atas benar-benar mengembang]_:]_!<X>!_[:_[
.<
dan>
masing-masing memindahkan satu tumpukan ke kiri dan satu tumpukan ke kanan.-n
menunjukkan angka I / O.Dan inilah jejak program penuh diperluas,
]_:]_!<X>!_[:_[
:a+b
kemudian dikeluarkan, dengan basis -1 diabaikan. Perhatikan bahwa bagian tersulit tentang solusi ini adalah bahwa tumpukan output harus memiliki-1
di bagian bawah, jika tidak tumpukan output hanya[-1]
akan mengabaikan basis -1, dan tumpukan output[0]
akan menyebabkan basis nol ditelan (tetapi output tumpukan[2]
, misalnya, akan menampilkan2
baik-baik saja).Hanya untuk bersenang-senang, inilah daftar lengkap solusi terkait dengan panjang yang sama yang ditemukan (daftar mungkin tidak lengkap):
The
*(>-_:[:)>
solusi lebih panjang, tetapi lebih intuitif untuk menulis karena menggunakan*(...)>
template yang. Templat ini diperluas ke<(...)*(...)>
saat digunakan dengan-l
bendera, yang berarti:Dengan demikian,
*(...)>
template berarti bahwa loop pertama dilewati tetapi yang kedua dieksekusi. Ini memungkinkan pemrograman yang lebih mudah terjadi, karena kita tidak perlu khawatir tentang efek loop di bagian lain dari program.Dalam hal ini, bagian dalam loop adalah:
Final
>
pada template kemudian memindahkan kita kembali ke tumpukan input, di manaa+b
dikeluarkan.sumber
Brain-flak , 6 byte
Cobalah online!
Brain-flak adalah bahasa yang sangat menarik dengan dua batasan utama.
Satu-satunya karakter yang valid adalah tanda kurung, yaitu salah satu dari karakter ini:
Satu set kurung dengan tidak ada di antara mereka disebut "nilad". Nilad menciptakan nilai numerik tertentu, dan semua nilad ini bersebelahan ditambahkan. Satu set kurung dengan sesuatu di antara mereka disebut "monad". Monad adalah fungsi yang mengambil argumen numerik. Jadi tanda kurung di dalam monad dievaluasi, dan itulah argumen untuk monad. Ini adalah contoh yang lebih konkret.
The
()
nilad sama dengan 1. Jadi kode otak-antipeluru berikut:Dievaluasi menjadi 3.
()
Monad mendorong nilai di dalamnya pada tumpukan global. Jadi berikut inimendorong a 3.
{}
Nilad mengeluarkan nilai di atas tumpukan. Karena nilad berturut-turut selalu ditambahkan, serangkaian{}
jumlah semua elemen teratas di stack. Jadi kode saya pada dasarnya:sumber
Minecraft 1.10.x,
924512 byteTerima kasih kepada @ quat untuk mengurangi blytecount sebesar 48 poin dan bytecount sebesar 412.
Baiklah, jadi, saya mengambil beberapa ide dari jawaban ini dan membuat versi saya sendiri, kecuali bahwa ini mampu menerima input non-negatif. Versi dapat ditemukan di sini dalam format blok struktur.
(versi baru terlihat agak membosankan tbh)
Perintah serupa dengan jawaban lainnya:
Untuk memasukkan angka, buat sejumlah sapi dan babi. Sapi akan mewakili nilai "n" dan babi akan mewakili nilai "m". Sistem blok perintah akan secara progresif membunuh sapi dan babi dan menetapkan nilai yang diperlukan.
Jawaban ini mengasumsikan bahwa Anda berada di dunia tanpa sapi atau babi yang muncul secara alami dan bahwa nilai yang disimpan dalam "n" dan "m" dihapus pada setiap proses.
sumber
execute @e[type=Pig] ~ ~ ~ scoreboard players add m a 1
, jadi Anda tidak memerlukan bentuk jam apa pun.Retina , 42 byte
Cobalah online!
Penjelasan
Menambahkan angka di unary adalah hal termudah di dunia, tetapi begitu Anda memperkenalkan angka negatif, semuanya menjadi kacau ...
Kami mulai dengan mengonversi angka menjadi unary. Ini dilakukan dengan mencocokkan setiap angka dengan
\d+
dan menggantinya$*
. Ini adalah fitur substitusi khusus-Retina. Sintaks lengkapnya adalahcount$*character
dan menyisipkancount
salinancharacter
. Keduanya dapat dihilangkan di manacount
default untuk$&
(yaitu pertandingan itu sendiri) dancharacter
default ke1
. Jadi untuk setiap inputn
kita mendapatkann
satu, dan kita masih memiliki tanda minus potensial di sana, serta pemisah ruang. Misalnya input8 -5
memberi:Sekarang untuk menangani angka negatif, paling mudah menggunakan
-1
digit terpisah . Kami akan gunakan-
untuk tujuan itu.Tahap ini melakukan dua hal. Itu menghilangkan ruang, tanda minus terkemuka, dan mengubah tanda
1
setelah minus menjadi-
diri mereka sendiri. Ini dilakukan dengan cara mencocokkan|-1+
(yaitu spasi atau angka negatif) dan melakukan transliterasi padanya. Transliterasi berubah dari1p
menjadi-_
, tetapi di sini,p
meluas ke semua karakter ASCII yang dapat dicetak dan_
berarti menghapus. Jadi1
dalam pertandingan itu bisa berubah menjadi-
dan minus dan spasi dihapus. Contoh kita sekarang terlihat seperti ini:Tahap ini menangani kasus di mana ada satu angka positif dan satu negatif dalam input. Jika demikian, akan ada
1
s dan-
s dalam string dan kami ingin mereka membatalkan. Ini dilakukan dengan mencocokkan dua karakter dengan batas kata di antara mereka (karena1
s dianggap sebagai karakter kata dan-
bukan), dan mengganti kecocokan dengan apa-apa. The+
menginstruksikan Retina untuk melakukan hal ini berulang-ulang sampai string berhenti berubah.Sekarang kita hanya memiliki
1
s atau hanya-
s.Untuk mengonversi ini kembali menjadi desimal, kami mencocokkan seluruh input, tetapi jika memungkinkan kami menangkap a
-
menjadi grup1
. Kami menulis kembali grup1
(untuk menambahkan a-
ke angka negatif) dan kemudian kami menulis kembali panjang pertandingan dengan$.&
(juga fitur substitusi khusus-Retina).sumber
range
di Retina. Saya sudah mencoba beberapa kali, tetapi negatifnya menyakitkan.Domino , 38.000 byte atau 37 ubin
Ini dibuat di Simulator Meja . Ini video dan ini file . Ini adalah setengah penambah standar, terdiri dari
and
gerbang untuk nilai2^1
tempat danxor
gerbang untuk nilai2^0
tempat.Detail
2^1
dan kanan2^0
[Hitam] .100%
sumber
Haskell, 3 byte
Tanda kurung ada di sini karena harus merupakan fungsi awalan. Ini sama dengan mengambil bagian dari fungsi +, tetapi tidak ada argumen yang diterapkan. Ini juga bekerja pada berbagai jenis, seperti Vektor yang diimplementasikan dengan benar, Matricies, bilangan Kompleks, Mengapung, Ganda, Rasional, dan tentu saja Integer.
Karena ini Haskell, inilah cara melakukannya pada level-level. Ini akan dilakukan pada waktu kompilasi alih-alih waktu berjalan:
Kode diadaptasi dari Haskell Wiki
sumber
Mathematica,
42 byteMencoret
4masih teratur 4 ...Tr
diterapkan ke daftar satu dimensi mengambil jumlah elemen daftar tersebut.sumber
dc, 2 byte
Menambahkan dua item teratas pada stack (sebelumnya diambil dari
stdin
), lalu membuang konten stack kestdout
.EDIT: Setelah dipertimbangkan lebih lanjut, tampaknya ada beberapa cara ini dapat diterapkan, tergantung pada perilaku I / O yang diinginkan.
Saya kira bentuk paling lengkap untuk penjumlahannya adalah sebagai berikut:
Tunggu! Dua angka dapat diambil pada baris yang sama, dipisahkan oleh spasi! Ini memberi kita:
sumber
+f
,dc -e "?+p"
berfungsi ok di sini.+f
Versi ini berfungsi jika Anda telah memasukkan (tepat dua) angka pada tumpukan. Saya tidak benar-benar tahu apakahdc
I / O seharusnyastd(in|out)
atau stack. Dalam retrospeksi, itu adalah pilihan yang paling tidak masuk akal untuk ditempatkan di bagian atas pos. : /Bahasa Pemrograman Shakespeare ,
155152 byteTidak Disatukan:
Saya menggunakan kompiler SPL drsam94 untuk mengkompilasi ini. Untuk menguji:
sumber
Brachylog , 2 byte
Mengharapkan daftar dengan dua angka sebagai input
Atau, jika Anda ingin jawabannya
STDOUT
:sumber
JavaScript (ES6), 9 byte
sumber
PHP, 20 byte
Mengejutkan kali ini:
Berjalan dari baris perintah, seperti:
sumber
php sum.php 1 2 3 4 5 6
jadi saya tidak 100% yakin apakah itu ok.-r
flag - maka itu tidak masalah lagi.Cheddar, 3 byte
Ini adalah fitur keren dari Cheddar yang disebut "operator yang difungsikan". Penghargaan untuk ide ini diberikan ke @ CᴏɴᴏʀO'Bʀɪᴇɴ.
Berikut adalah lebih banyak contoh operator yang difungsikan:
sumber
Python,
113 byteint.__add__
Operator khusus yang sederhana.
sumber
Dash Geometri - 15 objek
Akhirnya selesai.
15 objek tidak banyak, tetapi masih merupakan mimpi buruk untuk melakukan ini (terutama karena angka negatif).
Karena saya harus memasukkan 15 gambar di sini untuk bagaimana mereproduksi ini, saya hanya mengunggah level. Level ID adalah 5216804. Deskripsi memberi tahu Anda cara menjalankannya dan Anda dapat menyalinnya karena dapat disalin.
Penjelasan:
Pemicu kiri atas (Hitungan Instan 2) memeriksa apakah addend pertama adalah 0. Jika ya, maka dicek apakah addend kedua positif atau negatif. Jika positif, itu mentransfer nilai dari penambahan kedua ke jumlah (gaya BF, menggunakan loop) dan jika negatif, itu akan melakukan hal yang sama.
Alasan mengapa kita perlu memeriksa apakah penambahan kedua positif atau negatif adalah bahwa kita perlu mengurangi satu dari penambahan kedua dan menambahkan satu ke jumlah atau menambahkan satu ke penambahan kedua dan mengurangi satu dari jumlah masing-masing.
Jika tambahan pertama bukan nol, ia menguji apakah positif atau negatif menggunakan proses di atas. Setelah satu iterasi dalam loop sementara, tes untuk melihat apakah addend pertama adalah nol dan jika ya, itu melakukan proses yang dijelaskan pada awal penjelasan.
Karena Geometry Dash sangat mirip dengan BF, Anda bisa membuat solusi BF dari ini.
sumber
MATL, 1 byte
Menerima array dua bilangan bulat sebagai input dan menjumlahkannya. Sementara program sederhana
+
juga berfungsi, itu sudah ditunjukkan untuk bahasa lain.Cobalah secara Online
sumber
Perl 5.10, 8 byte
Dua angka yang ditambahkan harus berada pada 2 baris terpisah agar bisa berfungsi:
Coba yang ini di sini.
Satu dengan input pada baris yang sama ( 14 +1 byte untuk flag- a )
Coba di sini!
Satu dengan input pada baris yang sama ( 19 +1 byte untuk flag- a )
Coba yang ini di sini.
Satu lagi, dengan mengubah pemisah default array ( 19 + 1 byte untuk -sebuah flag juga)
Coba yang ini di sini!
sumber
-p
bendera.say$F[0]+$F[1]
,say pop()+pop
bekerja (diuji dalam Strawberry 5.20.2 dengan-E
) dan menghemat satu byte.Fuzzy Octo Guacamole , 1 byte
Fungsi yang mengambil input dari atas tumpukan dan mengeluarkan output dengan mendorong ke tumpukan.
Contoh berjalan di REPL:
sumber
Batch,
251816 byteSunting: disimpan
79 byte dengan menggunakan trik saya dari Alternating Sign Sequence .sumber
PowerShell v2 +, 17 byte
Mengambil input sebagai dua argumen baris perintah yang terpisah, yang dipra-diisi ke dalam array khusus
$args
. Kami membentuk string dengan-join
operator dengan menggabungkannya bersama-sama dengan+
di tengah, kemudian menyalurkan string keInvoke-Expression
(mirip denganeval
).Terima kasih kepada @DarthTwon untuk mengingatkan saya bahwa ketika berhadapan dengan program seminimal itu, ada beberapa metode untuk mengambil input semua pada byte-count yang sama.
PowerShell tidak ada artinya jika tidak fleksibel.
sumber
$args[0]+$args[1]
danparam($a,$b)$a+$b
> <> ,
763 bytePenerjemah online
Atau coba di TIO dengan flag -v.
Cobalah online
sumber
+
akan cukup: itu akan memunculkan dua angka dari tumpukan dan menempatkan hasil penambahan mereka kembali ke tumpukan. Biaya-v
juga dapat dihindari, karena membaca angka-angka bisa dilakukan sebelumnya pemanggilan fungsi.C, 35 byte
Apa yang saya lakukan di sini adalah penambahan tanpa menggunakan operator boolean atau aritmatika. Ini secara rekursif membuat x jumlah bit dengan 'xor', dan y carry bit oleh 'dan' sampai tidak ada carry. Ini versi yang tidak dikoleksi:
sumber
MATLAB, 4 byte
1 byte dihapus berkat @LeakyNun
Ini adalah fungsi anonim yang mengambil array dan memberikan jumlahnya. Contoh penggunaan:
sumber
sum
?@sum
jawaban yang valid. Atau adakah konsensus meta lain?GoLScript , 1 byte (tidak bersaing)
Menambahkan 2 angka teratas di tumpukan. Itu dia.
Sekarang bagaimana mendorong mereka pada ke stack, saya tidak tahu. Saya tidak berpikir itu mungkin .. batuk @ CᴏɴᴏʀO'Bʀɪᴇɴ batuk
sumber
Explanation soon to be coming.
- Riker 3 Jul '16Bahasa Pemrograman Shakespeare (SPL),
137135 byteProgram lengkap, golf:
Dan penjelasan singkat:
Saya tidak yakin ini adalah yang terpendek. Periksa halaman resmi untuk info lebih lanjut.
Sunting 1: Dihapus
:
setelahAct I
danScene I
karena tampaknya segala sesuatu setelah angka romawi diabaikan, sehingga menghemat 2 byte.sumber
kode mesin x86_32, 2 byte
Dengan asumsi kedua nilai sudah ada di register ecx dan eax, melakukan instruksi add akan menambahkan nilai-nilai dari dua register dan menyimpan hasilnya di register tujuan.
Anda dapat melihat program lengkap yang ditulis dalam C dan inline assembly di sini . Menulis pembungkus dalam C membuatnya lebih mudah untuk memberikan input dan melakukan pengujian, tetapi fungsi add yang sebenarnya dapat dikurangi menjadi dua byte ini.
sumber
ret
instruksi juga (satu byte). Dan itu mengasumsikan konvensi pemanggilan kustom di manaeax
digunakan sebagai register arg-passing. (Pustaka pengajaran Irvine32 asm melakukan hal itu, tetapi tidak ada konvensi panggilan standar untuk x86-32 atau x86-64 yang melakukan itu, tidak seperti pada ARM di mana register nilai-kembalir0
juga merupakan register pelintas yang pertama.) asm berfungsi, jadi Anda tidak perlu mengubahnya ke 3 bytelea (%ecx, %edx), %eax
+ 1 byteret
untuk Microsoft__fastcall
atau gcc-mregparm
.pop
hanya 1 byte, tetapiesp
mode pengalamatan-relatif membutuhkan byte SIB. Jadi konvensi pemanggil pemanggil mungkinpop %ecx
(alamat pengirim),pop %eax
/pop %edx
/add %edx, %eax
(2 byte) /jmp *%ecx
(2 byte) = total 7 byte. vs.mov 4(%esp), %eax
(4B) /add 8(%esp), %eax
(4B) /ret
= 9 byte, atau 11 byte untuk versi penelepon yang menggunakan ituret imm16
, jika saya melakukannya dengan benar. Ini adalah tambahan 1 byte untuk SIB dengan ESP sebagai basis, dan tambahan 1 byte untuk disp8 di setiap insn.