Porównywanie dwóch liczb

25

Wyzwanie

Biorąc pod uwagę dwie liczby całkowite Ai Bjako dane wejściowe, musisz napisać program, który wyprowadza if A>B, A==Blub A<B.

Liczby całkowite będą w dowolnym rozsądnym zakresie obsługiwanym przez Twój język, który zawiera co najmniej 256 wartości.

Twój program może być pełnym programem lub funkcją, przyjmując dane wejściowe przez STDIN lub argumenty funkcji.

Wyjścia

Jeśli A>Bwyjście

A is greater than B

Jeśli A==Bwyjście

A is equal to B

Jeśli A<Bwyjście

A is less than B

Gdzie zamieniasz Ai Bdla ich wartości całkowitych.

Zwycięski

Najkrótszy program w bajtach wygrywa.

Tabela liderów

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>

Rozpad beta
źródło
Dzisiaj na temat programowania puzzli i golfa: potrójne oświadczenia!
Trebuchette,
Czy funkcje mogą po prostu zwrócić rozwiązanie zamiast wydrukować rozwiązanie?
TheNumberOne
@TheNumberOne Nie, muszą wydrukować rozwiązanie
Beta Decay

Odpowiedzi:

11

CJam, 47 lat

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

Wypróbuj online

Wyjaśnienie:

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
aditsu
źródło
Wygląda na to, że CJam jest dziś o jeden bajt krótszy niż Pyth :(
orlp
Zgodnie z Domyślnymi wartościami odczytu kilku danych wejściowych , możesz odczytać dane wejściowe jako [A B]i usunąć je ]ze swojego kodu.
Dennis
@Dennis dzięki, myślałem o tym, ale nie byłem pewien.
aditsu
@orlp 2 bajty teraz, i to jest powód do uśmiechu, a nie do zmarszczenia brwi :)
aditsu
Właściwe, aby Twój kod zawierał buźkę w postaci ~_~...
Darrel Hoffman
19

Python 2, 95 94 76 bajtów

Dane wejściowe muszą być oddzielone przecinkami.

A,B=input();print A,'is',['equal to','greater than','less than'][cmp(A,B)],B
Numer jeden
źródło
Jestem zaintrygowany, czy możesz wyjaśnić, co cmp(A,B)jest i co robi? :)
Beta Decay
2
@BetaDecay, docs.python.org/2/library/functions.html#cmp . „Porównaj dwa obiekty xiy i zwróć liczbę całkowitą zgodnie z wynikiem. Zwracana wartość jest ujemna, jeśli x <y, zero, jeśli x == y, i ściśle dodatnia, jeśli x> y.”. W cPython 2.7.6 te liczby całkowite wynoszą odpowiednio -1, 0, 1. Definicja funkcji tego nie dyktuje, więc pedant może nalegać, aby podano dokładną implementację i wersję Pythona, a nie tylko „Python 2”, ale spodziewam się, że większość implementacji zachowa się tutaj tak samo.
ymbirtt
Chcę tylko, żebyś wiedział, że nie skopiowałem twojej odpowiedzi, aby wymyślić moją . Właśnie teraz zobaczyłem, jak blisko byli. Kiedy napisałem mój, miałem problem z uruchomieniem fragmentu i mogłem przysiąc, że nie było już odpowiedzi w języku Python (musiałem przeoczyć drugą stronę). Dziwnie napisałem to całkowicie niezależnie.
mbomb007
@ SP3000 Sprawdziłem to, i to działa perfekcyjnie w Pythonie 2.7.6
ML
1
@ML Mój komentarz odnosi się do poprzedniej wersji, ale ponieważ jest już nieaktualny,
usunąłem
10

Labirynt , 180 152 149 bajtów

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

Edycja: Udało się ogolić 3 bajty przez ponowne użycie 10pomiędzy101 , 103a 108(kody znaków e, gil ). Poniższe wyjaśnienie tego nie odzwierciedla, ale nie jest to istotna zmiana.

Wyjaśnienie

