Esse é um desafio no qual duas pessoas, 1 e 2, estão concorrendo ao cargo. As pessoas votam deterministicamente de certas maneiras no mundo de 1 e 2, o que pode permitir que os candidatos descubram os resultados antes da eleição.
NOTA: isso não se refere a eleições externas ou outros eventos políticos.
Duas pessoas estão concorrendo ao cargo. Chamaremos essas pessoas de 1 e 2. Como os dois querem saber se vencerão a eleição, decidem usar seu conhecimento das pessoas e algum código para descobrir qual será o resultado. Devido ao desejo de minimizar os gastos do governo, o código precisa ser o mais curto possível.
Sua tarefa: Dada uma série de pessoas com base em como estão votando, identifique quem vence a eleição.
Existem cinco tipos de pessoas no mundo divertido e emocionante de 1 e 2:
A
: pessoas que definitivamente votarão em 1.B
: pessoas que definitivamente votarão em 2.X
: pessoas que votarão em quem votará na pessoa à esquerda. Se não houver uma pessoa à sua esquerda, eles votam em quem quer que a pessoa à sua direita vote. Se não estiver claro em quem a pessoa à sua direita está votando, ela não votará.Y
: as pessoas votam o oposto da pessoa à sua esquerda. Se não houver uma pessoa à sua esquerda, eles votam oposto de quem está à sua direita. Se não estiver claro em quem a pessoa à sua direita está votando, ela não votará.N
: pessoas que não votam.
Isso é avaliado da esquerda para a direita.
Exemplo:
Quem está sendo "avaliado" está em minúsculas, para maior clareza.
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
Enquete final:
2 pessoas votaram em 1
1 pessoas votaram em 2
3 pessoas não votaram
1 tem mais votos, então 1 ganha!
Casos de teste:
Você pode usar outros caracteres ou valores como entrada e saída, desde que sejam distintos. (Por exemplo: números em vez de letras, letras diferentes, letras minúsculas, verdade / falsidade ou positivo / negativo (para saída), etc.)
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)
fonte
none
is the opposite ofnone
, if the behavior forNY
in the comments is correct.XA
,XB
,YA
andYB
.Respostas:
Perl 5,
5680726553 bytes+26 bytes to handle the case X or Y in first position and A or B in second. output is
1
if 1 wins empty (false value in perl) otherwise.TIO
using
P
andS
instead ofX
andY
allowing to use xor operation on characters, would save some more bytesuses a branch reset group
(?|
..|
..)
, so that$1
$2
refering to corresponding group in branch. Using\0
and\3
instead ofX
andY
72 bytes
65 bytes
53 bytes
fonte
X
andY
at the start of the string. TryXBA
andYAB
.Java 8,
153141135131129 bytesUses an integer array as input with
A=1, B=2, N=3, X=4, Y=5
and outputs a positive integer (>= 1
) if A wins, a negative integer (<= -1
) if B wins, or0
if it's a draw.-18 bytes thanks to @OlivierGrégoire.
Try it online.
Explanation:
fonte
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.fonte
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!
fonte
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:
fonte
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.fonte
JavaScript (Node.js), 42 bytes
Try it online!
Save 1 bytes, thanks to Shaggy.
fonte
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)
fonte
(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.fonte
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).
fonte
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
fonte