Я думаю, что все знакомы с дартс, некоторые люди не понимают счет, поэтому для этих людей здесь есть полезная ссылка на это.
Доска
Дартс можно сравнить с пирогом, разрезанным на 20 частей. Каждый кусок разделен на 4 раздела.
- маленькое внешнее кольцо, называемое двойным (точки х2)
- большое кольцо под названием один (точки х1)
- другое маленькое кольцо, называемое тройным (точки х3)
- еще одно большое кольцо, называемое одиночным (точки х1)
В середине доски еще 2 кольца, зеленое и красное (классическая доска)
- Красное кольцо, центр доски называется яблочко или двойной бык и хорошо для 50 очков. Этот считается двойным, и из-за этого его можно оформить.
- Зеленое кольцо, называется бык, один бык или просто 25 и считается за одного.
Вызов
Найти все возможности оформления заказа с 3 дротиками или меньше.
Пользователь может ввести целое число, и вам нужно будет проверить, можно ли получить счет до 0 с помощью 3 дротиков (или меньше).
Примеры
пример 1:
Input: 170
Output: T20, T20, Bullseye
Пример 2:
Input: 6
Output: D3;
S3,S1,D1;
S2,D2;
S2,S2,D1;
D2,D1;
S4,D1;
D1,D1,D1;
S1,S1,D2;
T1,S1,D1;
Пример 3:
Input: 169
Output: No possible checkout!
правила
- Основное правило дротика, вы должны заканчиваться двойным (внешнее кольцо доски или яблочко)
- Нет использования внешних ресурсов.
- Допускается жесткое кодирование возможных проверок, но помните, что это codegolf, ваш код не будет коротким;)
- Ячейки для удара будут отображаться в формате C + N, где C = T для Triple, D для двойной и S для одиночной.
- яблочко можно назвать яблочко или DB, DBull или что-то симулированное.
Возможные проверки
Чтобы начать, Максимально возможная проверка составляет 170.
169 168 166 165 163 162 159 невозможны в 3 дротика.
Минимально возможный заказ составляет 2.
К тому же
Это не является обязательным требованием, добавьте возможность показывать все возможные проверки для всех результатов. В основном потому, что мне интересно, сколько комбинаций возможно: P
Победителем станет тот, у кого самый короткий код.
Удачного кодирования.
Ответы:
C ++
248/228230/214 символовРед. 0:
Ред. 1. Сохранены некоторые символы, объявив все переменные одновременно и удалив ненужные скобки. Оказывается, в C ++ все логические и побитовые и / или имеют меньший приоритет, чем сравнения.
Я сделал функцию, а не программу, как другие. Возвращает общее количество найденных возможностей. Его можно уменьшить с 230 до 214 символов, исключив функцию суммирования.
Пример вывода, оценка 6:
Я считаю разные первый и второй дротики одной и той же комбинацией, как это сделал ОП (пример:
T1 S1 D1 = S1 T1 D1), хотя это стоит дополнительно 7 символов. Сначала я всегда перечисляю более высокий счет (игнорируя удвоение и утроение), так как считаю, что это более актуально для игрока (который может изменить свою стратегию, если он пропустит первый дротик). По той же причине я перечисляю дротики в порядке согласно второй дротик Я считаю, что 3-й дротик полностью отличается от двух других, поэтому я считаю, что D1 D2 и D2 D1 - это разные случаи, в то время как в OP они перечислены как одинаковые.
С этой системой подсчета я получаю 42336 полных возможностей , так же, как mmumboss. Считая разные первый и второй дротики как разные комбинации, это дойдет до 83349.
Я не использовал цикл for с множествами, как это делали другие (я довольно плохо знаком с C ++ и даже не знаю, возможно ли это.) Вместо этого я злоупотребляю условным приращением цикла, чтобы перейти с 20 на 25 Я использую переменную из одного цикла, чтобы закодировать все возможные оценки для одного дротика, например: S1 D1 T1 S2 D2 T2 и т. Д. С модулем и делением для декодирования. Это экономит на многословности объявления большего количества циклов, хотя и усложняет выражения.
Результатом этого является то, что неиспользованный дротик отображается как T0, но я думаю, что понятно, что имеется в виду, тем более что (рассматривая разные первый и второй дротики как одну и ту же комбинацию) я смог сгруппировать их все вместе в начале моего выхода.
Безголовая версия здесь. Пара других функций - использование операторов & и && выборочно с | таким образом, чтобы дать порядок приоритета я хочу без скобок.
источник
MATLAB (
299249241 символов)Это мой первый серьезный гольф. Моя первая попытка (136 символов) дает правильный результат, но не с правильным форматированием. Это дает все возможности, глядя на количество очков для каждого дротика. Это означает, что одинарные 20 и двойные 10 имеют отдельную запись, однако они оба отображаются как 20. Конечно, последний дротик всегда является двойным.
Во второй попытке улучшено форматирование, что, конечно, увеличило количество символов:
Улучшено с 299 до 249 символов, при этом даже улучшено форматирование вывода. Для этой улучшенной версии выходные данные для примеров:
е (170):
F (6):
F (169):
Дополнительно:
Согласно моим расчетным навыкам, есть всего 42336 возможностей закончить игру в дартс.
источник
60 60 50
должно быть написаноT20 T20 Bullseye
. Я сделаю это более ясным в вопросе. Хорошо идет, хотя, почти там :)Рубин (260 символов)
«Последний должен быть двойным» - отсутствующий кусок - не мог понять, почему 168 не должен иметь результатов ...:
с. (170)
с. (6)
источник
Python 2,7 (270 символов)
Не уверен, что Python позволит однострочно, но он в три.
Или 278+ символов с правильным сообщением «Нет проверки» (например, 290 здесь):
Вот так:
е (170)
F (6)
F (169)
Вещи, которыми я не доволен:
Это более 10% от общего количества. Есть ли более компактный способ без itertools и т. Д.?
Это используется для предотвращения дублирования в случае двух дротиков (например, ['', 'S1', 'D1'] и ['S1', '', 'D1']). Я считаю, что порядок имеет значение (эй, последний дротик должен быть двойным, поэтому порядок важен), но не бросок - это особый случай.
источник
05AB1E , 43 байта
Довольно медленно. Выводит в виде списка списков или пустого списка, если окончание невозможно. Мои быки
S25
иD25
; если это не разрешено, я могу изменить это.Попробуйте онлайн или проверьте несколько тестовых случаев одновременно .
Объяснение:
Есть несколько шагов:
1) Создайте список всех возможных одиночных, двойных и тройных дротиков:
2) Получите все возможные финишеры (заканчивающиеся двойным) до 3 дротиков:
3) Сохраняйте только те, для которых общий балл равен целочисленному вводу:
4) Преобразуйте данные в довольно распечатанный список результатов (то есть
[[20,3],[5,1],[1,2]]
становится["T20","S5","D2"]
):источник
Котлин , 254 байта
Примечание: алгоритм основан на ответе C ++ Level River St.
Попробуйте онлайн!
источник