Напишите программу или функцию, которая принимает строку, содержащую только символы ^
и v
(вы можете предположить, что других символов не будет). Читайте слева направо, эта строка представляет последовательность щелчков мышью, сделанных одним пользователем при первом просмотре вопроса или ответа по Stack Exchange .
Каждый ^
представляет щелчок кнопки upvote и каждый v
представляет щелчок кнопки downvote . (Для рабочих примеров посмотрите немного влево.)
Предположим, что ограничения для голосования не действуют, поэтому все клики зарегистрированы правильно.
Распечатать или вернуть:
1
или+1
если сообщение заканчивается голосованием.0
если сообщение заканчивается тем, что за него не проголосовали. (-0
и+0
не действительны)-1
если пост в конечном итоге будет опущен.
Сообщения начинаются с нуля чистых голосов от пользователя, а кнопки изменяют чистые голоса следующим образом:
Net Votes Before Button Pressed Net Votes After
1 ^ 0
1 v -1
0 ^ 1
0 v -1
-1 ^ 1
-1 v 0
Самый короткий код в байтах побеждает.
Тестовые случаи:
[empty string] -> 0
^^ -> 0
^v -> -1
^ -> 1
v -> -1
v^ -> 1
vv -> 0
^^^ -> 1
vvv -> -1
^^^^ -> 0
vvvv -> 0
^^^^^ -> 1
vvvvv -> -1
^^^^^^ -> 0
vvvvvv -> 0
^^v -> -1
^v^ -> 1
^vv -> 0
vv^ -> 1
v^v -> -1
v^^ -> 0
^vvv^^vv^vv^v^ -> 1
^vvv^^vv^vv^v^^ -> 0
^vvv^^vv^vv^v^^^ -> 1
^vvv^^vv^vv^v^^v -> -1
^vvv^^vv^vv^v^^vv -> 0
^vvv^^vv^vv^v^^vvv -> -1
^vvvvvvvvvvvv -> 0
^^vvvvvvvvvvvv -> 0
^^^vvvvvvvvvvvv -> 0
vvv^^^^^^^^^^^^ -> 0
vv^^^^^^^^^^^^ -> 0
v^^^^^^^^^^^^ -> 0
code-golf
arithmetic
Кальвин Хобби
источник
источник
^
персонаж может вызвать изменение балла -1, +1 или +2? Где я? В чем дело?Ответы:
Gol> <> 0.3.11 ,
131211 байтовПопробуйте онлайн . Несмотря на то, что в следующем обновлении это будет работать нормально, на всякий случай я указал его как 0.3.11.
объяснение
Обратите внимание, что первое использование
@
вытягивает 0 из нижней части стека, чтобы инициализировать подсчет голосов для первой итерацииДля иллюстрации с полной таблицей:
источник
машинный код x86, 24 байта
Эта функция использует соглашение о вызовах fastcall, которое принимает строку и возвращает 8-разрядное целое число.
Я проверил это с помощью следующей программы на C, которая должна быть скомпилирована для 32-битного режима.
источник
JavaScript (ES7),
474644433736 байтВычеркнул 44, все еще регулярно 44 :(
Сохраняет промежуточную сумму в
s
. Используетfor of
цикл для перебора каждого символа в строке и обновленияs
на основе текущего символа и предыдущего значения.Редактирует: Гольф
~s&&-1
для!~s-1
. Это выражение должно быть равно 0, еслиs
равно -1 и -1 в противном случае. Сохранено 6 байт благодаря @nderscore.Как работает выражение:
источник
v=>[for(x of v)v=x<"v"?~~v<1:!~v-1]|v
CJam,
1814 байтовОбновленная версия со значительными улучшениями, внесенными Денисом:
Попробуйте онлайн
Объяснение:
источник
Befunge 93 - 55 байт
52 персонажа и 3 новые строки.
Проверено на этом переводчике .
Это
j
равноудалено от^
иv
в ascii, поэтому оно используется для выполнения арифметических преобразований в конце, а не занимающих много места условных выражений.источник
мозговой трах, 146 байт
Эта программа берет каждый байт ввода и сравнивает его с последним. Если они одинаковые, он выбрасывает ввод и сохраняет «0» как «предыдущий ввод», в противном случае он сохраняет его как обычно.
Если конечный результат есть
v
, он печатает-
. Если конечный результат был ненулевым, 1 добавляется в пустую ячейку. Наконец, 48 добавляется к этой ячейке, и она печатается.источник
Javascript ES6,
9148 символовПояснение:
undefined
заканчиваетсяd
.Контрольная работа:
История ответов:
источник
Python 2, 49
Итерирует с помощью функции обновления
это берет текущий подсчет голосов
x
и новый символc
и выводит новый подсчет голосов.Идея состоит в том, чтобы использовать
cmp
функцию Python 2 , которая сравнивает два аргумента и дает-1, 0, 1
для<, ==, >
соответственно. Внутреннийcmp('u',c)
дает-1
дляv
и1
для^
; любой символ между ними достаточно для'u'
. Внешний один сравнивает , чтоx
, что даетcmp(1,x)
для^
иcmp(-1,x)
дляv
, которые имеют правильные значения.Прямая итерация была на 3 символа длиннее (52), хотя была бы на 1 символ короткой (48), если
input()
было разрешено брать с кавычками.Лучшая рекурсивная функция, которую я нашел, была на один символ длиннее (50)
источник
Пролог,
159152 байтаКод:
Проверьте сами:
онлайн переводчик здесь
Пример
Изменить: 7 байтов сохранены путем объединения r-предложений с ИЛИ.
источник
CJam, 16 байтов
Это произойдет сбой после печати 0 , если это применимо. Ошибка может быть подавлена с помощью интерпретатора Java. Если вы попробуете это онлайн , игнорируйте все, кроме последней строки вывода.
Как это устроено
источник
Python 2,
177 15972 байтаВсе еще новичок в этом коде гольф вещь.
РЕДАКТИРОВАТЬ: Исправлено неправильное поведение.
РЕДАКТИРОВАТЬ 2: Спасибо @MorganThrapp за сбрить много байтов.
источник
JavaScript (ES6),
64595852 байтаЭто основано на наблюдении, что только последний отрезок повторения (или
^
илиv
) влияет на результат.Спасибо Нейлу за игру в гольф с 6 байтами.
источник
f=v=>(t=/\^*$|v*$/.exec(v)[0]).length*(t<'v'?1:-1)%2
хватает.>
или<
оператору. Спасибо за советы[0]
что могло вас запутать.f=v=>(t=/\^*$|v*$/.exec(v))[0].length*(t<'v'?1:-1)%2
, что это работает, что происходит из-за приведения типов к массиву.Haskell, 40 байт
источник
f
как инфиксную функцию%
. Кроме того, я думаю, чтоv
может быть_
.-1
дляvv
вместо 0?1%_=-1
_%_=0
12 символов.Скала, 75 байт
Тест на реализованную функцию.
источник
APL, 17
Для интерпретаторов без нотации вилки (например, GNU APL) это будет
{⍺×⍺≠⍵}/⌽0,2-'^ '⍳⍞
(19). Это, пожалуй, самое скучное из возможных решений, поскольку оно работает непосредственно из определения проблемы.источник
Рубин,
4135 байтRegex. Интересна только последняя нажатая кнопка, поэтому проверьте длину пробега. Затем сравните его с
"a"
(или любой буквой между^
иv
), чтобы получить1
или-1
.источник
C # 6, 18 + 80 = 98 байт
Требуется:
Актуальная функция:
Как это работает: код сначала удаляет все перед последним
^^
илиvv
. Это содержание не имеет значения, потому что нажатие на одну и ту же кнопку дважды всегда отменяет ваш голос. Она делает это путем разделения на^^
иvv
и с последним пунктом. Если этот элемент является пустой строкой (.Length<1
), функция возвращается,0
потому что все голосования были отменены. Если строка не пустая, то она просто смотрит на последний символ исходной строки: она переопределит все предыдущие голоса. Если код символа меньше 95, то это будет 94^
, поэтому он возвращается1
, в противном случае-1
.источник
Python 2.7,
797588источник
(-1,(1,0)[n==0])[n>0]
чтобы сэкономить 10 байт. Кроме того, не используйтеa=str.count
. Это на самом деле стоит вам 4 байта.Минколанг 0,11 ,
2822 байтаПопробуй это здесь.
объяснение
Обратите внимание, что нет
N.
в конце. Это потому, что я позволил этому перейти к началу. Когда вход пуст, итоговый счет выводится как целое число, и программа останавливается.источник
Pyth, 13 байт
источник
Mathematica, 60 байт
источник
@#&
? Это бесполезно (еслиSequence
s не участвуют, ноSequence
s не участвуют.Скрипт формы , 26 байт
Как это работает
источник
C # 6, 18 +
9795 =115113 байтов, без строковых методов, чрезмерное LINQИстинно заслуживает, чтобы ему предшествовал
Получил идею использовать
x<95?1:-1
вместо ответаx=='^'?1:-1
от ProgramFOXСовпадения:
источник
C:
6766 байтgolfed:
ungolfed:
источник
Go, 179 байт
Чрезвычайно наивное решение.
Ungolfed:
источник
Perl 5, 41 байт
40 байт, плюс 1 для
-p
/(.)\1*$/;
сравнивает входную строку с регулярным выражением/(.)\1*$/
, т.е. видит, заканчивается ли она одним символом, повторяемым некоторое число ≥1 раз.Если это так, то
$&
есть вся строка повторения и$1
символ; в противном случае (т. е. входная строка пуста), эти две переменные являются пустой строкой.$1=~v?-1:1
сравнивает$1
с регулярным выражениемv
и возвращает -1, если оно совпадает, и 1 в противном случае.И умножьте это ± 1
(length$&)%2
на длину по$&
модулю 2.источник
05AB1E ,
141211 байтПорт ответа @ Sp3000 's Gol> <> .
ПРИМЕЧАНИЕ: @Grimy уже опубликовал более короткую 8-байтовую альтернативу для 05AB1E , так что убедитесь, что проголосовали за него!
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
05AB1E , 8 байтов
Попробуйте онлайн!
Альтернативные решения с той же длиной:
u㤮öÓÆ(
,㤮ögÓÆ(
.источник
^^ -> 0
CJam,
2724 байтаПопробуйте онлайн .
Все, что я взял от ответа Денниса, это
g
(знак функции).источник
Руби, 43
9-i/11
оценивается в 1 или -1, если даны коды ASCII^
(94) илиv
(118)В тестовой программе:
источник