2つの配列のベストを取得


19

浮動小数点数の2つの配列が与えられます。あなたの仕事は、2つの配列の対応する要素をペアにし、各ペアの最大値を取得することです。ただし、2つの対応する要素が等しい場合は、代わりにそれらの合計を取る必要があります。

たとえば、リスト[1, 3, 3.2, 2.3]とを指定すると[3, 1, 3.2, 2.6]、次のことを行う必要があります。

  • 要素(またはzip)をペアリングします[[1, 3], [3, 1], [3.2, 3.2], [2.3, 2.6]]

  • 各ペアを調べて、上記のプロセスを適用します[3, 3, 6.4, 2.6]


スペック

  • 配列/リストの長さは常に同じです。ただし、空の場合があります。

  • あなたがそれを乱用しない限り、それらに含まれる数字は常にあなたの言語の能力に適合します。正、ゼロ、または負の場合があり、すべてのタイプを処理する必要があります。

  • バイトカウントの削減に役立つ場合は、リストの長さを入力として使用することもできます。

ルール


テストケース

Array_1、Array_2->出力

[]、[]-> []
[1、2、3]、[1、3、2]-> [2、3、3]
[1、3、3.2、2.3]、[3、1、3.2、2.6]-> [3、3、6.4、2.6]
[1,2,3,4,5,5,7,8,9,10]、[10,9,8,7,6,5,4,3,2,1]-> [10、9、 8、7、6、10、7、8、9、10]
[-3.2、-3.2、-2.4、7、-10.1]、[100、-3.2、2.4、-7、-10.1]-> [100、-6.4、2.4、7、-20.2]

あなたは、数字は常に「あなたの言語の」能力内に収まると言います。あなたがそれを「乱用しない」限り、フロートを持たない言語の整数のみをサポートすることは虐待と見なされますか?私は実際にそれが浮動小数点数でなければなら理由が表示されていない同じプロセスが整数で行うことができ、私は脳フラックが、脳非難でこれを解決したいだけint型をサポートしています。。。
小麦ウィザード

@WheatWizard例外を作ることができます。先に進み、あなたの答えを投稿し、混乱を避けるために私が許可したことを述べてください。

回答:


8

ゼリー、4バイト

=‘×»

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

これは私のAPL answerとまったく同じアプローチを使用しますが、Jellyには1を数値に追加するための組み込み機能があります。


ネタバレは嫌いですが、賢明なエンコーディングでは、これらの文字の一部がそれぞれ1バイトを超えていませんか?
セドリックナイト

これはゼリーのコードページを使用します。
ザカリー

ついに競争に勝ちました!
ザカリー

2
@ZacharýONE MAN、4 btytes ...この夏...あなた...ウィル... ビー ... ジェリーオブジェリー ... JのJレーティング
魔法のタコUr

11

Kotlin、78 75 71 66 65 59バイト

それは私の最初の試みです、クールである:D

a.zip(b).map{(a,b)->when{b>a->b;a>b->a;else->a*2}}.toList()

TIOはこのソリューションでは動作せず(そしてその理由はわかりません)、以下のテスト用のソースコード

fun main(args: Array<String>) {
    bestOfTwo(floatArrayOf(), floatArrayOf()).print()
    bestOfTwo(floatArrayOf(0F), floatArrayOf(0F)).print()
    bestOfTwo(floatArrayOf(1F,2F,3F), floatArrayOf(1F,3F,2F)).print()
    bestOfTwo(floatArrayOf(1F,3F,3.2F,2.3F), floatArrayOf(3F,1F,3.2F,2.6F)).print()
    bestOfTwo(floatArrayOf(1F,2F,3F,4F,5F,5F,7F,8F,9F,10F), floatArrayOf(10F,9F,8F,7F,6F,5F,4F,3F,2F,1F)).print()
    bestOfTwo(floatArrayOf(-3.2F,-3.2F,-2.4F,7F,-10.1F), floatArrayOf(100F,-3.2F,2.4F,-7F,-10.1F)).print()
}


