ใครจะเป็นผู้ชนะการเลือกตั้ง?


32

นี่เป็นความท้าทายที่คนสองคนคือ 1 และ 2 กำลังทำงานอยู่ที่สำนักงาน ผู้คนลงคะแนนอย่างไม่แน่นอนในบางวิธีในโลกที่ 1 และ 2 ซึ่งจะช่วยให้ผู้สมัครสามารถหาผลลัพธ์ก่อนการเลือกตั้ง

หมายเหตุ: สิ่งนี้ไม่ได้หมายถึงการอ้างถึงการเลือกตั้งภายนอกหรือเหตุการณ์ทางการเมืองอื่น ๆ

คนสองคนกำลังทำงานที่สำนักงาน เราจะเรียกคนเหล่านี้ที่ 1 และ 2 เพราะพวกเขาทั้งคู่ต้องการทราบว่าพวกเขาจะชนะการเลือกตั้งหรือไม่พวกเขาตัดสินใจที่จะใช้ความรู้ของผู้คนและรหัสบางอย่างเพื่อหาว่าผลลัพธ์จะเป็นอย่างไร เนื่องจากต้องการลดการใช้จ่ายของภาครัฐรหัสจึงต้องสั้นที่สุด

งานของคุณ:รับจำนวนคนตามวิธีการลงคะแนนเอาท์พุทผู้ชนะเลือกตั้ง

มีคนห้าชนิดในโลกที่สนุกสนานและน่าตื่นเต้นของ 1 และ 2:

  • 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ตรงกันข้ามnoneถ้าพฤติกรรมNYในความคิดเห็นนั้นถูกต้อง
Kamil Drakari

1
IMHO ควรมี testcases เริ่มต้นด้วยXA, XB, และYA YB
Neil

1
อินพุตอาจมีเพียง 1 ตัวอักษร? เช่น "A", "X", "Y", "N"
tsh

2
เอาท์พุทจะต้องมีสองค่าที่แตกต่างกันหรือเราเช่นเอาท์พุทจำนวนเต็มบวกใด ๆ ถ้า 1 ชนะและจำนวนเต็มลบใด ๆ ถ้า 2 ชนะ?
Kevin Cruijssen

คำตอบ:


9

Perl 5, 56 80 72 65 53 ไบต์

+26 ไบต์เพื่อจัดการเคส X หรือ Y ในตำแหน่งแรกและ A หรือ B ในวินาที เอาท์พุทคือ1ถ้า 1 ชนะว่างเปล่า (ค่าเท็จใน Perl) เป็นอย่างอื่น

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แทนXและYช่วยให้การใช้การดำเนินการแฮคเกอร์ตัวละครจะช่วยลดขนาดบางมากขึ้น

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

ใช้กลุ่มการรีเซ็ตสาขา(?|.. |.. )ดังนั้นการ$1 $2อ้างอิงถึงกลุ่มที่เกี่ยวข้องในสาขา การใช้\0และ\3แทนXและY

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

72 ไบต์

65 ไบต์

53 ไบต์


จากความเข้าใจครั้งล่าสุดของฉันพวกเขาจะไม่ถูกนับอีกต่อไป
Nahuel Fouilleul

สิ่งนี้จัดการไม่ถูกต้องXและYในตอนเริ่มต้นของสตริง ลองและXBA YAB
Grimmy

@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=1, B=2, N=3, X=4, Y=5และส่งออกจำนวนเต็มบวก ( >= 1) ถ้า A ชนะ, จำนวนเต็มลบ ( <= -1) ถ้า B ชนะหรือ0เป็นรูปวาด

-18 ไบต์ขอบคุณ@ OlivierGrégoire @

ลองออนไลน์

คำอธิบาย:

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;บันทึกไม่กี่ไบต์ไบต์
Olivier Grégoire

1
จริงๆแล้วi=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;มันสั้นกว่า
Olivier Grégoire

@ OlivierGrégoireขอบคุณ! เมื่อฉันเห็นความคิดเห็นแรกของคุณฉันกำลังจะพบบางสิ่งที่สั้นลง แต่คุณเอาชนะฉันด้วยความคิดเห็นที่สองของคุณ ;)
Kevin Cruijssen

1
131 ไบต์โดยการรวมลูปที่สองในอันแรก แม้ว่าจะไม่ถูกต้อง แต่และบางกรณีการทดสอบอาจต้องเพิ่ม ...
Olivier Grégoire

@ OlivierGrégoireขอบคุณ! สามารถเล่นกอล์ฟได้อีก 4 ไบต์โดยการรวมเข้ากับตัวแปรอุณหภูมิ และสิ่งที่รู้สึกผิดเกี่ยวกับมัน? หากคุณเพิ่มSystem.out.println(java.util.Arrays.toString(a));วงหลังจากคุณสามารถเห็นการเปลี่ยนแปลงได้ตามที่คุณคาดหวัง (imo) กรณีทดสอบแบบใดที่คุณคิดว่าผลลัพธ์ในผลลัพธ์ไม่ถูกต้องและเนื่องจากส่วนใดของรหัส
Kevin Cruijssen

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สำหรับB, 0สำหรับN, 2สำหรับXและสำหรับ4 YผลตอบแทนTrueถ้าAชนะอื่นFalseชนะอื่น

