So sánh hai số


25

Thử thách

Cho hai số nguyên ABlàm đầu vào, bạn phải viết chương trình xuất ra nếu A>B, A==Bhoặc A<B.

Các số nguyên sẽ nằm trong bất kỳ phạm vi hợp lý nào được hỗ trợ bởi ngôn ngữ của bạn, bao gồm ít nhất 256 giá trị.

Chương trình của bạn có thể là chương trình đầy đủ hoặc hàm, lấy đầu vào thông qua STDIN hoặc đối số hàm.

Đầu ra

Nếu A>Bđầu ra

A is greater than B

Nếu A==Bđầu ra

A is equal to B

Nếu A<Bđầu ra

A is less than B

Nơi bạn thay thế ABcho các giá trị nguyên của họ.

Chiến thắng

Chương trình ngắn nhất tính bằng byte thắng.

Bảng xếp hạng

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>


Hôm nay trên Lập trình Câu đố & Code Golf: báo cáo ternary!
Trebuchette

Các chức năng có thể đơn giản trả lại giải pháp thay vì in ra giải pháp?
TheNumberOne

@TheNumberOne Không, họ phải in giải pháp
Beta Decay

Câu trả lời:


11

CJam, 47

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

Dùng thử trực tuyến

Giải trình:

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

Có vẻ như CJam ngắn hơn một byte so với Pyth ngày nay :(
orlp

Theo Mặc định để đọc một số phần đầu vào , bạn có thể đọc đầu vào dưới dạng [A B]và loại bỏ ]khỏi mã của mình.
Dennis

@Dennis cảm ơn, tôi đã nghĩ về nó nhưng không chắc chắn.
aditsu

@orlp 2 byte bây giờ và đó là lý do để mỉm cười, không nhăn mặt :)
aditsu

Thích hợp rằng mã của bạn thực sự chứa một biểu tượng mặt cười ở dạng ~_~...
Darrel Hoffman

19

Python 2, 95 94 76 byte

Đầu vào phải được phân tách bằng dấu phẩy.

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

Tôi tò mò, bạn có thể giải thích những gì cmp(A,B)và làm? :)
Beta Decay

2
@BetaDecay, docs.python.org/2/library/functions.html#cmp . "So sánh hai đối tượng x và y và trả về một số nguyên theo kết quả. Giá trị trả về là âm nếu x <y, zero nếu x == y và hoàn toàn dương nếu x> y.". Trong cPython 2.7.6, các giá trị của các số nguyên đó lần lượt là -1, 0, 1. Định nghĩa của hàm không quyết định điều này, vì vậy một người bán hàng có thể nhấn mạnh rằng việc triển khai và phiên bản chính xác của python đã được đưa ra ở đây thay vì chỉ là "Python 2", nhưng tôi hy vọng hầu hết các triển khai sẽ hoạt động giống nhau ở đây.
ymbirtt

Tôi chỉ muốn bạn biết rằng tôi đã không sao chép câu trả lời của bạn để đến với tôi . Tôi vừa mới thấy họ thân nhau thế nào. Khi tôi viết bài, tôi gặp khó khăn khi chạy đoạn trích và tôi có thể đã thề rằng đã không có câu trả lời Python (phải bỏ qua trang thứ 2). Tôi đã viết nó hoàn toàn độc lập, đủ lạ.
mbomb007

@ Sp3000 Tôi đã kiểm tra nó và nó hoạt động hoàn toàn tốt trong Python 2.7.6
ML

1
@ML Nhận xét của tôi đã đề cập đến một sửa đổi trong quá khứ nhưng vì nó đã lỗi thời nên tôi đã xóa nhận xét
Sp3000

10

Mê cung , 180 152 149 byte

