他の要素の合計のパリティ


23

仕事

正の整数の配列を指定して、各要素を他の要素の合計のパリティで置き換えます。配列には、少なくとも 2つの要素があることが保証されています。

定義

  • パリティ:数値が奇数か偶数か。

配列の場合[1,2,3,1]

  • 置き換え1のパリティ付き2+3+1すなわち、even
  • 置き換え2のパリティ付き1+3+1すなわち、odd
  • 置き換え3のパリティ付き1+2+1すなわち、even
  • 置き換え1のパリティ付き1+2+3すなわち、even

出力: [even, odd, even, even]

入力

正の整数の配列。

適切な配列、または正整数の改行で区切られた文字列として取得できます。

配列とその中の値は、言語の処理能力の範囲内であると想定できます。

出力

アレイ2つの一貫した値、1を表すodd、表す1 even

2つの値を改行で区切った文字列として出力できます。

テストケース

入力:

[1, 2, 3, 1]
[1, 2, 3, 2, 1]
[2, 2]
[100, 1001]

出力:

[even, odd, even, even]
[even, odd, even, odd, even]
[even, even]
[odd, even]

注:oddおよび以外の他の一貫した値を選択できますeven

得点

これはです。バイト単位の最短回答が優先されます。

標準の抜け穴が適用されます。

回答:


16

ゼリー、3バイト

+SḂ

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

使い方

+SḂ  Main link. Argument: A (array)

 S   Compute the sum of A.
+    Add the sum to each element of A.
     Using _ (subtraction) or ^ (bitwise XOR) would also work.
  Ḃ  Bit; compute the parity of each resulting integer.

それは賢いアプローチです。
リーキー修道女

1
@LeakyNunそれは他の誰もが使用しているのと同じアプローチで、より短いだけです:P
ETHproductions

@ETHproductionsはい、はい。Theteは、パリティを計算するための非常に多くの方法にすぎません...-
デニス

@ETHproductionsこれは...代わりに減算の追加を使用しています
漏れ修道女

@LeakyNun確かに、私のJaptの回答も同様です。ゼリーでは、ちょうど_SḂ
-ETHproductions

8

JavaScript(ES6)、38 36 32バイト

a=>a.map(b=>eval(a.join`+`)-b&1)

0偶数と1奇数に使用します。

テスト

f=
a=>a.map(b=>eval(a.join`+`)-b&1)
console.log(f([1, 2, 3, 1]))
console.log(f([1, 2, 3, 2, 1]))
console.log(f([100, 1001]))


2バイトoff:c-b&1代わりに(c-b)%2
漏れ修道女

ああ!あなたはそれに私を打ち負かした!
シャギー

1
使用することを忘れないeval(a.join`+`)でくださいa.reduce((x,y)=>x+y)。それは賢明です
チョイス

8

Haskell、20バイト

f x=odd.(sum x-)<$>x

True奇数値と偶数値に使用しFalseます。

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

リストの合計から各要素を減算し、奇数かどうかをテストします。

fpointfreeに変更した場合も20バイトですmap=<<(odd.).(-).sum


6

MATL5、4つのバイト

ts-o

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

デニスのおかげで1バイト節約できました!

これにより、奇数に「1」、偶数に「0」が与えられます。説明:

t       % Duplicate the input
 s      % Get the sum of the input
  -     % Subtract it from the original input
   o    % Get the parity of each element

6

アリス31 28バイト

/O.HQ\d$K@
\i#\ /d2-&+!w?+2%

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

整数が区切られている限り、入力形式は関係ありません。出力形式は改行で区切られています。

レイアウトはおそらくまだ最適ではありませんが、これをさらに短縮する方法をまだ見つけていません。

説明

/     Reflect to SE. Switch to Ordinal.
i     Read all input as a string.
      Reflect off bottom boundary. Move to NE.
.     Duplicate the input string.
      Reflect off top boundary. Move to SE.