fun bestOfTwo(a :FloatArray, b :FloatArray): List<Float> =
    a.zip(b).map{(a,b)->when{b>a->b;a>b->a;else->a*2}}.toList()


fun List<Float>.print() {
    this.forEach { print("$it, ") }; println("")
}

編集:

-3「a + b [i]」を「a * 2」に置き換えて

-4「mapIndexed」メソッドを「zip」に置き換える(@AnonymousReality Swiftソリューションのおかげ)

-5 when条件による「Math.max」メソッドの置き換え

-1条件順の変更により

-6 toList()によるtoFloatArray()の変更


10
PPCGへようこそ!ダウン票に落胆しないでください(新しいユーザーの最初の投稿が品質のために自動フラグが付けられ、その投稿が改善されたときに発生するシステムのわずかな奇抜の結果です!!)
ジョナサンアラン

2
最悪の「機能」は...それについては気にしないでください。
エリックアウトゴルファー

10

Python 2、45バイト

私の最初のソリューションと@ovs 'のミックス。

lambda*a:map(lambda x,y:max(x,y)*-~(x==y),*a)

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

Python 2、49バイト

lambda x,y:[max(a,b)*-~(a==b)for a,b in zip(x,y)]

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

Python 2、46バイト

@ovsは3バイトを節約するためにこのメソッドを提案しました。

lambda*x:[max(a,b)*-~(a==b)for a,b in zip(*x)]

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


どうやって?

まず、*またはを使用して、対応する要素をペアにしますzip()。これにより、マップまたはリストの理解のいずれかを使用して、さらにゴルフを行うことができます。

この回答のクールなトリックは、次の部分ですmax(x,y)*-~(x==y)それはどのように機能しますか?-よくご存じのとおり、Pythonは算術演算で使用されるブール値を整数に自動変換します。したがって、条件が満たされる場合、(x==y)と評価され1ます。ただし、2つの値が等しくない場合は、0代わりに戻ります。次に、ビットごとの演算-~はboolから返された値をでインクリメントし、またはの1いずれ2かを返します1max(a,b)ペアの最大値を指定し、*上記で返された値で乗算します(したがって2、等しい場合にのみ乗算され、その場合max()は両方の値が返されます)。

これは、2つの等しい数の合計が実際にはそれらのいずれかが2倍になっており、Pythonのboolクラスがintのサブクラスであるような「悪用」の事実に基づいています。


うわー、それは本当に速かったです!

より簡単で、同じバイト数:lambda*a:map(lambda x,y:(x<=y)*y+(x>=y)*x,*a)
jferard

@jferard事実、それはすでにLuisのソリューションです。
ミスターXcoder

@ Mr.Xcoderおっと!ページ全体を読みませんでした
...-jferard

順序は変更される可能性があるため(上​​記のソリューションは表示されません)
ザカリー

8

JavaScript(ES6)、53 49 45 43バイト

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)
  • Mr. Xcoderからトリックを借りて、4バイトを節約しました。
  • Arnauldのおかげで2バイト節約されました。

それを試してみてください

o.innerText=(f=

a=>b=>a.map((x,y)=>(y=b[y])>x?y:y<x?x:x+y)

)(i.value=[1,3,3.2,2.3])(j.value=[3,1,3.2,2.6]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))(j.value.split`,`.map(eval))
<input id=i><input id=j><pre id=o>


説明

a=>b=>

