Jest to wyzwanie, w którym dwie osoby, 1 i 2, ubiegają się o urząd. Ludzie deterministycznie głosują w określony sposób w świecie 1 i 2, co może pozwolić kandydatom na zorientowanie się w wynikach przed wyborami.
UWAGA: nie dotyczy to żadnych wyborów zewnętrznych ani innych wydarzeń politycznych.
Dwie osoby biegną do biura. Zadzwonimy do tych osób 1 i 2. Ponieważ oboje chcą wiedzieć, czy wygrają wybory, decydują się wykorzystać swoją wiedzę o ludziach i trochę kodu, aby dowiedzieć się, jaki będzie wynik. Ze względu na chęć zminimalizowania wydatków rządowych kod musi być możliwie jak najkrótszy.
Twoje zadanie: Biorąc pod uwagę liczbę osób na podstawie tego, jak głosują, wyjdź, kto wygra wybory.
W zabawnym i ekscytującym świecie 1 i 2 jest pięć rodzajów ludzi:
A
: osoby, które zdecydowanie zagłosują na 1.B
: osoby, które zdecydowanie zagłosują na 2.X
: osoby, które będą głosować na osobę po ich lewej, będą głosować na. Jeśli po ich lewej stronie nie ma żadnej osoby, wówczas głosują na każdego, kto będzie głosował po ich prawej stronie. Jeśli nie jest jasne, na kogo osoba po ich prawach głosuje, wówczas nie głosuje.Y
: ludzie będą głosować przeciwnie do osoby po lewej stronie. Jeśli po ich lewej stronie nie ma żadnej osoby, wówczas głosują przeciw temu, kto ma rację. Jeśli nie jest jasne, na kogo osoba po ich prawach głosuje, wówczas nie głosuje.N
: ludzie, którzy nie głosują.
Jest to oceniane od lewej do prawej.
Przykład:
Ktokolwiek jest „oceniany”, jest napisany małymi literami, dla jasności.
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
Ostatnia ankieta:
2 osoby głosowały na 1
1 osoba głosowała na 2
3 osoby nie głosowały
1 ma najwięcej głosów, więc 1 wygrywa!
Przypadki testowe:
Możesz używać innych znaków lub wartości jako danych wejściowych i wyjściowych, o ile są one odrębne. (Na przykład: liczby zamiast liter, różne litery, małe litery, prawda / fałsz lub dodatnie / ujemne (na wyjściu) itp.)
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)
źródło
none
jest odwrotnienone
, jeśli zachowanieNY
w komentarzach jest prawidłowe.XA
,XB
,YA
iYB
.Odpowiedzi:
Perl 5,
5680726553 bajtów+26 bajtów do obsługi skrzynki X lub Y na pierwszej pozycji i A lub B na drugiej. wyjście jest,
1
jeśli 1 wygrywa puste (fałszywa wartość w perlu) w przeciwnym razie.TIO
użycie
P
iS
zamiastX
orazY
zezwolenie na użycie operacji xor na znakach, pozwoliłoby zaoszczędzić trochę więcej bajtówużywa grupy resetowania gałęzi
(?|
..|
..)
, dzięki czemu$1
$2
odnosi się do odpowiedniej grupy w oddziale. Używanie\0
i\3
zamiastX
iY
72 bajty
65 bajtów
53 bajty
źródło
X
iY
na początku łańcucha. SpróbujXBA
iYAB
.Java 8,
153141135131129 bajtówUżywa tablicy liczb całkowitych jako danych wejściowych
A=1, B=2, N=3, X=4, Y=5
i zwraca dodatnią liczbę całkowitą (>= 1
), jeśli wygrywa A, ujemną liczbę całkowitą (<= -1
), jeśli wygrywa B lub0
jeśli jest to remis.-18 bajtów dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
i=0;for(int n:a)i+=n<2?1:n<3?-1:0;return i>0;
saves a few bytes bytes.i=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;
is even shorter.System.out.println(java.util.Arrays.toString(a));
after the loop you can see it changed as you would expect (imo). What kind of test case would you think results in an incorrect result and due to what part of the code?Haskell,
60504859 bytesUses
1
forA
,-1
forB
,0
forN
,2
forX
and4
forY
. ReturnsTrue
ifA
wins, elseFalse
.Try it online!
On the recursive way down the input list we add
1
for every vote forA
,-1
for every vote forB
and0
for "no vote".l
is the last vote,v
the next. Ifv=1
,-1
or0
(orv<2
) we just add it to the sum. Ifv
is "vote same" (X
in the challenge,2
for my solution) we keep and addl
((3-2)*l
=l
). Ifv
is "vote opposite" (Y
in the challenge,4
for my solution) we first negatel
((3-4)*l
=-l
) and then add it. Base case is the empty list which starts the sum with0
. Recursion is started withl
set torem s 2
wheres
is the second element of the input list (x!!1
).rem s 2
maps1
and-1
to itself, all other values to0
. Fix votes ignorel
anyway [*] andX
orY
get the right neighbor if it's a fix vote. If the overall sum is positive,A
wins.[*] this makes singleton lists with fix votes like
[1]
work, because due to Haskell's laziness access to the second element is never evaluated. Inputs like[2]
fail with error, but don't have to be considered.źródło
JavaScript (ES6),
78 7573 bytesTakes input as an array of integers with:0 = N, 1 = A, 2 = B, 4 = Y, 8 = X.
Returnsfalse if the first candidate wins or true if the 2nd candidate wins.
Try it online!
źródło
05AB1E,
34333230 bytesUses an integer-array as input with
A=-1, B=1, N=0, X=2, Y=3
and outputs a negative integer (<= -1
) if A wins, a positive integer (>= 1
) if B wins, or0
if it's a draw.Try it online or verify all test cases.
Explanation:
źródło
Retina 0.8.2, 70 bytes
Try it online! Link includes test cases. Outputs
0
for a tie. Explanation:Handle
Y
voters to the right of people with decided votes.Handle
X
voters to the right of people with decided votes, and then loop back until all possibleY
andX
votes can be decided.Handle an initial
X
voter next to a decided vote, and also an initialY
voter next to a decided vote. As this voter will vote opposite to the decided vote, we can just delete both votes in this case.Delete any remaining no vote or undecided votes, and cancel out all pairs of opposing decided votes. Repeat until all possible votes are cancelled. In the case of a tie, nothing will be left, otherwise the remaining votes will all be of the same type.
Output
1
if there are any votes, but2
if they areB
votes.źródło
JavaScript (Node.js), 42 bytes
Try it online!
Save 1 bytes, thanks to Shaggy.
źródło
0
,1
and3
instead of1
and2
?3
is truthy in JS as well. I always think of0
/1
as falsey/truthy. And since we no longer need distinct outputs,0
= 1 wins and>= 1
= 2 wins is fine as well. So +1 from me.Python
32,125121117 bytes(Thanks to Jonathan Frech)
Using tab indentation
Input: list of
int
s where 'A'=1, 'B'=0, 'X'=4, 'N'=3, 'Y'=-1, so "AAAA" is[1, 1, 1, 1]
and "XXAYAN" is[4, 4, 1, -1, 1, 3]
.[{'A': 1, 'B': 0, 'X': 4, 'N': 3, 'Y': -1}[c] for c in s]
will convert the strings to the needed input format.You can Try it online! (Thanks to Jonathan Frech for the suggestion)
źródło
(i, i-1)[i>0]
should be equivalent toi-(i>0)
.if
s could probably becomex[i]+=(v>3)*n+abs(n-1)*(v<0)
. You can then save on indentation by moving the now non-compound statement (using;
) on the same line as thefor
.Perl 5, 54 bytes
Try it online!
Uses
A
forA
,B
forB
,N
forN
,\0
forX
and\3
for Y (the last two being literal control chars). The trick is thatA
bitwise-xor\3
equalsB
, and vice-versa.źródło
Javascript (ES6) - 133 bytes
Takes in a string with the format given in the OP and returns 1 if candidate 1 won and 2 otherwise (I'll admit it, I'm even-biased).
źródło
Python 2,
9573 bytesTry it online!
Bug fix was required that added extra bytes, but converting to lambda thanks to @Stephen reduced it back to 95
źródło