誰が選挙に勝ちますか?


32

これは、1人と2人の2人が出勤するという課題です。1と2の世界では、人々は特定の方法で決定論的に投票するため、候補者は選挙前に結果を把握できます。

注:これは、外部の選挙やその他の政治的出来事を指すものではありません。

2人がオフィスに走っています。これらの人々を1と2と呼びます。どちらも選挙に勝つかどうかを知りたがっているので、彼らは人々の知識といくつかのコードを使用して結果がどうなるかを判断します。政府の支出を最小限に抑えるため、コードはできるだけ短くする必要があります。

あなたの仕事:投票方法に基づいて一連の人々を与え、選挙で勝った人を出力します。

1と2の楽しくてエキサイティングな世界には5種類の人々がいます。

  • A:1に間違いなく投票する人
  • B:間違いなく2に投票する人。
  • X:左の人が投票する人に投票する人。左に人がいない場合は、右の人が投票する人に投票します。自分の権利のある人が誰に投票しているかが明確でない場合、彼らは投票しません。
  • Y:人々は左の人の反対に投票します。左側に人がいない場合は、右側にいる人の反対に投票します。自分の権利のある人が誰に投票しているかが明確でない場合、彼らは投票しません。
  • N:投票しない人。

これは左から右に評価されます。

例:

明確にするために、「評価」されている人はすべて小文字です。

Input: `XXAYAN`
        xX      Votes for whoever their friend is voting for. Their friend has not decided yet, so it is unclear, so they do not vote.
        Xx      Person to left is voting "none" so votes "none."
          a     Votes for 1
          Ay    Since person on left is voting for 1, votes for 2.
            a   Votes for 1
             n  Does not vote

最終投票:

  • 2人が1票を投じました

  • 1人が2に投票しました

  • 3人が投票しませんでした

1票が最も多いので、1勝!

テストケース:

他の文字または値は、区別できる限り、入力および出力として使用できます。(例:文字の代わりに数字、異なる文字、小文字、真実/偽、または正/負(出力用)など)

Input -> Output

"AAAA" -> 1
"BBBB" -> 2
"BBAXY" -> 2
"BAXYBNXBAYXBN" -> 2
"XXAYAN" -> 1
"AAAABXXXX" -> 2
"AXNXXXXAYB" -> 1
"NANNY" -> 1
"XA" -> 1
"YAB" -> 2
"XY" -> anything (do not need to handle test cases with no victor)
"AB" -> anything (do not need to handle test cases with no victor)

1
@EriktheOutgolfer ANNYはA NNと同じです。NXとNYはNNになります。
同志SparklePony

5
コメントでの動作が正しい場合、それnoneはの反対であると指定する価値があるかもしれません。noneNY
カミルドラカリ

1
私見はそこから始まるテストケースである必要がありXAXBYAYB
ニール

1
入力に含まれる文字は1文字のみですか?たとえば、「A」、「X」、「Y」、「N」。
tsh

2
出力は2つの異なる値である必要がありますか、たとえば、1が勝った場合に正の整数を出力し、2が勝った場合に負の整数を出力できますか?
ケビンクルーッセン

回答:


9

Perl 5の、56の 80 72 65 53バイト

ケースXまたはYを最初の位置に、AまたはBを2番目に処理する+26バイト。出力は1、1が空の場合(perlのfalse値)、それ以外の場合です。

s/^X(.)/$1$1/,s/A\KX|B\KY|^Y(?=B)/A/|s/B\KX|A\KY|^Y(?=A)/B/&&redo;$_=y/A//>y/B//

TIO

使用するPと、S代わりにXY、文字の上にXOR演算を使用できるように、いくつかのより多くのバイトを救います

s/(?|^(P|S)(?=(A|B))|(A|B)\K(P|S))/P^$1^$2/e&&redo;$_=y/A//>y/B//

分岐リセット・グループを使用しています(?|。.. |。.. )だから、$1 $2支店内のグループに対応する参照のうえ。\0andの\3代わりにXand を使用するY

$_=s/^\W(?=(\w))|(\w)\K\W/$1.$2^$&/e?redo:y/A//>y/B//

72バイト

65バイト

53バイト


私の最後の理解から、彼らはもう数えられません
ナウエル・フイユル

これが正しく処理しないXY、文字列の先頭に。試してみてくださいXBAYAB
グリムミー

@Grimy、更新
Nahuel Fouilleul

9

Java 8、153 141 135 131 129バイト