構文をカリー化する際ab、パラメーターおよびを介して2つの配列を引数として取る匿名関数(つまり、f(a)(b)

a.map((x,y)=>                      )

最初の配列にマップし、x現在の要素とy現在のインデックスを関数に各要素を渡します。

(y=b[y])

y2番目の配列のインデックスにある要素を取得し、それをの新しい値として割り当てますy

>x?y

yより大きいかどうかを確認し、大きい場合はをx返しyます。

:y<x?x

それ以外の場合yは、より小さいかどうかを確認xし、もしそうであれば、返すx

:x+y

そうでなければ、の合計を返すxy。(同じバイト数のx場合y、乗算または2でもここで機能します。)


j.value.split`,`.map(eval)またはeval('['+j.value+']')?またx+y、見栄えの良い私見になります。
ニール

@Neil:1)前者の方が入力しやすいと思います。また、マシンの1つにスニペットテンプレートがいくつかあります。.map(eval)それらにタックするだけで簡単です。2)同意し、すぐに編集します。
シャギー


7

R31 29バイト

function(a,b)pmax(a,b)+a*!a-b

pmax 2つ(またはそれ以上)の配列の並列最大値を取ります(必要に応じて短い方をリサイクルします)。

ルイス・メンドーのコメントを見ていましたが、明らかにこのアプローチがRにも有効であることに気付きました。これは、30バイトに私を得たが、その後、私は私の元の答えを改善するために、代わりにインデックスを得るためのさまざまな方法で遊んで開始し、つまずいた!a-bとしてTRUEどこa==bFALSEと同等、それ以外の場合はa==b。しかし、何らかの理由で、Rは、周りの括弧を必要としない!a-b、それがために行うようにa==b私に2つのバイトを保存し、。

JDLのcommentsで述べたように、これは、!(否定)が-R のバイナリ演算子よりも優先順位が低いために機能しますが、これは奇妙です。

オンラインでお試しください!(新しいバージョン)

オンラインでお試しください!(元の)


単項の「!」バイナリー「-」よりもRの優先順位が低く、これは非常に珍しいと思います(そして、この答えを読むまで気付いていませんでした!)
JDL

@JDLええ、私はこのような奇妙な癖の場合、ゴルフ中にR構文ページを開く必要がほとんどあります...そしてまた:、算術と相互作用するときの優先順位を思い出すことができないからです。
ジュゼッペ


6

Dyalog APL、5バイト

⌈×1+=

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

どうやって?

  • 、引数の要素ごとの最大値
  • ×、要素ごとの乗算
  • 1+=、1は引数の要素ごとの等式に追加されます

これは、数字が等しくない場合、1+=になり1、最大値を掛けると最大になるためです。数が等しい場合、1+=を返します2。これに最大値を掛けると、最大値の2倍、または最大値がそれ自体に加算されます。


5

ゼリー、6 バイト

żSṀE?€

両側の数値のリストを取得し、結果のリストを返すダイアディックリンク。

オンラインでお試しください!またはテストスイート *を参照してください。

どうやって?

żSṀE?€ - Link: list of numbers L, list of numbers R   e.g. [1,3,3.2,2.3], [3,1,3.2,2.6]
ż      - zip - interleave L & R                       [[1,3],[3,1],[3.2,3.2],[2.3,2.6]]
     € - for each pair:
    ?  - { if:
   E   -   ...condition: equal                          0      0       1         0
 S     -   ...then: sum                                               6.4
  Ṁ    -   ...else: maximum                             3      3                2.6
       - }                                    ... ->   [3     ,3     ,6.4      ,2.6]

別の方法は、このモナドリンクが2つのリストのリスト(6バイト)を取ることです。

+»⁼?"/

*以前にコードのバイトカウントのほぼ3倍のテストスイートフッターを作成したことはないと思います!


アウトゴルフ!。質問の実質的に逐語的な解釈のために+1。
ザカリー

...そして、私は»以前にベクトル化することを忘れることに気づきました!
ジョナサンアラン

他に何をしますか、複雑な方法で最大配列を取得しますか?
ザカリー

複雑な定義は必要ありません。Pythonが管理します-たとえばmax([1,1,0],[1,0,3]) -> [1,1,0](ではありません[1,1,3])。
ジョナサンアラン

それで、基本的に無限ベースですか?
ザカリー

5

を使用して素晴らしいアイデアγ
エミグナ

