Seçimleri kim kazanacak?


32

Bu, 1 ve 2 numaralı iki kişinin ofis için çalıştığı bir zorluktur. İnsanlar, seçimden önce adayların sonuçlarını anlamalarını sağlayabilen, 1 ve 2 dünyasında belli belirleyici şekilde oy kullanıyorlar.

NOT: Bu, herhangi bir dış seçime veya diğer siyasi olaylara atıfta bulunma amaçlı değildir.

İki kişi ofis için çalışıyor. Bu insanları 1 ve 2 olarak adlandıracağız. Her ikisi de seçimleri kazanıp kazanmayacaklarını bilmek istediklerinden, sonucun ne olacağını bulmak için insanlar hakkındaki bilgilerini ve bazı kuralları kullanmaya karar veriyorlar. Devlet harcamalarını minimize etmek istemediğinden, kodun mümkün olduğu kadar kısa olması gerekiyor.

Senin görevin: Nasıl oy kullandıklarına bağlı olarak bir dizi insan göz önüne alındığında, seçimleri kazanan kişi çıktısını aldı.

1 ve 2'nin eğlenceli ve heyecan verici dünyasında beş çeşit insan var:

  • A: kesinlikle 1 oy verecek olan insanlar.
  • B: kesinlikle 2'ye oy verecek insanlar.
  • X: solundaki kişi için oy verecek olan, oy verecek olan kişi. Solunda kimse yoksa, o zaman sağındaki kişinin oy vereceği kişiye oy verir. Haklarındaki kişinin kime oy kullandığı açık değilse, o zaman oy kullanmazlar.
  • Y: insanlar sola karşı tarafını oylayacak. Solunda kimse yoksa, o zaman sağında bulunanın karşısında oy kullanırlar. Haklarındaki kişinin kime oy kullandığı açık değilse, o zaman oy kullanmazlar.
  • N: oy kullanmayan kişiler.

Bu soldan sağa değerlendirilir.

Örnek:

“Değerlendirilen” kişi netlik için küçük harflerle yazılmıştır.

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

Son anket:

  • 1 kişi için 1 kişi oy kullandı

  • 2 kişi için 1 kişi oy kullandı

  • 3 kişi oy kullanmadı

1 en çok oy alan, 1 kazanır!

Test durumları:

Farklı olduğu sürece, diğer karakterleri veya değerleri giriş ve çıkış olarak kullanabilirsiniz. (Örneğin: harfler yerine sayılar, farklı harfler, küçük harfler, gerçek / yanlış veya pozitif / negatif (çıktı için), vb.)

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, sadece A NN ile aynıdır. NX ve NY, NN olur.
Yoldaş SparklePony

5
Yorumlardaki davranış doğru noneise bunun tersi olduğunu belirtmekte fayda var .noneNY
Kamil Drakari

1
IMHO testcases ile başlayan olmalı XA, XB, YAve YB.
Neil

1
Girdi yalnızca 1 harf içerebilir mi? örneğin "A", "X", "Y", "N".
tsh

2
Çıktının iki ayrı değeri olması gerekir mi, yoksa 1 kazanırsa herhangi bir pozitif tamsayı ve 2 kazanırsa herhangi bir negatif tamsayı verebilir miyiz?
Kevin Cruijssen

Yanıtlar:


9

Perl 5, 56 80 72 65 53 bayt

X veya Y kasasını birinci konumda ve A veya B’yi ikinci durumda işlemek için +26 byte Çıktı 11 ise boş kazanırsa (Perl'de yanlış değer).

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

kullanma P ve Syerine Xve Ykarakterler xor işlemi kullanmasına izin biraz daha bayt kurtaracak

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

Bir dal sıfırlama grubu kullanır (?|.. |.. ), böylece $1 $2daldaki ilgili gruba atıfta bulunabilirsiniz. kullanılması \0ve\3 yerine XveY

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

72 bayt

65 bayt

53 bayt


son anlayışa göre artık sayılmazlar
Nahuel Fouilleul

Bu doğru bir şekilde işlemez Xve Ydizenin başlangıcında. Dene XBAve YAB.
Grimmy

@Grimy, güncellendi
Nahuel Fouilleul

9

Java 8, 153 141 135 131 129 bayt

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

Girdi olarak bir tamsayı dizisi kullanır A=1, B=2, N=3, X=4, Y=5ve >= 1A kazanırsa pozitif bir tamsayı ( <= -1), B kazanırsa veya 0bir beraberlik olursa negatif bir tamsayı ( ) kullanır .

@ OlivierGrégoire sayesinde -18 bayt .

Çevrimiçi deneyin.

Açıklama:

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;birkaç bayt baytı kaydeder.
Olivier Grégoire

1
Aslında i=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;daha da kısa.
Olivier Grégoire

@ OlivierGrégoire Teşekkürler! İlk yorumunuzu gördüğümde daha kısa bir şeyler bulmak üzereydim, ama ikinci yorumunuzla beni yendin. ;)
Kevin Cruijssen

