2つの値をマージする


44

それぞれ0「不明」またはのいずれかを表す2つの値があります1,2,3。次のようにそれらを単一の値にマージします。

  • 両方の値がゼロ以外で等しい場合、その値を出力します。
    (3,3) -> 3
  • 両方の値がゼロではないが等しくない場合、不明の場合は0を出力します。
    (1,2) -> 0
  • 一方の値がゼロで、もう一方がそうでない場合、ゼロ以外の値を出力します。
    (2,0) -> 2, (0,1) -> 1
  • 両方の値がゼロの場合、ゼロを出力します。
    (0,0) -> 0

テストケース:

16の可能な入力ペアがあります。

  | 0 1 2 3
--+--------
0 | 0 1 2 3
1 | 1 1 0 0
2 | 2 0 2 0
3 | 3 0 0 3

(0, 0) -> 0
(0, 1) -> 1
(0, 2) -> 2
(0, 3) -> 3
(1, 0) -> 1
(1, 1) -> 1
(1, 2) -> 0
(1, 3) -> 0
(2, 0) -> 2
(2, 1) -> 0
(2, 2) -> 2
(2, 3) -> 0
(3, 0) -> 3
(3, 1) -> 0
(3, 2) -> 0
(3, 3) -> 3

リーダーボード


8
4番目のルールは最初のルールに適合するため、なぜそれらを分離したのかわかりません。
18年

1
Nitpick:4番目のポイントは冗長です。最初のポイントから「非ゼロ」を削除できます。編集:うわー、忍者@Fatalizeとは何ですか。
エリックアウトゴルファー

また、ここでは3は必ずしも必要ではありませんが、可能な入力の数は増えます。
エリックアウトゴルファー

2
ルールを凝縮することを検討しましたが、すべてのゼロ/非ゼロのケースをリストし、最適化をゴルファーに任せるのが最も明確だと思いました。
xnor

2
これにはリーダーボードが必要です。最初のページでは、2番目のページで既にanswersられた回答が得られ始めています。
Ørjanヨハンセン

回答:


22

Pythonの327の 25バイト

lambda x,y:(x|y)>>(x*y&2)

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


5
私はこれが3を超える入力に対して壊れるのが好きです。
ヤコブ

4
基本的に多くの試行錯誤。
デニス

1
面白い。しばらくの間、2つの整数といくつかの演算子を含む長さの制限された式で検索を自動化することを考えましたが、20バイト程度でもスペースが大きすぎます。何らかの知性が必要です!
ヤコブ



7

シェークスピアプログラミング言語、296バイト

Z.Ford,.Ajax,.Act I:.Scene I:.[Enter Ford and Ajax]Ajax:Listen to thy heart.Ford:Listen to thy heart.Am I as fat as you?Ajax:If so,let us Scene C.Am I as fat as zero?If so,let us Scene C.Ford:Am I as fat as zero?If not,you zero.open heart.let us Scene V.Scene C:.Ajax:open heart.Scene V:.[Exeunt]

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

コードゴルフチャレンジへの最初の参加なので、私のお気に入りのジョーク言語の1つから始めましょう!

説明:2つの変数FordおよびAjaxの宣言(利用可能な最短の変数名)

Z.Ford,.Ajax,.

最初のシーン:2つの値を変数に入れ、それらが等しいかどうかをテストしてから、Ajaxを0に対してテストします。返す必要がある値が変数Fordに格納されている場合は、シーンCに進みます。

Act I:.
Scene I:.
[Enter Ford and Ajax]
Ajax:
Listen to thy heart.
Ford:Listen to thy heart.
Am I as fat as you?
Ajax:
If so,let us Scene C.
Am I as fat as zero?
If so,let us Scene C.

Fordが0の場合はAjaxを出力し、そうでない場合はAjaxを0に設定してからAjaxを出力します。その後、プログラムの最後に進みます。

Ford:Am I as fat as zero?
If not,you zero.
open heart.
let us Scene V.

シーンC:フォードの印刷

Scene C:.
Ajax:open heart.

シーンV:プログラムの終了。

Scene V:.
[Exeunt]


2
鉱山よりも、紛れもなく、より良いバージョンをされ@JoKing、私はあなたが答えとして、それを掲示場合、プログラムの背後にある理由はかなり異なっていると私はあなたの仕事のための信用を取ることを望んでいないとして、それが良いことだと思う
ギヨームRuchot

