等しい、合計、または差!


32

与えられた2つの整数値が等しいか、それらの和または絶対差が5である場合にtrueを返す最短のコードを記述します。

テストケースの例:

4 1 => True
10 10 => True
1 3 => False
6 2 => False
1 6 => True
-256 -251 => True
6 1 => True
-5 5 => False

私がpython2で思いつくことができる最短は56文字の長さです:

x=input();y=input();print all([x-y,x+y-5,abs(x-y)-5])<1

-9、@ ElPedroに感謝します。x、yの形式で入力を受け取ります。

x,y=input();print all([x-y,x+y-5,abs(x-y)-5])<1

9
PPCGへようこそ!これは良い最初の課題です。課題は明確に定義されており、十分なテストケースがあり、デフォルトのI / Oを使用します。しばらくこだわって興味深い課題を考え続ける場合は、このサイトに投稿する前に、The Sandboxを使用してフィードバックを取得することをお勧めします。ここで過ごす時間をお楽しみください!
ジュゼッペ

回答:





8

x86マシンコード、39バイト

00000000: 6a01 5e6a 055f 5251 31c0 39d1 0f44 c601  j.^j._RQ1.9..D..
00000010: d139 cf0f 44c6 595a 29d1 83f9 050f 44c6  .9..D.YZ).....D.
00000020: 83f9 fb0f 44c6 c3                        ....D..

アセンブリ

section .text
	global func
func:					;inputs int32_t ecx and edx
	push 0x1
	pop esi
	push 0x5
	pop edi
	push edx
	push ecx
	xor eax, eax

	;ecx==edx?
	cmp ecx, edx
	cmove eax, esi

	;ecx+edx==5?
	add ecx, edx
	cmp edi, ecx
	cmove eax, esi
	
	;ecx-edx==5?
	pop ecx
	pop edx
	sub ecx, edx
	cmp ecx, 5
	
	;ecx-edx==-5?
	cmove eax, esi
	cmp ecx, -5
	cmove eax, esi

	ret

オンラインでお試しください!


5

J12 11バイト

Adámのおかげで1バイト節約

1#.=+5=|@-,+

オンラインでお試しください!

説明

これは次と同等です:

1 #. = + 5 = |@- , +

これは、次のフォークチェーンに分割できます。

(= + (5 e. (|@- , +)))

または、次を使用して視覚化5!:4<'f'

  ┌─ =               
  ├─ +               
──┤   ┌─ 5           
  │   ├─ e.          
  └───┤          ┌─ |
      │    ┌─ @ ─┴─ -
      └────┼─ ,      
           └─ +      

注釈付き:

  ┌─ =                                     equality
  ├─ +                                     added to (boolean or)
──┤   ┌─ 5                                   noun 5
  │   ├─ e.                                  is an element of
  └───┤          ┌─ |  absolute value         |
      │    ┌─ @ ─┴─ -  (of) subtraction       |
      └────┼─ ,        paired with            |
           └─ +        addition               | any of these?

バイト保存e.
アダム

@Adámどうして?私が得た最短のアプローチe.はでした=+.5 e.|@-,+5e.Jに無効なトークンがあることを忘れているかもしれませんか?
コナーオブライエン

1
二つの整数を同時に5に合計し、等しくすることはできませんので、あなたが使用することができる+のではなく+.
アダム

@AdámAh、なるほど、ありがとう。
コナーオブライエン

5

R、40バイト(または34)

function(x,y)any((-1:1*5)%in%c(x+y,x-y))

オンラインでお試しください!

非Rユーザーの場合:

  • -1:1*5 に展開する [-5, 0, 5]
  • %in%操作者は、左から要素およびチェックをとる(要素ごとの)彼らは右側に、ベクターに存在する場合

@ArBoのソリューションの直接ポートは35 34バイトなので、必要に応じてその回答に賛成票を投じてください。

function(x,y)x%in%c(y--1:1*5,5-y)

1は、との1削減することができる34バイトfunction(x,y)x%in%c(y--1:1*5,5-y)
MickyT

減算:を移動することで30バイトにドロップできfunction(x,y)(x-y)%in%(-1:1*5)scan()入力する関数表記をドロップすることでさらに24バイトにドロップできます:diff(scan())%in%(-1:1*5) オンラインで試してみてください!。それでも同じ方法です。
CriminallyVulgar

1
@CriminallyVulgarはその合計が5であることを説明していますか?
ArBo

@ArBo Hah、仕様でそれを見逃しており、TIOにテストケースがなかったので、私はそれを単に説明しました!
CriminallyVulgar