a->{int l=a.length,t,r=0,i=-1;for(;++i<l;r+=(t=a[i]=a[i]>4?t<3?t^3:3:a[i]>3?t:a[i])>2?0:3-t*2)t=a[i>0?i-1:i<l-1?i+1:i];return r;}

整数配列を入力として使用し、Aが勝った場合A=1, B=2, N=3, X=4, Y=5は正の>= 1整数(<= -1)、Bが勝った0場合、または引き分けの場合は負の整数()を出力します。

@OlivierGrégoireのおかげで-18バイト。

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

説明:

a->{                      // Method with int-array parameter and boolean return-type
  int l=a.length,         //  Length of the input-array
      t,                  //  Temp integer, uninitialized
      r=0,                //  Result-integer, starting at 0
  i=-1;for(;++i<l         //  Loop `i` in the range [0, l):
           ;              //    After every iteration:
            r+=           //     Increase the result by:
             (t=a[i]=     //       Change `i`'th item in the array to:
                 a[i]>4?  //        If the `i`'th item is a 5:
                  t<3?    //         If `t` is 1 or 2:
                   t^3    //          Use `t` Bitwise-XOR 3 to invert it
                          //          (1 becomes 2; 2 becomes 1)
                  :       //         Else (`t` is 3, 4, or 5 instead):
                   3      //          Set it to 3
                 :a[i]>3? //        Else-if the `i`'th item is a 4:
                  t       //         Set it to `t`
                 :        //        Else (the `i`'th item is a 1, 2 or 3):
                  a[i])   //         Leave it unchanged
             )>2?         //      And if this new `i`'th value is 3, 4, or 5:
              0           //       Leave the result the same by increasing it with 0
             :            //      Else (it's 1 or 2 instead):
              3-t*2;      //       Increase it by 3 minus two times the `i`'th value
                          //       (which is 1 for 1; and -1 for 2)
         t=               //   Set `t` to:
           a[i>0?         //    If `i` is not the first item:
              i-1         //     Set `t` to the previous (`i-1`'th) value
             :i<l-1?      //    Else-if `i` is not the last item:
              i+1         //     Set `t` to the next (`i+1`'th) value
             :            //    Else (`i` is the first or last item):
              i];         //     Set `t` to the current item itself
  return r;}              //  Return the result
                          //  (positive if A wins; negative if B wins; 0 if it's draw)

i=0;for(int n:a)i+=n<2?1:n<3?-1:0;return i>0;数バイトを節約します。
オリビエグレゴワール

1
実際にi=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;は、さらに短くなります。
オリビエグレゴワール

@OlivierGrégoireありがとう!あなたの最初のコメントを見たとき、私はもっと短いものを見つけようとしていましたが、あなたはあなたの2番目のコメントで私にそれを打ちました。;)
ケビンクルーッセン

1
最初のループに2番目のループをマージして131バイト。しかし、それは正しくないと思われ、いくつかのテストケースを追加する必要があるかもしれません...
オリビエグレゴワール

@OlivierGrégoireありがとう!temp変数とさらにマージすることで、さらに4バイトをゴルフすることができました。そして、それについて何が間違っていると感じますか?System.out.println(java.util.Arrays.toString(a));ループの後にaを追加すると、期待どおりに変更されたことがわかります(imo)。コードのどの部分が原因で、どのようなテストケースが誤った結果をもたらすと思いますか?
ケビンクルーイッセン

8

Haskell、60 50 48 59バイト

l#(v:o)|v<2=v+v#o|n<-(3-v)*l=n+n#o
_#_=0
f x=rem(x!!1)2#x>0

用途1のためにA-1のためにB0のためにN2X4Y。勝ったTrue場合Aはelseを返しますFalse

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

入力リストの再帰的な方法1A-1に対するすべての投票、Bおよび0「投票なし」に対するすべての投票に対して追加します。次lが最後の投票vです。v=1-1または0(またはv<2)の場合、合計に追加します。vが「同じ投票」の場合(Xチャレンジで2は、私のソリューションの場合)、キープして追加しますl(3-2)*l= l)。v「反対の投票」の場合(Yチャレンジで4は、私のソリューションの場合)、まず否定l(3-4)*l= -l)してから追加します。基本ケースは、合計がで始まる空のリスト0です。再帰はどこにl設定されて開始されますrem s 2s入力リスト(x!!1)の2番目の要素です。rem s 2にマップ1-1、それ自体に、他のすべての値はに0lとにかく修正票は無視します[*]、XまたはY修正票の場合は正しい隣人を取得します。合計が正であれば、A勝ちます。