\     Reflect to N. Switch to Cardinal.
H     Implicitly convert the top copy of the input to the integers it
      contains and take the absolute value of the top-most one. (Taking
      the absolute value doesn't do anything, but we need the implicit
      conversion to integers.)
      The IP wraps back to the second line.
\     Reflect to SE. Switch to Ordinal.
      Immediately reflect off bottom boundary. Move to NE.
Q     Reverse the stack (this converts the integers back to strings but
      that's irrelevant). After this, we end up with all the individual
      integers on the bottom of the stack in reverse order and the other
      copy of the input string with all integers on top.
      Reflect off top boundary. Move to SE.
/     Reflect to E. Switch to Cardinal.
d     Push the stack depth, which is one more than the number of list
      elements (due to the other input string on the stack).
2-    Subtract 2.
&+    Run + that many times, which implicitly converts the second string
      to the integers it contains and then adds up all the list elements.
!     Store the sum on the tape.
w     Push the current IP position to the return address stack. This
      lets us return here repeatedly to implement a loop.

  ?+    Retrieve the input sum from the tape and add it to the current
        element.
  2%    Compute its parity. Other ways to do this are 1A and 0x. 2F would
        also work but it gives 0/2 instead of 0/1.
        The IP wraps the first column of the grid.
  \     Reflect to NE. Switch to Ordinal. The IP bounces diaginally up
        and down until it hits the next \.
  O     Implicitly convert the current parity to a string and print it
        with a trailing linefeed.
  #     Skip the next command (the H).
  \     Reflect to E. Switch to Cardinal.
  d     Push the stack depth. This is zero when we're done.
  $     Skip the next command if the stack depth is indeed zero, which
        exits the loop.

K     Jump to the return address on top of the return address stack without
      popping it (so that the next K will jump there again).

@     Terminate the program.

6

Pyth、7 6バイト

mi2-sQ

-1バイト@KZhangに感謝

奇数の場合は1、偶数の場合は2を出力します。

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

説明

m%-sQd2
m      Q    # For each element in the (implicit) input list
   sQ       # Take the sum of all the elements
  -  d      # subtract that element, so that we now have the sum of the other elements
 %    2     # modulo 2; 1=off, 0=even

モジュロ%_2をGCD i2_d変更することにより、コードをに暗黙的に変更してmi2-sQ、バイトを節約することさえできます。出力は、偶数の場合は2、奇数の場合は1に変更されます。
Kチャン



4

R、21バイト

(sum(n<-scan())-n)%%2

stdinからリストを読み取り、偶数の場合は0、奇数の場合は1を返します。入力を外部で呼び出す代わりにn、呼び出し内の変数にバインドしますsum。つまり、n=scan();(sum(n)-n)%%2

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



3

Clojure、30バイト

#(for[i %](odd?(apply - i %)))

各値からすべての値を順番に減算します。たとえば、入力で[a b c d]は2番目の計算値はb - a - b - c - d= -(a + c + d)です。出力がありfalseさえためとtrue奇数のために。

しかし+、パリティに影響を与えないように、後続の各用語を2回使用して計算することもできます。


3

CJam、10バイト

{_:+f+1f&}

これは、スタックから入力を受け取り、それを出力で置き換える匿名ブロック(関数)です。

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

説明

入力を検討してください[1 2 3 1]

{         e# Begin block
          e#   STACK: [1 2 3 1]
  _       e#   Duplicate
          e#   STACK: [1 2 3 1], [1 2 3 1]
  :+      e#   Fold addition over the array: compute its sum
          e#   STACK: [1 2 3 1], 7 
  f+      e#   Map addition over the array with extra parameter
          e#   STACK: [8 10 11 8]
  1       e#   Push 1
          e#   STACK: [8 10 11 8], 1
  f&      e#   Map bit-wise "and" over the array with extra parameter
          e#   STACK: [0 0 1 0]
}         e# End block




2

Perl 5、31バイト

sub{map$x+=$_,@_;map$x-$_&1,@_}

1奇数と偶数の出力0


+1、いいね。ただし、これは28バイトだと思いますperldoc perlsub。「署名はサブルーチンの本体の一部です。通常、サブルーチンの本体は単純なコードブロックです。」
msh210

@ msh210ありがとう!サブルーチンの本体はたった28バイトであることは確かですが、それをsub壊さずに除外することはできません。
クリス

ただし、サブルーチンは、なしでsub、たとえば、後sortまたはgrep別のサブルーチンへの引数として機能する場合があります。これはCode Golf Metaについて尋ねる価値があるかもしれません。
msh210

@ msh210 Aサブルーチンはせずに動作しますsubそれは試作機能で使用されている(場合にのみ、sortgrep多かれ少なかれ試作されます)。しかし、そうでなければ、subが必要です。とにかく、3バイトを省略してゴルフをするのsubはあまり面白くない。
ダダ

2

Clojure(スクリプト)、36バイト

出力はtrue奇数用と偶数false用です。出力と入力は両方ともシーケンスです。

(fn[l](map #(odd?(-(apply + l)%))l))

2

PHP、50バイト

オンライン版

奇数の場合は1、偶数の場合は0

で区切られた文字列として出力 _

<?foreach($_GET as$v)echo array_sum($_GET)-$v&1,_;

PHP、72バイト

配列使用として出力 array_map

<?print_r(array_map(function($v){return array_sum($_GET)-$v&1;},$_GET));

1
ドロップし?:0ても何もしません。foreach($_GET as$v)echo array_sum($_GET)-$v&1,_;
クリストフ

2

C、68 62バイト

i;s;f(c,l)int*l;{while(i<c)s+=l[i++];while(i)l[--i]=s-l[i]&1;}

奇数の場合は1、偶数の場合は0

オンラインで詳細を試す

f(int c, int * l)
{
    int i = 0, s = 0;

    while(i < c)
    {
        s = s + l[i];
        i = i + 1;
    }

    // assert(i == c)

    while(i > 0)
    {
        i = i - 1;
        l[i] = s - l[i]&1;
    }
}

2

網膜40 38バイト

\d+
¶$` $'
^¶

\d+
$*
+` |11

%M`1
¶
 

オンラインでお試しください!奇数の場合は1、偶数の場合は0を出力します。説明:最初の2行は、入力内の各数値に対して入力を1回複製しますが、要素自体はありません。これにより、余分な空白行が作成され、削除されます。次に、入力が10進数から単項に変換され、スペースが削除されてパリティが計算されます。その後、偶数パリティがゼロに変換され、結果が1行に戻されます。編集:@FryAmTheEggmanのおかげで2バイト保存されました。私は概念的にはもっと楽しいが、表現するにはバイトが多すぎるいくつかの他のバージョンを試しました:

\d\B

T`2468O`00001
T`d`10`^([^1]*1[^1]*1)*[^1]*1[^1]*$

すべての入力をパリティに変更し、合計のパリティが奇数の場合、すべてのパリティを反転します。

\d+
$*
^.*
$&¶$&
 (?=.*$)

11

\B
0
T`d`10`.*¶1
¶0

入力の複製を合計し、すべてのパリティを取得し、合計が奇数の場合はパリティを反転し、合計を再度削除します。


私が思いついたことを試してみて、少し短い解決策を得ましたが、まだ最適ではないと思います。特に、最後に取得した余分なゼロをどのように処理するのが好きではありません。
FryAmTheEggman

@FryAmTheEggman節約できるのは、;sをスペースに変換する目に見えない方法があることです。;先頭に置くと、0に変換した後ではなく、すぐに削除してバイトを保存できます
ニール

実際、もう一度見てみると、最後の段階で改行をスペースに置き換えるだけではないのはなぜですか?それは2バイト節約しませんか?
-FryAmTheEggman

@FryAmTheEggmanはい。私はもともと、以前の反復で複数の代替品を作成したと思います。
ニール




1

Brain-Flak94 68 66バイト

({({}<>)<>})<>{<>(({})<({}<>{}<>(())){({}[()]<([{}])>)}{}>)<>}<>{}

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

これは、タスクには少し長いようです。これを行うには、もっと便利な方法があるかもしれません。

説明

最初に、スタックの合計を計算します:

({({}<>)<>})

スタック全体を調べて、その結果を各要素に追加し、ペアを決定します

<>{<>(({})<({}<>{}<>(())){({}[()]<([{}])>)}{}>)<>}<>{}

これは、このチャレンジのために思いついたかなりクールなmod 2アルゴリズムを使用しています。

({}(())){({}[()]<([{}]())>)}{}

これ1-nは、前に配置した1を実行するたびに入力がゼロに達するまで、入力の下に1をプッシュし、入力を削除します。


最後にmod 2を変更できます。合計をmod 2する必要はありません。
リーキー修道女

@LeakyNunありがとう!私はそのことに気づき、修正を行いました。
小麦ウィザード

1

ワイズ54 52バイト

::^:??[:!^:?^:!^:?^?]|!::^??[!:?^:><^!:?^:!^:?^?]!&|

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

説明

このコードは、上位2つの要素をスワップするのにそれほど多くのバイトを必要としない場合、はるかに短くなります。現在の記録は

:?^:!^:?^!

残念ながら、これがコードの大部分を占めています。


まず、スタックのXOR合計を取得します

::^:??[:!^:?^:!^:?^?]|!

次に、これをすべての要素とXORし、最後のビットがゼロになった要素

::^??[!:?^:><^!:?^:!^:?^?]!&|

1

Java81 78バイト

Kevin Cruissenのおかげで3バイト

void f(int[]a){int s=0,i=a.length;for(int x:a)s+=x;for(;i-->0;a[i]=s-a[i]&1);}

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

配列をその場で変更します。


:あなたはこのような3バイトだけゴルフをすることができますvoid f(int[]a){int s=0,i=a.length;for(int x:a)s+=x;for(;i-->0;a[i]=s-a[i]&1);}
ケビンCruijssen

ラムダを使用する場合は67バイト:オンラインで試してください!
ブライアンマックラッチン

ありがとう、でもラムダを使うのは好きじゃない。
リーキー修道女

1

AWK、64バイト

{for(i=0;++i<=NF;print s[i]%2)for(j=0;++j<=NF;)if(i!=j)s[i]+=$j}

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

改行で区切られた偶数合計01奇数合計に対してa を出力します。わずかに独創的な思考でさえ、printコマンドをfor「増分」ステップ内に配置するだけでした。いくつかの「賢い」印刷方法を試しましたが、バイトを節約できませんでした。

笑いのためだけに、改行が必要ない場合:

{for(i=0;++i<=NF;m=m,s[i]%2)for(j=0;++j<=NF;)if(i!=j)s[i]+=$j}1

上記と同じバイト数ですが、もう少し鈍いです。


1

スイフト-55バイト

ついにCを打ち負かす! また、0は偶数、1は奇数

func g(a:[Int]){for i in a{print((a.reduce(0,+)-i)%2)}}

使用法のある関数: g(a: [1,2,3,2,1] // => 0 1 0 1 0

見てみな!


スウィフトに慣れていない、しかし、あなたは置き換えることができ、多くの言語に(x-y)%2してx-y&1
Cyoce

@Cyoce私にとっては、テスト後は機能しません。ビット演算は、スウィフトの得意ではありません
氏Xcoder

1

公理、45バイト

f(a)==[(reduce(+,a)-a.j)rem 2 for j in 1..#a]

入力タイプのチェックなし、合計「a」各要素の再計算の可能性...テスト

(27) -> [[a,f(a)] for a in [[1,2,3,1], [1,2,3,2,1], [2,2], [100, 1001] ]]
   (27)
   [[[1,2,3,1],[0,1,0,0]], [[1,2,3,2,1],[0,1,0,1,0]], [[2,2],[0,0]],
    [[100,1001],[1,0]]]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.