両方に対して行うことができる小さな変更は、を使用するpryr::fことです。引数を適切に検出できるかどうかは完全にいくらかヒットまたはミスですが、これらの2つの関数を無効にしているようです。例:pryr::f(x%in%c(y--1:1*5,5-y)) オンラインで試してみてください!。それぞれ36バイトと29バイトになります。
CriminallyVulgar


5

8086マシンコード、 22 20バイト

8bd0 2bc3 740e 7902 f7d8 3d0500 7405 03d3 83fa05

ゴルフをしていない:

ESD  MACRO
    LOCAL SUB_POS, DONE
    MOV  DX, AX     ; Save AX to DX
    SUB  AX, BX     ; AX = AX - BX
    JZ   DONE       ; if 0, then they are equal, ZF=1
    JNS  SUB_POS    ; if positive, go to SUB_POS
    NEG  AX         ; otherwise negate the result
SUB_POS:
    CMP  AX, 5      ; if result is 5, ZF=1
    JZ   DONE
    ADD  DX, BX     ; DX = DX + BX
    CMP  DX, 5      ; if 5, ZF=1
DONE:
    ENDM

AXおよびBXに数値を入力し、結果がtrueの場合はゼロフラグ(ZF = 1)を返します。必要に応じて、次の条件でどの条件が真であったかを判断することもできます。

  • ZF = 1およびDX = 5; 合計は5
  • ZF = 1およびAX = 5; diffは5
  • ZF = 1およびAX = 0; 等しい
  • ZF = 0; 結果偽

数値の差が0であれば、それらが等しいことがわかります。それ以外の場合、結果が負の場合、最初に否定してから5をチェックします。それでも真でない場合は、5を追加してチェックします。

サンプルのPC DOSテストプログラム。こちら(ESD.COM)からダウンロードしてください。

START:
    CALL INDEC      ; input first number into AX
    MOV  BX, AX     ; move to BX
    CALL INDEC      ; input second number into BX
    ESD             ; run "Equal, sum or difference" routine
    JZ   TRUE       ; if ZF=1, result is true
FALSE:
    MOV  DX, OFFSET FALSY   ; load Falsy string
    JMP  DONE
TRUE:
    MOV  DX, OFFSET TRUTHY  ; load Truthy string
DONE:
    MOV  AH, 9      ; DOS display string
    INT  21H        ; execute
    MOV  AX, 4C00H  ; DOS terminate
    INT  21H        ; execute

TRUTHY   DB 'Truthy$'
FALSY    DB 'Falsy$'

INCLUDE INDEC.ASM   ; generic decimal input prompt routine

テストプログラムの出力:

A>ESD.COM
: 4
: 1
Truthy

A>ESD.COM
: 10
: 10
Truthy

A>ESD.COM
: 1
: 3
Falsy

A>ESD.COM
: 6
: 2
Falsy

A>ESD.COM
: 1
: 6
Truthy

A>ESD.COM
: -256
: -251
Truthy

A>ESD.COM
: 6
: 1
Truthy

A>ESD.COM
: 9999999999
: 9999999994
Truthy


4

Python 2、38バイト

@DjMcMayhemのおかげで-2バイト

lambda a,b:a+b==5or abs(a-b)==5or a==b

オンラインでお試しください!


あなたのTIOは実際には42バイトですが、間にスペースを削除することによってそれを修正することができ5、SとorS
ElPedro

3
実際、TIOリンクは38バイトに
DJMcMayhem

@ElPedro関数自体は40バイトでしたが、それを呼び出すためにf =を使用しました
fəˈnɛtɪk

1
@DJMcMayhem私は通常pythonでゴルフをしません。質問者が例としてpythonを使用したため、私はちょうどそれをやった
f –nɛtɪk



4

PowerShell48 44 40バイト

param($a,$b)$b-in($a-5),(5-$a),(5+$a),$a

オンラインでお試しください!またはすべてのテストケースを検証する

入力$aとを受け取ります$b。かどうかをチェックし$bている-in基($a-55-$a 5+$aまたは$a)、のチェックすべての可能な組み合わせ$a$bおよび5

-4バイトはmazzyのおかげです。
KGlasierのおかげで-4バイト。


($a-$b)です-$x:)
mazzy

@mazzy Ooo、良い電話。
AdmBorkBork

