Порівнюючи два числа


25

Виклик

З урахуванням двох цілих чисел Aі Bяк вхідних даних, ви повинні написати програму, яка виводить if A>B, A==Bабо A<B.

Цілі числа будуть у будь-якому розумному діапазоні, підтримуваному вашою мовою, що включає принаймні 256 значень.

Ваша програма може бути або повною програмою, або функцією, приймаючи дані через STDIN або аргументи функції.

Виходи

Якщо A>Bвихід

A is greater than B

Якщо A==Bвихід

A is equal to B

Якщо A<Bвихід

A is less than B

Де ви замінити Aі Bдля їх цілочисельних значень.

Перемога

Виграє найкоротша програма в байтах.

Таблиця лідерів

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>


Сьогодні про програмування головоломок та код гольфу: потрійні заяви!
Trebuchette

Чи можуть функції функцій просто повернути рішення замість роздрукування рішення?
TheNumberOne

@TheNumberOne Ні, вони повинні надрукувати рішення
Beta Decay

Відповіді:


11

CJam, 47

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

Спробуйте в Інтернеті

Пояснення:

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

Схоже, CJam сьогодні на один байт коротший, ніж Pyth :(
orlp

Відповідно до значень за замовчуванням для зчитування декількох фрагментів вводу , ви можете прочитати вхід як [A B]і виключити ]зі свого коду.
Денніс

@ Денніс спасибі, я думав про це, але не був впевнений.
aditsu

@orlp 2 байти зараз, і це привід посміхнутися, а не
нахмуритися

Доречно, що ваш код насправді містить смайлик у вигляді ~_~...
Даррел Гофман

19

Python 2, 95 94 76 байт

Введення має бути розділене комою.

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

Мене заінтригує, чи можете ви пояснити, що cmp(A,B)є і що робить? :)
Бета-розпад

2
@BetaDecay, docs.python.org/2/library/functions.html#cmp . "Порівняйте два об'єкти x і y і поверніть ціле число відповідно до результату. Повернене значення від'ємне, якщо x <y, нулеве, якщо x == y, і строго додатне, якщо x> y." У cPython 2.7.6 ці цілі числа дорівнюють -1, 0, 1 відповідно. Визначення функції цього не диктує, тому педант може наполягати на тому, що тут було вказано точну реалізацію та версію python, а не просто "Python 2", але я думаю, що більшість реалізацій буде вести себе однаково.
ymbirtt

Я просто хочу, щоб ви знали, що я не копіював вашу відповідь, щоб придумати свою . Я тільки що побачив, як вони були поруч. Коли я написав своє, у мене виникли проблеми із запуском фрагмента, і я міг присягнути, що відповіді Python ще не було (напевно, я пропустив другу сторінку). Я написав це абсолютно самостійно, досить дивно.
mbomb007

@ Sp3000 Я перевірив це, і він прекрасно працює в Python 2.7.6
ML

1
@ML Мій коментар стосувався минулої редакції, але оскільки вона застаріла, я видалив коментар
Sp3000

10

Лабіринт , 180 152 149 байт

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

Edit: Чи встигли збрити 3 байта за рахунок багаторазового використання 10між 101, 103і 108(символьні коди e, gі l). Пояснення нижче цього не відображає, але це не суттєва зміна.

Пояснення

Ми не можемо багато зробити, щоб зберегти байти для друку рядків, це просто довгі лінійні перерізи. Тому головне завдання в гольфі - уникати великої кількості непотрібного простору. Це означає, що ми хочемо, щоб лінійні деталі "випромінювались" із самого лівого стовпчика. Ми також можемо отримати більше заощаджень, використовуючи код, який друкується than B. Отже, давайте розглянемо контрольний потік тут:

Програма запускається за допомогою команди обертання сітки <. Це циклічно зміщує поточний рядок вліво з IP-адресою на ньому, тому ми отримуємо це:

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

Тепер IP знаходиться на ізольованій комірці, тому він виконує ту ж команду знову і знову, поки <рухається далі вліво, поки ...

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

У цей момент ІР має кудись піти і виконує перший лінійний розділ (другий ряд) справа наліво. Що він робить - це читати A, копіювати, друкувати. Вживайте розділовий символ між цифрами, друком is(і пробілами). Потім прочитайте B, скопіюйте його і відніміть Aз нього в -.