1
Birincide ikinci döngüyü birleştirerek 131 bayt . Yine de doğru gelmiyor ve bazı test vakalarının eklenmesi gerekebilir ...
Olivier Grégoire

@ OlivierGrégoire Teşekkürler! Temp değişkeniyle biraz daha birleştirerek 4 byte daha golf oynatabildim. Peki bu konuda yanlış olan ne? Döngüden System.out.println(java.util.Arrays.toString(a));sonra bir eklerseniz beklediğiniz gibi değiştiğini görebilirsiniz (imo). Ne tür bir test senaryosunun yanlış bir sonuçla sonuçlandığını ve kodun hangi bölümünden kaynaklandığını düşünüyorsunuz?
Kevin Cruijssen

8

Haskell, 60 50 48 59 bayt

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

Kullanımları 1için A, -1için B, 0için N, 2için Xve 4için Y. İade Truedurumunda Akazanç, başka False.

Çevrimiçi deneyin!

Girdi listesindeki aşağı yinelemeli şekilde 1, her oy için A, -1her oy için Bve 0"oy yok" için ekledik. lSon oy, bir vsonraki. Eğer v=1, -1veya 0(veya v<2) sadece toplamı ekleriz. Eğer v"aynı oy kullanıyorsanız" ( çözümüm için X, meydan 2okuduysanız) tutar ve ekleriz l( (3-2)*l= l). Eğer v"karşıt oy" ise ( benim sorunum için, benim Ymücadelem 4için) önce reddeder l( (3-4)*l= -l) ve sonra ekleriz. Temel durum, toplamı başlatan boş listedir 0. Girdi listesinin ( ) ikinci elemanı ise özyineleme ile başlar .lrem s 2Nereye ayarlandıysasx!!1rem s 21ve -1diğer tüm değerleri eşler ve eşler 0. Fix oy görmezden lyine [*] ve Xya Ybir düzeltme oy ise sağ komşu olsun. Eğer toplam tutar pozitifse,A kazanır.

[*] bu, singleton listelerini [1]iş gibi sabit oylarla yapar , çünkü Haskell'in ikinci elemana tembellikten dolayı asla değerlendirilmez. Gibi girişler [2]hatayla başarısız olur, ancak dikkate alınması gerekmez.



1
@Grimy: İşaret ettiğiniz için teşekkürler. Sabit.
nimi

6

JavaScript (ES6),  78 75  73 bayt

Girdiyi bir tamsayı dizisi olarak alır: 0 = N, 1 = A, 2 = B, 4 = Y, 8 = X.

İade fbirlse ilk aday kazanırsa veya true 2. aday kazanırsa.

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

Çevrimiçi deneyin!


4

05AB1E , 34 33 32 30 bayt

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

Girdi olarak bir tamsayı dizisi kullanır A=-1, B=1, N=0, X=2, Y=3ve <= -1A kazanırsa negatif bir tamsayı ( >= 1), B kazanırsa veya 0bir beraberlik ise pozitif bir tamsayı ( ) kullanır .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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 bayt

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

.+|(?<=B)

Çevrimiçi deneyin! Link, test durumlarını içerir. 0Bir kravat için çıkışlar . Açıklama:

AY
AB
BY
BA

Kulp Ykarar oy insanların sağında seçmenleri.

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

Sap Xolası tüm kadar karar oylarıyla halkın hakkı ve sonra döngü arkasına seçmenY ve Xoy karar verilebilir.

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

XKarar verilmiş bir oylamanın yanında bir ilk seçmen ve bir de ilkY yanında seçmen . Bu seçmen, karar verilen oylama karşısında oy kullanacağından, bu durumda sadece iki oyu da silebiliriz.