ลองออนไลน์!

ในวิธี recursive ลงรายการการป้อนข้อมูลที่เราเพิ่ม1สำหรับการลงคะแนนเสียงสำหรับทุกA, -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กรณีฐานเป็นรายการที่ว่างเปล่าซึ่งเริ่มต้นด้วยผลรวม การเรียกซ้ำเริ่มต้นด้วยlsetrem s 2ที่ไหนsเป็นองค์ประกอบที่สองของรายการอินพุต (x!!1) rem s 2แผนที่1และ-1ตัวเองมีค่าอื่น ๆ 0ทั้งหมด แก้ไขคะแนนโหวตไม่สนใจl[*] และXหรือYรับเพื่อนบ้านที่ถูกต้องถ้ามันเป็นคะแนนโหวต หากผลรวมโดยรวมเป็นค่าบวกAชนะ

[*] นี่ทำให้รายการเดี่ยวที่มีคะแนนโหวตคงที่เหมือน[1]งานเพราะเนื่องจากความขี้เกียจของ Haskell ในการเข้าถึงองค์ประกอบที่สองไม่เคยถูกประเมิน อินพุตเช่น[2]ล้มเหลวพร้อมข้อผิดพลาด แต่ไม่ต้องพิจารณา



1
@Grimy: ขอบคุณสำหรับการชี้ให้เห็น คงที่
Nimi


4

05AB1E , 34 33 32 30 ไบต์

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

ใช้อาร์เรย์จำนวนเต็มเป็นอินพุตด้วย A=-1, B=1, N=0, X=2, Y=3และส่งออกจำนวนเต็มลบ ( <= -1) ถ้า A ชนะ, จำนวนเต็มบวก ( >= 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

เรติน่า 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กับผู้มีสิทธิเลือกตั้งไปทางด้านขวาของคนที่มีคะแนนโหวตตัดสินใจแล้ววนซ้ำจนกว่าจะเป็นไปได้ทั้งหมดYและXสามารถตัดสินใจได้

^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

ลองออนไลน์!

บันทึก 1 ไบต์ขอบคุณ Shaggy


  • อินพุตเป็นอาร์เรย์จำนวนเต็มโดยที่ N = 0, A = -1, B = 1, X = 2, Y = -2;
  • เอาท์พุท 1 = เป็นเท็จ 2 = ความจริง

2
TIO ของคุณดูเหมือนจะส่งออก 0 , 1และ3แทน1และ2?
Kevin Cruijssen

1
@KevinCruijssen แต่ OP อนุญาตให้ใช้สัจธรรมกับความเท็จเป็นผลลัพธ์ถ้าฉันเข้าใจอย่างถูกต้อง Falsy หมายถึง 1 ชนะเกมและความจริงหมายถึง 2 ชนะ
tsh

อาโอเคการลืมความ3จริงใน JS ก็เช่นกัน ฉันมักจะคิดว่า0/ 1เป็นเท็จ / ความจริง และเนื่องจากเราไม่ต้องการเอาต์พุตที่ชัดเจนอีกต่อไป0= 1 ชัยชนะและ>= 1= 2 ชนะก็ใช้ได้เช่นกัน +1 จากฉัน
Kevin Cruijssen

ดูเหมือนว่าคุณสามารถบันทึกไบต์โดยใช้ระดับบิตหรือแทนตรรกะหรือ
ปุย

@Shaggy แปลกมาก มันได้ผล.
tsh

2

หลาม 3 2 125 121 117 ไบต์

(ขอบคุณ 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)

ใช้การเยื้องแท็บ

อินพุต: รายการจาก int s ที่ '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 เกี่ยวกับความถูกต้องของมัน
Jonathan Frech

ในฐานะที่เป็นเคล็ดลับการเล่นกอล์ฟควรจะเทียบเท่ากับ(i, i-1)[i>0] i-(i>0)
Jonathan Frech

นอกจากนี้คุณคงอาจจะกลายเป็นif x[i]+=(v>3)*n+abs(n-1)*(v<0)จากนั้นคุณสามารถบันทึกเกี่ยวกับการเยื้องโดยการย้ายคำสั่งในขณะนี้ไม่ใช่สารประกอบ (ใช้;) forในบรรทัดเดียวกับ
Jonathan Frech

@ JonathanFrech ขอบคุณมาก ๆ ฉันหวังว่าฉันจะอธิบายอินพุตที่ดีขึ้น
user24343

1

Perl 5, 54 ไบต์

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

ลองออนไลน์!

ใช้AสำหรับA, BสำหรับB, NสำหรับN, \0สำหรับXและ\3สำหรับ Y (ที่สองเป็นตัวอักษรควบคุมตัวอักษร) เคล็ดลับคือAbitwise-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

Python 2 , 95 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) จะจับคู่กับตัวเองหรือ 0

ต้องการการแก้ไขข้อผิดพลาดที่เพิ่มไบต์พิเศษ แต่การแปลงแลมบ์ดาด้วย @Stephen ลดให้เหลือ 95


74 ไบต์โดยการลบช่องว่างและเปลี่ยนฟังก์ชันเป็นฟังก์ชัน lambda
Stephen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.