Niewiele możemy zrobić, aby zaoszczędzić bajty na wydrukowaniu ciągów, będą to po prostu długie odcinki liniowe. Zatem głównym wyzwaniem w golfie jest unikanie dużych ilości niepotrzebnych białych znaków. Oznacza to, że chcemy, aby części liniowe „promieniowały” z lewej kolumny. Możemy również zyskać trochę więcej oszczędności, ponownie wykorzystując drukowany kodthan B . Spójrzmy więc na przepływ sterowania tutaj:

Program rozpoczyna się od polecenia obrotu siatki < . To przesuwa bieżący wiersz cyklicznie w lewo z adresem IP, więc otrzymujemy:

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

Teraz adres IP znajduje się w izolowanej komórce, więc wykonuje to samo polecenie raz po raz, podczas gdy < podróżuje dalej w lewo, aż ...

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

W tym momencie adres IP musi gdzieś iść i wykonuje pierwszą sekcję liniową (drugi rząd) od prawej do lewej. Czyta A, kopiuje, drukuje. Użyj znaku oddzielającego między liczbami, drukiem is(i spacjami). Potem przeczytajB , skopiuj i odejmij Aod niego na- .

W tym momencie uderzamy pierwszy „widelec w drodze”. Jeśli uzyskana różnica 0, adres IP przesuwa się prosto w kierunku dolnej gałęzi. Ta gałąź po prostu drukujeequal to a następnie B.

W przeciwnym razie adres IP skręca w lewo w kierunku dwóch no-ops "". Potem jest kolejny widelec. Jeśli różnica była ujemna, IP skręca w lewo w kierunku długiej górnej gałęzi. Ta gałąź po prostu drukuje, greater thana następnieB .

Jeśli różnica była dodatnia, adres IP ma prawo do dolnej gałęzi, która drukuje less. Teraz chcemy ponownie wykorzystać thandrugą gałąź. Ale jednocześnie nie chcemy później łączyć dwóch gałęzi, ponieważ potrzebowalibyśmy całą masę niepotrzebnych miejsc. Zamiast tego używamy kilku zakazów, aby wyrównać dolną gałąź z miejscem, w którym thanzaczyna się na górnej gałęzi, a następnie ponownie zacząć manipulować źródłem za pomocą ^:

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

Znów jest to izolacja adresu IP, więc ^jest wykonywana ponownie i otrzymujemy

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

Teraz IP może kontynuować ruch w prawo i drukowania thani Bwymagane.

Martin Ender
źródło
8

JavaScript (ES6), 66 bajtów

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

Definiuje anonimową funkcję. Przetestuj, dodając f=przed nim i nazwij to takalert(f(4, 5))


Niestety nie ma oszczędności z powtarzalnego „niż”.

jrich
źródło
Jesteś pewny? Wydaje się, że odpowiedź na Javę omija;)
Beta Decay
3
@BetaDecay cóż, nie. Nawet odpowiedź Java byłaby tej samej długości, powtarzając 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 Czy to poprawna odpowiedź, jeśli tak naprawdę nie wyświetla tekstu? Alternatywnie 7 alert()należy dodać do wyniku.
curiousdannii
@curiousdannii Och, widzę, tak, to jest nieprawidłowe, jeśli nie liczysz się alert()jako część kodu i liczby bajtów
Beta Decay
@BetaDecay och, nie zdawałem sobie sprawy, że odpowiedź powinna zostać wydrukowana, a nie tylko zwrócona. Jeśli założenie, że środowisko REPL jest w porządku, można je uruchomić w konsoli FireFox bez żadnych kosztów, w przeciwnym razie myślę, że jest to 73.
jrich
8

Java, 114 113 bajtów lub 74 72 67, jeśli zastosowaliśmy notację lambda

Podziękowania dla Kevina Cruijssena za rozwiązanie oparte na curry:

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

Stare rozwiązanie przed lambda

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

jako znaczenie użytkownika hjk w komentarzu, jeśli użyjemy lambda, możemy znacznie zmniejszyć do 74 bajtów.

