Siapa yang akan memenangkan pemilihan?

32

Ini adalah tantangan di mana dua orang, 1 dan 2, berlari untuk jabatan. Orang-orang secara menentukan memilih dengan cara tertentu di dunia 1 dan 2, yang dapat memungkinkan para kandidat untuk mengetahui hasilnya sebelum pemilihan.

CATATAN: ini tidak dimaksudkan untuk merujuk pada pemilihan luar atau peristiwa politik lainnya.

Dua orang berlari untuk kantor. Kami akan memanggil orang-orang ini 1 dan 2. Karena mereka berdua ingin tahu apakah mereka akan memenangkan pemilihan, mereka memutuskan untuk menggunakan pengetahuan mereka tentang orang-orang dan beberapa kode untuk mengetahui apa hasilnya. Karena ingin meminimalkan pengeluaran pemerintah, kode ini harus sesingkat mungkin.

Tugas Anda: Diberikan serangkaian orang berdasarkan bagaimana mereka memberikan suara, hasil siapa yang memenangkan pemilihan.

Ada lima jenis orang di dunia 1 dan 2 yang menyenangkan dan menarik:

  • A: orang yang pasti akan memilih 1.
  • B: orang yang pasti akan memilih 2.
  • X: orang yang akan memilih siapa pun orang di sebelah kiri mereka akan memilih. Jika tidak ada orang di sebelah kiri mereka, maka mereka memilih siapa pun orang di sebelah kanan mereka akan memilih. Jika tidak jelas untuk siapa orang yang berhak memilihnya, maka mereka tidak memberikan suara.
  • Y: orang akan memilih lawan dari orang di sebelah kiri mereka. Jika tidak ada orang di sebelah kiri mereka, maka mereka memilih lawan dari siapa pun di sebelah kanan mereka. Jika tidak jelas untuk siapa orang yang berhak memilihnya, maka mereka tidak memberikan suara.
  • N: orang yang tidak memilih.

Ini dievaluasi dari kiri ke kanan.

Contoh:

Siapa pun yang "dievaluasi" dalam huruf kecil, untuk kejelasan.

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

Jajak pendapat akhir:

  • 2 orang memberikan suara untuk 1

  • 1 orang memilih 2

  • 3 orang tidak memilih

1 memiliki suara terbanyak, jadi 1 menang!

Kasus uji:

Anda dapat menggunakan karakter atau nilai lain sebagai input dan output, selama mereka berbeda. (Misalnya: angka alih-alih huruf, huruf berbeda, huruf kecil, benar / salah atau positif / negatif (untuk output), dll.)

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)
Kamerad SparklePony
sumber
1
@EriktheOutgolfer ANNY sama dengan A NN. NX dan NY menjadi NN.
Kamerad SparklePony
5
Mungkin layak untuk menentukan yang nonemerupakan kebalikan dari none, jika perilaku NYdalam komentar sudah benar.
Kamil Drakari
1
IMHO harus ada testcases dimulai dengan XA, XB, YAdan YB.
Neil
1
Bolehkah input hanya berisi 1 huruf? mis. "A", "X", "Y", "N".
tsh
2
Apakah output harus berupa dua nilai yang berbeda , atau bisakah kita misalnya mengeluarkan bilangan bulat positif jika 1 menang dan bilangan bulat negatif jika 2 menang?
Kevin Cruijssen

Jawaban:

9

Perl 5, 56 80 72 65 53 byte

+26 byte untuk menangani case X atau Y di posisi pertama dan A atau B di posisi kedua. output adalah 1jika 1 menang kosong (nilai false dalam perl) sebaliknya.

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

menggunakan Pdan Sbukannya Xdan Ymemungkinkan untuk menggunakan operasi xor pada karakter, akan menghemat lebih banyak byte

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

menggunakan kelompok ulang cabang (?|.. |.. ), sehingga $1 $2mengacu sesuai kelompok di cabang. Menggunakan \0dan \3bukannya XdanY

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

72 byte

65 byte

53 byte

Nahuel Fouilleul
sumber
dari pemahaman terakhir saya, mereka tidak dihitung lagi
Nahuel Fouilleul
Ini tidak menangani dengan benar Xdan Ypada awal string. Coba XBAdan YAB.
Grimmy
@Grimy, diperbarui
Nahuel Fouilleul
9

Java 8, 153 141 135 131 129 byte

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;}

Menggunakan bilangan bulat integer sebagai input dengan A=1, B=2, N=3, X=4, Y=5dan menghasilkan bilangan bulat positif ( >= 1) jika A menang, bilangan bulat negatif ( <= -1) jika B menang, atau 0jika itu seri.

