В настольной игре «Поселенцы Катана» есть пять типов ресурсов: Кирпич, Бревно, Руда, Пшеница и Овцы. Строительство поселения стоит Кирпич, Бревно, Пшеница и Овца. Однако вы также можете торговать четырьмя одинаковыми ресурсами, чтобы получить ресурс другого типа. Например, если у вас в руке было четыре руды, вы могли бы обменять их всех и получить одну овцу.
Ваша задача - определить, могу ли я построить поселение, учитывая мою руку.
Твое задание
Ввод будет последовательностью букв B
, L
, O
, W
, и S
, взятые в любом приемлемом формате. Эти буквы соответствуют пяти типам ресурсов, приведенным выше. Вы должны указать, есть ли у меня ресурсы, необходимые для построения поселения, принимая во внимание возможность торговли четырьмя видами.
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Заметки
- Вам не нужно выводить, какие сделки мне нужно совершить или сколько расчетов я мог бы построить. Простое «да» или «нет» подойдет.
- Вы не можете предполагать, что входные данные находятся в каком-либо определенном порядке. В частности, вы не можете предполагать, что ресурсы одного и того же типа сгруппированы, так
OBLSO
что это допустимый ввод. - Это проблема принятия решения , поэтому вы можете использовать любое значение, которое хотите обозначить «да» и «нет», если два выбранных значения различны и согласованы.
- Здесь нас интересуют только те правила, которые перечислены выше. Более сложные правила Settlers of Catan, такие как торговля с другими игроками или в гаванях, здесь не актуальны.
- Входные символы (
B
,L
,O
,W
,S
) могут быть заменены другими значениями , если это проще для конкретного языка выбора, до тех пор, пока пять различных входов. Если вы используете другие входные значения, укажите их в своем ответе.
Примеры
BLWS -> Yes
OOOOWLB -> Yes (trade four O for a S)
OOW -> No
BBBO -> No
(empty input) -> No
BBBBLW -> No
BBBBBLW -> Yes (trade four B for a S)
OOOOOOOOOOOOOOOO -> Yes (sixteen O; trade for B, L, W, S)
BLBLBLBLBL -> Yes (trade L for W and B for S)
BLSWBLSWBLSW -> Yes (extra, unused resources are ignored)
источник
Ответы:
Python 2 , 54 байта
Попробуйте онлайн!
Для каждого из наших ресурсов, мы считаем число «свобод» данных при наличии n этого ресурса. Свобода представляет возможность заполнить один из слотов кирпичного бревна-пшеницы-овцы, который мы должны заполнить, чтобы рассчитаться, учитывая тот факт, что мы можем преобразовать наши ресурсы.
Для всех BLSW, имеющих один ресурса дает нам одну такую свободу, а каждое дополнительное превышение 4 дает нам другую. Правило подсчета свободы выглядит так:
Так п кирпичей / бревен / пшеницы / овец дают ⌊ (n + 3) / 4⌋ свобод.
Для руд учитываются только лишние четверки. Правило подсчета свободы выглядит так:
Так , п руды дают ⌊n / 4⌋ свободы.
Теорема: мы можем урегулировать, если и только если у нас есть ≥ 4 таких «свобод».
Таким образом, мы считаем наши свободы и проверяем, есть ли ≥ 4 из них. Чтобы обрабатывать подсчет руд как ⌊n / 4⌋, а других ресурсов ⌊ (n + 3) / 4⌋, мы искусственно увеличиваем количество других ресурсов на 3, а затем считаем countn / 4⌋ для всех из них. Мы делаем это путем сопоставления
(s+"BLSW"*3).count
вместоs.count
.доказательство :
Предположим, мы можем решить. Затем для каждого из [B, L, S, W] мы либо (а) использовали 1 из того ресурса, который у нас уже был, либо (б) пожертвовали 4 какого-то другого ресурса (включая руды) для его создания. В любом случае мы учитываем как минимум 1 свободу по вышеуказанным правилам. Итак, у нас ≥ 4 свободы.
Предположим , что мы имеем 4 свободы, к из которых из - за «перегибы» (каждая свобода от руд избыток, и каждая свобода от других ресурсов , в прошлом первый также) и 4-к из которых являются свидетель , владеющих не менее одной кирпич / бревно / пшеница / овца (тот, который дал «первую свободу»). Затем мы заполняем 4-k слоты кирпичом / бревном / пшеницей / овцой, которые дали нам первую свободу, и заполняем оставшиеся k слотов путем преобразования наших эксцессов. Все 4 слота заполнены, и мы можем решить. Очевидно, мы можем сделать это, если у нас более 4 свобод.
Это доказательство отстой, но я сонный. Я уверен, что есть лучшее объяснение.
источник
s
этоOOOOBLW
, вы в конечном итоге получитьsum(n/4for n in map(("OOOOBLWBBBLLLSSSWWW").count,"BLSWO"))>3
... так что для каждого изBLOWS
вас сосчитать , сколько раз он появляется в этой стартером строке"BLWS"*3
, затем подвести итог."OOOOBLWBLSWBLSWBLSW"
, на самом деле, но число одинаковое, конечно.)in"BLSWO"
не нужен в Python, не так ли? Кажется, работает в TIO по крайней мере ..Python 2 ,
5251 байт-1 байт благодаря Люку (заменить
>=0
на<0
, инвертируяFalse
/True
результаты)Безымянная функция принимает строку символов B , O , W , L и S (как в OP) и возвращает
False
если вы можете решить илиTrue
нет.Попробуйте онлайн!(принуждает вывод к
yes/no
OP).Как?
Это порт моего желе ответа. Нам нужно наверстать упущенное B , W , L или S из остатка после использования одного из них. Таким образом, мы можем добавить дополнительный O к нашей руке, затем уменьшить все счетчики на единицу, затем целочисленно разделить все счетчики на четыре и затем сложить - если результат равен нулю или более, мы можем рассчитать (либо потому, что не было пропущенных необходимых ресурсов или потому что мы можем торговать, чтобы получить недостающий (ые).
источник
False
для'yes'
иTrue
для'no'
? Затем вы можете изменить>=
на<
, сохраняя 1 байт.Pyth , 14 байт
Попробуй это здесь! или Проверьте все контрольные примеры.
Pyth ,
31 27 1716 байтПроверьте контрольные примеры.
Как это работает?
Объяснение № 1
Объяснение № 2
Вот коды, используемые моей программой:
источник
+%ld4/ld4
->s.Dld4
//Q4 4
может быть,/Q16
но я не совсем уверен ...BBBO
, например,4
и делить на4
.Желе ,
1312 байтМонадическая ссылка, принимающая список чисел, представляющих ресурсы, которыми вы владеете, и возвращающая,
1
если вы можете успокоиться или0
нет.Ресурсы,
1, 2, 3, 4, 5
где5
представляет руды .Попробуйте онлайн! или посмотрите набор тестов (используя OP IO).
Как?
Идея состоит в том, чтобы сначала посчитать ресурсы по типу, а затем уменьшить все значения B , L , W и S на один - если мы не подсчитали ни одного из этих четырех, то у них теперь будут записи -1 - нам нужно получить их из наших оставшихся ресурсов (это на самом деле достигается путем добавления дополнительного O (
5
) и уменьшения всех пяти счетчиков на 1 ). Затем мы делим целое число на все эти значения на четыре, чтобы увидеть, сколько единиц мы можем обменять с каждым из наших оставшихся счетчиков по типу ресурса, не влияя на счетчики -1 и 0 (обратите внимание, что -1 целое число, деленное на четыре,-1 , а не 0). Наконец, мы складываем значения и проверяем, будет ли результат больше или равен нулю (здесь можно использовать больше -1 , поскольку у нас всегда есть целые числа).источник
Java 8, 101 байт
Лямбда из
int[]
вboolean
. ПрисвоитьFunction<int[], Boolean>
.Попробуйте онлайн
Вход и выход
Входные данные - это массив целых чисел от 0 до 4 включительно. 4 представляет руду, а другие отображения несущественны. Мои тестовые примеры - это прямые переводы тех, кто в вопросе, с 0 как Кирпич, 1 как Бревно, 2 как Пшеница и 3 как Овцы.
Выход - можно ли построить поселение.
Ungolfed
объяснение
h
количество ресурсов, доступных для торговли. Мы выполняем итерацию по каждому типу ресурса (кроме руды), увеличиваяh
для каждого четверки имеющихся у нас дополнительных ресурсов и уменьшая при отсутствии ресурсов. Тогда наш результатh
неотрицательным.Линия
корректируется
h
соответствующим образом независимо от того, есть ли ресурсы (дефицит) или есть хотя бы один ресурс (излишек).f[i]
уменьшается для учета требуемого ресурса в случае излишка, производя -1 в случае нехватки. Сдвиг вправо со знаком сокращает выражение до 0 (избыточный регистр) или -1 (регистр нехватки), так что побитовое ИЛИ с числомf[i++] / 4
избыточных четверок (в случае с избыточным кодом) не влияет на случай дефицита, но приводит к числу Сам в избытке дела.Подтверждения
источник
...for(h=f[4]/4;i<4;h+=f[i++]/4)n+=--f[i]>>-1;return~h<n;
.a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;h+=f[i++]/4)h+=--f[i]>>-1;return~h<0;}
a->{int h,f[]=new int[5],i=0;for(int x:a)f[x]++;for(h=f[4]/4;i<4;)h+=--f[i]>>-1|f[i++]/4;return~h<0;}
Сетчатка , 34 байта
Попробуйте онлайн! Объяснение: Построение поселения требует 4 ресурсов, которые являются либо вашими первыми B, L, W или S, либо любыми другими 4 ресурсами того же типа. Это эквивалентно добавлению трех из каждого из этих четырех типов ресурсов, а затем подсчету, чтобы увидеть, есть ли у вас четыре набора из четырех.
источник
Желе , 23 байта
Попробуйте онлайн!
Обратитесь к следующей таблице для значений:
источник
Сетчатка , 43 байта
Попробуйте онлайн!
источник
Python 3 ,
7978 байтРедактировать: -1 байт благодаря @ Mr.Xcoder
Попробуйте онлайн!
источник
MATL , 19 байт
Ввод - это числовой вектор строки, в котором буквы представлены в виде чисел следующим образом:
Вывод
1
для правды,0
для ложных.Попробуйте онлайн!: Проверьте все контрольные примеры .
Как это работает
BLWS
) отличны от нуля. Это дает число с .Код комментария
источник
> <> 61 байт
Попробуйте онлайн!
Использует следующее сопоставление ресурсов:
Это действительно не имеет значения , что отображение используются, до тех пор , пока они в диапазоне
0-4
, и0
используются для О. Позволяет использовать то , что ищешь комбинациюBLWS
является таким же , как поиск комбинации ,OBLWS
а уже имеяO
в системе рука.источник
05AB1E , 19 байтов
0 -> Руда
1 -> Кирпич
2 -> Бревно
3 -> Пшеница
4 -> Овцы
Возвращает 0, когда ложь, и 1 в противном случае.
Попробуйте онлайн!
Объяснение:
Неконкурентное решение: 17 байт
В 05AB1E была ошибка, когда я впервые представил это решение, когда некоторые операторы плохо обрабатывали пустые вводы. Это привело к ответу на это решение
1
на пустой вход. Теперь это исправлено, поэтому это решение работает просто отлично.Разница здесь в том, что мы добавляем руду до удаления одного из каждого ресурса без разбора, считая количество ресурсов, удаленных таким образом. Затем мы уменьшаем счетчик на 1, чтобы получить правильное число B, L, W и S.
Попробуйте онлайн!
источник
JavaScript (SpiderMonkey) , 116 байт
Попробуйте онлайн!
Супер Clunky плохой ответ. Я уверен, что это может быть убрано больше. Метод вдохновлен ответом Линн в этой теме.
источник
Котлин ,
131129 байтпредставление
Тест
Не может работать на TryItOnline, но работает на try.kotlinlang.org
источник