(a,b)->a+" is "+(a==b?"equal to ":(a>b?"greater":"less")+" than ")+b;
użytkownik902383
źródło
1
Sprytny sposób kompresji than:)
TheNumberOne
4
Możesz usunąć, publicjeśli chcesz. Proponuję zrobić z tego lambda. Możesz usunąć jedno miejsce przed {.
TheNumberOne
1
I kiedy już to robisz, dodaj przecinek po #Java, abyś mógł znaleźć się w tabeli liderów. ;)
TNT
2
Oficjalna specyfikacja pytania brzmi: „mniej”, a nie „mniej”. Równie dobrze możesz to zrobić i stracić trzy bajty! Nie znam Java, ale czy kod lambda wydrukuje tekst, czy po prostu zwróci? Jeśli nie zostanie wydrukowany, prawdopodobnie nie jest to prawidłowa odpowiedź.
curiousdannii
2
@hjk Krótsza lambda przy użyciu curry: a->b->a+" is "+(a==b?"equal to ":(a>b?"greater":"smaller" )+" than ")+bTak, wiem, że minęły prawie dwa lata. ;) I rzeczywiście możesz użyć lesszamiast na smallerpodstawie opisu wyzwania, jak wspomniano w dwóch komentarzach powyżej. Wypróbuj tutaj, aby zobaczyć, jak odbywa się curry.
Kevin Cruijssen
7

R, 80 bajtów

function(A,B)cat(A,"is",c("less than","equal to","greater than")[2+sign(A-B)],B)
flodel
źródło
1
Możesz zapisać 3 bajty, zmieniając „mniejsze niż” na „mniejsze niż”, aby postępować zgodnie z powyższą specyfikacją. +1 za nieużywanie operatora trójskładnikowego.
zaznacza
Ach, dzięki, nie złapałem tego! naprawiony!
flodel
@bmarks R nie ma operatora trójskładnikowego. : P
Alex A.
@AlexA. Wiem. Miałem na myśli to, że użycie listy i funkcji znaku bardzo różniło się od innych dotychczasowych odpowiedzi (z których większość używała operatorów trójskładnikowych lub podobnych).
zaznacza
Dobrze. Dla porównania, moja pierwsza próba z użyciem if / else było 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 bajtów

jdm@cd)._-FQcj"
is
equal greater less
to than
"Qb
orlp
źródło
7

Julia, 69 66 bajtów

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

Ten ciąg używa interpolacji do osadzenia A, Bi trójskładnikowego wewnątrz pojedynczego łańcucha.

Oszczędność 3 bajtów dzięki Glenowi O.

Alex A.
źródło
6

Perl, 64 63 bajtów

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

62 bajty + 1 bajt na -p. Pobiera dane wejściowe ze STDIN, z dwoma liczbami oddzielonymi pojedynczym odstępem:

$ 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

Jak to działa:

The <=> powroty operator -1, 0 lub 1 zależnie od tego, czy pierwszy argument jest mniejszy, równy lub większy niż drugi. Dogodnie Perl zezwala na ujemne indeksy dolne z tablicami i plasterkami, gdzie ostatni element znajduje się w pozycji -1, drugi do ostatniego elementu w pozycji -2 i tak dalej.

W kodzie

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