[*] [1]Haskellの怠さのために、2番目の要素へのアクセスが評価されないため、これは作業のような修正票を持つシングルトンリストを作成します。入力[2]はエラーで失敗しますが、考慮する必要はありません。



1
@Grimy:指摘してくれてありがとう。一定。
nimi


4

05AB1E34 33 32 30 バイト

gFÐNè©2@iNx1.S-èDÄ2‹*D(‚®èNǝ]O

整数配列を入力として使用し、Aが勝った場合A=-1, B=1, N=0, X=2, Y=3は負の<= -1整数(>= 1)、Bが勝った0場合、または引き分けの場合は正の整数()を出力します。

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

説明:

g             # Take the length of the (implicit) input-list
              #  i.e. [3,1,3,3,2,0,1] → 7
 F            # Loop `N` in the range [0, length):
  Ð           #  Triplicate the list at the top of the stack
              #  (which is the implicit input-list in the first iteration)
   Nè         #  Get the `N`'th item of the list
              #   i.e. [3,1,3,3,2,0,1] and `N`=0 → 3
              #   i.e. [-1,1,-1,3,2,0,1] and `N`=3 → 3
     ©        #  Store it in the register (without popping)
   2@i        #  If it's larger than or equal to 2 (so either 2 or 3):
      Nx      #   Push `N` and `N` doubled both to the stack
              #    i.e. `N`=0 → 0 and 0
              #    i.e. `N`=3 → 3 and 6
        1.S   #   Compare the double integer with 1 (-1 if N*2<1; 0 if N*2==1; 1 if N*2>1)
              #   (So this will be -1 in the first iteration, otherwise it will be 1)
              #    i.e. 0 → -1
              #    i.e. 6 → 1
            #   Subtract that from the index, and index it into the list
              #    i.e. `N`=0 and -1 → 1 (first item, so get the next index)
              #     → [3,1,3,3,2,0,1] and 1 → 1
              #    i.e. `N`=3 and 1 → 2 (fourth item, so get the previous index)
              #     → [-1,1,-1,3,2,0,1] and 2 → -1
      D       #   Duplicate that value
       Ä2    #   Check if that value is -1, 0, or 1 (abs(i) < 2) (truthy=1; falsey=0)
          *   #   And multiply that with the value
              #   (remains the same if truthy; or becomes 0 if falsey)
      D(‚     #   Pair it with its negative (-1 becomes [-1,1]; 1 becomes [1,-1])
         ®è   #   And index the `N`'th value (from the register) into it (with wraparound)
              #   (if it was a 2, it uses the unchanged (first) value of the pair;
              #    if it was a 3, it uses the negative (second) value of the pair)
              #     i.e. [1,-1] and 3 → -1
              #     i.e. [-1,1] and 3 → 1
      Nǝ      #   And replace the `N`'th value with this
              #    i.e. [3,1,3,3,2,0,1], `N`=0 and -1 → [-1,1,3,3,2,0,1]
              #    i.e. [-1,1,-1,3,2,0,1], `N`=3 and 1 → [-1,1,-1,1,2,0,1]
 ]            # Close both the if-statement and loop
  O           # Sum the modified list (which now only contains -1, 0, or 1)
              #  i.e. [-1,1,-1,1,1,0,1] → 2

3

Retina 0.8.2、70バイト

AY
AB
BY
BA
}`(A|B)X
$1$1
^X(A|B)|^Y[AB]
$1$1
+`N|X|Y|AB|BA

.+|(?<=B)

オンラインでお試しください!リンクにはテストケースが含まれます。0同点の出力。説明:

AY
AB
BY
BA

Y投票権のある人の権利を有権者に処理する。

}`(A|B)X
$1$1

ハンドルX決定票を持つ人々の権利、およびすべての可能になるまで、ループバックに有権者YXの投票を決定することができます。

^X(A|B)|^Y[AB]
$1$1

X決定された投票の横にある最初の有権者と、決定された投票の横にある最初の有権者を処理しYます。この投票者は決定された投票と反対の投票を行うため、この場合は両方の投票を削除するだけです。

+`N|X|Y|AB|BA

残りの無投票または未決定の投票を削除し、反対の決定された投票のすべてのペアをキャンセルします。すべての可能な投票が取り消されるまで繰り返します。同数の場合、何も残されません。それ以外の場合、残りの票はすべて同じタイプになります。

