Почему симулятор?
В наши дни у детей нет ни времени, ни амбиций, чтобы пойти и сложить коробки на качелях или поиграть с уравновешивающими физическими объектами. Это оставляет много места на рынке программного обеспечения для Lever Simulator, который, согласно моим моделям, будет продаваться как сумасшедший!
Требуется помощь по программированию
Я подал патент на такую игру (в ожидании), но мне нужен опытный программист, чтобы написать игровую логику для меня. Насколько я понимаю, это стандартная практика, чтобы компенсировать программистов на основе размера в байтах конечной программы. Таким образом, я буду заключать этот выгодный контракт с самой низкой ставкой.
Спецификация
Рычаг - это серия ящиков или пустых пространств, уравновешенных точкой опоры. Каждая коробка имеет определенный вес от одного до девяти, а пробелы не имеют веса. Как вы знаете, вес коробки на рычаге прямо пропорционален тому, как далеко этот ящик находится от точки опоры. Ящик с весом, 4
который находится на третьем месте от точки опоры, будет вносить 12
эффективные единицы силы в ту сторону рычага.
Мне нужна программа, которая при наличии рычага ввода будет выводить, будет ли рычаг наклонен влево, вправо или будет идеально сбалансирован.
Руководство по вводу / выводу
- Вы напишите для меня программу.
- Ввод будет содержать одну строку текста.
- Входные данные будут поступать из
stdin
или как одна строка командной строки. - Коробки будут представлены символами
1
«через9
». Эти символы представляют их соответствующие веса. Пустое пространство будет представлено пробелом ''. Точка опоры будет представлена кареткой '
^
'.
Рычаг ввода образца может выглядеть так: 8 2^ 941
Этот рычаг идеально сбалансирован: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- Там не будет ни начальных, ни конечных пробелов. Не будет завершающего перевода строки.
- Нет необходимости обрабатывать некорректный ввод, ввод всегда будет иметь только одну точку опоры, и только цифры и пробелы.
- Выходные данные будут указывать, является ли рычаг тяжелым слева, тяжелым справа или сбалансированным.
- Ваша программа должна иметь ровно 3 возможных выхода, которые могут быть результатом правильно сформированного ввода. Вы можете выбрать, что это такое.
- Выходные данные должны быть либо распечатаны,
stdout
либо быть кодом возврата программы.
Контрольные примеры
Здесь я использую L
, R
, B
означает левый тяжелый, правый тяжелый, сбалансированный:
Вход:
11 ^9
Выход:B
Вход:
321^ 12
Выход:L
Вход:
9^ 1
Выход:R
(Если у кого-то есть более «сложные» тестовые случаи, не стесняйтесь их редактировать).
Библиография
Не обязательно вдохновленный, но связанный с Балансом набор весов на качелях
источник
The output must either be print to stdout or be the return code of the program.
Что ж, теперь вы просите меня создать дистрибутив Linux, который использует обозначения качелей для кодов выхода.^16
,16^
или^
? (Предположим, что это возможно)Ответы:
Python 2, 69 байт
Модуль
ord(c)%16
извлекает значение символа цифры, получая 0 за пробел. Для каждого символа его вклад в крутящий момент вычисляется как его вес, умноженный на расстояние в знаке до точки поворотаi-s.find('^')
, и они суммируются и сравниваются с 0, получая одно из-1,0,1
. Персонаж^
рассчитан на вес 14, но это не имеет значения, потому что он в центре внимания.18-байтовый Pyth порт по Maltysen:
Для кода Python, если требуется полная программа, вот 79 байтов. Идея состоит в том, чтобы начать
i
сдвигать индекс на обратныйs.find('^')
отсчет.источник
Javascript ES6, 62 байта
-1
если левый тяжелее0
если сбалансирован1
если право тяжелееUngolfed:
Тестовые прогоны (назначение анонимной функции
f
):R B L
на-1 0 1
e.split``
на[...e]
(спасибо @ Vɪʜᴀɴ)~~'^'
оценивается в0
...)источник
f=
и сказать, что оно генерирует анонимную функцию. (-2 байта FYI)Japt , 22 байта
Japt - это сокращенная версия Ja vaScri pt . переводчик
Возвращает
-1
дляL
,0
дляB
и1
дляR
.Как это устроено
источник
APL,
3930 байтПеречитав правила, я изменил это на вывод
-1
0
1
вместо тогоL
B
R
, чтобы сэкономить девять байтов.Попробуй это здесь .
источник
Pyth, 20 байтов
Тестирование
-1
для левостороннего,0
для сбалансированного,1
для правостороннего.Как это устроено:
источник
Haskell,
116968276 байтовВыход
0
для сбалансированного,-1
для левого тяжелого и1
для правого тяжелого.Пример использования:
f "321^ 12"
->-1
Как это работает: найти часть до
^
. Умножьте входную строку и список весов, который начинается с- length-of-first-part
.^
Имеет вес 0 и не добавляет к сумме. Я использую трюк @ xnor's mod 16 для преобразования цифр / пробелов в целочисленные значения. Если сумма отрицательная (положительная), рычаг будет тяжелым слева (правым) и сбалансирован, если сумма равна 0.источник
TeaScript , 23 байта
25Я пытался написать ответ Pyth, но это пошло ужасно: \
Это
²
выглядит так неуместно, но сохраняет 1 байт, так что я буду держать его.Попробуйте онлайн!
Проверьте все случаи
Для схемы вывода я выбрал:
-1
если левый тяжелее правого (L
)0
если левый такой же тяжелый, как правый (B
)1
Левый менее тяжелый, чем Правый (R
)Ungolfed && Объяснение
Это использует карты и уменьшает, чтобы сделать работу.
источник
pb ,
349329 байтЭто было сложно. ПБ не был предназначен, чтобы быть хорошим в таких вещах.
У него даже нет умножения .Но эй, это работает.Самым сложным было, после получения сумм (вес * расстояние) для каждой стороны, определить, какую букву нужно напечатать. у пб нету
>
или<
операторов, просто==
и!=
. Нет простого способа узнать, какое значение больше. Я не могу даже вычесть и сравнить с 0 ... если я не сделаю что-то действительно глупое.Затем вы просто переходите к X = (слева - справа), и вот ваш ответ! Удалите все в этой строке, чтобы очистить, а затем напечатайте значение, которое было найдено в (0, 0).
... Но есть немного более короткий путь. Вместо использования «L», «B» и «R», используйте эти значения - «B» и добавьте «B» снова при печати. Таким образом, вам никогда не нужно ставить 'B' в X = 0, вы просто оставляете его как 0, в котором он уже был. Единственная проблема заключается в том, что, как только вы это сделаете, программа станет очень тупой в режиме просмотра.
'L'-'B'==76-66==10=='\n'
, Кажется, все работает нормально, пока внезапно не будет напечатано огромное количество новых строк, и невозможно отследить, что происходит: D В обычном режиме выполнения pbi все работает нормально, потому что новые строки удаляются до того, как что-либо будет напечатано в приставка.источник
Perl 5, 72 байта
источник
MATLAB 91, 57, 55Octave, 50 байтовЯ не ожидал, что играю в гольф дальше, но переход на Octave позволил сэкономить 5 дополнительных байтов! Вау, это заняло время ...
Он выводит
-Inf, NaN, Inf
дляL, B, R
соответственно.Тестирование!
Объяснение:
Это определенно трудный для чтения код, но я постараюсь объяснить, насколько смог. Я буду переключаться между объяснением блока кода и текстом.
Давайте посмотрим, что происходит внутри скобок:
Это немного сложно:
Числа на каждой стороне лестницы должны быть умножены на расстояние от каретки. Если мы используем отрицательные числа с левой стороны и положительные числа с правой стороны, мы можем просто сложить вектор, чтобы увидеть, какая сторона является самой тяжелой.
Предположим , что входной строки:
'321^ 12'
. Мы хотим , чтобы следующее:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. Вектор, который мы сделали внутри скобок, начинается с1-i
(в данном случае-3
, так как каретка находится в 4-й позиции). Это идет сnnz(x)-i
шагом в один. Мы можем использоватьnnz(x)
вместоnumel(s)
, потому чтоx
это строка, не содержащая нулей.Следовательно:
Теперь мы могли бы сделать поэлементное умножение
s.*[...]
и взять сумму этого. Но, поскольку у нас есть два вектора, мы также можем умножитьs
путем транспонирования[...]
и вычислить сумму с использованием умножения матриц:Это дает нам либо отрицательное число, означающее, что левая сторона тяжелее, ноль, означающее, что он сбалансирован, либо положительное число, означающее, что правая сторона тяжелее. Вместо того чтобы использовать наивный подход
sign(...)
, мы умножаем его наinf
, который дадим нам либо-Inf
илиInf
для левых и правых соответственно. Мы получаемNaN
для0*inf
, так как это не определено.Это дает нам три различных значения для трех возможных результатов.
источник
𝔼𝕊𝕄𝕚𝕟, 22 символа / 38 байт
Try it here (Firefox only).
источник
JavaScript, 146 байт
Довольно массивный.
Demo .
источник
function t(s){
могло статьt=>{
иsplit('^')
могло статьsplit`^`
Рубин,
111108 байтобъяснение
Суммирует взвешенное значение каждого числа на каждой стороне. Затем он использует оператор космического корабля ruby, чтобы обеспечить 1,0, -1 равенства / неравенства двух сторон, что является индексом массива с правильным выводом.
источник
PowerShell,
8373 байтаСпасибо TessellatingHeckler за гольф.
Использует, по сути, тот же алгоритм, что и в предыдущем более старом коде, но здесь мы перебираем символы во входной строке по одному за раз, а не перебираем индекс, что экономит несколько байтов. По-прежнему выдает такое же впечатляющее сообщение об ошибке, когда алгоритм достигает
^
- не влияет на STDOUT.предыдущий
Использует тот же потрясающий алгоритм, что и превосходный ответ Дендробиума , и, следовательно, использует тот же результат,
-1 / 0 / 1
что и входleft-heavy / balanced / right-heavy
.Тьфу. Задолго из разливочного
костыльфункции , что PowerShell имеет. Наиболее уместным здесь являетсяchar
умножение наint
функции. Получение массива-индексаstring
результатов вchar
объекте. PowerShell преобразуетchar
его в соответствующее значение ASCII (а не литеральное значение) перед умножением. Итак, что-то вроде$a='012'[0];[int]$a*2
результатов в96
.Это означает, что нам нужно перевести его обратно как строку. Тем не менее, просто делать
string
времяint
дает намstring
повторять это много раз. Например,$a='0';$a*2
приведет к00
.Это означает, что нам нужно преобразовать
char
обратно как astring
перед повторным вещанием какint
, тогда может произойти умножение, прежде чем мы добавим его в наш аккумулятор$x
.Соедините это с длинным способом перебора строки и вызовом .NET для вывода знака, и мы получим довольно длинный кусок кода.
NB. Это приведет к выдающейся ошибке, когда он достигнет
^
строки, заявив, что не может преобразовать ее вint
. Не влияет на STDOUT.источник
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
на 74 байта. Это заняло много времени и несколько попыток подхода. math :: sign выглядит так долго, но я не вижу способа улучшить этот бит.$i++*+"$_"
эквивалентно$i++*"$_"
if$i
is int.CJam, 29 байт
Попробуйте онлайн
Результат
-1
для левого тяжелого,0
для сбалансированного,1
для правого тяжелого.Это казалось немного длинным, но я попробовал кучу альтернатив, и все они оказались между 29 и 33 байтами. Одна проблема заключается в том, что я не смог найти способ преобразования строки в значения, которые автоматически приводили бы к 0 для пробелов. Таким образом, я в итоге явно заменил пробелы символами '0, что, очевидно, увеличивает длину кода.
Альтернативы пробовали:
ee
оператора для добавления индекса в список значений.Объяснение:
источник
Python 3,
196114 байтовОбычный код:
Объяснение:
stdin
.Огромное спасибо @ThomasKwa за обрезку 82 байтов (более 40%)!
источник
print('LBR'[(B>D)-(B<D)])
для конца иB=D=0
в начале.^
. Этоabs()
тоже тебя спасает .C
140139138134100 байтВернуть:
Бегать:
Как мы имеем ASCII:
Мы получили:
Затем сумма по фактору расстояние до
^
.источник
SpecBAS - 140 байт
t
представляет собой промежуточный итог, значения являются отрицательными, когда позиция символа превышает позицию в каратах. В конце он видит, является ли total отрицательным, нулевым или положительным, и печатает соответствующий символ R, B или L.Я мог бы сбрить несколько байтов, просто выдав -1, 0 или 1, как некоторые другие ответы.
источник
Java, 83 байта
источник