6

Ruby、21バイト

->a,b{(a|b)*531[a*b]}

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

ルビーだから

簡単な説明:

  • a|b bitwse ORであるため、a == bまたはそれらの1つがゼロの場合に適切な数値を提供します。

  • マジックナンバー531は2 ^ 9 + 2 ^ 4 + 2 ^ 1 + 2 ^ 0であり、[]演算子は単一ビットを抽出します。つまり、a * bが0、1、2、4、または9の場合は1を掛け、それ以外の場合は0を掛けます。

  • これは3を超える値では機能しません。


5

JavaScript(Node.js)、17バイト、Pythonからの何らかの方法での回答

a=>b=>a*b&2?0:a|b

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

JavaScript(Node.js)、21バイト

a=>b=>a-b?a*b?0:a+b:a

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


?0:...できますか||、それとも優先順位が混乱しますか?
スタン・ストラム

@StanStrum ?0:は、condがゼロでない場合にゼロを||返し、condがゼロでない場合にゼロ以外を返すことを意味します
l4m2

5

Pyth8 7バイト

@{+0SQ3

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

@{+0SQ3   Implicit: Q=input()

    SQ    Sort input
  +0      Prepend 0
 {        Deduplicate
@     3    Get 4th element (index 3), modular indexing

ケース1-両方の値がゼロ以外で等しい

Sorted Input   [3,3]
Prepend 0      [0,3,3]
Deduplicate    [0,3] - index 3 yields 3

ケース2-両方の値がゼロ以外で等しくない

Sorted Input   [1,2]
Prepend 0      [0,1,2]
Deduplicate    [0,1,2] - index 3 yields 0

ケース3-正確に1つの値ゼロ

Sorted Input   [0,1]
Prepend 0      [0,0,1]
Deduplicate    [0,1] - index 3 yields 1

ケース4-両方の値がゼロ

Sorted Input   [0,0]
Prepend 0      [0,0,0]
Deduplicate    [0] - index 3 yields 0

代替ソリューション、7バイト

*eSQ}s{

オンラインで試す

*eSQ}s{QQ   Trailing Q's inferred

      {Q    Deduplicate input
     s      Take the sum
    }   Q   Is this in the input? True treated as 1, false as 0
*           Multiplied by
 eSQ        Max from input (end of sorted input) 

以前のバージョン、8バイト

@+0{-QZ3

@xnorそれを発見してくれてありがとう、それは今修正されるべきです
ソク

@{+0Q36バイトで動作します。
Mr Xcoder


4

スタックス、8 バイト

Ç∞∟∙◄╥*♣

実行してデバッグする

開梱されていない、コメントされていない、これはこのように見えます。

    e.g.        [2, 0]
c:s [2, 0] 2    calculate the "span" of the input array (max(a) - min(a))
+   [2, 0, 2]   append the span to the input array
o   [0, 2, 2]   sort the 3-element array
E   0 2 2       explode the 3 elements into 3 separate stack entries
a   2 2 0       rotate the third stack element to the top of stack
!   2 2 1       logical not, produces 1 iff the top value was 0
*   2 2         multiply
                implicitly print top of stack

これを実行する



4

(最初の投稿ですので、激しく蹴らないでください)

パイソン257の44 43バイト

lambda a,b:(0 if a*b else a+b)if a-b else a

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

最初のPythonの答えを見た後、少し圧縮されました)



取り消し線44はまだ44です(
ジョーキング

@JoKingハァッ?あなたの解決策は素晴らしいです、私は算術でそれをやろうとしましたが、失敗してif / elseに戻りました
10

4

C(gcc)、25バイト

f(a,b){a=a^b&&a*b?0:a|b;}

擬似コード:

foo(A,B)
    if A XOR B and A*B are > 0
        return 0
    else 
        return A OR B`

3

C(gcc)、26バイト

f(a,b){a=a*b?a-b?0:a:a+b;}

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

拡張/ Ungolfed:

int f(int a, int b) { // implicit-int (C89)
    // return replaced with assignment: link
    return a*b ? // if a and b are both not zero, then
        a-b ? // if a != b
        0 : // a != b, so return 0
        a // a == b, so return a
    : a+b // one of a,b is zero, so return whichever is nonzero 
    ;
}

3

MATL、9バイト

dGp*~GX>*

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

説明:

           % Implicit input as a vector with two elements implicitly. Stack: [0,2]
d          % The difference between the two elements. Stack: [2]
 G         % Push input again. Stack: [2], [0,2]
  p        % The product of the last element (the input). Stack: [2], [0]
   *       % Multiply the two elements on the stack. Stack: [0]
    ~      % Negate. Stack: [1]
     G     % Push input again. Stack: [1], [0,2]
      X>   % Maximum value. Stack: [1], [2]
        *  % Multiply the two elements on the stack. Stack: [2]
           % Implicit output

アウトゴルフの失敗:t?td~*]X>
スンダ-モニカの復活


3

QBasic、34バイト

別のアプローチ!

INPUT a,b
?(a OR b)*-(a*b=0OR a=b)

出力グリッドの非ゼロ値ORは、2つの入力数値のビット単位であることに注意してください。これはa OR bQBasicにあります。私たちは時に出力し、この値をしたいa*b=0 OR a=b、と0(truthyであるため、負の、我々は前述の条件付きの負乗じて行うことができ、そうでない場合は-1QBasicをで)。


2

brainfuck、25バイト

,>,[>]<<[[->->+<<]>[>]]>.

入力は2バイト値です(ASCIIではありません)


2

スイフト、118バイト

func c(n1:Int,n2:Int){n1==n2 ? print("\(n1)") : (n1*n2 != 0 ? print("0") : (n1==0 ? print("\(n2)") : print("\(n1)")))}

4
PPCGへようこそ!私はSwiftを知りませんが、おそらく変数名をそれぞれ1文字にして、および演算子のような空白を削除することで、多くのバイトを節約できます!=
18年

1
こんにちは、PPCGへようこそ!@Οurousが述べたように、変更n1してn2、単一の文字に変更して短縮することができます。いくつかの空白と括弧を削除し、いくつかのスペースを削除します。さらに、入力のみが可能であることがわかっているため、==0can <1および!=0can が可能です。どちらの前にもSwiftでプログラミングしたことはありませんでしたが、次のように91バイトに減らしました。オンラインで試してみてください。>00,1,2,3func c(a:Int,b:Int){a==b ?print("\(a)"):a*b>0 ?print("0"):a<1 ?print("\(b)"):print("\(a)")}
ケビンクルーイッセン

さらに、次のように51バイトに短縮できるようです:func c(a:Int,b:Int){print(a==b||a*b<1 ?max(a,b):0)} オンラインで試してください。再びPPCGへようこそ、あなたの滞在をお楽しみください!
ケビンクルーイッセン

1
@KevinCruijssenのゴルフに加えて、提出物を匿名のクロージャーに変えて87バイトを節約できます。{$0==$1||1>$0*$1 ?max($0,$1):0} オンラインで試してみてください!
氏Xcoder

2

バッチ、38 36 35 30バイト

@cmd/cset/a"(%1|%2)>>(%1*%2&2)

@DennisのPythonの答えは、バッチでは条件式が高すぎるためです。




2

05AB1E9 8 バイト

àIËIP_+*

@MagicOctopusUrnのおかげで-1バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

à         # Take the maximum of the input-list
          #  [0,2] → 2
IË        # Are all elements in the input-list equal?
          #  [0,2] → 0
  IP_     # Take the product of the input-list, and verify if it equals 0
          # (`_` transforms 0 into 1; everything else into 0)
          #  [0,2] → 0 (product) → 1 (==0)
     +    # Add them together (since only 1 is truthy in 05AB1E, this is basically an OR)
          #  0+1 → 1
*         # Multiply both values on the stack
          #  2*1 → 2

一般的な説明:

IËIP_+    # If both values are equal, or one of them is a zero:
 à        #  Output the maximum of the two values
          # Else:
          #  Output 0

Ës0å~iZë0私のものでした。良いですね。実際に9バイトをはるかに上回ることができるかどうかはわかりません。
魔法のタコ

1
私はそれを論理的に等価なà®Ë®P_+*場所に戻します_
マジックタコ

_0に1に0、他のすべての値を回す
マジックタコ壺

よろしくお願いします!この答えを出したとき、== 0コマンドがあるかどうかを確認するためにドキュメントを調べていましたが、_それが正確に行われることを知りませんでした。将来の他の課題にも役立つはずです。TIL。:)
ケビンクルーイッセン



2

ジャバスクリプトES6、25 22 21 20バイト

a=>b=>a?b-a?!b*a:a:b

14 13バイト、引数がソート順に提供される場合

a=>b=>a%b?0:b


2

QBasic、38 36 35バイト

INPUT a,b
?(a*b>0)*(b-a*(a<>b))+a+b

エリックのIF ... THEN ... ELSE答えに一部触発され、ここに数学のみのソリューションがあります。

どうやってここに来たの

条件付き数学を理解するための重要な注意:QBasicでは、比較演算子の結果は0and -1、not 0および1です。

Erikのコードから始めます。

IF a*b THEN?a*-(a=b)ELSE?a+b

つまり、aとのb両方がゼロ以外の場合、print a*-(a=b)aif a=b、それ以外の場合0); それ以外の場合(aおよびの少なくとも1つbがゼロ)、出力a+b(ゼロ以外の数、または0両方がゼロの場合)。

ここで条件付きの数学がすでにあります。さらに一歩進んで、IFステートメントを完全に削除できるかどうかを確認しましょう。a*b>0外側の条件に使用する必要があります:a*b複数の異なる真理値を持つことができますが、これはIF問題ありませんが、数学には問題を引き起こします。

c=a*b>0
?c*a*(a=b)+(c+1)*(a+b)

これは-elimination の標準的なトリックですIF。場合はc、真でc*a*(a=b)ある-a*(a=b)(c+1)*(a+b)されます0。when cがfalse、c*a*(a=b)is 0および(c+1)*(a+b)is a+bです。したがって、この式はと同じ結果を返しIF ... THEN ... ELSEます。唯一の問題は、プログラムが38バイトではなく40バイトになることです。おそらく、数学を再配置することでプログラムを短縮できます。

c=a*b>0
?c*a*(a=b)+c*(a+b)+a+b

まだ40バイト...

c=a*b>0
?c*(a+b+a*(a=b))+a+b

これで、プログラムは38バイトに戻りました。ただし、使用するのはc1回だけなので、変数に割り当てる必要はもうありません。

?(a*b>0)*(a+b+a*(a=b))+a+b

これで、36バイトになりました。

しかし、もっと待ってください...そのa+b+a*(a=b)表現は少し冗長に見えます。a*(a=b)である-a場合a=b0そうでありません。それをに追加するとa0if a=baそうでない場合に取得します。条件を逆にすることで、より少ないバイトで同じことを達成できるかもしれません。

b+a*-(a<>b)

最初は、これは短く見えません。しかし、マイナスを追加する代わりに減算することでバイトを節約できます:

b-a*(a<>b)

そして、35バイトのソリューションがあります。


あそこニーストリック...
エリックOutgolfer

1

クリーン46 43 42バイト

import StdEnv
?[a,b]|a<1||a==b=b=0

?o sort

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

匿名の構成:: [Int] -> Int、ペアを並べ替えてから、最初のメンバーを突き合わせます。

合成されたラムダとしてそれを行うことは同じ長さです:

import StdEnv

(\[a,b]|a<1||a==b=b=0)o sort

1

ゼリー7 6バイト

׬o=a»

オンラインでお試しください!またはすべての組み合わせを試してください!

どうやって?

׬o=a»   Dyadic link
×        Multiply the two arguments.
 ¬       Logical not. Gives 1 if one argument is 0, 1 otherwise.
   =     Are the two arguments equal?
  o      Logical or the result of = and ¬. 
     »   Greater of the two arguments.
    a    Logical and. Gives the greater of the two arguments if they are equal
         or if one of them is zero and gives 0 otherwise.

APL answerのメソッドを使用して、同じバイトカウントを取得します。最小公倍数は2バイトであるため、その回答よりも1バイト長くなります。

6バイト

«=æl×»

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


また、以下の代替方法に注意してください
-H.PWiz

@ H.PWizああ、私はあなたがリンクと同じ方法を使っていたと思っていました
-dylnan

私は2つのメソッドを与える∧=⌊=*⌊。2番目はJellyによって
好まれています-H.PWiz

@ H.PWiz APLは話せませんが、あなたが説明した方法を使っていました。何を=*⌊するの?
ディルナン

それは最小限であることを除いて、ゼリーとほとんど同じです。または×、両方の言語で使用できます
-H.PWiz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.