У цей момент ми вдарили першу «вилку в дорогу». Якщо різниця принесла 0, IP продовжує рухатися прямо вперед до нижньої гілки. Ця гілка просто друкує equal toі тоді B.

В іншому випадку IP-адреса ліворуч спрямовується до двох відсутніх вікон "". Потім ще одна вилка. Якщо різниця була від’ємною, IP бере іншу ліву сторону до довгої верхньої гілки. Ця гілка просто друкує greater thanі тоді B.

Якщо різниця була позитивною, IP бере право на нижню гілку, яка друкує less. Тепер ми хочемо повторно використовувати thanз іншої галузі. Але в той же час ми не хочемо згодом з'єднувати ці дві гілки, тому що нам знадобиться ціла купа непотрібних пробілів. Замість цього ми використовуємо декілька відсутніх вікон для вирівнювання нижньої гілки з тим, де thanпочинається на верхній гілці, а потім знову починаємо маніпулювати джерелом ^:

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

Знову ж таки, це ізолює IP, тому ^виконується знову і ми отримуємо

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

Тепер IP може продовжувати рухатися праворуч та друкувати thanта, Bяк потрібно.


8

JavaScript (ES6), 66 байт

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

Визначає анонімну функцію. Тестуйте, додаючи f=перед цим, і називайте його якalert(f(4, 5))


На жаль, жодних заощаджень від повторюваного "ніж" не було.


Ти впевнений? Відповідь на Java, схоже, обійде більш ніж;)
Beta Decay

3
@BetaDecay добре, ні. Навіть відповідь на Java буде повторювати однакову довжину 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 Це правдива відповідь, якщо вона фактично не виводить текст? Крім того, 7 alert()балів повинні бути додані до оцінки.
курйозданні

@curiousdannii О, я бачу, так, це недійсно, якщо ви не вважаєтесь alert()частиною коду та кількості байтів
Beta Decay

@BetaDecay О, я не розумів, що відповідь, як очікується, буде надруковано, а не щойно повернутою. Якщо припустити, що середовище REPL нормально, це можна запустити на консолі FireFox без будь-яких витрат, інакше я думаю, що це до 73.
jrich,

8

Java, 114 113 байт або 74 72 67, якщо ми використовували лямбда-позначення

Дякуємо Кевіну Крейсейну за рішення на основі каррі:

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

Старий попередній лямбда-розчин

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

як значення hjk користувача в коментарі, якщо ми використовували лямбда, ми можемо значно знизити до 74 байт.

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

1
Розумний спосіб стискання than:)
TheNumberOne

4
Ви можете видалити, publicякщо захочете. Я б запропонував зробити це лямбда. Ви можете видалити один пробіл перед {.
TheNumberOne

1
І поки ви при цьому, додайте кому після #Java, щоб ви могли бути на лідері лідерів. ;)
ТНТ

2
Офіційна специфіка питання полягає у тому, щоб сказати "менше", а не "менше". Ви можете також зробити це і втратити три байти! Я не знаю Java, але чи буде лямбда-код друкувати текст чи просто повертати його? Якщо він не надрукує його, то, ймовірно, це неправдива відповідь.
цікаводанні

2
@hjk Коротше лямбда з використанням каррі: a->b->a+" is "+(a==b?"equal to ":(a>b?"greater":"smaller" )+" than ")+bТак, я знаю, це було майже два роки. ;) І ви дійсно можете використовувати lessзамість smallerопису виклику, про що говорилося в двох коментарях над мною. Спробуйте тут, щоб побачити, як робиться заготовка.
Kevin Cruijssen

7

R, 80 байт

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

1
Ви можете зберегти 3 байти, змінивши "менше, ніж" на "менше", щоб дотримуватися наведених вище специфікацій. +1 за те, що не використовується термінальний оператор.
позначки

ах спасибі, я цього не зловив! виправлено!
flodel

@bmarks R не має потрійного оператора. : P
Алекс А.

@AlexA. Я знаю. Я мав на увазі, що використання списку та функції знаку сильно відрізняється від інших відповідей поки що (більшість з яких використовували потрійні оператори чи подібні).
позначки

Правильно. Для порівняння, моя перша спроба використання if / else була 83 : function(A,B)cat(A,"is",if(A==B)"equal to"else c(if(A>B)"greater"else"less","than"),B).
flodel


7

Юлія, 69 66 байт

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

Це використовує інтерполяцію рядки для вбудовування A, Bі трикомпонентних всередині одного рядка.

