İki sayının karşılaştırılması


25

Meydan okuma

İki tamsayı Verilen Ave Bgirdi olarak, eğer çıktılar bir program yazmak gerekir A>B, A==Bya da A<B.

Tam sayılar, diliniz tarafından desteklenen ve en az 256 değer içeren makul bir aralıkta olacaktır.

Programınız tam bir program veya fonksiyon olabilir, STDIN veya fonksiyon argümanları üzerinden giriş yapar.

çıktılar

Eğer A>Bçıktı

A is greater than B

Eğer A==Bçıktı

A is equal to B

Eğer A<Bçıktı

A is less than B

Değiştirdiğiniz Ave Btamsayı değerleri için.

Kazanan

Bayt cinsinden en kısa program kazanır.

Liderler Sıralaması

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>


Bugün Programlama Bulmacaları ve Kod Golfü: üçlü ifadeler!
Trebuchette

İşlevler çözümü yazdırmak yerine çözümü basitçe iade edebilir mi?
TheNumberOne

@TheNumberOne Hayır, çözümü yazdırmalılar
Beta Decay

Yanıtlar:


11

CJam, 47

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

Çevrimiçi deneyin

Açıklama:

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 bugün Pyth'den bir bayt daha kısa gibi görünüyor :(
orlp

Birkaç girdi parçasını okumak için Varsayılanlara göre , girişi olduğu gibi okuyabilir [A B]ve ]kodunuzdan çıkarabilirsiniz.
Dennis,

@Dennis teşekkürler, bunu düşündüm ama emin değildi.
aditsu,

@orlp 2 şimdi bayt ve bu değil :) kaşlarını için, gülümsemeye bir sebep
aditsu

Kodunuzun aslında ~_~... şeklinde bir surat içermesi uygun ...
Darrel Hoffman

19

Python 2, 95 94 76 bayt

Giriş virgülle ayrılmış olmalıdır.

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

Merak ediyorum, ne cmp(A,B)olduğunu ve neler yapabileceğini açıklayabilir misin ? :)
Beta Çürüğü

2
@ BetaDecay, docs.python.org/2/library/functions.html#cmp . "İki nesneyi x ve y ile karşılaştırın ve sonuca göre bir tamsayı döndürün. Dönüş değeri x <y ise negatif, x == y ise sıfır ve x> y ise kesinlikle pozitif." CPython 2.7.6'da bu tamsayıların değerleri sırasıyla -1, 0 ve 1'dir. İşlevin tanımı bunu dikte etmiyor, bu yüzden bir soygun burada yalnızca "Python 2" yerine python uygulamasının ve sürümünün tam olarak verildiği konusunda ısrar edebilir, ancak çoğu uygulamanın burada aynı şekilde davranmasını bekliyorum.
ymbirtt

Bilmeni isterim ki, cevabını benimkine cevap vermek için kopyalamadığımı . Şimdi onların ne kadar yakın olduklarını gördüm. Benim yazdığımda snippet'i çalıştırmakta zorlanıyordum ve yemin edebilirdim zaten bir Python cevabı yoktu (2. sayfayı kaçırmış olmalı). Tamamen bağımsız olarak, yeterince garip bir şekilde yazdım.
mbomb007 15

@ Sp3000 Kontrol ettim ve Python 2.7.6
ML

1
@ML Yorumum eski bir revizyona atıfta bulundu ancak şu anda modası geçmiş olduğu için yorumu sildim
Sp3000,

10

Labirent , 180 152 149 bayt

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

Düzenleme: yeniden kullanarak 3 bayt kapalı tıraş başardı 10arasında 101, 103ve 108(karakter kodları e, gve l). Aşağıdaki açıklama bunu yansıtmamaktadır, ancak önemli bir değişiklik değildir.

açıklama

Dizeleri yazdırmak için baytları kaydetme yolunda yapabileceğimiz fazla bir şey yok, bu sadece uzun doğrusal bölümler olacak. Bu yüzden golf oynamaktaki asıl zorluk, büyük miktarda gereksiz boşluk bırakmamaktır. Bu, doğrusal parçaların en soldaki sütundan "yayılmasını" istediğimiz anlamına gelir. Ayrıca yazdırılan kodu yeniden kullanarak da daha fazla tasarruf sağlayabiliriz than B. Öyleyse burada kontrol akışına bakalım:

Program bir ızgara döndürme komutu ile başlar <. Bu, şu anki satırı döngüsel olarak sola kaydırır ve üzerinde IP ile çalışırız;

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

Şimdi IP izole edilmiş bir hücrede, bu yüzden aynı komutu tekrar tekrar yürütürken <...

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

Bu noktada IP'nin gidecek bir yeri vardır ve birinci doğrusal bölümü (ikinci satır) sağdan sola doğru yürütür. Yaptığı şey okumak A, kopyalamak, basmaktır. Sayılar, baskı is(ve boşluklar) arasındaki sınırlayıcı karakteri kullanın . Sonra okumak B, kopyalamak ve çıkarma Ade ondan -.

Bu noktada ilk "yoldaki çatal" ı çarptık. Fark ortaya çıkarsa, 0IP doğrudan dalın dibine doğru ilerlemeye devam eder. Bu dal sadece basar equal tove sonra B.

Aksi takdirde, IP iki işlem dışı bırakma yönünde sola döner "". Sonra başka bir çatal var. Fark negatifse, IP uzun üst dalı doğru sola alır. Bu dal sadece basar greater thanve sonra B.

Fark pozitifse, IP, baskı yapan alt dalı alır less. Şimdi thandiğer şubeden tekrar kullanmak istiyoruz . Fakat aynı zamanda iki şubeyi daha sonra bağlamak istemiyoruz, çünkü bir sürü gereksiz yere ihtiyacımız var. Bunun yerine, alt dalı thanüst dalda başladığı yer ile aynı hizaya getirmek için birkaç no-op kullanıyoruz ve ardından kaynağı tekrar kullanmaya başlıyoruz ^:

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

Yine, bu IP'yi izole eder, ^tekrar yürütülür ve elde ederiz.

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

Artık IP sağa doğru hareket etmeye devam edebilir thanve Bgerektiği gibi yazdırabilir .


8

JavaScript (ES6), 66 bayt

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

Anonim bir işlev tanımlar. Daha f=önce ekleyerek sınayın ve buna benzer şekilde çağrı yapın.alert(f(4, 5))


Ne yazık ki, tekrarlayandan "den" den elde edilecek tasarruf yok.


Emin misiniz? Java cevabı şunun etrafında anlaşılıyor;)
Beta Decay

3
@ Beta iyi, hayır. Java cevabı bile yinelenen aynı uzunluktadır 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 Bu, aslında metni çıkarmadıysa geçerli bir cevap mıdır? Alternatif olarak 7 alert()puan için eklenmelidir.
curiousdannii

@curiousdannii Oh Anlıyorum, evet alert(), kodunuzun ve bayt sayınızın bir parçası olarak sayılmazsanız evet bu geçersiz
Beta Decay

@ BetaDecay oh, cevabın sadece iade edilmek yerine basılması beklendiğini bilmiyordum. Bir REPL ortamının uygun olduğunu varsayarsak, bu FireFox konsolunda ücretsiz olarak çalıştırılabilir, aksi takdirde 73'e kadar olur.
jrich

8

Java, 114 113 Bayt veya 74 72 67, lambda notasyonu kullanıyorsak

Karıştırma tabanlı çözüm için Kevin Cruijssen'e teşekkürler:

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

Eski ön lambda çözeltisi

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

Kullanıcı yorumunda olduğu gibi, lambda kullandıysak önemli ölçüde 74 bayta kadar yapabiliriz.

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

1
Sıkıştırmanın zekice yolu than:)
TheNumberOne

4
İsterseniz kaldırabilirsiniz public. Bunu bir lambda yapmayı öneriyorum. Önce bir boşluk kaldırabilirsiniz {.
TheNumberOne

1
Ve onun yanındayken, #Java'dan sonra virgül ekleyin, böylece skor tablosunda kalabilirsiniz. ;)
TNT

2
Resmi soru spec "küçük" değil, "az" demek. Bunu yapabilir ve üç bayt kaybedebilirsiniz! Java'yı bilmiyorum, ancak lambda kodu metni yazdırır mı yoksa geri verir mi? Yazdırmazsa, muhtemelen geçerli bir cevap değildir.
curiousdannii

2
@hjk Kribi kullanarak kısa lambda: a->b->a+" is "+(a==b?"equal to ":(a>b?"greater":"smaller" )+" than ")+bEvet, neredeyse iki yıl geçtiğini biliyorum. ;) Ve benim üstümdeki iki yorumda da belirtildiği gibi, meydan okuma tanımına dayanmak lessyerine gerçekten kullanabilirsiniz smaller. Körlenmenin nasıl yapıldığını görmek için burada deneyin.
Kevin Cruijssen