-18 byte terima kasih kepada @ OlivierGrégoire .

Cobalah online.

Penjelasan:

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)
Kevin Cruijssen
sumber
i=0;for(int n:a)i+=n<2?1:n<3?-1:0;return i>0;menyimpan beberapa byte byte.
Olivier Grégoire
1
Sebenarnya, i=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;ini lebih pendek.
Olivier Grégoire
@ OlivierGrégoire Terima kasih! Ketika saya melihat komentar pertama Anda, saya akan menemukan sesuatu yang lebih pendek, tetapi Anda mengalahkan saya untuk itu dengan komentar kedua Anda. ;)
Kevin Cruijssen
1
131 byte dengan menggabungkan loop kedua di yang pertama. Tapi rasanya tidak benar, dan beberapa kasus uji harus ditambahkan ...
Olivier Grégoire
@ OlivierGrégoire Terima kasih! Telah dapat melakukan golf 4 byte lebih banyak dengan menggabungkannya lagi dengan variabel temp. Dan apa yang salah dengan itu? Jika Anda menambahkan System.out.println(java.util.Arrays.toString(a));setelah loop Anda dapat melihatnya berubah seperti yang Anda harapkan (imo). Jenis uji seperti apa yang menurut Anda menghasilkan hasil yang salah dan karena bagian kode mana?
Kevin Cruijssen
8

Haskell, 60 50 48 59 byte

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

Penggunaan 1 untuk A, -1untuk B, 0untuk N, 2untuk Xdan 4untuk Y. Kembali Truejika Amenang, jika tidak False.

Cobalah online!

Dalam cara rekursif dalam daftar input kami tambahkan 1untuk setiap suara untuk A, -1untuk setiap suara untuk Bdan 0"tidak ada suara". ladalah suara terakhir, vyang berikutnya. Jika v=1, -1atau 0(atau v<2) kami hanya menambahkannya ke jumlah. Jika v"suara yang sama" ( Xdalam tantangan,2 untuk solusi saya) kami menyimpan dan menambahkan l( (3-2)*l= l). Jika v"memilih yang berlawanan" ( Ydalam tantangan, 4untuk solusi saya), pertama-tama kita meniadakan l( (3-4)*l= -l) dan kemudian menambahkannya. Kasing dasar adalah daftar kosong yang memulai penjumlahan dengan 0. Rekursi dimulai dengan lset ke rem s 2tempats elemen kedua dari daftar input ( x!!1).rem s 2peta 1dan -1untuk dirinya sendiri, semua nilai lainnya 0. Tetap memilih mengabaikan suara l[*] dan Xatau Ymendapatkan tetangga yang tepat jika itu adalah suara memperbaiki. Jika jumlah keseluruhan positif, Amenang.

[*] ini membuat daftar tunggal dengan suara tetap seperti [1]pekerjaan, karena karena kemalasan Haskell ke elemen kedua tidak pernah dievaluasi. Input seperti [2]gagal dengan kesalahan, tetapi tidak harus dipertimbangkan.

nimi
sumber
1
@ Grimy: terima kasih telah menunjukkan. Tetap.
nimi
6

JavaScript (ES6),  78 75  73 byte

01248

fSebuahlsetrkamue

a=>a.reduce((v,x,i)=>v+~~[,1,-1][p=x?x&3||~-x%7^(p&3||a[i+1]&3):0],p=0)<0

Cobalah online!

Arnauld
sumber
4

05AB1E , 34 33 32 30 byte

gFÐNè©[email protected]èDÄ2‹*D(‚®èNǝ]O

Menggunakan integer-array sebagai input A=-1, B=1, N=0, X=2, Y=3 dan mengeluarkan bilangan bulat negatif ( <= -1) jika A menang, bilangan bulat positif (>= 1 ) jika B menang, atau 0jika itu seri.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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
Kevin Cruijssen
sumber
3

Retina 0.8.2 , 70 byte

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

.+|(?<=B)

Cobalah online! Tautan termasuk kasus uji. Output 0untuk seri. Penjelasan:

AY
AB
BY
BA

Tangani Ypemilih di sebelah kanan orang dengan suara yang diputuskan.

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

Tangani Xpemilih di sebelah kanan orang dengan suara yang diputuskan, dan kemudian putar kembali sampai semua yang memungkinkan Ydan Xsuara dapat diputuskan.

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

Tangani Xpemilih awal di sebelah suara yang diputuskan, dan juga Ypemilih awal di sebelah suara yang diputuskan. Karena pemilih ini akan memberikan suara yang berlawanan dengan suara yang diputuskan, kami hanya dapat menghapus kedua suara dalam kasus ini.