Збережено 3 байти завдяки Глен О.


6

Perl, 64 63 байт

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

62 байти + 1 байт для -p. Бере вхід з STDIN, причому два числа розділені одним пробілом:

$ 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

Як це працює:

The <=> оператор повертає -1, 0 або 1 в залежності від того , чи є перший операнд менше, дорівнює або більше , ніж другий. Зручно, Perl дозволяє негативні підписки з масивами та фрагментами, де останній елемент знаходиться в положенні -1, другий-останній елемент знаходиться в положенні -2 і так далі.

У коді

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

ми використовуємо значення, що повертається <=>в якості підписання в фрагменті списку, щоб отримати відповідний рядок, де $`є перше число і $'друге.

Щоб уникнути повторення than, xвикористовується як заповнювач і замінюється другою заміною в кінці.


Альтернативне рішення, 63 байти

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

62 байти + 1 байт для -p. Займає вхід STDIN, розділений простором, як і перше рішення.

Як це працює:

Це рішення також використовує фрагмент, але використовує той факт, що на відміну від фрагментів списку, фрагменти масиву можуть бути інтерпольовані в рядки (і RHS підстановок). Це дозволяє нам скинути /eмодифікатор і лапки в операторі заміни.

Справжня хитрість полягає в індексі фрагмента:

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

Для різних значень <=>, це дає:

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

Коли масив або фрагмент масиву інтерполюється у рядок, елементи автоматично з'єднуються $"(за замовчуванням - єдиний пробіл).


5

Миша , 79 байт

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

Коли зустрічаються рядки, вони негайно записуються в STDOUT, а не ставляться у стек. Стек може містити лише цілі числа.

Безголівки:

? 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 байт

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

Очікує 2 цілих числа на стеці. Спробуйте в Інтернеті .

Як це працює:

  • \.@.@- А і Б вже в стеку, і цей шматок коду робить стек виглядати наступним чином : ABBA. \поміняє два верхні елементи в стеку, .дублює верхній елемент і @обертає 3 верхні елементи ( 1 2 3-> 2 3 1).

  • Потім три елементи висуваються до стека: =знак "equal to ", та блок між {}. ifЗаява робить це: якщо перший аргумент істинно, то виконується перший блок коду (другий аргумент), в іншому випадку, другий блок коду (третій аргумент). Тож якщо A і B рівні, він натисне "рівний" на стеку. Якщо вони не рівні, він виконає код між блоком. Зауважте, що= два найпопулярніші елементи випливає з стека, тому тепер стек виглядає так AB.

  • Всередині блоку ви вперше бачите .@.@. Перед цими командами стек має вигляд AB, а після - стек BAAB. Команди подібні до зазначених вище.

  • Потім є ще одне ifтвердження. Цього разу він перевіряє, чи A> B, і якщо це правда, він натискає "більше" на стек. Інакше, він штовхає "менше" на стек. Після натискання одного з цих двох, він натисне «ніж» на стек і з'єднає його з попередньою висунутою струною. >також з'являється два найголовніші елементи стеку, тому тепер стек виглядає так BA"string".

  • Наступні три команди: " is "\+. " is "висуває цей рядок на стек (стек виглядає як BA"string"" is "), \підміняє два верхні елементи (стек виглядає BA" is ""string") і +об'єднує два верхні елементи (стек схожий BA" is string").

  • Остання команда, @обертає три елементи стека, так що стек тепер виглядає наступним чином : A" is string"B. GolfScript автоматично друкує значення стека на STDOUT, коли програма закінчується, тож ви отримуєте потрібний вихід.


4

MATLAB, 105 байт

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

Додано перерву рядка перед спринтом, щоб полегшити читабельність. Він працює як з, так і без цього розриву рядків, тому він не входить до числа байтів. Потрібно ввести між двома вхідними номерами.


2
Дуже розумне використання sprintf!
Луїс Мендо


4

Фортран, 129

Арифметика Фортрана, якщо ідеально підходить для цього завдання

Тест: 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 байт (збережено вісім байтів завдяки Digital Trauma)

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

Тест (на 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

Використання [ ]after p=greater- це запобігання ||оцінці оператора раніше =у виразі...&&p=greater||(($1<$2))... (the operator precedence!).

Альтернативою було б використання дужок навколо (($1>$2))&&p=greaterі (($1<$2))&&p=less, але дужки створюють внутрішню область для змінних, тому pзалишаються без змін.


1
p=equal;q=than;(($1>$2))&&p=greater&&[ ]||(($1<$2))&&p=less||q=to;echo $1 is $p $q $2
Цифрова травма

3

Машинний код IA-32 + linux, 107 байт

Шестнадцятковий код:

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

Через обмеження обладнання, код працює з номерами в діапазоні 0 ... 255.

Вихідний код (може бути зібраний за допомогою 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

Це якесь серйозне зловживання стеком! Код будує вихідне повідомлення на стеку, від кінця до початку. Щоб записати 4 байти, використовується одна pushінструкція. Щоб записати 1 байт, він використовує дві інструкції:

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

На щастя, більшість фрагментів для запису - це 4 байти. Один з них ("gre" в "більший") - 3 байти; це обробляється натисканням 4 байтів і видаленням одного:

inc %esp

Підпрограма, що записує числа в десятковій формі, використовує aamінструкцію ділити axна 10кілька разів. Вигідно, що він обчислює цифри справа наліво!


Оскільки для запису є два числа, код використовує підпрограму, яка викликається двічі. Однак, оскільки підпрограма записує результати в стек, вона використовує регістр для утримання зворотної адреси.


C код, який викликає машинний код вище:

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

Вихід:

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

3

Короткий сценарій , 98 байт

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

Ця відповідь є неконкурентною, оскільки ShortScript був опублікований після цього виклику.


3

Fourier, 147 74 bytes

Non-competing because string printing is newer than this challenge

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

Try it on FourIDE!

Dunno why I didn't allow printing before... It makes the code readable and is great for golfing


You should be able to save by assigning common letters like 101 and 116 to variables, right? I'm not sure how/if variable scope is handled.
Geobits

@Geobits There are no local scopes in Fourier, so yeah, I'll work on that
Beta Decay

@Geobits Golfed it a bit more using variables
Beta Decay

2

C, 155 136 127 83 bytes

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

5
You can make this much shorter - rename argc and argv, define both a and b in one line, skip the argc check, and more.
ugoren

1
Note that the requirement is either a complete program or a function. A function would be much shorter.
ugoren

@ugoren I was not sure whether it could be a function, so I decided to write a complete program. I'm gonna refactor it. Thank you again!
Mauren

2

Haskell, 87 bytes

One byte shorter than Otomo's approach.

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

Nice solution. :)
Otomo

2

Lua, 118 bytes

I don't see enough Lua answers here so...

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

Ungolfed:

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

Welcome to PPCG!
Dennis

2

Python 2, 78 bytes

I love how cmp() is really useful, but it was removed in Python 3.

Using an anonymous function:

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

Not using a function (79 bytes):

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

Isn't this a dupe of @TheNumberOne's answer?
Beta Decay

@BetaDecay Nope. They are different. Read my comment on that answer.
mbomb007

2

JavaScript, 151 104 100 95 92 bytes

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

I managed to shorten with help of edc65


I am a JavaScript newbie...
Kritixi Lithos

May I ask what you are using to find your score?
Beta Decay

Not it's broken (syntax error). Just try before posting
edc65

Is there an error now?
Kritixi Lithos

1
a = expression. That is an initialisation. var a is declaring the variable a. You have to use it in real code for a lot of good reasons. But it's optional in javascript and avoiding var you save 4 charactes
edc65

2

C# 6, 113 103 100 95 bytes

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

Thanks to edc65 for saving 13 bytes and to cell001uk for saving 5 bytes using C# 6's interpolated strings!


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

@edc65 Nice, thanks!
ProgramFOX

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

@edc65 Woah, that's awesome! Thanks! Also thanks for reminding me that A and B have to be replaced by their values, I totally overlooked that >_>
ProgramFOX



1

Pyth, 57 55 53 bytes

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

This basically does:

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

Saved 2 bytes thanks to @AlexA.'s suggestion of using A instead of J and K and another 2 bytes by replacing the whole addition mess with a simpler subtraction.

Live demo and test cases.

55-byte version

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

Live demo and test cases.

57-byte version:

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

Live demo and test cases.


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

@AlexA. I just used the suggestion of A instead of J and K, which saved 2 bytes.
kirbyfan64sos


1

SWI-Prolog, 94 bytes

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")}

even shorter with 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

Processing, 92 bytes

void c(int a,int b){print(a+" is "+(a>b?"greater than ":a<b?"lesser than ":"equal to ")+b);}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.