Хто переможе на виборах?


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в коментарях правильна.
Каміль Дракарі

1
ИМХО там повинно бути testcases починаючи з XA, XB, YAі YB.
Ніл

1
Може введення містить лише 1 букву? наприклад, "A", "X", "Y", "N".
tsh

2
Чи повинно виходити два різних значення, чи ми можемо, наприклад, вивести будь-яке додатне ціле число, якщо виграє 1, і будь-яке від’ємне ціле число, якщо виграє 2?
Кевін Круїссен

Відповіді:


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//

ТІО

використання, Pа Sзамість Xі Yдозволяючи використовувати операцію xor на символах, дозволить зберегти ще кілька байтів

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 байти


з мого останнього розуміння, вони більше не рахуються
Науель Фуле,

Це неправильно справляється Xі Yна початку рядка. Спробуйте XBAі YAB.
Гриммі

@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;економить кілька байт.
Олів'є Грегоар

1
Насправді i=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;ще коротше.
Олів'є Грегоар

@ OlivierGrégoire Дякую! Коли я побачив ваш перший коментар, я збирався знайти щось коротше, але ви перебили мене своїм другим коментарем. ;)
Кевін Круїссен

1
131 байт шляхом злиття другої петлі в першу. Хоча це не так, і деякі тестові випадки, можливо, доведеться додати ...
Олів'є Грегоар

@ OlivierGrégoire Дякую! Уміли гольфувати ще 4 байти, об'єднавши його ще з тимчасовою змінною. І що почувається в цьому неправильно? Якщо додати System.out.println(java.util.Arrays.toString(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для B, 0для N, 2для Xі 4для Y. Повертається, Trueякщо Aвиграє, в іншому випадку False.

Спробуйте в Інтернеті!

З рекурсивним способом зменшення списку введення ми додаємо 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. Рекурсія починається з lвстановленого rem s 2місцяsє другим елементом списку вхідних даних ( x!!1). rem s 2карти 1і -1собі, всі інші значення 0. Закріпити голосу ігнорувати все lодно [*] і Xчи Yотримати право сусіда , якщо це скрутне голосування. Якщо загальна сума позитивна, Aвиграє.

[*] це робить одиночні списки з фіксованими голосами на зразок [1]роботи, оскільки через лінь Хаскелла доступ до другого елемента ніколи не оцінюється. Такі дані, як [2]помилка з помилкою, але не повинні розглядатися.



1
@Grimy: дякую за вказівку. Виправлено.
німі


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 байт, завдяки Шаггі.


  • Введіть як цілий масив, де N = 0, A = -1, B = 1, X = 2, Y = -2;
  • Вихід 1 = Falsy, 2 = Truthy

2
Здається, ваш TIO видає 0, 1а 3замість 1і 2?
Кевін Круїссен

1
@KevinCruijssen Але ОП дозволив truthy vs falesy як вихід, якщо я правильно розумію. Falsy означає, що 1 виграв гру, а truthy означає 2 виграли.
tsh

Ах гаразд, забув 3, правда в JS також. Я завжди думаю про 0/ 1як фальси / триутю. А оскільки нам більше не потрібні різні результати, 0= 1 виграш і >= 1= 2 перемоги також добре. Тож +1 від мене.
Кевін Круїссен

Схоже, ви можете зберегти байт за допомогою побітового АБО, а не логічного АБО.
Кудлатий

@Shaggy Так дивно. Це працює.
tsh

2

Пітон 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] перетворить рядки у потрібний формат введення.

Ви можете спробувати онлайн! (Дякую Джонатану Фреху за пропозицію)


Привіт і ласкаво просимо до PPCG. Я рекомендую використовувати TIO , оскільки він добре форматує ваш код. Крім того, я не дуже розумію ваш формат введення. Можливо, вам доведеться запитати ОП про його чинність.
Джонатан Фрех

Як підказка для гольфу, (i, i-1)[i>0]повинна бути рівнозначною i-(i>0).
Джонатан Фрех

Крім того, вашим ifs, можливо, може стати 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для A, BдляB , Nдля N, \0для Xі \3для Y (останні два є буквальні символи управління). Хитрість полягає в тому, що Aрозрядний-xor \3дорівнює B, і навпаки.


він використовує багато ідей моєї відповіді, я не був впевнений, що ми можемо використовувати символи, що не друкуються, як вхід і вихід, за винятком випадків, коли я не усвідомлював користь використання класів символів зворотної косої риси
Науель Фуле

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)

Складається в рядку у форматі, вказаному в ОП, і повертає 1, якщо кандидат 1 переміг і 2 в іншому випадку (я визнаю, я рівномірний).


1

Пітон 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 байти , видаливши пробіл та змінивши функцію на лямбда-функцію
Stephen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.