切り替える5$b、数バイトをカットできます(つまりparam($a,$b)$b-in($a-5),(5-$a),($a+5),$aここで試してみてください
KGlasier

1
@KGlasierすばらしい提案。コマンドライン入力を取得するときに適切にキャストするためにスワップ$a+5する必要5+$aがありましたが、それ以外は素晴らしいです。ありがとう!
AdmBorkBork

4

パスカル(FPC)26 70バイト

編集: +入力変数。

Procedure z(a,b:integer);begin Writeln((abs(a-b)in[0,5])or(a+b=5))end;

オンラインでお試しください!


(abs(a-b)in[0,5])or(a+b=5)

オンラインでお試しください!

私の答えがコードゴルフのすべてのルールに従っていることを願っています。とにかく楽しかったです。


2
こんにちは、PPCGへようこそ!通常、既に変数に入力されていると仮定するのではなく、入力を取得する必要があります。パスカルは知りませんが、それがこのコードが行っていることだと思います。
NoOneIsHere

こんにちは、NoOneIsHere、発言ありがとうございます。それも懸念される可能性があります-変​​数の初期化を含めます。パラメーターのある関数定義がソリューションの全体の長さから除外されているJavaなどのいくつかの他のソリューションを見て、ReadLnを含めないことにしました。
Dessy Stoeva

わかった。PPCGへようこそ!
NoOneIsHere

Java送信は、2つのパラメーターを取る匿名ラムダです。これは事前定義された変数を使用しているように見えますが、これは有効な入力方法ではありません。
ジョーキング

1
問題ありません。提出を変更します。
Dessy Stoeva

3

C#(.NETコア)434847、33のバイト

編集:%を使用しようとしましたが、どうやって%にするのを忘れたようです。それを指摘してくれたArnauldに感謝します!

EDIT2:-1バイトのゴルフを備えたAdmBorkBorkは、括弧を並べ替えてリターンの隣に配置するため、追加のスペースは必要ありません!

EDIT3:1行のリターンショートカットおよび関数のカリー化(TIOにリンクするための無知のTyの実施形態)の-14バイトゴルフのdanaに感謝します。

C#(.NET Core)、33バイト

a=>b=>a==b|a+b==5|(a-b)*(a-b)==25

オンラインでお試しください!


ああ。System.Mathを回避しようとしています。それに戻って!それを指摘してくれてありがとう:D
Destroigo

1
ダナのヒントを適用して33バイトまで下げることができます
無知の具現化




2

C(gcc)41 34バイト

f(a,b){a=5==abs(a-b)|a+b==5|a==b;}

オンラインでお試しください!


1
なぜf戻るのaですか?未定義の動作だけですか?
ティロ

@Tyiloはい、実装固有です。そのため、最初のパラメータが戻り値と同じレジスタに保存されます。
cleblanc


@Logernはf(6,1)では機能しません
cleblanc

@ceilingcatはf(6,1)では機能しません
cleblanc

2

05AB1E13 12バイト

ÐO5Qs`α5QrËO

オンラインでお試しください!

入力を整数のリストとして受け取り、1バイトを節約します。ありがとう@Wisław!

代替の12バイトの回答

Q¹²α5Q¹²+5QO

オンラインでお試しください!

これは、別々の行に入力を取ります。


1
明確に指定されていないため、入力が整数のリストであると仮定して、初期値を削除することはできません|か?
ヴィスワフ

@Wisław良い点、答えを更新しました。ありがとう!
Cowabunghole

11バイトの代替案を見つけましたOI`αª5¢IË~Ā。入力は整数のリストです。
ヴィスワフ

1
OIÆÄ)5QIËM10です
マジックタコ壺

1
@MagicOctopusUrnルールが何であるか正確にはわかりませんが、あなたの解決策は私の答えとは異なると思います。また、無関係ですが、このサイトで長い間あなたのユーザー名を見てきましたが、それを入力した後、「Um」ではなく「Urn」であることに気付きました:)
Cowabunghole

2

05AB1E、10バイト

OIÆ‚Ä50SåZ

オンラインでお試しください!


O           # Sum the input.
 IÆ         # Reduced subtraction of the input.
   ‚        # Wrap [sum,reduced_subtraction]
    Ä       # abs[sum,red_sub]
     50S    # [5,0]
        å   # [5,0] in abs[sum,red_sub]?
         Z  # Max of result, 0 is false, 1 is true.

スタックのみの操作を使用してそれを実行しようとしましたが、より長くなりました。


1
残念ながら、合計が0[5, -5]
Emigna

1
コメント(OIÆÄ‚5QIËM)として残した他の10バイトソリューションは、に適しています[5,-5]
ケビンクルーイッセン

