Уравновешивание
Качели (предположительно от французского «ci-ça», что означает «это-то») составляют треть священной троицы игрового оборудования, наряду с такими же вездесущими горками и качелями. Качели находятся в идеальном равновесии, если и только если сумма моментов на каждой стороне эквивалентна. Поэтому качели можно уравновесить, добавив определенное количество веса в сторону с меньшей суммой моментов; достижение этой цели является вашей целью.
Вызов
Ваша задача состоит в том, чтобы взять изображение качелей в качестве входных данных и вывести их снова, с весом, добавленным к одному концу качелей, чтобы сбалансировать его.
вход
Ваша программа должна иметь в любом приемлемом формате качели ASCII, такие как:
100 100
-------------------
^
Первая строка содержит два числа, каждое из которых представляет вес на качелях. Ровно один вес присутствует на каждой стороне, каждый действует на самом конце своей стороны доски. Веса гарантированно являются целыми числами и всегда совпадают с соответствующим концом доски. Эти числа никогда не будут перекрывать точку опоры ( ^
).
Вторая строка представляет «доску» качелей. Каждый тире ( -
) представляет одинаковую длину для каждого другого тире, за единственным исключением тире непосредственно над точкой опоры ( ^
), которая не имеет длины.
Третья строка представляет точку опоры качели. Эта точка опоры помечена единственным символом, который не является пробелом в этой строке, - окружностью ('^'). Точка опоры может быть расположена в любом месте по всей длине доски на допустимом входном сигнале, если остается достаточно места, чтобы числа, представляющие веса, не перекрывали точку опоры ни на входе, ни на выходе.
Входные данные гарантированно состоят из трех строк и не имеют пробелов до или после символов, составляющих качели (за исключением, конечно, третьей строки, которая этого требует).
Выход
Для вывода такое же изображение качелей должно быть напечатано на стандартный вывод, но с заменой одного (и только одного) веса на больший, чтобы сбалансировать качели. Входные данные гарантированно сделают это возможным, используя только целые числа. Следовательно, веса должны быть показаны без десятичных точек или любых других аналогичных обозначений. Если ваш язык не использует стандартный вывод, вы должны прийти к общему / мета-консенсусу по выводу. Конечные переводы строки хороши, но любые другие изменения в формате описания, вероятно, не в порядке.
заверенная копия
Тестовые входы и соответствующие выходы
Вход 1
12 22
--------------------
^
Выход 1
12 26
--------------------
^
Вход 2
42 42
-----------
^
Выход 2
42 42
-----------
^
Вход 3
3 16
----------------
^
Выход 3
14 16
----------------
^
Вход 4
1 56
-------------------
^
Выход 4
196 56
-------------------
^
Реализация ссылок - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
правила
Это код-гольф , поэтому самый короткий код считается в байтах. Проверьте мета, если подсчет байтов неудобен на вашем языке.
Применяются стандартные правила / лазейки.
Входные данные должны быть приняты в разумном формате. Неисчерпывающий список подходящих форматов приводится ниже:
- Одна строка со строками, разделенными символами новой строки
- Список строк, каждая строка представляет собой строку
- 2D-массив или матрица символов
Связанные проблемы
- Балансировать набор весов на качелях - Предложено в августе 2015 года samgak
Ответы:
05AB1E ,
605150494745 байтСэкономили 10 байтов благодаря Эминье и 1 байт благодаря Аднану.
Все строки ввода должны иметь одинаковое количество символов.
Попробуйте онлайн!
Должно быть практическое правило, например, «если ваш код 05AB1E длиннее 40 байт, вы, вероятно, делаете это неправильно». Кажется, что это гольф, любая идея приветствуется!
источник
¬s¤s\‚
можноõK
.kD²g->(‚
может быть,¡€g
если вы добавите недостающие пробелы в нижнем ряду контрольного примера31SÍ
на1®‚
:)/ ï
на÷
.?JavaScript (ES6), 136
Вероятно, не работает в Chrome, поскольку он использует деструктурированное назначение и параметры по умолчанию.Обратите внимание, что стандартный метод вывода JS
alert
особенно не подходит для этой задачи из-за используемого пропорционального шрифта.Меньше гольфа
Тестовое задание
источник
Perl, 149 + 2 = 151 символов
Требуются параметры командной строки
-p0
(это дает мне 2-байтовое наказание поверх 149 байтов в самой программе).Объяснение:
-p0
Переключатель считывает весь ввод до первого байта NUL или EOF. Эта проблема не допускает NUL, поэтому по умолчанию мы получим все входные данные в переменной,$_
которая используется для регулярных выражений и т. Д..+?
), но я не могу получить его ниже 3 символов, поэтому я могу также использовать очевидный\d+
. Второе число находится в конце строки, поэтому его можно проанализировать как.+
(2 символа). Центральная линия используется для определения ширины шкалы; он анализируется как-+
(многие другие представления будут работать). Пробелы перед кареткой в последней строке+
. Как только каретка (или вообще любое другое пространство) появляется, мы игнорируем остальную часть ввода.$1
,$2
,$3
,$4
. Предоставление регулярного выражения в качестве аргумента дляmap
дополнительного использования массива этих групп в качестве массива для отображения. Поэтому мы берем их длины; это удобный способ хранить длины$3
и$4
без необходимости писатьlength
дважды. Мы также перезаписываем$_
с длиной$1
; нам не важно значение этого (количество цифр в левом входе бесполезно), но тот факт, что оно короткое ($_
длина теперь равна количеству цифр в числе цифр в первый вес, который обязательно очень мал по сравнению с шириной весов).$r
в котором делятся шкалы.$1*$r>$2
проверяет, какая сторона тяжелее Мы храним новые веса в$x
и$y
; они имеют очень простые вычисления, как только соотношение весов известно.$x
,$,
и$y
в,$_
чтобы создать верхнюю строку, затем продолжаем добавлять пробелы ($"
по умолчанию содержит один пробел и короче, чем буквальный пробел' '
),$,
пока длина не станет такой же, как в средней строке (т.е. имеет длину$c
). (Я выбрал переменную$,
, как это встроенная переменная , которая может безопасно быть изменен в связи с этим и начинает по умолчанию пустой) . Какlength
действует на$_
по умолчанию, мы не должны дать ему аргумент явно. Я использовал условное выражение Yoda, потому что для правильного разбора требуется значительно меньше неоднозначности синтаксиса.$\
), чтобы он содержал остальную часть набора масштабов (который такой же, как и во входных данных, поэтому я могу просто использовать$3
и$4
непосредственно для создания его основной части). Обратите внимание, что это означает, что в третьей строке нет завершающих пробелов; добавление этого сделает программу немного длиннее и, похоже, не будет служить цели, поэтому я оставил ее.-p
переключатель снова срабатывает; на этот раз он выводит$_
после чего следует "перевод строки" ($\
). Поскольку я переопределил вывод новой строки, эти два неявных отпечатка генерируют новый набор масштабов между ними (хотя в качестве побочного эффекта нет новой строки на выходе).-p
коммутатор пытается снова прочитать ввод, но мы уже удалили весь файл, поэтому он читает EOF и завершает программу.источник
PHP,
212209205 байтвероятно гольф
Принимает данные из аргумента командной строки; избежать новых строк. Беги с
-r
.Замена на заполнитель не сработала, как ожидалось; поэтому я должен был добавить еще паренов к первому регулярному выражению.
источник
Befunge,
223217 байтПопробуйте онлайн!
источник
>
я думаю, был просто оставлен по эстетическим причинам. Тем не менее, у меня, кажется, есть 215-байтовое решение в моих заметках, так что это может быть возможно (если у меня также есть ошибки, которые объясняют, почему я никогда не отправлял его - у меня нет времени сейчас его тестировать).Python 2,
184183 байтаОпределенно гольф
Довольно просто. Просто возьмите скорректированные веса для настройки обеих сторон, посмотрите, какая из них больше, чем оригинал, и измените эту, и выведите.
РЕДАКТИРОВАТЬ Переключение умножения и деления, потому что целочисленное деление - зло (спасибо @JonathanAllan за то, что заметил это)
РЕДАКТИРОВАТЬ -1 байт Изменено
i().index('^')
наi().find('^')
(благодаря @JonathanAllan [снова!])источник
a=[w[1]*R/I,w[0]*I/R]
(Простой пример, который не сработает, будет a1
and2
withI
иR
оба3
). В настоящее время 194 не 184, кстати , так как новые строки считаются байтами каждым, ноj
иk
более стоимость байт , чем они экономят.I=i().find('^')
и короткую форму__repr__
обратных кавычек, чтобы сделать последнюю строкуprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
и перейти к 182 - repl.it/EW8fC ++ 14, 482 байта
более читаемая версия:
источник
Питон 3,
235230 байт (минимизированная ссылка)Я просто уменьшил количество ссылок, так как я очень новичок в код-гольфе.
Вы используете его точно так же, как в примере, но функция
s
вместоbalance_seesaw
.источник
w[o>p]=[o//k,p//t][o>p]
. Кроме того, большинство строк можно объединить, чтобы избавиться от лишних пробелов.