Membandingkan dua angka


25

Tantangan

Diberi dua bilangan bulat Adan Bsebagai input, Anda harus menulis sebuah program yang menampilkan apakah A>B, A==Batau A<B.

Bilangan bulat akan berada dalam kisaran wajar yang didukung oleh bahasa Anda yang mencakup setidaknya 256 nilai.

Program Anda dapat berupa program lengkap atau fungsi, mengambil input melalui STDIN atau argumen fungsi.

Keluaran

Jika A>Boutput

A is greater than B

Jika A==Boutput

A is equal to B

Jika A<Boutput

A is less than B

Di mana Anda mengganti Adan Buntuk nilai integernya.

Kemenangan

Program terpendek dalam byte menang.

Papan peringkat

var QUESTION_ID=55693,OVERRIDE_USER=8478;function answersUrl(e){return"http://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"http://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>


Hari ini di Programming Puzzles & Code Golf: pernyataan ternary!
Trebuchette

Bisakah fungsi mengembalikan solusi alih-alih mencetak solusi?
TheNumberOne

@TheNumberOne Tidak, mereka harus mencetak solusinya
Beta Decay

Jawaban:


11

CJam, 47

q~_~-g"is
equal greater less
to than"N/Sf/f=*S*

Cobalah online

Penjelasan:

q~     read and evaluate the input (array of 2 numbers)
_      duplicate the array
~-     dump one array on the stack and subtract the numbers
g      get signum (-1 for <, 0 for ==, 1 for >)
"…"    push that string
N/     split into lines
Sf/    split each line by space
f=     get the corresponding word (for the signum) from each line
*      join the array of 2 numbers by the array of words
        it effectively inserts the words between the numbers
S*     join everything with spaces

Sepertinya CJam adalah satu byte lebih pendek dari Pyth hari ini :(
orlp

Menurut Default untuk membaca beberapa potong input , Anda dapat membaca input sebagai [A B]dan menghilangkan ]dari kode Anda.
Dennis

@Dennis terima kasih, saya sudah memikirkannya tetapi tidak yakin.
aditsu

@ orlp 2 byte sekarang, dan itu alasan untuk tersenyum, bukan untuk mengerutkan kening :)
aditsu

Sesuai bahwa kode Anda sebenarnya mengandung smiley dalam bentuk ~_~...
Darrel Hoffman

19

Python 2, 95 94 76 byte

Input harus dipisahkan koma.

A,B=input();print A,'is',['equal to','greater than','less than'][cmp(A,B)],B

Saya tertarik, bisakah Anda menjelaskan apa yang cmp(A,B)bisa dan tidak? :)
Beta Decay

2
@BetaDecay, docs.python.org/2/library/functions.html#cmp . "Bandingkan dua objek x dan y dan kembalikan integer sesuai dengan hasilnya. Nilai kembaliannya negatif jika x <y, nol jika x == y dan benar-benar positif jika x> y.". Dalam cPython 2.7.6, nilai-nilai integer masing-masing adalah -1, 0, 1. Definisi fungsi tidak mendikte ini, jadi pedant mungkin bersikeras bahwa implementasi dan versi python yang tepat diberikan di sini daripada hanya "Python 2", tapi saya berharap sebagian besar implementasi akan berperilaku sama di sini.
ymbirtt

Saya hanya ingin Anda tahu bahwa saya tidak menyalin jawaban Anda untuk muncul dengan saya . Saya baru saja melihat seberapa dekat mereka. Ketika saya menulis milik saya, saya mengalami kesulitan menjalankan cuplikan dan saya bisa bersumpah sudah tidak ada jawaban Python (pasti melewatkan halaman ke-2). Saya menulisnya sepenuhnya independen, anehnya.
mbomb007

@ Sp3000 Saya memeriksanya, dan berfungsi dengan baik di Python 2.7.6
ML

1
@ ML Komentar saya merujuk pada revisi yang lalu, tetapi karena sekarang sudah ketinggalan zaman, saya telah menghapus komentar
Sp3000

