Это проблема, в которой два человека, 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)
источник
none
это противоположноnone
, если поведениеNY
в комментариях правильное.XA
,XB
,YA
иYB
.Ответы:
Perl 5,
5680726553 байта+26 байтов, чтобы обработать регистр X или Y в первой позиции и A или B во второй. вывод -
1
если 1 выигрывает пустое (ложное значение в perl) в противном случае.TIO
используя
P
иS
вместо того , чтобыX
иY
позволяет использовать XOR операции на персонажах, позволит сэкономить еще несколько байтиспользует группу сброса ветви
(?|
..|
..)
, так что$1
$2
ссылка на соответствующую группу в ветви. Использование\0
и\3
вместоX
иY
72 байта
65 байт
53 байта
источник
X
иY
в начале строки. ПопробуйтеXBA
иYAB
.Java 8,
153141135131129 байтИспользует целочисленный массив в качестве входных данных
A=1, B=2, N=3, X=4, Y=5
и выводит положительное целое число (>= 1
), если побеждает A, отрицательное целое число (<= -1
), если побеждает B, или0
если это ничья.-18 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
i=0;for(int n:a)i+=n<2?1:n<3?-1:0;return i>0;
сохраняет несколько байтов байтов.i=0;for(int n:a)i+=n>2?0:3-n*2;return i>0;
еще короче.System.out.println(java.util.Arrays.toString(a));
после цикла, вы увидите, что он изменился, как и следовало ожидать (IMO). Какой тестовый пример, по вашему мнению, приводит к неверному результату и из-за какой части кода?Haskell,
60504859 байтИспользует
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]
сбой с ошибкой, но не должны рассматриваться.источник
JavaScript (ES6),
78 7573 байтаПопробуйте онлайн!
источник
05AB1E ,
34333230 байтИспользует целочисленный массив в качестве входных данных
A=-1, B=1, N=0, X=2, Y=3
и выводит отрицательное целое число (<= -1
), если побеждает A, положительное целое число (>= 1
), если побеждает B, или0
если это ничья.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Сетчатка 0.8.2 , 70 байт
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Выходы
0
на галстук. Объяснение:Справиться
Y
избирателям с правом людей с определенными голосами.Обращайтесь к
X
избирателям справа от людей с определенными голосами, а затем возвращайтесь к началу, пока все возможноеY
иX
голоса не могут быть решены.Обработка первоначального
X
избирателя рядом с решенным голосованием, а также начальногоY
избирателя рядом с решенным голосованием. Поскольку этот избиратель будет голосовать против принятого решения, в этом случае мы можем просто удалить оба голоса.Удалите все оставшиеся не проголосовавшие или не определились голоса, и отмените все пары противостоящих решительных голосов. Повторяйте, пока все возможные голоса не будут отменены. В случае ничьей ничего не останется, в противном случае все оставшиеся голоса будут одного типа.
Выведите,
1
если есть какие-либо голоса, но2
если они являютсяB
голосами.источник
JavaScript (Node.js) , 42 байта
Попробуйте онлайн!
Сэкономьте 1 байт, благодаря Shaggy.
источник
0
,1
а3
вместо1
а2
?3
, правда в JS. Я всегда думаю о0
/1
как фальси / правдивый. И поскольку нам больше не нужны разные выходы,0
= 1 победа и>= 1
= 2 победы тоже подойдут. Так что +1 от меня.питон
32,125121117 байт(Спасибо Джонатану Фреху)
Использование отступа табуляции
Вход: список
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]
преобразует строки в нужный формат ввода.Вы можете попробовать это онлайн! (Спасибо Джонатану Фреху за предложение)
источник
(i, i-1)[i>0]
должна быть эквивалентнаi-(i>0)
.if
s, вероятно, могли бы статьx[i]+=(v>3)*n+abs(n-1)*(v<0)
. Затем вы можете сэкономить на отступе, переместив теперь несоставный оператор (используя;
) в ту же строку, что иfor
.Perl 5, 54 байта
Попробуйте онлайн!
Используется
A
дляA
,B
дляB
,N
дляN
,\0
дляX
и\3
для Y (последние два - буквенные контрольные символы). Хитрость в том, чтоA
бит-xor\3
равноB
, и наоборот.источник
Javascript (ES6) - 133 байта
Принимает строку с форматом, заданным в OP, и возвращает 1, если кандидат 1 победил, и 2 в противном случае (я признаю это, я даже предвзятый).
источник
Python 2 ,
9573 байтаПопробуйте онлайн!
Исправление ошибки требовало добавления дополнительных байтов, но преобразование в лямбду благодаря @Stephen уменьшило его до 95
источник