私が思いついた別の10バイトのソリューションはOsÆÄ‚5åsË~です。あなたのものとほとんど同じようです。オンラインでお試しください!
ヴィスワフ

2

ルビー、34バイト

->(a,b){[a+5,a-5,5-a,a].include?b}

オンライン評価 -ありがとう@ ASCII-Only


...それらが等しいけれどもをしている場合、あなたがチェックを行う
ASCIIのみの

そのチェックを追加するのを忘れました。間違いを指摘してくれた@ASCIIのみに感謝します。
ジャティンダンカー

1
あなたがにリンクすることができれば私はいいと思います。この
ASCIIのみの

これ 有効ですか?完全に確認してくださいしかし、あなたは他の誰かに確認したいと思うかもしれない
ASCIIのみ

これは機能し.nil?ますが、必要な形式で出力するためのチェックが必要です。 ->(a,b){[a+5,a-5,5-a,a].index(b).nil?}、これは現在のものよりも長いです。
ジャティンダンカー



1

バッチ、81バイト

@set/as=%1+%2,d=%1-%2
@if %d% neq 0 if %d:-=% neq 5 if %s% neq 5 exit/b
@echo 1

入力をコマンドライン引数として受け取り、成功した場合は1、失敗した場合は何も出力しません。Batchは簡単に選言を行うことができないため、De Morganの法則を使用して、Batchを結合に変換します。



1

Japt、13 12バイト

x ¥5|50ìøUra

試すかすべてのテストケースを実行してください

x ¥5|50ìøUra
                 :Implicit input of array U
x                :Reduce by addition
  ¥5             :Equal to 5?
    |            :Bitwise OR
     50ì         :Split 50 to an array of digits
        ø        :Contains?
         Ur      :  Reduce U
           a     :    By absolute difference

失敗する[-5,5](偽であるはずです)
ケビン・クルーイセン

ありがとう、@ KevinCruijssen。前のバージョンにロールバックしました。
シャギー


1

Brachylog、8バイト

=|+5|-ȧ5

入力を2つの数値のリストとして受け取ります(_負数に使用)。オンラインでお試しください!

説明

仕様のほぼ直接的な翻訳:

=          The two numbers are equal
 |         or
  +        The sum of the two numbers
   5       is 5
    |      or
     -     The difference of the two numbers
      ȧ    absolute value
       5   is 5

0

Retina 0.8.2、82バイト

\d+
$*
^(-?1*) \1$|^(-?1*)1{5} -?\2$|^-?(-?1*) (\3)1{5}$|^-?(1 ?){5}$|^(1 ?-?){5}$

オンラインでお試しください!リンクにはテストケースが含まれます。説明:最初の2行は、入力を単項に変換します。最後の行では、許可された一致のいずれかを確認します。

^(-?1*) \1$                              x==y
^(-?1*)1{5} -?\2$   x>=0 y>=0 x=5+y i.e. x-y=5
                    x>=0 y<=0 x=5-y i.e. x+y=5
                    x<=0 y<=0 x=y-5 i.e. y-x=5
^-?(-?1*) (\3)1{5}$ x<=0 y<=0 y=x-5 i.e. x-y=5
                    x<=0 y>=0 y=5-x i.e. x+y=5
                    x>=0 y>=0 y=5+x i.e. y-x=5
^-?(1 ?){5}$        x>=0 y>=0 y=5-x i.e. x+y=5
                    x<=0 y>=0 y=5+x i.e. y-x=5
^(1 ?-?){5}$        x>=0 y>=0 x=5-y i.e. x+y=5
                    x>=0 y<=0 x=5+y i.e. x-y=5

取得した最後の列を中心に:

x==y            ^(-?1*) \1$
x+y=5 x>=0 y>=0 ^-?(1 ?){5}$
      x>=0 y>=0 ^(1 ?-?){5}$
      x>=0 y<=0 ^(-?1*)1{5} -?\2$
      x<=0 y>=0 ^-?(-?1*) (\3)1{5}$
      x<=0 y<=0 (impossible)       
x-y=5 x>=0 y>=0 ^(-?1*)1{5} -?\2$
      x>=0 y<=0 ^(1 ?-?){5}$
      x<=0 y>=0 (impossible)
      x<=0 y<=0 ^-?(-?1*) (\3)1{5}$
y-x=5 x>=0 y>=0 ^-?(-?1*) (\3)1{5}$
      x>=0 y<=0 (impossible)
      x<=0 y>=0 ^-?(1 ?){5}$
      x<=0 y<=0 ^(-?1*)1{5} -?\2$
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.