.+|(?<=B)

1票がある2場合は出力しますが、票がある場合は出力しBます。


3

JavaScript(Node.js)、42バイト

s=>s.map(c=>x+=l=c%2|l*c/2,l=s[x=1]%2)|x>1

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

Shaggyのおかげで1バイト節約できます。


  • N = 0、A = -1、B = 1、X = 2、Y = -2の整数配列として入力します。
  • 出力1 =偽、2 =真実

2
あなたのTIOを出力するようだ013の代わりに、12
ケビンクルーッセン

1
@KevinCruijssenしかし、OPは、正しく理解していれば、出力として真実と偽を許可しました。Falsyはゲームに1勝、真実は2勝を意味します。
tsh

ああ3、JSでも忘れていたのは真実です。私は0/ 1を偽り/真実だといつも思っています。また、個別の出力が不要になったため、0= 1勝と>= 1= 2勝でも問題ありません。だから私から+1。
ケビンクルーッセン

論理ORではなく、ビット単位のORを使用してバイトを保存できるようです。
シャギー

@Shaggyとても奇妙です。できます。
tsh

2

Python 3 2、 125 121 117バイト

(ジョナサン・フレッシュに感謝)

def f(x):
    for i,v in enumerate(x):n=x[i-(i>0)];x[i]=(v>3)*n+abs(n-1)*(v<0)+x[i]*(0<v<4)
    print x.count(1)>x.count(0)

タブのインデントを使用する

入力:intsのリスト。「A」= 1、「B」= 0、「X」= 4、「N」= 3、「Y」=-1であるため、「AAAA」は[1, 1, 1, 1]「XXAYAN」[4, 4, 1, -1, 1, 3]。。

[{'A': 1, 'B': 0, 'X': 4, 'N': 3, 'Y': -1}[c] for c in s] 文字列を必要な入力形式に変換します。

オンラインで試すことができます!(提案をしてくれたJonathan Frechに感謝)


こんにちは、PPCGへようこそ。TIOを使用することをお勧めします。コードを適切にフォーマットするからです。さらに、私はあなたの入力フォーマットをよく理解していません。OPにその有効性について尋ねなければならない場合があります。
ジョナサン

ゴルフのヒントとして、(i, i-1)[i>0]と同等である必要がありますi-(i>0)
ジョナサンフレッチ

さらに、ifがになる可能性がありx[i]+=(v>3)*n+abs(n-1)*(v<0)ます。次に;、のと同じ行で(を使用して)今では非複合ステートメントを移動することにより、インデントを節約できforます。
ジョナサンフレッチ

@JonathanFrechありがとうございます。入力をより適切に説明したいと思います
user24343

1

Perl 5、54バイト

s/^\W(?=(\w))|(\w)\K\W/$1^$2^$&/e&&redo;$_=y/A//>y/B//

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

用途AのためにABのためにBNのためにN\0Xおよび\3Y用の(最後の二つのリテラル制御文字です)。A秘Theは、ビットごとのxor \3がに等しいことB、およびその逆です。


それは私の答えの多くのアイデアを使用していますが、バックスラッシュ文字クラスを使用するメリットを認識していないことを除いて、印刷不能文字を入力および出力として使用できるかどうかはわかりませんでした
Nahuel Fouilleul

1

Javascript(ES6)-133バイト

a=>(i=($=_=>'AB'.search(_)+1)(a[1],o=0),[...a].map(v=>(r=['NAB','NBA']['XY'.search(x)],p=r?r[i]:v,i=$(p),o+='NA'.search(p))),o>0?1:2)

OPで指定された形式の文字列を受け取り、候補者1が勝った場合は1を返し、そうでない場合は2を返します(認めますが、偏りがあります)。


1

パイソン295の 73バイト

lambda(v):sum([l for l in[2*int(v[1]/2)]for i in v for l in[i*l**(i%2)]])

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


  • N = 0、A = -2、B = 2、X = 1、Y = -1の整数配列として入力します。
  • 出力負= A、0 =描画、正= B
  • 最初の入力がXまたはYの場合、2 * int(v [1] / 2)は2番目をそれ自体または0にマッピングします

余分なバイトを追加するバグ修正が必要でしたが、@ Stephenのおかげでラムダに変換すると95に戻りました


空白を削除して関数をラムダ関数に変更することで74バイト
Stephen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.