<
?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.{!@

Chỉnh sửa: Quản lý để cạo tắt 3 byte bằng cách tái sử dụng 10giữa 101, 103108(các mã ký tự của e, gl). Giải thích dưới đây không phản ánh điều này, nhưng nó không phải là một thay đổi đáng kể.

Giải trình

Chúng ta không thể làm gì nhiều trong cách tiết kiệm byte để in chuỗi, đó sẽ là những đoạn tuyến tính dài. Vì vậy, thách thức chính trong việc chơi golf là tránh một lượng lớn khoảng trắng không cần thiết. Điều đó có nghĩa là chúng tôi muốn các phần tuyến tính "tỏa ra" từ cột ngoài cùng bên trái. Chúng tôi cũng có thể nhận được một số tiền tiết kiệm hơn bằng cách sử dụng lại mã được in than B. Vì vậy, hãy nhìn vào dòng điều khiển ở đây:

Chương trình bắt đầu trên một lệnh xoay lưới <. Điều này sẽ dịch chuyển hàng hiện tại theo chu kỳ sang trái với IP trên đó, vì vậy chúng tôi nhận được điều này:

                                                     <
?.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.{!@

Bây giờ IP nằm trên một ô bị cô lập, do đó, nó thực hiện cùng một lệnh một lần nữa trong khi <di chuyển xa hơn về bên trái cho đến khi ...

                    <
?.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.{!@

Tại thời điểm này, IP có một nơi nào đó để đi và thực hiện phần tuyến tính đầu tiên (hàng thứ hai) từ phải sang trái. Những gì nó làm là đọc A, sao chép, in. Sử dụng ký tự phân cách giữa các số, in is(và dấu cách). Sau đó đọc B, sao chép nó và trừ Anó tại -.

Tại thời điểm này, chúng tôi đạt "ngã ba đường" đầu tiên. Nếu chênh lệch mang lại 0, IP sẽ tiếp tục di chuyển thẳng về phía nhánh dưới cùng. Chi nhánh đó chỉ đơn giản là in equal tovà sau đó B.

Mặt khác, IP rẽ trái về phía hai no-op "". Sau đó, có một ngã ba khác. Nếu sự khác biệt là âm, IP sẽ rẽ trái về phía nhánh trên dài. Chi nhánh đó chỉ đơn giản là in greater thanvà sau đó B.

Nếu sự khác biệt là tích cực, IP sẽ đặt quyền vào nhánh dưới, in less. Bây giờ chúng tôi muốn sử dụng lại thantừ các chi nhánh khác. Nhưng đồng thời chúng tôi không muốn kết nối hai chi nhánh sau này, vì chúng tôi cần cả đống không gian không cần thiết. Thay vào đó, chúng tôi sử dụng một vài no-op để căn chỉnh nhánh dưới với nơi thanbắt đầu ở nhánh trên và sau đó bắt đầu thao tác lại nguồn với ^:

                    <
?.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 .{!@

Một lần nữa, đây là cách ly IP, do đó ^được thực hiện lại và chúng tôi nhận được

                    <
?.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 .{!@

Bây giờ IP có thể tiếp tục di chuyển sang phải và in thanBtheo yêu cầu.


8

JavaScript (ES6), 66 byte

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

Xác định một hàm ẩn danh. Kiểm tra bằng cách thêm f=trước nó và gọi nó nhưalert(f(4, 5))


Thật không có khoản tiết kiệm nào từ "hơn" lặp đi lặp lại.


Bạn có chắc không? Câu trả lời Java dường như có được khoảng hơn;)
Beta Decay

3
@BetaDecay tốt, không. Ngay cả câu trả lời Java cũng sẽ có cùng độ dài lặp lại 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 Đây có phải là câu trả lời hợp lệ nếu nó không thực sự xuất văn bản? Hoặc 7 cho alert()nên được thêm vào điểm số.
tò mò

@cquildannii Ồ tôi hiểu rồi, vâng, điều này không hợp lệ nếu bạn không được tính alert()là một phần của mã và số byte của mình
Beta Decay

@BetaDecay oh, tôi đã không nhận ra rằng câu trả lời dự kiến ​​sẽ được in thay vì chỉ trả lại. Nếu giả sử môi trường REPL là ổn, thì điều này có thể được chạy trong bảng điều khiển FireFox miễn phí, nếu không tôi đoán nó lên tới 73.
jrich

8

Java, 114 113 Byte hoặc 74 72 67 nếu chúng tôi sử dụng ký hiệu lambda

Cảm ơn Kevin Cruijssen cho giải pháp dựa trên cà ri:

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

Giải pháp lambda cũ

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

như ý nghĩa của người dùng hjk trong bình luận, nếu chúng ta sử dụng lambda, chúng ta có thể giảm đáng kể đến 74 byte.

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

1
Cách nén thông minh than:)
TheNumberOne

4
Bạn có thể loại bỏ publicnếu bạn muốn. Tôi sẽ đề nghị làm điều này thành một lambda. Bạn có thể loại bỏ một khoảng trắng trước {.
TheNumberOne

1
Và trong khi bạn đang ở đó, hãy thêm dấu phẩy sau #Java để bạn có thể ở trên bảng xếp hạng. ;)
TNT

2
Thông số câu hỏi chính thức là nói "ít hơn", không phải "nhỏ hơn". Bạn cũng có thể làm điều đó và mất ba byte! Tôi không biết Java, nhưng mã lambda sẽ in văn bản hay chỉ trả lại nó? Nếu nó không in thì có lẽ đó không phải là một câu trả lời hợp lệ.
tò mò

2
@hjk Lambda ngắn hơn bằng cách sử dụng cà ri: a->b->a+" is "+(a==b?"equal to ":(a>b?"greater":"smaller" )+" than ")+bVâng, tôi biết nó đã được gần hai năm. ;) Và bạn thực sự có thể sử dụng lessthay vì smallerdựa trên mô tả thử thách, như được đề cập bởi hai ý kiến ​​trên tôi. Hãy thử nó ở đây để xem làm thế nào cà ri được thực hiện.
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
Bạn có thể lưu 3 byte bằng cách thay đổi "nhỏ hơn" thành "nhỏ hơn" để làm theo thông số kỹ thuật ở trên. +1 vì không sử dụng toán tử ternary.
đánh dấu

ah cảm ơn, tôi đã không nắm bắt được điều đó! đã sửa!
flodel

@bmark R không có toán tử ternary. : P
Alex A.

@AlexA. Tôi biết. Tôi có nghĩa là sử dụng một danh sách và chức năng ký hiệu rất khác so với các câu trả lời khác cho đến nay (hầu hết trong số đó sử dụng các toán tử ternary hoặc tương tự).
đánh dấu

Đúng. Để so sánh, lần thử đầu tiên của tôi sử dụng if / other là 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"

Này sử dụng chuỗi suy nhúng A, Bvà ternary bên trong một chuỗi duy nhất.

Đã lưu 3 byte nhờ 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 cho -p. Lấy đầu vào từ STDIN, với hai số được phân tách bằng một khoảng trắng:

$ 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

Làm thế nào nó hoạt động:

Các <=>lợi nhuận điều hành -1, 0, hoặc 1 tùy thuộc vào việc các toán hạng đầu tiên là ít hơn, bằng hoặc lớn hơn so với thứ hai. Thuận tiện, Perl cho phép các chỉ số âm với các mảng và lát, trong đó phần tử cuối cùng ở vị trí -1, phần tử thứ hai đến cuối cùng ở vị trí -2, v.v.

Trong mã

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

chúng tôi sử dụng giá trị trả về <=>là chỉ mục trong một lát danh sách để lấy chuỗi tương ứng, trong đó $`là số đầu tiên và $'là số thứ hai.

Để tránh lặp lại than, xđược sử dụng như một trình giữ chỗ và được thay thế trong lần thay thế thứ hai ở cuối.


Giải pháp thay thế, 63 byte

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

62 byte + 1 byte cho -p. Đưa đầu vào được phân tách bằng dấu cách từ STDIN giống như giải pháp đầu tiên.

Làm thế nào nó hoạt động:

Giải pháp này cũng sử dụng một lát cắt, nhưng lợi dụng thực tế là không giống như các lát danh sách, các lát mảng có thể được nội suy thành các chuỗi (và RHS thay thế). Điều này cho phép chúng ta bỏ công cụ /esửa đổi và dấu ngoặc kép trong toán tử thay thế.

Bí quyết thực sự nằm trong phần con:

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

Đối với các giá trị khác nhau của <=>, điều này mang lại:

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

Khi một mảng hoặc mảng mảng được nội suy thành một chuỗi, các phần tử sẽ tự động được nối bởi $"(theo mặc định, một khoảng trắng).


5

Chuột , 79 byte

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

Khi gặp chuỗi, chúng ngay lập tức được ghi vào STDOUT thay vì được đặt trên ngăn xếp. Ngăn xếp chỉ có thể chứa số nguyên.

Ung dung:

? 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 "\+@

Yêu cầu 2 số nguyên trên ngăn xếp. Hãy thử trực tuyến .

Làm thế nào nó hoạt động:

  • \.@.@- A và B đã có trên ngăn xếp và đoạn mã này làm cho ngăn xếp trông như thế này : ABBA. \hoán đổi hai mục trên cùng trên ngăn xếp, .sao chép mục trên cùng và @xoay 3 mục trên cùng ( 1 2 3-> 2 3 1).

  • Sau đó, ba mục được đẩy vào ngăn xếp: =dấu hiệu "equal to "và khối giữa {}. Câu iflệnh thực hiện điều này: nếu đối số thứ nhất ước tính là true, nó sẽ thực thi khối mã thứ nhất (đối số thứ hai), nếu không, khối mã thứ hai (đối số thứ ba). Vì vậy, nếu A và B bằng nhau, nó sẽ đẩy "bằng" trên ngăn xếp. Nếu chúng không bằng nhau, nó sẽ thực thi mã giữa các khối. Lưu ý rằng =bật hai mục trên cùng từ ngăn xếp, vì vậy bây giờ ngăn xếp trông như thế nào AB.

  • Bên trong khối, đầu tiên bạn nhìn thấy .@.@. Trước các lệnh này, ngăn xếp trông giống như ABvà sau đó, ngăn xếp trông như thế nào BAAB. Các lệnh tương tự như những người được đề cập ở trên.

  • Sau đó, có một iftuyên bố khác . Lần này, nó kiểm tra xem A> B, và nếu đúng, nó sẽ đẩy "lớn hơn" trên ngăn xếp. Khác, nó đẩy "ít" trên ngăn xếp. Sau khi đẩy một trong hai, nó sẽ đẩy "hơn" trên ngăn xếp và nối nó với chuỗi đẩy trước đó. >cũng xuất hiện hai mục trên cùng của ngăn xếp, vì vậy bây giờ ngăn xếp trông như thế nào BA"string".

  • Ba lệnh tiếp theo là : " is "\+. " is "đẩy chuỗi đó trên ngăn xếp (stack trông giống như BA"string"" is "), \hoán đổi hai mục trên cùng (stack trông giống như BA" is ""string") và +nối hai mục trên cùng (stack trông như thế nào BA" is string").

  • Lệnh cuối cùng @, xoay ba mục ngăn xếp, vì vậy ngăn xếp bây giờ trông như : A" is string"B. GolfScript tự động in các giá trị ngăn xếp trên STDOUT sau khi chương trình kết thúc, do đó bạn sẽ có được đầu ra mong muốn.


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)

Đã thêm ngắt dòng trước khi chạy nước rút, để dễ đọc. Nó hoạt động cả có và không có ngắt dòng này, vì vậy nó không được bao gồm trong số byte. Phải nhấn enter giữa hai số đầu vào.


2
Sử dụng rất thông minh sprintf!
Luis Mendo


4

Pháo đài, 129

Số học Fortran nếu là hoàn hảo cho thử thách này

Kiểm tra: 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 (đã lưu tám byte nhờ Chấn thương kỹ thuật số)

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

Kiểm tra (trên 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

Việc sử dụng [ ]after p=greaterlà để ngăn ||toán tử được đánh giá trước =trong biểu thức ...&&p=greater||(($1<$2))... (ưu tiên toán tử!).

Phương án thay thế sẽ là sử dụng dấu ngoặc quanh (($1>$2))&&p=greater(($1<$2))&&p=less, nhưng dấu ngoặc tạo phạm vi bên trong cho các biến, do đó psẽ không bị thay đổi.


1
p=equal;q=than;(($1>$2))&&p=greater&&[ ]||(($1<$2))&&p=less||q=to;echo $1 is $p $q $2
Chấn thương kỹ thuật số

3

Mã máy IA-32 + linux, 107 byte

Mã thập phân của mã:

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

Do các giới hạn phần cứng, mã hoạt động với các số trong phạm vi 0 ... 255.

Mã nguồn (có thể được lắp ráp với 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

Đây là một số lạm dụng nghiêm trọng của ngăn xếp! Mã xây dựng thông điệp đầu ra trên ngăn xếp, từ đầu đến cuối. Để viết 4 byte, nó sử dụng một pushlệnh đơn . Để viết 1 byte, nó sử dụng hai hướng dẫn:

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

May mắn thay, hầu hết các đoạn để viết là 4 byte. Một trong số chúng ("gre" trong "lớn hơn") là 3 byte; nó được xử lý bằng cách đẩy 4 byte và loại bỏ một byte sau đó:

inc %esp

Thói quen viết các số ở dạng thập phân sử dụng aamhướng dẫn để chia axcho 10nhiều lần. Thật thuận lợi khi nó tính toán các chữ số từ phải sang trái!


Vì có hai số để viết, mã sử dụng chương trình con, được gọi là hai lần. Tuy nhiên, vì chương trình con ghi kết quả trên ngăn xếp, nó sử dụng một thanh ghi để giữ địa chỉ trả về.


Mã C gọi mã máy ở trên:

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;
}

Đầu ra:

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β

Câu trả lời này không cạnh tranh, vì ShortScript đã được xuất bản sau thử thách này.


3

Fourier , 147 74 byte

Không cạnh tranh vì in chuỗi mới hơn thử thách này

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

Hãy thử nó trên FourIDE!

Tại sao tôi không cho phép in trước đây ... Nó làm cho mã có thể đọc được và rất tốt cho việc chơi gôn


Bạn sẽ có thể lưu bằng cách gán các chữ cái phổ biến như 101116cho các biến, phải không? Tôi không chắc chắn làm thế nào / nếu phạm vi biến được xử lý.
Geobits

@Geobits Không có phạm vi địa phương trong Fourier, vì vậy, tôi sẽ làm việc trên đó
Beta Decay

@Geobits Chơi gôn nhiều hơn một chút bằng cách sử dụng các biến
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
Bạn có thể làm điều này ngắn hơn nhiều - đổi tên argc và argv, xác định cả a và b trong một dòng, bỏ qua kiểm tra argc và hơn thế nữa.
ugoren

1
Lưu ý rằng yêu cầu là một chương trình hoàn chỉnh hoặc một chức năng. Một chức năng sẽ ngắn hơn nhiều.
ugoren

@ugoren Tôi không chắc liệu nó có thể là một hàm không, vì vậy tôi quyết định viết một chương trình hoàn chỉnh. Tôi sẽ tái cấu trúc nó. Cám ơn bạn một lần nữa!
Mauren

2

Haskell, 87 byte

Một byte ngắn hơn cách tiếp cận của Otomo.

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

Giải pháp tốt đẹp. :)
Otomo

2

Lua, 118 byte

Tôi không thấy đủ câu trả lời của Lua ở đây nên ...

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

Ung dung:

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

Chào mừng đến với PPCG!
Dennis

2

Python 2, 78 byte

Tôi thích cách cmp()thực sự hữu ích, nhưng nó đã bị xóa trong Python 3 .

Sử dụng chức năng ẩn danh:

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

Không sử dụng hàm (79 byte):

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

Đây không phải là bản sao của câu trả lời của @ TheNumberOne sao?
Beta Decay

@BetaDecay Không. Họ khác nhau. Đọc bình luận của tôi về câu trả lời đó.
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)

Tôi quản lý để rút ngắn với sự giúp đỡ của edc65


Tôi là người mới sử dụng JavaScript ...
Kritixi Lithos

Tôi có thể hỏi những gì bạn đang sử dụng để tìm điểm số của bạn?
Beta Decay

Không phải nó bị hỏng (lỗi cú pháp). Chỉ cần thử trước khi đăng
edc65

Có một lỗi bây giờ?
Kritixi Lithos

1
a = biểu thức. Đó là một khởi đầu. var ađang khai báo biến a. Bạn phải sử dụng nó trong mã thực sự cho rất nhiều lý do tốt. Nhưng đó là tùy chọn trong javascript và tránh cho var bạn lưu 4 charactes
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}");}

Cảm ơn edc65 đã lưu 13 byte và đến cell001uk để lưu 5 byte bằng chuỗi nội suy của C # 6 !


Lưu 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 Rất vui, cảm ơn!
Chương trìnhFOX

Tôi yêu định dạng C #:Write("{0} is {1:greater than;less than;equal to} {2}",a,a-b,b)
edc65

@ edc65 Woah, thật tuyệt vời! Cảm ơn! Cũng cảm ơn vì đã nhắc nhở tôi rằng A và B phải được thay thế bằng các giá trị của chúng, tôi hoàn toàn bỏ qua điều đó> _>
Chương trìnhFOX



1

Pyth, 57 55 53 byte

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

Điều này về cơ bản là:

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

Saved 2 byte nhờ gợi ý của việc sử dụng @ Alexa. Của Athay JKvà khác 2 byte bằng cách thay thế toàn bộ mớ hỗn độn Ngoài ra với một phép trừ đơn giản hơn.

Bản demo và trường hợp thử nghiệm trực tiếp.

Phiên bản 55 byte

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

Bản demo và trường hợp thử nghiệm trực tiếp.

Phiên bản 57 byte:

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

Bản demo và trường hợp thử nghiệm trực tiếp.


Một byte ngắn hơn:AQs[Gd"is"d?<GH"less than"?>GH"greater than""equal to"dH
Alex A.

@AlexA. Tôi chỉ sử dụng đề xuất Athay vì JK, đã lưu 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")}

thậm chí ngắn hơn với 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

Đang xử lý, 92 byte

void c(int a,int b){print(a+" is "+(a>b?"greater than ":a<b?"lesser than ":"equal to ")+b);}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.