używamy wartości zwracanej <=>jako indeksu dolnego w wycinku listy, aby uzyskać odpowiedni ciąg, gdzie $`jest pierwszą liczbą, a $'drugą.

Aby uniknąć powtarzania than, xjest używany jako symbol zastępczy i zastępowany w drugiej zamianie na końcu.


Alternatywne rozwiązanie, 63 bajty

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

62 bajty + 1 bajt na -p. Pobiera oddzielone spacjami dane wejściowe ze STDIN, podobnie jak pierwsze rozwiązanie.

Jak to działa:

To rozwiązanie wykorzystuje również wycinek, ale wykorzystuje fakt, że w przeciwieństwie do wycinków listy, wycinki tablicowe można interpolować na ciągi znaków (i RHS podstawień). To pozwala nam upuścić /emodyfikator i cudzysłowy w operatorze podstawienia.

Prawdziwa sztuczka polega na indeksie plastra:

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

Dla różnych wartości <=>daje to:

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

Kiedy tablica lub wycinek tablicy jest interpolowany w ciąg, elementy są automatycznie łączone przez $"(domyślnie pojedynczą spację).

ThisSuitIsBlackNot
źródło
5

Mysz , 79 bajtów

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

Kiedy napotkane są łańcuchy, są one natychmiast zapisywane w STDOUT, zamiast umieszczane na stosie. Stos może zawierać tylko liczby całkowite.

Nie golfowany:

? 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
Alex A.
źródło
4

GolfScript, 61 bajtów

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

Oczekuje 2 liczb całkowitych na stosie. Wypróbuj online .

Jak to działa:

  • \.@.@- A i B są już na stosie, a ten kawałek kodu sprawia, że wygląd stosu tak: ABBA. \zamienia dwa górne elementy na stosie, .duplikuje górny element i @obraca 3 górne elementy ( 1 2 3-> 2 3 1).

  • Następnie trzy przedmioty są wypychane na stos: = znak "equal to "i blok pomiędzy {}. ifSprawozdanie robi to: jeśli pierwszy argument wartość true, wykonuje pierwszy blok kodu (drugi argument), w przeciwnym razie, drugi blok kodu (trzeci argument). Więc jeśli A i B są równe, przesunie „stos równy” na stosie. Jeśli nie są równe, wykona kod między blokami. Zauważ, że =wyskakują dwa górne elementy ze stosu, więc teraz wygląda stos AB.

  • Wewnątrz bloku po raz pierwszy widzisz .@.@. Przed tymi poleceniami stos wygląda AB, a potem stos BAAB. Polecenia są podobne do tych wymienionych powyżej.

  • Potem jest kolejne ifoświadczenie. Tym razem sprawdza, czy A> B, a jeśli to prawda, wypycha „większy” na stosie. W przeciwnym razie przesuwa „mniej” na stosie. Po pchnięciu jednego z tych dwóch, pcha on „niż” na stosie i łączy go z poprzednim popchniętym łańcuchem. >wyskakuje również dwa górne elementy stosu, więc teraz wygląda stos BA"string".

  • Kolejne trzy polecenia: " is "\+. " is "przesuwa ten ciąg na stosie (wygląda na stos BA"string"" is "), \zamienia dwa górne elementy (stos wygląda BA" is ""string") i +konkatenuje dwa górne elementy (stos wygląda BA" is string").

  • Ostatnie polecenie, @obraca elementy stosu trzy, więc stos wygląda teraz tak: A" is string"B. GolfScript automatycznie drukuje wartości stosu na STDOUT po zakończeniu programu, więc otrzymujesz pożądany wynik.

ProgramFOX
źródło
4

MATLAB, 105 bajtów

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

Dodano podział linii przed sprintfem, aby ułatwić czytelność. Działa zarówno z podziałem wiersza, jak i bez niego, więc nie jest uwzględniany w liczbie bajtów. Musisz nacisnąć Enter między dwiema liczbami wejściowymi.

Stewie Griffin
źródło
2
Bardzo sprytne użycie sprintf!
Luis Mendo,
4

Bash, 76

a=(less\ than equal\ to greater\ than)
echo $1 is ${a[($1>$2)-($1<$2)+1]} $2
Cyfrowa trauma
źródło
4

Fortran, 129

Arytmetyka Fortrana, jeśli jest idealna do tego wyzwania

Test: 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
edc65
źródło
3

Bash, 94 86 bajtów (zapisane osiem bajtów dzięki Digital Trauma)

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

Test (w systemie 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

Użycie parametru [ ]after p=greaterma zapobiec ||ocenie operatora przed =wyrażeniem...&&p=greater||(($1<$2))... (pierwszeństwo operatora!).

Alternatywą byłoby użycie nawiasów wokół (($1>$2))&&p=greateri (($1<$2))&&p=less, ale uchwyty sprawiają wewnętrzny zakres zmiennych, tak pby pozostawić niezmienione.

pawel.boczarski
źródło
1
p=equal;q=than;(($1>$2))&&p=greater&&[ ]||(($1<$2))&&p=less||q=to;echo $1 is $p $q $2
Cyfrowa trauma
3

Kod maszynowy IA-32 + Linux, 107 bajtów

Hexdump kodu:

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

Ze względu na ograniczenia sprzętowe kod działa z liczbami z zakresu 0 ... 255.

Kod źródłowy (można skompletować za pomocą 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

To poważne nadużycie stosu! Kod buduje komunikat wyjściowy na stosie, od końca do początku. Aby zapisać 4 bajty, używa jednej pushinstrukcji. Aby zapisać 1 bajt, używa dwóch instrukcji:

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

Na szczęście większość fragmentów do napisania ma 4 bajty. Jeden z nich („gre” w „większym”) ma 3 bajty; jest obsługiwany przez naciśnięcie 4 bajtów i usunięcie jednego później:

inc %esp

Procedura, która zapisuje liczby w postaci dziesiętnej, używa aaminstrukcji do wielokrotnego dzielenia axprzez 10. Korzystne jest, że oblicza cyfry od prawej do lewej!


Ponieważ do zapisania są dwie liczby, kod używa podprogramu, który jest wywoływany dwukrotnie. Ponieważ jednak podprogram zapisuje wyniki na stosie, używa rejestru do przechowywania adresu zwrotnego.


Kod C wywołujący powyższy kod maszynowy:

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

Wydajność:

90 is less than 102
78 is greater than 0
222 is equal to 222
anatolig
źródło
3

ShortScript , 98 bajtów

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

Ta odpowiedź nie jest konkurencyjna, ponieważ po tym wyzwaniu opublikowano ShortScript.

YourDeathIsComing
źródło
3

Fourier , 147 74 bajtów

Niekonkurencyjny, ponieważ drukowanie ciągów jest nowsze niż to wyzwanie

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

Wypróbuj na FourIDE!

Nie wiem, dlaczego wcześniej nie pozwalałem na drukowanie ... To sprawia, że ​​kod jest czytelny i jest świetny do gry w golfa

Rozpad beta
źródło
Powinieneś być w stanie oszczędzać, przypisując wspólne litery, takie jak 101i 116do zmiennych, prawda? Nie jestem pewien, jak / jeśli obsługiwany jest zakres zmienny.
Geobits,
@Geobits Nie ma lokalnych zasięgów w Fourier, więc tak, popracuję nad tym
Beta Decay
@Geobits Grał w golfa nieco bardziej przy użyciu zmiennych
Beta Decay
2

C, 155 136 127 83 bajtów

f(a,b){printf("%d is %s %d\n",a,a>b?"greater than":a<b?"less than":"equal to",b);}
Mauren
źródło
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
Lynn
źródło
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
Nikolai97
źródło
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
mbomb007
źródło
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

Kritixi Lithos
źródło
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!

ProgramFOX
źródło
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

rs, 105 bytes

(\d+) (\d+)/\1 is (_)^^(\1) (_)^^(\2) \2
 (_+) \1_+/ less than
 (_+) \1 / equal to 
_+ _+/greater than

The trailing and preceding whitespace is very important!

Live demo and all test cases.

kirbyfan64sos
źródło
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.

kirbyfan64sos
źródło
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

O, 67 bytes

jJ" is ""greater than""less than""equal to"JjK-.e\1<+{@}d;;' K++++p

Live demo.

kirbyfan64sos
źródło
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]).
Fatalize
źródło
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")}
OutOfBounds
źródło
1

Processing, 92 bytes

void c(int a,int b){print(a+" is "+(a>b?"greater than ":a<b?"lesser than ":"equal to ")+b);}
Kritixi Lithos
źródło