+`N|X|Y|AB|BA

Geriye kalan oy veya kararsız oyu silin ve muhalif karar verilen tüm oyları iptal edin. Mümkün olan tüm oylar iptal edilinceye kadar tekrarlayın. Eşleşme durumunda, hiçbir şey bırakılmayacak, aksi halde kalan oyların tümü aynı türde olacak.

.+|(?<=B)

Çıktı 1herhangi oy varsa, ancak 2eğer olurlarsa Boy.


3

JavaScript (Node.js) , 42 bayt

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

Çevrimiçi deneyin!

Shaggy sayesinde 1 bayt tasarruf edin.


  • Tamsayı dizisi olarak giriş, burada N = 0, A = -1, B = 1, X = 2, Y = -2;
  • Çıktı 1 = Falsy, 2 = Truthy

2
Kişisel TIO çıkışına görünüyor 0, 1ve 3yerine 1ve 2?
Kevin Cruijssen

1
@KevinCruijssen Fakat doğru bir şekilde anladıysam OP çıktı olarak yanlışlık ve sahtekarlığa izin verdi. Falsy, oyunu 1 kazandı, truthy ise 2 kazandı.
tsh

Ah tamam, unuttum 3JS'de de hakikaten. Hep düşünüyorum 0/ ' 1Falsey / truthy olarak. Ve artık ayrı çıktılara ihtiyacımız olmadığından, 0= 1 kazanç ve >= 1= 2 kazanç da iyi. Yani benden +1.
Kevin Cruijssen

Mantıksal OR yerine bitsel VEYA kullanarak bir bayt kaydedebildiğiniz anlaşılıyor.
Shaggy,

@Shaggy Çok garip. İşe yarıyor.
tsh

2

piton 3 2, 125 121 117 bayt

(Jonathan Frech'e teşekkürler)

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)

Sekme girintisini kullanma

Girdi: int'A' = 1, 'B' = 0, 'X' = 4, 'N' = 3, 'Y' = - 1, yani "AAAA" [1, 1, 1, 1]ve "XXAYAN" olduğu s'nin listesi [4, 4, 1, -1, 1, 3].

[{'A': 1, 'B': 0, 'X': 4, 'N': 3, 'Y': -1}[c] for c in s] dizeleri gerekli giriş biçimine dönüştürür.

Şunları yapabilirsiniz çevrimiçi deneyin! (Öneri için Jonathan Frech'e teşekkürler)


Merhaba ve PPCG'ye hoş geldiniz. Kodunuzu güzel bir şekilde biçimlendirdiği için TIO kullanmanızı öneririm . Ayrıca, giriş biçiminizi tam olarak anlamadım. OP'ye geçerliliği hakkında soru sormanız gerekebilir.
Jonathan Frech

Bir golf ipucu olarak, (i, i-1)[i>0]eşdeğer olmalıdır i-(i>0).
Jonathan Frech

Ayrıca, ifmuhtemelen s olabilir x[i]+=(v>3)*n+abs(n-1)*(v<0). Şimdi bileşik olmayan ifadeyi (ile ;) aynı satırda hareket ettirerek girintiden tasarruf edebilirsiniz for.
Jonathan Frech

@JonathanFrech Çok teşekkür ederim; Umarım girişi daha iyi
açıklardım

1

Perl 5, 54 bayt

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

Çevrimiçi deneyin!

Kullanım Aiçin A, Biçin B, Niçin N, \0için Xve \3Y (son iki değişmez kontrol karakter olmak üzere). İşin püf noktası, Abit-xor veya \3eşittir Bve bunun tam tersidir.


cevabımın pek çok fikrini kullanıyor, ters eğik çizgi karakter sınıfları kullanmanın
yararını

1

Javascript (ES6) - 133 bayt

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 verilen formata sahip bir dizede alır ve döndürür 1 aday 1 kazandı ve eğer 2 aksi (bunu kabul edeceğiz, ben bile önyargılı değilim).


1

Python 2 , 95 73 bayt

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

Çevrimiçi deneyin!


  • Tamsayı dizisi olarak giriş, burada N = 0, A = -2, B = 2, X = 1, Y = -1;
  • Çıktı negatif = A, 0 = çizim, pozitif = B
  • İlk giriş X veya Y ise, 2 * int (v [1] / 2) kendi kendine ikinci veya 0 ile eşleştirir

Ekstra bayt ekleyen hata düzeltmesi gerekliydi, ancak @Stephen sayesinde lambda'ya dönüştürmek onu 95'e düşürdü.


Boşluğu kaldırarak ve işlevi bir lambda işlevine değiştirerek 74 bayt
Stephen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.