モジュロパリティパーティ


15

n≥2n個の厳密に正の整数の配列Aが与えられます。

あなたの仕事は、各エントリA iを以下にマップすることです:

  • 1場合A J MOD A iが各奇数であるJように1≤J≤N及びJ≠I
  • A j mod A i1≤j≤nかつj≠iであるようなjごとに偶数の場合は2
  • そうでない場合は0(混合パリティ)

A = [73、50、61] 、我々が持っています:

  • = 50 MOD 73 50、61 MOD 73 = 61 →混合
  • = 73 MOD 50 23、61 MOD 50 = 11 →すべての奇数
  • = 73 MOD 61 12、50 MOD 61 = 50 →全ての偶数

したがって、予想される出力は[0、1、2]です。

ルール

  • あなたは、任意の三つの異なる(任意の型の)値の代わりに使用することができます012を、彼らは一貫している限り。チャレンジで説明されているマッピングを使用していない場合は、マッピングを指定してください
  • それについて疑問がある場合、ゼロは偶数です。
  • これはなので、バイト単位の最短回答が勝ちです!

テストケース

[ 1, 2 ] --> [ 2, 1 ]
[ 3, 4 ] --> [ 1, 1 ]
[ 1, 2, 3 ] --> [ 2, 1, 0 ]
[ 4, 4, 4 ] --> [ 2, 2, 2 ]
[ 73, 50, 61 ] --> [ 0, 1, 2 ]
[ 941, 459, 533 ] --> [ 1, 0, 0 ]
[ 817, 19, 928, 177 ] --> [ 1, 2, 1, 1 ]
[ 312, 463, 336, 729, 513 ] --> [ 0, 2, 0, 0, 0 ]
[ 53, 47, 33, 87, 81, 3, 17 ] --> [ 0, 0, 0, 1, 0, 2, 0 ]


出力値は整数でなければならないか、だろうか[1][0, 1][1, 1]仕事?
デニス

@Dennis一貫性のある値であれば問題ありません。それで、はい、それはうまくいくでしょう!
アルノー

回答:



4

ゼリー、9バイト

%þœ-€0Ḃ‘Ṭ

0、1、2の代わりに[1、1]、[0、1]、[1]を返します。

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

使い方

%þœ-€0Ḃ‘Ṭ  Main link. Argument: A (array)

%þ           Build the modulus table.
  œ-€0       Remove one 0 from each list of moduli.
      Ḃ      Take the last bit of each.
       ‘     Increment, mapping 0 and 1 to 1 and 2.
        Ṭ    Untruth; map each array to an aray of 1's at the specified indices.
             This yields:
                 [1] if the array contains only 1's (all even).
                 [0, 1] if the array contains only 2's (all odd).
                 [1, 1] if the array contains 1's and 2's.

に置き換え‘ṬUḄQ€Ḅバイトを保存できますか?
ジョナサンアラン

悲しいことに、いいえ。またはをQ€返すことができます。[0, 1][1, 0]
デニス

ああ、そう。私が思うに[1][1,1]と、[0,1]そう三つの異なる値であり、%þœ-€0Ḃ‘Ṭ9 EDITのために許容されるべきである-ああ、私はあなたがこの正確な質問:)尋ね見る
ジョナサン・アラン

もう1つの9バイトの代替は、¹-Ƥ%"%2‘Ṭ
マイルです。

3

MATL、12バイト

!G\o~tAws1=-

この用途0-11代わりに012それぞれ。

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

説明

!    % Implicit input: row vector. Transpose into a column
G    % Push input again
\    % Modulus, element-wise with broadcast. Gives a square matrix
o    % Parity: gives 1 for odd, 0 for even
~    % Logical negate: 0 for odd, 1 for even
t    % Duplicate
A    % All: gives 1 for columns that contain only 1
w    % Swap
s    % Sum of each column
1    % Push 1
=    % Is equal? Gives 1 if the column sum was 1, 0 otherwise
-    % Subtract, element-wise. Implicit display

3