@Emigna「最大の要素」が本当に欲しかったので、{γθおそらくそれで一番短いでしょう。
エリックアウトゴルファー

どうøεMÃO
エミグナ

@Emignaクール、ありがとう!(なぜ私は考えていなかった)イェイ今すぐリードを得た:p btw øεZÃOも動作します
エリックアウトゴルファー

4

MATL、7バイト

X>tG=s*

入力は2行の行列で、各行は配列の1つです。

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

説明

X>   % Implicit input. Maximum of each column
t    % Duplicate
G    % Push input
=    % Is equal? Element-wise with broadcast. Gives a two-row matrix
s    % Sum of each column. Gives a row vector containing 1 and 2
*    % Multiply, element-wise. Implicit display

4

Java 8、80 69 67 66 65 64 63バイト

(a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}

代わりに2番目の入力配列を変更するか、バイトを節約するために新しいfloat配列を返します。

追加の整数入力として長さを取ることにより、-11バイト。チャレンジルールに従って許可されます。
-5おかげバイト@OliverGrégoire(一度に1つのバイト.. XDのを)
-1バイト間接的に感謝@ShaggyのJS回答を使用してa[l]*2代わりにa[l]+b[l]

説明:

ここで試してみてください。

(a,b,l)->{          // Method with 2 float-array and integer parameters and no return-type
  for(;l-->0;)      //  Loop over the array
    if(a[l]>=b[l])  //   If the current value in `a` is larger or equal to `b`:
      b[l]=         //   Modify the second input-array:
       a[l]*        //    Use `a` multiplied by:
        (a[l]>b[l]? //     If the current value in `a` is larger than `b`:
          1         //      Multiply by 1
         :          //     Else (`a` is smaller of equal to `b`):
          2)        //      Multiply by 2
                    //  End of loop (implicit / single-line body)
}                   // End of method

2
「バイトカウントの削減に役立つ場合は、リストの長さを入力として使用することもできます。」バイト数が確実に減ります;)
オリビエグレゴワール

1
また、2バイト短縮:a->b->l->{float A,B;for(;l-->0;b[l]=(A=a[l])<B?B:A>B?A:A+B)B=b[l];}
オリビエグレゴワール

そしてfloat A, Bfor初期化を行うことでもう1バイト節約できます。
オリヴィエグレゴワール

1
またはこれ:(a,b,l)->{for(;l-->0;)if(a[l]>=b[l])b[l]=a[l]*(a[l]>b[l]?1:2);}(63バイト)
オリビエグレゴワール

3
@OlivierGrégoireLol ..すべてのバイトでゴルフをすることは役立ちますが、それは一度に1バイトずつゴルフする必要があるという意味ではありません。; p
ケビンクルーイッセン


3

05AB1E9 8 7バイト

Erik the Outgolferがリストのリストが有効な入力であると指摘したので、1バイトを保存しました。

øεMsËi·

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

説明

ø          # zip the lists
 ε         # apply to each pair
  M        # get max
   s       # swap the top 2 elements on the stack
    Ëi     # if all elements are equal
      ·    # double the max

うわー、それは本当に速かったです!

リストを削除し、リストとリストのペアとして入力することで、バイトを保存できます。
エリックアウトゴルファー

@EriktheOutgolfer:はい。許可されていないと仮定しましたが、チャレンジでは標準のI / Oルールが指定されていることがわかります。お知らせいただきありがとうございます:)
エミグナ

1
@エミグナのヒント:あなたの心からルールを作らないでください;)
エリックアウトゴルファー

1
@EriktheOutgolfer:ええ、私は本当にそれをやめる必要があります。特に私のプログラムを長くする規則;)
エミグナ


3

J、7バイト

>.`+@.=

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

1つのリストを左の引数として取り、もう1つのリストを右の引数として取ります。

幸いなことに、平等はランク0の操作です。

説明

>.`+@.=
      =  Compare equality pairwise
    @.   If equal
   +       Sum