+`N|X|Y|AB|BA

Hapus yang tersisa tanpa suara atau suara ragu-ragu, dan batalkan semua pasangan suara yang diputuskan yang bertentangan. Ulangi sampai semua suara yang mungkin dibatalkan. Dalam hal seri, tidak ada yang tersisa, jika tidak, suara yang tersisa akan semua dari jenis yang sama.

.+|(?<=B)

Keluaran 1jika ada suara, tetapi 2jika ada Bsuara.

Neil
sumber
3

JavaScript (Node.js) , 42 byte

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

Cobalah online!

Hemat 1 byte, terima kasih untuk Shaggy.


  • Input sebagai bilangan bulat integer dengan N = 0, A = -1, B = 1, X = 2, Y = -2;
  • Output 1 = Falsy, 2 = Truthy
tsh
sumber
2
TIO Anda tampaknya menghasilkan 0, 1dan 3bukannya 1dan 2?
Kevin Cruijssen
1
@KevinCruijssen Tapi OP diizinkan benar vs palsu sebagai output jika saya mengerti dengan benar. Falsy berarti 1 memenangkan permainan, dan kebenaran berarti 2 menang.
tsh
Ah ok, lupa 3juga benar di JS. Saya selalu menganggap 0/ 1sebagai falsey / truthy. Dan karena kita tidak lagi membutuhkan output yang berbeda, 0= 1 menang dan >= 1= 2 menang juga baik-baik saja. Jadi +1 dari saya.
Kevin Cruijssen
Sepertinya Anda bisa menyimpan byte menggunakan bitwise OR, bukan logika OR.
Shaggy
@ Shaggy Sangat aneh. Berhasil.
tsh
2

Python 3 2, 125 121 117 byte

(Terima kasih kepada Jonathan Frech)

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)

Menggunakan lekukan tab

Input: daftar intdi mana 'A' = 1, 'B' = 0, 'X' = 4, 'N' = 3, 'Y' = - 1, jadi "AAAA" adalah [1, 1, 1, 1]dan "XXAYAN" berada [4, 4, 1, -1, 1, 3].

[{'A': 1, 'B': 0, 'X': 4, 'N': 3, 'Y': -1}[c] for c in s] akan mengonversi string ke format input yang diperlukan.

Anda dapat mencobanya secara online! (Terima kasih kepada Jonathan Frech untuk sarannya)

pengguna24343
sumber
Halo dan selamat datang di PPCG. Saya akan merekomendasikan menggunakan TIO , karena baik memformat kode Anda. Selanjutnya, saya tidak begitu mengerti format input Anda. Anda mungkin harus bertanya kepada OP tentang validitasnya.
Jonathan Frech
Sebagai tip golf, (i, i-1)[i>0]harus sama dengan i-(i>0).
Jonathan Frech
Selain itu, Anda ifmungkin bisa menjadi x[i]+=(v>3)*n+abs(n-1)*(v<0). Anda kemudian dapat menghemat lekukan dengan memindahkan pernyataan yang sekarang non-majemuk (menggunakan ;) pada baris yang sama dengan for.
Jonathan Frech
@JonathanFrech Terima kasih banyak; Saya harap saya menjelaskan input dengan lebih baik
user24343
1

Perl 5, 54 byte

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

Cobalah online!

Penggunaan Auntuk A, Buntuk B, Nuntuk N, \0untuk Xdan \3untuk Y (dua terakhir menjadi karakter kontrol literal). Caranya adalah Abitwise-xor \3sama dengan B, dan sebaliknya.

Grimmy
sumber
menggunakan banyak ide jawaban saya, saya tidak yakin kita dapat menggunakan karakter yang tidak dapat dicetak sebagai input dan output, kecuali saya tidak menyadari manfaat menggunakan kelas karakter backslash
Nahuel Fouilleul
1

Javascript (ES6) - 133 byte

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)

Mengambil string dengan format yang diberikan dalam OP dan mengembalikan 1 jika kandidat 1 menang dan 2 sebaliknya (saya akui, saya bias).

M Dirr
sumber
1

Python 2 , 95 73 byte

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

Cobalah online!


  • Input sebagai array integer di mana N = 0, A = -2, B = 2, X = 1, Y = -1;
  • Output negatif = A, 0 = draw, positif = B
  • Jika input pertama adalah X atau Y, maka 2 * int (v [1] / 2) memetakan kedua untuk dirinya sendiri atau 0

Perbaikan bug diperlukan yang menambahkan byte tambahan, tetapi mengonversikannya ke lambda berkat @Stephen menguranginya kembali menjadi 95

ABridgeTooFar
sumber
74 byte dengan menghapus spasi dan mengubah fungsi menjadi fungsi lambda
Stephen