7

R, 80 bayt

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

1
Yukarıdaki spesifikasyonu takip etmek için "daha küçük" den "daha az" olarak değiştirerek 3 bayt tasarruf edebilirsiniz. Üçlü bir operatör kullanmadığınız için +1.
Ağustos'ta

ah teşekkürler, bunu anlamadım! sabit!
flodel

@bmarks R üçlü bir operatöre sahip değil. : P
Alex A.

@AlexA. Biliyorum. Bir liste ve işaret işlevini kullanmak, şimdiye kadarki cevaplardan çok farklıydı (çoğu üçlü operatör veya benzeri).
b

Sağ. Karşılaştırma için, ilk / if / else kullanarak 83: oldu 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 bayt

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

7

Julia, 69 66 bayt

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

Bu gömmek dize interpolasyon kullanır A, Btek bir dize içine ve üçlü.

Glen O sayesinde 3 byte kurtarıldı


6

Perl, 64 63 bayt

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

İçin 62 bayt + 1 bayt -p. İki sayı tek bir boşlukla ayrılmış olarak STDIN'den girdi alır:

$ 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

Nasıl çalışır:

<=>İlk işlenen az olmasına bağlı olarak operatör döner -1, 0 veya 1 'e eşit ya da daha büyük ikinci, daha. Uygun bir şekilde Perl, son elemanın -1 konumunda olduğu ikinci ve son elemanın -2 konumunda olduğu diziler ve dilimlerle negatif abonelere izin verir.

Kodunda

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