10

Labyrinth , 180 152 149 bytes

<
?01.23.511.501.23};,!:?
:
= ;3.114.101.97.116.101.114.32.116.104.97.110.32.{!@
-""
; ;8.101.115:..""""""""""""^
1
.113.117.97.108.32.116.111.32.{!@

Sunting: Berhasil mencukur 3 byte dengan menggunakan kembali 10antara 101, 103dan 108(kode karakter e, gdan l). Penjelasan di bawah ini tidak mencerminkan hal ini, tetapi itu bukan perubahan besar.

Penjelasan

Tidak banyak yang bisa kita lakukan dengan cara menghemat byte untuk mencetak string, itu hanya akan menjadi bagian linear yang panjang. Jadi tantangan utama dalam bermain golf adalah menghindari ruang putih yang tidak perlu dalam jumlah besar. Itu berarti kita ingin bagian-bagian linear "memancar keluar" dari kolom paling kiri Kami juga dapat memperoleh lebih banyak penghematan dengan menggunakan kembali kode yang dicetak than B. Jadi mari kita lihat aliran kontrol di sini:

Program dimulai pada perintah rotasi grid <. Ini menggeser baris saat ini secara siklis ke kiri dengan IP di atasnya, jadi kami mendapatkan ini:

                                                     <
?.23.511.501.23};,!:?
:
= ;103.114.101.97.116.101.114.32.116.104.97.110.32.{!@
-""
1 ;108.101.115:..""""""""""""^
0
1.113.117.97.108.32.116.111.32.{!@

Sekarang IP berada di sel yang terisolasi, sehingga menjalankan perintah yang sama berulang-ulang saat <bergerak lebih jauh ke kiri sampai ...

                    <
?.23.511.501.23};,!:?
:
= ;103.114.101.97.116.101.114.32.116.104.97.110.32.{!@
-""
1 ;108.101.115:..""""""""""""^
0
1.113.117.97.108.32.116.111.32.{!@

Pada titik ini, IP memiliki tempat untuk pergi dan mengeksekusi bagian linier pertama (baris kedua) dari kanan ke kiri. Apa yang dilakukannya adalah membaca A, menyalin, mencetak. Konsumsi karakter pembatas antara angka, cetak is(dan spasi). Kemudian baca B, salin dan kurangi Adari itu di -.

Pada titik ini kita menekan pertama "garpu di jalan". Jika perbedaan menghasilkan 0, IP terus bergerak lurus ke depan menuju cabang bawah. Cabang itu hanya mencetak equal tolalu B.

Jika tidak, IP mengambil kiri menuju dua no-ops "". Lalu ada garpu lain. Jika perbedaannya negatif, IP mengambil kiri lagi menuju cabang atas yang panjang. Cabang itu hanya mencetak greater thanlalu B.

Jika perbedaannya positif, IP mengambil hak ke cabang bawah, yang dicetak less. Sekarang kami ingin menggunakan kembali thandari cabang lain. Tetapi pada saat yang sama kami tidak ingin menghubungkan dua cabang nanti, karena kami membutuhkan banyak ruang yang tidak perlu. Alih-alih, kami menggunakan beberapa no-op untuk menyelaraskan cabang bawah dengan tempat thandimulai pada cabang atas dan kemudian mulai memanipulasi sumber lagi dengan ^:

                    <
?.23.511.501.23};,!:?
:                            .
= ;103.114.101.97.116.101.114 32.116.104.97.110.32.{!@
-""                          ^
1 ;108.101.115:..""""""""""""
0                            2
1.113.117.97.108.32.116.111.3 .{!@

Sekali lagi, ini mengisolasi IP, jadi ^dieksekusi lagi dan kita dapatkan

                    <
?.23.511.501.23};,!:?        .
:
= ;103.114.101.97.116.101.114^32.116.104.97.110.32.{!@
-""
1 ;108.101.115:..""""""""""""2
0
1.113.117.97.108.32.116.111.3 .{!@

Sekarang IP dapat terus bergerak ke kanan dan mencetak thandan Bsesuai kebutuhan.


8

JavaScript (ES6), 66 byte

(a,b)=>a+` is ${a<b?"less than":a>b?"greater than":"equal to"} `+b

Menentukan fungsi anonim. Tes dengan menambahkan f=sebelumnya, dan menyebutnya sepertialert(f(4, 5))


Sayangnya, tidak ada penghematan yang didapat dari pengulangan "selain".


Apakah kamu yakin Jawaban Java tampaknya melampaui;)
Beta Decay

3
@BetaDecay baiklah, tidak. Bahkan jawaban Java akan sama panjang mengulangi than. public void c(int a,int b){System.out.print(a+" is "+(a==b?"equal to ":a>b?"greater than ":"smaller than ")+b);}
edc65

@ BetaDecay Apakah ini jawaban yang valid jika tidak benar-benar menampilkan teks? Atau 7 untuk alert()harus ditambahkan ke skor.
curiousdannii

@curiousdannii Oh saya mengerti, ya ini tidak valid jika Anda tidak dihitung alert()sebagai bagian dari kode dan byte Anda
Beta Decay

@ BetaDecay oh, saya tidak menyadari bahwa jawabannya diharapkan akan dicetak, bukan hanya dikembalikan. Jika mengasumsikan lingkungan REPL ok, ini bisa dijalankan di konsol FireFox tanpa biaya, kalau tidak saya rasa itu hingga 73.
jrich

8

Java, 114 113 Bytes atau 74 72 67 jika kami menggunakan notasi lambda

Terima kasih kepada Kevin Cruijssen untuk solusi berbasis kari:

a->b->a+" is "+(a==b?"equal to ":(a>b?"greater":"less")+" than ")+b

Solusi lama pra lambda

public void c(int a,int b){System.out.print(a+" is "+(a==b?"equal to ":(a>b?"greater":"less")+" than ")+b);}

sebagai pengguna hjk artinya dalam komentar, jika kita menggunakan lambda kita dapat melakukan secara signifikan hingga 74 byte.

(a,b)->a+" is "+(a==b?"equal to ":(a>b?"greater":"less")+" than ")+b;

1
Cara pintar mengompresi than:)
TheNumberOne

4
Anda dapat menghapus publicjika Anda mau. Saya sarankan membuat ini menjadi lambda. Anda dapat menghapus satu ruang sebelum {.
TheNumberOne

1
Dan saat Anda melakukannya, tambahkan koma setelah #Java sehingga Anda bisa berada di papan peringkat. ;)
TNT

2
Spesifikasi pertanyaan resmi adalah untuk mengatakan "kurang", bukan "lebih kecil". Anda mungkin melakukannya dan kehilangan tiga byte! Saya tidak tahu Java, tetapi apakah kode lambda akan mencetak teks atau hanya mengembalikannya? Jika tidak mencetaknya maka itu mungkin bukan jawaban yang valid.
curiousdannii

2
@ hjk Lebih pendek lambda menggunakan currying: a->b->a+" is "+(a==b?"equal to ":(a>b?"greater":"smaller" )+" than ")+bYa, saya sadar sudah hampir dua tahun. ;) Dan Anda memang dapat menggunakan lessalih-alih smallerberdasarkan pada deskripsi tantangan, sebagaimana disebutkan oleh dua komentar di atas saya. Coba di sini untuk melihat bagaimana kari dilakukan.
Kevin Cruijssen

7

R, 80 byte

function(A,B)cat(A,"is",c("less than","equal to","greater than")[2+sign(A-B)],B)

1
Anda dapat menyimpan 3 byte dengan mengubah "lebih kecil dari" menjadi "kurang dari" untuk mengikuti spesifikasi di atas. +1 karena tidak menggunakan operator ternary.
tanda

ah terima kasih, saya tidak menangkap itu! tetap!
flodel

@ tanda R tidak memiliki operator ternary. : P
Alex A.

@AlexA. Aku tahu. Maksud saya menggunakan daftar dan fungsi isyarat sangat berbeda dari jawaban lain sejauh ini (sebagian besar yang menggunakan operator ternary atau serupa).
tanda

Kanan. Sebagai perbandingan, upaya pertama saya menggunakan jika / lain adalah 83: function(A,B)cat(A,"is",if(A==B)"equal to"else c(if(A>B)"greater"else"less","than"),B).
flodel

7

Pyth, 52 49 byte

jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb

7

Julia, 69 66 byte

f(A,B)="$A is $(A>B?"greater than":A<B?"less than":"equal to") $B"

Ini menggunakan interpolasi string untuk menanamkan A, Bdan terner dalam sebuah string tunggal.

Disimpan 3 byte berkat Glen O.


6

Perl, 64 63 byte

#!/usr/bin/perl -p
s/ /" is ".("equal to ",greaterx,lessx)[$`<=>$']/e;s/x/ than /

62 byte + 1 byte untuk -p. Mengambil input dari STDIN, dengan dua angka dipisahkan oleh satu spasi:

$ echo 1 2 | ./cmp
1 is less than 2
$ echo 42 -17 | ./cmp
42 is greater than -17
$ echo 123456789 123456789 | ./cmp
123456789 is equal to 123456789

Bagaimana itu bekerja:

The <=>pengembalian Operator -1, 0, atau 1 tergantung pada apakah operan pertama adalah kurang dari, sama dengan, atau lebih besar dari yang kedua. Dengan mudah, Perl memungkinkan subskrip negatif dengan array dan irisan, di mana elemen terakhir berada di posisi -1, elemen kedua hingga terakhir berada di posisi -2, dan seterusnya.

Dalam kode

("equal to ",greaterx,lessx)[$`<=>$']

kami menggunakan nilai balik <=>sebagai subskrip dalam daftar slice untuk mendapatkan string yang sesuai, di mana $`nomor pertama dan $'yang kedua.

Untuk menghindari pengulangan than, xdigunakan sebagai pengganti dan diganti di substitusi kedua di akhir.


Solusi alternatif, 63 byte

#!/usr/bin/perl -p
@a=(equal,greater,than,to,less);s/ / is @a[$i=$`<=>$',!$i+2] /

62 byte + 1 byte untuk -p. Mengambil input yang dipisahkan oleh ruang dari STDIN seperti solusi pertama.

Bagaimana itu bekerja:

Solusi ini juga menggunakan irisan, tetapi mengambil keuntungan dari fakta bahwa tidak seperti irisan daftar, irisan array dapat diinterpolasi menjadi string (dan RHS substitusi). Ini memungkinkan kita menjatuhkan /epengubah dan kutipan di operator substitusi.

Trik sebenarnya ada di subscript slice:

@a[$i=$`<=>$',!$i+2]

Untuk nilai yang berbeda <=>, ini memberikan:

$i  !$i+2  $a[$i]  $a[!$i+2]
----------------------------
-1    2     less      than
 0    3     equal     to
 1    2     greater   than

Ketika sebuah array atau slice array diinterpolasi ke dalam string, elemen-elemen tersebut secara otomatis bergabung dengan $"(secara default, satu spasi).


5

Mouse , 79 byte

?A:?B:A.!" is "A.B.<["less than"]A.B.>["greater than"]A.B.=["equal to"]" "B.!$

Ketika string ditemui mereka segera ditulis ke STDOUT daripada diletakkan di tumpukan. Tumpukan hanya dapat berisi bilangan bulat.

Tidak Disatukan:

? A:                            ~ Read an integer A from STDIN
? B:                            ~ Read an integer B from STDIN
A. !                            ~ Write A to STDOUT
" is "
A. B. < [ "less than" ]         ~ If A < B
A. B. > [ "greater than" ]      ~ If A > B
A. B. = [ "equal to" ]          ~ If A == B
" "
B. !                            ~ Write B to STDOUT
$                               ~ End of program

4

GolfScript, 61 byte

\.@.@="equal to "{.@.@>"greater""less"if" than "+}if" is "\+@

Mengharapkan 2 bilangan bulat di tumpukan. Cobalah online .

Bagaimana itu bekerja:

  • \.@.@- A dan B sudah di stack, dan potongan kode ini membuat tumpukan terlihat seperti ini: ABBA. \menukar dua item teratas di tumpukan, .menduplikasi item teratas, dan @memutar 3 item teratas ( 1 2 3-> 2 3 1).

  • Kemudian, tiga item didorong ke tumpukan: =tanda "equal to ",, dan blok di antara {}. The ifpernyataan melakukan hal ini: jika argumen pertama bernilai true, itu mengeksekusi blok kode pertama (argumen kedua), jika tidak, blok kode kedua (argumen ketiga). Jadi jika A dan B sama, itu akan mendorong "sama dengan" pada tumpukan. Jika tidak sama, itu akan mengeksekusi kode antara blok. Perhatikan bahwa =muncul dua item teratas dari tumpukan, jadi sekarang tumpukan itu terlihat seperti AB.

  • Di dalam blok, Anda pertama kali melihat .@.@. Sebelum perintah ini, tumpukan terlihat seperti AB, dan setelah itu, tumpukan itu terlihat seperti BAAB. Perintahnya sama dengan yang disebutkan di atas.

  • Lalu, ada ifpernyataan lain . Kali ini, ia memeriksa apakah A> B, dan jika benar, ia mendorong "lebih besar" pada tumpukan. Selain itu, ia mendorong "kurang" pada tumpukan. Setelah mendorong salah satu dari dua, ini akan mendorong "daripada" pada tumpukan dan menyatukannya dengan string yang didorong sebelumnya. >juga muncul dua item teratas dari tumpukan, jadi sekarang tumpukan terlihat seperti BA"string".

  • Tiga perintah berikutnya adalah: " is "\+. " is "mendorong string itu di tumpukan (tumpukan terlihat seperti BA"string"" is "), \menukar dua item teratas (tumpukan terlihat seperti BA" is ""string"), dan +menyatukan dua item teratas (tumpukan terlihat seperti BA" is string").

  • Perintah terakhir, @, berputar tiga item stack, sehingga stack sekarang terlihat seperti: A" is string"B. GolfScript secara otomatis mencetak nilai-nilai stack pada STDOUT setelah program berhenti, jadi Anda mendapatkan output yang diinginkan.


4

MATLAB, 105 byte

x=input('');y=input('');t={'less than','greater than','equal to'};
sprintf('%i is %s %i',x,t{(x>=y)+(x==y)+1},y)

Menambahkan jeda baris sebelum sprintf, untuk memudahkan keterbacaan. Ia berfungsi baik dengan dan tanpa jeda baris ini, sehingga tidak termasuk dalam jumlah byte. Harus menekan enter di antara dua angka input.


2
Penggunaan yang sangat pintar sprintf!
Luis Mendo

4

Bash, 76

a=(less\ than equal\ to greater\ than)
echo $1 is ${a[($1>$2)-($1<$2)+1]} $2

4

Fortran, 129

Aritmatika Fortran jika sempurna untuk tantangan ini

Uji: ideone

read(*,*)i,j
if(i-j)1,2,3
1 print*,i," is less than",j
stop
2 print*,j," is equal to",j
stop
3 print*,i," is greater than",j
end

3

Bash, 94 86 byte (disimpan delapan byte berkat Digital Trauma)

p=equal;q=than;(($1>$2))&&p=greater&&[ ]||(($1<$2))&&p=less||q=to;echo $1 is $p $q $2

Tes (di Linux):

echo 'p=equal;q=than;(($1>$2))&&p=greater&&[ ]||(($1<$2))&&p=less||q=to;echo $1 is $p $q $2' > cmp.sh
chmod +x cmp.sh
./cmp.sh 10 12
10 is less than 12

Penggunaan [ ]after p=greateradalah untuk mencegah ||operator dari evaluasi sebelumnya =dalam ekspresi ...&&p=greater||(($1<$2))... (operator diutamakan!).

Alternatifnya adalah menggunakan tanda kurung di sekitar (($1>$2))&&p=greaterdan (($1<$2))&&p=less, tetapi tanda kurung membuat lingkup dalam untuk variabel, sehingga pakan dibiarkan tidak berubah.


1
p=equal;q=than;(($1>$2))&&p=greater&&[ ]||(($1<$2))&&p=less||q=to;echo $1 is $p $q $2
Digital Trauma

3

Kode mesin IA-32 + linux, 107 byte

Hexdump kode:

60 89 e5 89 d0 e8 51 00 00 00 4c c6 04 24 20 38
d1 74 20 68 74 68 61 6e 4c c6 04 24 20 72 0d 68
61 74 65 72 68 20 67 72 65 44 eb 11 68 6c 65 73
73 eb 0a 68 6c 20 74 6f 68 65 71 75 61 68 20 69
73 20 88 c8 e8 12 00 00 00 89 ea 29 e2 89 e1 31
db 43 8d 43 03 cd 80 89 ec 61 c3 5b d4 0a 4c 04
30 88 04 24 c1 e8 08 75 f3 ff e3

Karena keterbatasan perangkat keras, kode ini berfungsi dengan angka dalam kisaran 0 ... 255.

Kode sumber (dapat dirakit dengan gcc):

    .globl print_it
    .text
    .align 16
print_it:
    pushal;
    mov %esp, %ebp; // save esp (stack pointer)
    mov %edx, %eax; // put second number in al
    call prepend;   // convert al to string

    dec %esp;       // write ...
    movb $' ', (%esp); // ... a space
    cmp %dl, %cl;   // compare the numbers
    je equal;       // if equal, goto there

    push $0x6e616874; // write "than"
    dec %esp;       // write ...
    movb $' ', (%esp); // ... a space
    jb less;        // if below, goto there

greater:
    push $0x72657461; // write "ater"
    push $0x65726720; // write " gre"
    inc %esp;         // remove a space
    jmp finish;     // bypass the code for "less than"

less:
    push $0x7373656c; // write "less"
    jmp finish;     // bypass the code for "equal"

equal:
    push $0x6f74206c; // write "l to"
    push $0x61757165; // write "equa"

finish:
    push $0x20736920; // write " is "

    mov %cl, %al;   // put first number in al
    call prepend;   // convert al to string

    mov %ebp, %edx; // calculate the length ...
    sub %esp, %edx; // ... of the output message
    mov %esp, %ecx; // address of the message
    xor %ebx, %ebx; // set ebx to ...
    inc %ebx;       // ... 1 (i.e. stdout)
    lea 3(%ebx), %eax; // set eax=4 (syscall "write")
    int $0x80;      // do the system call
    mov %ebp, %esp; // restore the stack pointer
    popal;          // restore other registers
    ret;            // return

prepend:            // writes al converted to string
    pop %ebx;       // remove return address from the stack
appendloop:
    aam;            // calculate a digit in al, rest in ah
    dec %esp;
    add $'0', %al;  // convert the digit to ASCII
    mov %al, (%esp);// write the digit
    shr $8, %eax;   // replace al by ah; check if zero
    jnz appendloop; // nonzero? repeat
    jmp *%ebx;      // return

Ini adalah beberapa penyalahgunaan tumpukan yang serius! Kode membangun pesan output di stack, dari ujung ke awal. Untuk menulis 4 byte, ia menggunakan pushinstruksi tunggal . Untuk menulis 1 byte, ia menggunakan dua instruksi:

dec %esp
mov %al, (%esp);

Untungnya, sebagian besar fragmen untuk ditulis adalah 4 byte. Salah satunya ("gre" dalam "great") adalah 3 byte; itu ditangani dengan mendorong 4 byte dan menghapus satu setelahnya:

inc %esp

Rutin yang menulis angka dalam bentuk desimal menggunakan aaminstruksi untuk membagi axdengan 10berulang kali. Sangat menguntungkan karena menghitung angka dari kanan ke kiri!


Karena ada dua angka untuk ditulis, kode ini menggunakan subrutin, yang disebut dua kali. Namun, karena subrutin menulis hasilnya di stack, ia menggunakan register untuk menyimpan alamat pengirim.


Kode C yang memanggil kode mesin di atas:

include <stdio.h>

void print_it(int, int) __attribute__((fastcall));

int main()
{
    print_it(90, 102);
    puts("");
    print_it(78, 0);
    puts("");
    print_it(222, 222);
    puts("");
    return 0;
}

Keluaran:

90 is less than 102
78 is greater than 0
222 is equal to 222

3

ShortScript , 98 byte

←Α
←Β
↑Γαis
↔α>β→γgreater thanβ
↔α<β→γless thanβ
↔α|β→γequal toβ

Jawaban ini tidak bersaing, karena ShortScript diterbitkan setelah tantangan ini.


3

Fourier , 147 74 byte

Non-bersaing karena pencetakan string lebih baru dari tantangan ini

I~AoI~B` is `<A{1}{`greater than`}A<B{1}{`less than`}A{B}{`equal to`}` `Bo

Cobalah di FourIDE!

Entah mengapa saya tidak mengizinkan pencetakan sebelumnya ... Itu membuat kode dapat dibaca dan bagus untuk bermain golf


Anda harus dapat menyimpan dengan menetapkan huruf umum seperti 101dan 116ke variabel, bukan? Saya tidak yakin bagaimana / jika ruang lingkup variabel ditangani.
Geobits

@ Geobits Tidak ada cakupan lokal di Fourier, jadi ya, saya akan kerjakan itu
Beta Decay

@ Geobits Golf sedikit lebih menggunakan variabel
Beta Decay

2

C, 155 136 127 83 byte

f(a,b){printf("%d is %s %d\n",a,a>b?"greater than":a<b?"less than":"equal to",b);}

5
Anda dapat membuat ini lebih pendek - ganti nama argc dan argv, tentukan a dan b dalam satu baris, lewati pemeriksaan argc, dan banyak lagi.
ugoren

1
Perhatikan bahwa persyaratannya adalah program lengkap atau fungsi. Suatu fungsi akan jauh lebih pendek.
ugoren

@ugoren Saya tidak yakin apakah itu bisa berfungsi, jadi saya memutuskan untuk menulis program yang lengkap. Saya akan refactor itu. Terima kasih lagi!
Mauren

2

Haskell, 87 byte

Satu byte lebih pendek dari pendekatan Otomo.

a?b=show a++" is "++["less than ","equal to ","greater than "]!!(1+signum(a-b))++show b

Solusi yang bagus. :)
Otomo

2

Lua, 118 byte

Saya tidak melihat cukup jawaban Lua di sini jadi ...

function f(a,b)print(a>b and a.." is greater than "..b or a==b and a.." is equal to "..b or a.." is less than "..b)end

Tidak Disatukan:

function f(a,b)
    print(a>b and a.." is greater than "..b or a==b and a.." is equal to "..b or a.." is less than "..b)
end

Selamat datang di PPCG!
Dennis

2

Python 2, 78 byte

Saya suka bagaimana cmp()ini benar-benar berguna, tetapi dihapus dengan Python 3 .

Menggunakan fungsi anonim:

lambda a,b:`a`+' is '+['equal to ','greater than ','less than '][cmp(a,b)]+`b`

Tidak menggunakan fungsi (79 byte):

a,b=input();print a,'is %s'%['equal to','greater than','less than'][cmp(a,b)],b

Bukankah ini jawaban dari @ TheNumberOne ?
Beta Decay

@BetaDecay Tidak. Mereka berbeda. Baca komentar saya tentang jawaban itu.
mbomb007

2

JavaScript, 151 104 100 95 92 byte

a+=prompt()
b+=prompt()
alert(a+" is "+(a>b?"greater than ":a<b?"lesser than ":"equal to ")+b)

Saya berhasil mempersingkat dengan bantuan edc65


Saya seorang pemula JavaScript ...
Kritixi Lithos

Bolehkah saya bertanya apa yang Anda gunakan untuk menemukan skor Anda?
Beta Decay

Bukan rusak (kesalahan sintaks). Coba saja sebelum memposting
edc65

Apakah ada kesalahan sekarang?
Kritixi Lithos

1
a = ekspresi. Itu adalah inisialisasi. var amendeklarasikan variabel a. Anda harus menggunakannya dalam kode nyata untuk banyak alasan bagus. Tapi itu opsional dalam javascript dan menghindari var Anda menyimpan 4 karakter
edc65

2

C # 6, 113 103 100 95 byte

void C(int a,int b){System.Console.Write($"{a} is {a-b:greater than;less than;equal to} {b}");}

Terima kasih kepada edc65 untuk menghemat 13 byte dan untuk cell001uk untuk menghemat 5 byte menggunakan string interpolasi C # 6 !


Simpan 10 bytevoid C(int a,int b){System.Console.Write("A is {0} B",a==b?"equal to":a>b?"greater than":"less than");}
edc65

@ edc65 Bagus, terima kasih!
ProgramFOX

Saya suka format C #:Write("{0} is {1:greater than;less than;equal to} {2}",a,a-b,b)
edc65

@ edc65 Woah, itu luar biasa! Terima kasih! Juga terima kasih telah mengingatkan saya bahwa A dan B harus digantikan oleh nilai-nilai mereka, saya benar-benar mengabaikan bahwa> _>
ProgramFOX



1

Pyth, 57 55 53 byte

AQjd[G"is"@c"equal to
greater than
less than"b._-GHH)

Ini pada dasarnya tidak:

["less than", "greater than", "equal to"][sign_of(A-B)]

Disimpan 2 byte berkat saran @ AlexA untuk menggunakan Aalih-alih Jdan Kdan 2 byte lainnya dengan mengganti seluruh kekacauan penambahan dengan pengurangan yang lebih sederhana.

Demo langsung dan uji kasus.

Versi 55 byte

AQjd[G"is"@c"less than
greater than
equal to"b+gGHqGHH)

Demo langsung dan uji kasus.

Versi 57 byte:

jd[JhQ"is"@c"less than
greater than
equal to"b+gJKeQqJKK)

Demo langsung dan uji kasus.


Satu byte lebih pendek:AQs[Gd"is"d?<GH"less than"?>GH"greater than""equal to"dH
Alex A.

@AlexA. Saya hanya menggunakan saran Abukannya Jdan K, yang menyelamatkan 2 byte.
kirbyfan64sos


1

SWI-Prolog, 94 byte

a(A,B):-(((A>B,C=greater;A<B,C=less),D=than);C=equal,D=to),writef("%t is %t %t %t",[A,C,D,B]).

1

Swift, 105 92 byte

func c(a:Int, b:Int){println("A is",(a==b ?"equal to":(a<b ?"less":"greater")," than"),"B")}

bahkan lebih pendek dengan Swift 2.0 ( 103 90 byte)

func c(a:Int, b:Int){print("A is",(a==b ?"equal to":(a<b ?"less":"greater")," than"),"B")}

1

Memproses, 92 byte

void c(int a,int b){print(a+" is "+(a>b?"greater than ":a<b?"lesser than ":"equal to ")+b);}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.