C(GCC) 118の 114 97 92 91バイト

  • バグ修正してくれたPeter Cordesに感謝します。
  • Peter Cordesのおかげで4つの 21バイトを節約しました。別の出力値マッピングを使用することを提案します。。[0 1 2] ~ [3 2 1]
  • 5バイトを保存しました。さらに別のマッピングを使用します。[0 1 2] ~ [  ]
  • バイトを保存しました。にゴルフfor(i=0;i<n;i++,putchar...したfor(i=~0;++i<n;putchar...
i,j,r;f(A,n)int*A;{for(i=~0;++i<n;putchar(r)){for(j=r=0;j<n;j++)j-i&&(r|=1<<A[j]%A[i]%2);}}

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


TIOのテスト関数は十分な引数を渡さず、この未定義の動作により、最後のテストケースからゼロによる除算(SIGFPE)が発生します。 (f()の)f(I,7)の最初の要素を、ローカルとして使用している引数の1つで上書きします。 I[]A[]f()argが呼び出し側によってスタックに渡されたと仮定しますが、呼び出し側はそれを知らず、実際に戻りアドレスの上のスタックにあるのはA[0]です。(つまり、このUBが原因tA[0]、同じアドレスを持っている)。とにかく、これはTIOのテスト関数の UBのみです。
ピーター

ところで、クラッシュをローカルで再現できなかったため、追加する必要がありました execlp("/usr/bin/objdump", "objdump", "-drwC", "-Mintel", argv[0], 0);たため、mainにしてTIOのgcc 7.2.1からasmを取得する必要がありましたが、これは私のArch Linux gcc 7.2.1と完全には一致しませんでした。その逆アセンブリを呼び出し元関数のasmソースに戻した後、gdb内でローカルに再現し、何が起こっているかを正確に確認できました。
ピーター・コーデス

あなたも1、奇数のための2、混合のための3のように、異なるマッピングを使用してバイト救うかもしれないので、あなたのことができo|=1<<(A[j]%A[i]%2)のための復号あらゆる空想を必要とせずo
ピーター

@PeterCordes最初の配列エントリが上書きされる理由がまだ完全には理解されていませんが、ご指摘いただきありがとうございます。ここで、ローカル変数の代わりにグローバル変数を使用することを選択し、未定義の動作を削除しました。
ジョナサンフレッチ

@PeterCordes私もあなたのゴルフの提案を受けて、なんとか4バイト節約できました。これは本当にあなたが書いたように、あなたが、示唆されていたものだった場合しかし、私は知らないo|=1<<...の代わりの線に沿って何かをo|=1<<(t=...
ジョナサンフレッチ

3

Mathematica、57 49 48バイト

(s=#;And@@#.Or@@#&@OddQ@Rest@Sort[s~Mod~#]&)/@#&

これは返します:

  • False.True以下のための0(混合)
  • True.True以下のための1(全ての奇数)
  • False.False以下のための2(すべての偶数)

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

もう少し長い選択肢(49バイト)を次に示します。

Sign[(s=#;Tr@Mod[s~Mod~#,2]&)/@#/.Tr[1^#]-1->-1]&

これは以下を返します:

  • 1以下のための0(混合)
  • -1以下のための1(全ての奇数)
  • 0 にとって 2(すべての偶数)

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



2

JavaScript(ES6)、46バイト

a=>a.map(A=>a.map(B=>d+=B%A%2,d=0)|!a[d+1]-!d)

-1(偶数)、1(奇数)、および0(混合)を返します。

使い方:

dアキュムレータは次のようになります。

  1. すべてのモジュラスがゼロの場合。(!a[d+1]== false、!d== 1、false - 1== -1
  2. モジュラスがすべて奇数の場合、配列の長さより1つ少ない*。(*アキュムレータには、それ自体に対してモジュラス化された要素が含まれ、1つの偶数モジュラスになります。)(!a[d+1]== true、!d== 0、true - 0== 1
  3. ミックスの場合、配列の長さよりも2つ以上短い。(!a[d+1]== false、!d== 0、false - 0== 0

テストケース:


1

J27 20バイト

[:<@~.@}:@\:"1~2||/~

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

0 1 2の代わりに[1 0] [1] [0]を使用します

説明:

|/~ -剰余を含むテーブルを作成します。

  |/~ 73 50 61 
 0 50 61
23  0 11
12 50  0

2|奇数または偶数?:

   2||/~ 73 50 61 
0 0 1
1 0 1
0 0 0

<@~.@}:@\:"1 -並べ替え、最後の要素をドロップ(常にゼロ)、元の要素を保持し、各行をボックス化します。

   <@~.@}:@\:"1~2||/~ 73 50 61 
┌───┬─┬─┐
│1 0│1│0│
└───┴─┴─┘

1
2/:~@:|"1]|1]\.]ペアのリストを返す16バイト。
マイル

@マイルありがとうございます!この出力は受け入れられますか?
ガレンイワノフ

実際、いいえ、個別の値に関する部分を見逃しました。少し後で説明します。
マイル


1

Perl、38バイト

含み+3のために-p

#!/usr/bin/perl -p
s/\d+/$@|=$_%$&%2+1for<$`$'>;$@/gee

出力はすべて偶数、2はすべて奇数、3は混合





1

Java 8、91 89バイト

a->{for(int z:a){int s=1;for(int y:a)s+=y%z%2;System.out.print(" "+(s<a.length)+(s<2));}}
  • truetrue代わりに2偶数の
  • falsefalse代わりに1奇数の
  • 混合のtruefalse代わりに使用0

説明:

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

a->{                      // Method with integer-array parameter and no return-type
  for(int z:a){           //  Loop over the array
    int s=1;              //   Sum-integer, starting at 1
    for(int y:a)          //   Inner loop over the array again
      s+=y%z%2;           //    Increase the sum by `y` modulo-`z` modulo-2
    System.out.print(" "  //   Print a space
      +(s<a.length)       //    + "true" if the sum is smaller than the length of the array
                          //      (this means there is at least one even)
      +(s<2));}}          //    + "true" if the sum is still 1
                          //      (this means all are even)

0

Clojure、82バイト

#(for[R[(range(count %))]i R](set(for[j R :when(not= i j)](odd?(mod(% j)(% i))))))

出力変換の完全な例:

(def f #(for[R[(range(count %))]i R](set(for[j R :when(not= i j)](odd?(mod(% j)(% i)))))))
(->> [ 53, 47, 33, 87, 81, 3, 17] f
     (map {#{true} 1, #{false} 2, #{true false} 0}))
; (0 0 0 1 0 2 0)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.