İlgili <=>dizgeyi elde etmek için liste diliminde alt simge olarak döndürülen değeri kullanırız , burada $`ilk sayı ve $'ikinci sayıdır .

Tekrar etmemek için than, xyer tutucu olarak kullanılır ve sonunda ikinci bir sübstitüsyon ile değiştirilir.


Alternatif çözüm, 63 bayt

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

İçin 62 bayt + 1 bayt -p. İlk çözüm gibi STDIN'den boşlukla ayrılmış girdiler alır.

Nasıl çalışır:

Bu çözüm aynı zamanda bir dilim kullanır, ancak liste dilimlerinden farklı olarak, dizi dilimlerinin dizgilere (ve yer değiştirmelerin RHS) enterpolasyonlu olması gerçeğinden yararlanır. Bu, /edeğiştiriciyi ve değiştirme operatöründeki teklifleri düşürmemize izin verir .

Asıl püf noktası dilim alt öğesinde:

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

Farklı değerleri için <=>, bu verir:

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

Bir dizi veya dizi dilimi bir dizgenin arasına girdiğinde, öğeler otomatik olarak birleştirilir $"(varsayılan olarak tek boşluk).


5

Fare , 79 bayt

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

Dizelerle karşılaşıldığında hemen yığına koymak yerine STDOUT'a yazılırlar. Yığın yalnızca tam sayı içerebilir.

Ungolfed:

? 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 bayt

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

Yığında 2 tam sayı bekliyor. Çevrimiçi deneyin .

Nasıl çalışır:

  • \.@.@- A ve B yığın zaten vardır ve bu kod parçası böyle yığın göz yapar: ABBA. \yığındaki iki üst .öğeyi değiştirir, üst öğeyi çoğaltır ve üst üç öğeyi @( 1 2 3-> 2 3 1) döndürür .

  • Ardından, üç öğe yığına itilir: =işareti "equal to "ve arasındaki blok {}. Bunu ifyapar: İlk argüman true olarak değerlendirilirse, birinci kod bloğunu (ikinci argüman), aksi halde ikinci kod bloğunu (üçüncü argüman) yürütür. Yani eğer A ve B eşitse, istif üzerinde "eşit" e basacaktır. Eşit değilse, blok arasındaki kodu yürütecektir. En =üstteki iki öğeyi yığından çıkardığına dikkat edin, bu nedenle şimdi yığın benziyor AB.

  • Bloğun içinde önce sen görüyorsun .@.@. Bu komutlardan önce, yığın gibi görünür ABve daha sonra yığın gibi görünür BAAB. Komutlar yukarıda belirtilenlere benzer.

  • O zaman başka bir ififade var. Bu kez, A> B olup olmadığını kontrol eder ve doğruysa, yığında "daha büyük" bastırır. Aksi takdirde, yığında "daha az" iter. Bu ikisinden birini ittikten sonra, istif üzerinde "den" i itecek ve onu bir önceki itti dizisi ile birleştirecektir. >ayrıca yığının en üst iki öğesini çıkarır, bu yüzden şimdi yığın benziyor BA"string".

  • Sonraki üç komutlar şunlardır: " is "\+. " is "yığındaki o dizeyi iter (yığın benziyor BA"string"" is "), \iki üst öğeyi değiştirir (yığın benziyor BA" is ""string") ve +iki üst öğeyi birleştirir (yığın benziyor BA" is string").

  • Geçen komutu, @yığın şimdi benziyor yüzden, üç yığın öğeleri döndürür: A" is string"B. GolfScript, program sona erdiğinde otomatik olarak STDOUT'da yığın değerlerini yazdırır, böylece istediğiniz çıkışı elde edersiniz.


4

MATLAB, 105 bayt

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

Okunabilirliği kolaylaştırmak için sprintf öncesi bir satır sonu eklendi. Bu satır sonu olan ve olmayan her ikisi de çalışır, bu nedenle bayt sayısına dahil edilmez İki giriş numarası arasında enter'a basılmalıdır.


2
Çok akıllıca kullanımı 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

Fortran aritmetik bu meydan okuma için mükemmel ise

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

3

Bash, 94 86 bayt (Dijital Travma sayesinde sekiz bayt kaydedildi)

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

Test (Linux'ta):

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

Kullanımı [ ]sonrasÖ p=greaterönlemektir ||önce değerlendirilir olmaktan operatörü =ifadesinde ...&&p=greater||(($1<$2))... (operatör öncelik!).

Alternatif köşeli parantez kullanarak olurdu (($1>$2))&&p=greaterve (($1<$2))&&p=lessancak parantez değişkenler için iç kapsamını yapmak, yani pdeğiştirilmemiş bırakılacaktır.


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

3

IA-32 makine kodu + linux, 107 bayt

Kodun Hexdump:

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

Donanım kısıtlamaları nedeniyle, kod 0 ... 255 aralığındaki sayılarla çalışır.

Kaynak kodu (gcc ile birleştirilebilir):

    .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

Bu, yığının ciddi bir şekilde kötüye kullanılması! Kod, yığından gelen çıktı mesajını baştan sona oluşturur. 4 bayt yazmak için, tek bir pushkomut kullanır . 1 bayt yazmak için iki komut kullanır:

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

Şansınız varsa, yazılacak parçaların çoğu 4 bayttır. Onlardan biri ("büyük" de "gre") 3 bayttır; 4 baytı iterek ve daha sonra bir tanesini kaldırarak işlenir:

inc %esp

Ondalık formda sayıları yazıyor rutin kullandığı aamböl talimat axyoluyla 10defalarca. Rakamları sağdan sola doğru hesaplaması avantajlıdır!


Yazılacak iki sayı bulunduğundan, kod iki kez adı verilen bir alt yordam kullanır. Bununla birlikte, alt rutin sonuçları yığına yazdığından, dönüş adresini tutmak için bir kayıt kullanır.


Yukarıdaki makine kodunu çağıran C kodu:

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

Çıktı:

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

3

ShortScript , 98 bayt

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

Bu cevap, rakipsiz çünkü ShortScript bu zorluğun ardından yayınlandı.


3

Fourier , 147 74 bayt

Dize baskı bu yarışmadan daha yeni olduğu için rekabet edemez

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

FourIDE'da dene!

Dunno neden daha önce yazdırmaya izin vermedim ... Kodu okunabilir kılar ve golf oynamak için mükemmeldir


Değişkenler gibi 101ve gibi ortak harfler atayarak tasarruf edebilmelisiniz 116, değil mi? Değişken kapsamın nasıl işlendiğini / bilemeyeceğinden emin değilim.
Geobits

@Geobits Fourier'de yerel bir kapsam yok, bu yüzden evet, bunun üzerinde çalışacağım
Beta Decay

@Geobits Değişkenleri kullanarak biraz daha golf oynadı
Beta Decay

2

C, 155 136 127 83 bayt

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

5
Bunu çok daha kısa yapabilirsiniz - argc ve argv'yi yeniden adlandırabilir, hem a hem de b'yi bir satırda tanımlayabilir, argc kontrolünü atlayabilir ve daha fazlasını yapabilirsiniz.
ugoren

1
Gerekliliğin tam bir program veya işlev olduğunu unutmayın. Bir işlev çok daha kısa olurdu.
ugoren

@ugoren Bunun bir fonksiyon olup olamayacağından emin değildim, bu yüzden tam bir program yazmaya karar verdim. Yeniden ateşleyeceğim. Tekrar teşekkürler!
Mauren

2

Haskell, 87 bayt

Otomo'nun yaklaşımından bir bayt daha kısa.

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

Güzel çözüm. :)
Otomo

2

Lua, 118 bayt

Burada yeterince Lua cevabı göremiyorum, bu yüzden ...

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

PPCG'ye Hoşgeldiniz!
Dennis,

2

Python 2,78 bayt

Ne kadar cmp()yararlı olduğunu çok seviyorum , ama Python 3'te kaldırıldı .

İsimsiz bir işlev kullanma:

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

İşlev kullanmamak (79 bayt):

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

Bu @NumberOne'ın cevabının bir kopyası değil mi?
Beta Decay

@ BetaDecay Hayır. Onlar farklı. Bu cevapla ilgili yorumumu oku.
mbomb007

2

JavaScript, 151 104 100 95 92 bayt

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

Edc65 yardımı ile kısaltmayı başardım


Ben bir JavaScript
acemiyim

Puanınızı bulmak için ne kullandığınızı sorabilir miyim?
Beta Çürümesi

Kırık değil (sözdizimi hatası). Göndermeden önce deneyin
edc65 31:15

Şimdi bir hata mı var?
Kritixi Lithos 31:15

1
a = ifadesi. Bu bir başlangıç. var aa değişkenini bildiriyor. Bunu bir çok iyi nedenden dolayı gerçek kodda kullanmak zorundasınız . Fakat javascriptte isteğe bağlıdır ve 4 var
parçadan

2

C # 6, 113 103 100 95 bayt

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

13 byte tasarruf için edc65 ve C # 6'nın enterpolasyonlu dizelerini kullanarak 5 byte tasarruf için cell001uk'e teşekkürler !


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

@ edc65 Güzel, teşekkürler!
ProgramFOX

C # formatına bayılıyorum:Write("{0} is {1:greater than;less than;equal to} {2}",a,a-b,b)
edc65

@ edc65 Woah, bu harika! Teşekkürler! A ve B değerlerinin yerini gerektiğini hatırlattığın için de teşekkürler, ben tamamen o> _> gözardı
ProgramFOX



1

Pyth, 57 55 53 bayt

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

Bu temelde yapar:

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

Kaydedilen 2 kullanmanın @ Alexa. Öneri sayesinde bayt Ayerine Jve Kve daha basit bir çıkarma ile tüm ekleme karmaşa değiştirerek başka 2 bayt.

Canlı demo ve test vakaları.

55 bayt sürümü

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

Canlı demo ve test vakaları.

57 bayt sürümü:

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

Canlı demo ve test vakaları.


Bir bayt kısa:AQs[Gd"is"d?<GH"less than"?>GH"greater than""equal to"dH
Alex A. 0

@AlexA. Sadece bir öneri kullanılan Ayerine Jve K2 bayt kaydedildi.
kirbyfan64sos


1

SWI-Prolog, 94 bayt

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 bayt

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

Swift 2.0 ( 103 90 byte) ile daha da kısa

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

1

İşlem, 92 bayt

void c(int a,int b){print(a+" is "+(a>b?"greater than ":a<b?"lesser than ":"equal to ")+b);}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.