обзор
Учитывая 3 строки строки, выясните, если структура падает влево, уравновешивает или падает вправо.
Структура ввода
Вы можете представить конструкцию в виде металлического стержня с наполнителем сверху, который сбалансирован сверху вертикального стержня.
1 7 4 a
===============
|
Первая строка - это предметы. Вес каждого предмета рассчитывается как значение ascii символа минус 32. (Символы до 32 не учитываются, а пробелы весят 0). Имейте в виду, что сила предмета на стержне равна его весу, умноженному на расстояние до точки поворота.
Вторая строка - это удочка. Каждая длина стержня весит 1 единицу. Эта строка исключительно равна знакам ( =
).
Третья линия - это точка разворота. Это может быть помещено где угодно, и представлено числом пробелов, сопровождаемых единственным |
символом pipe ( ).
Примеры
Входные данные:
===== |
Выход: баланс
Входные данные:
===== |
Выход: падает слева
Входные данные:
% ===== |
Вывод: баланс (потому что %
весит достаточно, чтобы противодействовать весу левой стороны стержня)
Входные данные:
аа ======= |
Вывод: падает вправо (потому что a
справа находится дальше от точки поворота)
Входные данные:
1 7 4 A
===============
|
Выход: падает слева
Входные данные:
1 7 4 a
===============
|
Вывод: падает справа (строчные буквы тяжелые!)
Входные данные:
$ ~
===============
|
Выход: баланс
Заметки
- Конечный пробел разрешен, ведущий пробел - нет.
- Ваша программа может выводить в любом формате, который вам нравится, при условии, что есть 3 различных выхода для left, balance и Right.
- Ваша программа должна принять формат, показанный как ввод.
Ответы:
JavaScript (ES6),
116111108106 байт-5 байтов путем суммирования через
eval(array.join`+`)
вместоarray.reduce()
.-3 байта по умолчанию
1
вместо32 - 31
, позволяя удалить скобки.-2 байта, поскольку точка разворота - длина последней строки - 1
Выходы
-1
,0
или1
, для левого, сбалансированного или правого соответственно. Закончилось тем же, что и ответ Питона на Chas Brown , так что заслуга в этом.Может сохранить 4 байта, если первая строка дополняется, чтобы соответствовать длине стержня с помощью
(31-t.charCodeAt(i))*(b.length+~i)
.Тестовый фрагмент
Включает дополнительный вывод (
Left
/Balanced
/Right
) вместе с номером.Еще один 106-байтовый метод
Вместо того , чтобы создавать
join
массив на+
s, мы создаем строку чисел, каждое с префиксом+
. Ведущий+
игнорируется.источник
(b.length+~i)
может помочь сохранить байт. (Также я не понимаю, почему у вас есть||1
.)b.length+~i
возвращает отрицательное значениеi-b.length+1
; это могло бы помочь, если бы я мог отрицать другую часть. Что касается того||1
, что это было, потому что я предполагал, что первая строка не была дополнена, чтобы соответствовать длине стержня, поэтомуt.charCodeAt(i)
вернулась быNaN
за конец первой строки.Python 2 ,
112110 байтПопробуйте онлайн!
РЕДАКТИРОВАТЬ: Наконец-то удалось устранить
enumerate
иrjust
для 2 жалких байтов ... Мех!Берет в строку; выводит -1,0 или 1 для падений влево, остатков, падений вправо соответственно.
Первый проход на 112 байт был:
источник
(ord(c)-31)
Мне потребовалось некоторое время, чтобы понять, что это фактически включает вес самого стержня вместе с предметами. Очень умно!return
сprint
на -1 байт (хотя это не очень приятно играть с текущим кодом TIO).Haskell,
212171 байт (188, если принять входные данные одной строкой)171 байтовый вариант
Вариант 188 байт
объяснение
источник
fromEnum
вместоord
и броситьimport
.c
может быть упрощен доc p=max(ord p-32)0
(или сfromEnum
) и, поскольку вы используете его только один раз, вставьте его.c
может быть даже упрощена (символы до 32 не рассматриваются) в дальнейшемc p=ord p-32
. Такжеp
в основномlength
(минус 1), такp x=length x-1
что будет работать (и вы можете включить его тоже). Также посмотрите на мое решение, как я используюsignum
- вы могли бы сделать,r o l s = signum $ 2 * z ...
что возвращает0,1,-1
для B, L, R.[3,4,7]
проходит тестовые случаи и принимает 3 строки вместо одной. (см.lines
)Желе , 30 байт
Тестирование
Выходы 0 для сбалансированного, 1 для правого и -1 для левого.
Как это работает
источник
Желе , 24 байта
Попробуйте онлайн!
-1
для падения влево,0
для балансировки,1
для падения вправо (полная программа).[-1]
для падения влево,[0]
для балансировки,[1]
для падения вправо (функция).Первая строка должна иметь конечные пробелы, последняя строка не должна.
Пояснение (мы начинаем с нижней строки):
Прежде всего, мы работаем с отдельными строками, поэтому нам нужно как-то их получить. Это работа для
Ỵ
. Затем нам нужно обработать\n
версию ввода -split так, как если бы это был исходный ввод, поэтому мы используемµ
монадическую цепочку, примененную к текущему значению.Теперь мы начинаем настоящую работу, и нашей первой работой будет вычисление коэффициентов весов. По сути, это диапазон [расстояние от крайнего левого до центра. 0 .. расстояние от центра до крайнего справа]. Прежде всего, мы должны найти основанный на 1 индекс пивота, который по сути является длиной последней строки без конечных пробелов. Таким образом, мы извлекаем последнюю строку (линию разворота) из нашего исходного списка
Ṫ
, поскольку она нам больше не нужна, а затем мы берем ее длинуL
. Затем нам нужно взять длину стержня, для которой мы делаем то же самое с последней последней строкой (линия стержня) сṪL$
. Наконец, чтобы получить диапазон, мы наносим на карту | х - у | в [1..rod length], где x - это индекс поворота, а yкаждый элемент списка, на который мы наносим карту. Мы делаем это, используяạЀ
, гдеạ
вычисляет | х - у | иЀ
составляет от 1 до и включая длину стержня. Теперь у нас будет диапазон, который мы хотим.После этого мы должны умножить каждое целое число, представляющее кусок стержня, на соответствующий вес. Для вычисления весов мы используем
Ç
переход к верхней строке нашего кода. Мы берем на себя оставшуюся линиюṪ
, ее charcodes сO
, а затем вычислить й - 31 с использованием_31
, й не каждый charcode. Затем мы присваиваем пробелу вес 1 (0 + штанга = 1),!
вес 2 (1 + 1) и т. Д. Мы закончили с верхней строкой, поэтому теперьÇ
вернемся список весов, который мы умножим на соответствующий целые числа, представляющие части стержня с×
.После этого мы разделяемся с
ṣ0
точкой поворота, представленной 0 (поскольку любой вес там не повлияет на результат), в результате получается список в форме [[1-й вес, 2-й вес ... вес перед поворотом] , [вес после разворота, вес после того, что перед… последним весом]]. Эти списки представляют стороны стержня слева и справа. Теперь мы суммируем каждый из списков, используяS€
для получения суммарных весов с каждой стороны, и используем,I
чтобы взять дельту, которая будет отрицательной, если левая сторона тяжелее, нулями, если они равны весу, и положительной, если правая сторона тяжелее. , Таким образом, чтобы вернуть конечный результат, используя его должным образом, мы берем знак сṠ
.источник
APL (Dyalog) , 43 байта *
Попробуйте онлайн!
⊆⊢
разделить аргумент на серии символов, которые⎕TC[2]∘≠
отличается от 2 - го T erminal C ontrol характера (Linefeed) **{
…}
Применить следующую анонимную функцию в списке строк:⊃⌽⍵
в первой строке перевернутого списка (т.е. в последнем)'|'⍳⍨
найти индекс точки поворота(
…)-
Вычтите это из следующего списка:⊃⍵
первая строка≢
его длина⍳
все ɩ ndices о том , что(
…)+.×
Взвешенная сумма с этими весами и следующими значениями:⊃⍵
первая строка⎕UCS
Точки код в U niversal С haracter S и др¯31+
добавить отрицательный тридцать один (32 для требуемого смещения минус один для стержня)×
знак того* Для 1 байта на символ используйте
{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢
с⎕ML←3
. Попробуйте онлайн!**
⎕TC
устарела и используется здесь только для целей игры в гольф. В производственном коде нужно использовать⎕UCS 10
.источник
Haskell (Lambdabot), 142 байта
Попробуйте онлайн!
Безголовая версия:
источник
Python 2 , 90 байт
Ожидает, что входные строки будут дополнены (с пробелами) правильной длины. Выходы
-1
для падений влево ,0
для сбалансированных и1
для падений вправо .Попробуйте онлайн!
94 байта
Для +4 байтов у нас может быть версия, которая, используя
while
цикл, требует зачеркнутых строк, а не дополненных строк:Попробуйте онлайн!
источник
Рубин, 543 байта
источник
C (gcc) , 106
107121123124129131байтовВерните 0 для падения влево, 1 для баланса и 2 для падения вправо.
Требуется, чтобы все три строки имели одинаковую длину и заканчивались
\n
для определения длины строки.Попробуйте онлайн!
источник
Математика, 91
92байтовПервая строка должна иметь одинаковую длину со стержнем. Третья строка не должна содержать пробелов.
Верните -1, 0, 1 для падения влево, баланса и падения вправо.
источник
C # (.NET Core) ,
1279590 + 18 = 108 байтовДля этой функции первая строка должна быть дополнена справа пробелами такой же длины, что и стержень, а третья строка не должна иметь пробельных пробелов. Эти условия разрешены (см. Комментарии к вопросу).
Попробуйте онлайн!
Выходы:
-1 для наконечника влево
0 для баланса
1 для наконечника вправо
источник
Python 3, 217 байт
Также работает в Python 2.7
Возвращает 1 для левой стороны, -1 для правой стороны или ноль, если сбалансирован.
Читаемая версия:
источник
sum([...])
, вы можете просто иметьsum(...)
i[c:].find(e)
можноi.find(e,c)
, использоватьi,m,n=s.split('\n')
иs
вообще избегать необходимости , использоватьreturn 2*(r>l) or l>r
для значительного сокращения затрат на тестирование в конце (возвращаемое значение численно эквивалентно, ноTrue
вместо1
иFalse
вместо0
), или действительно использовать другой набор возвращаемых значений значения и сделать,return (l>r)-(r>l)
чтобы вернуть 1, 0 или -1, как этоcmp
делала старая функция.i[c:]
потому что более короткий путь вызвал странную проблему с одним-единственным вводом в угловом регистре (попробуйте разместить|
точно посередине - над полосой).PHP, 105 байт
печатает
-1
/0
/1
влево / баланс / вправо. Запустите как трубу с-nR
или попробуйте онлайн .сломать
источник
Древесный уголь , 31 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Выходы 0 для баланса или -1 или 1 для падения влево или вправо. Изменить: Изменения в Charcoal теперь означают, что
≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
работает на 24 байта: попробуйте онлайн! Ссылка на подробную версию кода. Примечание. Оба ответа требуют ввода с дополнением, но могут быть адаптированы для приема ввода без дополнения со стоимостью 3 байта:≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰
попробуйте онлайн!≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
Попробуйте онлайн! Ссылки на подробную версию кода.источник