>.       (Else) take greater value

@.実際にはifステートメントではありませが、この場合は1つのステートメントとして機能します(>.`+正しい引数の結果に基づいて動名詞にインデックスを付け、それを入力に適用します)。


私のAPLの翻訳であなたがゴルフをしのいだとしても、私はこれができなかったことを知っています。> _ <
ザカリー

Jはここで本当に輝いています
ジョナ

それにもかかわらず、@Zacharýラット、よくゴルフをしています。
コール


3

TI-Basic、23 21バイト

Prompt A,B
(ʟA=ʟB)ʟA+max(ʟA,ʟB

あまりにも悪いリストはそれぞれ2バイトを占有します...


Xand を要求することで2バイトを保存しY、次にʟXand ʟYを使用してそれらにアクセスできます(例: " Prompt X,Y:ʟX(ʟX=ʟY)+max(ʟ1,ʟ2")。
スコットミルナー

また、リストにあるL1(L1=L2)要素を取得しようとL1するとエラーがスローされるため、これは現在無効です。これを修正するには、順序を入れ替え(L1=L2)L1ます。
スコットミルナー

@ScottMilner両方を指摘してくれてありがとう。
ティムテック



2

Pythonの349 46 45バイト

図3は、除去のおかげバイト@ Mr.Xcoder(スプラットの代わりに二つの引数)、および1つのバイトのおかげ@ovsを(代わりに、リストの内包表記の地図)

lambda*x:map(lambda a,b:a*(a>=b)+b*(b>=a),*x)

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


1
46バイト:lambda*c:[a*(a>=b)+b*(b>=a)for a,b in zip(*c)]。このうちターンは:)あまりにもかなり良いです-あまりにも悪いのがさらにゴルフのための場所がない
氏Xcoder

@ Mr.Xcoderありがとう!良いアイデア!
ルイスメンドー

zipの代わりにマップを使用して45バイト
-ovs

2

Common Lisp、60 59バイト

(mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))

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

@Zacharýのおかげで-1バイト!


59バイト:(mapcar(lambda(x y)(*(max x y)(if(= x y)2 1)))(read)(read))
ザカリー

どういたしまして、私はそのLispをよく知りません。私は他の答えをLispに翻訳しただけで、結局1バイトを節約しました。
ザカリー

2

numpyを使用したPython、28バイト

lambda a,b:a*(a>=b)+b*(b>=a)

入力が2つのnumpy配列として与えられていると仮定します。


numpyを使用している場合、ここに私の悪い解決策があります。– lambda a,b:n.fmax(a,b)*((a==b)+1)
エーリッヒ

@Erich私はこのアイデアが好きですが、それを行うには必要import numpy as nです。入力に暗黙的に含まれているため、ここでは省略します。

私は答えの実際の実装が何かにそれを割り当てることを必要とするとき、私は多くの場合Pythonの答えが単にラムダである、明示的なバイトカウントに少し不安があると思います。このため、暗黙のimportステートメントを使用することも許されるのでしょうか?
エーリッヒ

@Erich一般に、コードでn定義nした場合にのみ変数を参照できるため、インポートは明示的に行う必要があります。デフォルトでは、匿名関数を含む関数または完全なプログラムを回答として許可します。

1
さて、これはをインポートするのではなく、numpy配列として入力するだけnumpyです。しかし、これは使用しなくても機能しreturnますか?
ザカリー

2

Linq 47 + 18 = 65バイトを使用したC#(.NET Core)

x=>y=>x.Zip(y,(a,b)=>a>b?a:b>a?b:b+a).ToArray()

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

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

x=>y=>l=>{for(int i=0;i<l;i++)x[i]=x[i]>y[i]?x[i]:y[i]>x[i]?y[i]:y[i]*2;return x;}

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


あなたはで数バイトでLINQの答えをドロップすることができSystem.Linqのを使用して、名前空間System.Linqのを変える
jkelm

@jkelmええ、「using System;」が含まれるかどうかは疑問に思っていましたが、そうではないでしょう。クリーンアップします
-Dennis.Verweij

System.Linqは「Visual C#Interactive Compiler」に含まれています。私は帰国については全くわからないArrayIListIEnumerableが、すべてが対象とされている場合、あなたは37にバイト数を取得することができます- tio.run/##Sy7WTS7O/...
ダナ


1

スウィフト3、81の 79バイト

func n(a:[Double],b:[Double]){for(x,y)in zip(a,b){print((x==y) ?x+y:max(x,y))}}

Swiftには興味深いプロパティがあり、Intはa Doubleに直接キャストできないDoubleため、関数に渡す前に配列をsの配列として指定する必要があります。

(例えば) var k:[Double] = [1,2,3,4,5,5,7,8,9,10]

編集:@EriktheOutgolferのおかげで-2バイト


あなたの周りのスペースが必要です(x,y)し、前に?
エリックアウトゴルファー

@EriktheOutgolfer ?Swiftはそれらを3項ではなくオプションの型として扱うため、前のものが必要です(そうではありません)。他はそうではありません。それとは別に、これは劇的にゴルフすることができます。

@EriktheOutgolfer-TheIOSCoderはすでにあなたに部分的に答えていますが、あなたは正しい、あなたはforループにあるものを必要としない、面白い!
AnonymousReality

73バイト:func n(a:[Float],b:[Float]){print(zip(a,b).map{$0==$1 ?2*$0:max($0,$1)})}(フロート不正確は、デフォルトで処理する必要はありません)
ミスターXcoder

または74バイト:func n(a:[Float],b:[Float]){print(zip(a,b).map{($0==$1 ?2:1)*max($0,$1)})}
Xcoder氏



1

Rust107 97バイト

|a:V,b:V|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<V>();
type V=Vec<f32>;

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

@mgcのおかげで8バイト節約


1
収集されたデータに対して型推論をVec使用しmaxf32s のメソッドを使用することで、8バイトを節約できると思います|a:Vec<f32>,b:Vec<f32>|a.iter().zip(b).map(|(&x,y)|if x==y{x+y}else{x.max(y)}).collect::<Vec<_>>();
。– mgc

1
@mgcありがとう!型推論は良いアイデアでしたが、この場合、型エイリアスはさらに短くなります。
-jferard

1

Swift 4、41バイト

{zip($0,$1).map{$0==$1 ?2*$0:max($0,$1)}}

テストケース:

let f: ([Float], [Float]) -> [Float]
    = {zip($0,$1).map{$0==$1 ?2*$0:max($0,$1)}}

let testcases: [(inputA: [Float], inputB: [Float], expected: [Float])] = [
    (
        inputA: [],
        inputB: [],
        expected: []
    ),
    (
        inputA: [1, 2, 3],
        inputB: [1, 3, 2],
        expected: [2, 3, 3]
    ),
    (
        inputA: [1, 3, 3.2, 2.3],
        inputB:  [3, 1, 3.2, 2.6],
        expected: [3, 3, 6.4, 2.6]
    ),
    (
        inputA: [1,2,3,4,5,5,7,8,9,10],
        inputB:  [10,9,8,7,6,5,4,3,2,1],
        expected: [10, 9, 8, 7, 6, 10, 7, 8, 9, 10]
    ),
    (
        inputA: [-3.2, -3.2, -2.4, 7, -10.1],
        inputB:  [100, -3.2, 2.4, -7, -10.1],
        expected: [100, -6.4, 2.4, 7, -20.2]
    ),
]

for (caseNumber, testcase) in testcases.enumerated() {
    let actual = f(testcase.inputA, testcase.inputB)
    assert(actual == testcase.expected,
        "Testcase #\(caseNumber) \((testcase.inputA, testcase.inputB)) failed. Got \(actual), but expected \(testcase.expected)!")
    print("Testcase #\(caseNumber) passed!")
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.