Может быть, вы знаете, что игра Set (замечательная игра для детей) - карточная игра с 81 карточкой, где на каждой карточке изображена фигура с 4 различными атрибутами (форма, число, цвет и заполнение). Каждый атрибут имеет 3 разных значения:
form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.
На столе лежат 12 карт, и теперь задача состоит в том, чтобы указать наборы. Набор состоит из трех карт, где каждое значение атрибута встречается 0, 1 или 3 раза. 2 карты с красными цифрами, или непрозрачные, или 1 номер не годятся. Смотрите предоставленную ссылку для более наглядного объяснения.
Я предполагаю код для карты, где все атрибуты закодированы так
"WP2N"
обозначает
2 Purple Waves with No fill
Вместе с, например, OR1N
иDG3N
и
это набор (3 разных формы, 3 разных цвета, 3 разных номера, 1 заливка).
Ввод - это строка уникальных кодов (разделенных пробелами, случайно выбранных из 81 возможных кодов), представляющих карты.
"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"
Решение должно указывать все возможные наборы в данной коллекции. Так
OR1N, WP2N, DG3N
должен быть частью решения вместе со всеми другими наборами.
Ответы:
Рубин,
104988180 символовПробный прогон (используя данные вашего примера):
Он выводит
WP2N,DR1D,OG3O
дважды, потому что у вас есть дваDR1D
s в ваших данных выборки.Объяснение:
$*.combination(3).map{|c|
- каждая комбинация из 3 картputs c*?,if
- вывести набор, если ...(0..3).all?{|i|
- если все числа от 0 до 3 (значения свойств в строке) вычисляютсяtrue
при передаче в этот блокc.map{|x|x[i]}
- взятьi
индекс th каждой строки.uniq.size!=2}
- если количество уникальных свойств (форма, цвет и т. д.) не равно 2 (т. е. 1 или 3)источник
end
плюс несколько разрывов строк: преобразоватьif ... puts ... end
вputs ... if ...
б) все могут занять блок, таким образомx.map{}.all?
, равенx.all?{}
if
.Mathematica
93 92 93 82 7673Логика
StringSplit@#~Subsets~{3}
создает список из 3-х карточных подмножеств. Каждая тройка, такая как:{{"D", "G", "3", "N"}, {"W", "G", "3", "S"}, {"O", "G", "3", "О"}}
или
затем транспонируется,
и
Tally/@(Characters@#^T)
подсчитывает количество различных элементов в каждом ряду.3 соответствует «все разные»; 1 соответствует «все то же самое».
FreeQ[...,2]
определяет, будут ли 2 карты одного типа или тройные. Если 2 не входит в число, то три карты являются «сетом», согласно правилам игры набора.использование
источник
f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&
Выходной будет{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
Mathematica 73
использование
источник
Брахилог , 12 байт
Попробуйте онлайн!
Принимает ввод через входную переменную и генерирует вывод через выходную переменную.
Второй контрольный пример взят из недавно закрытого дубликата в его кодировке, так как это решение на самом деле не заботится о том, что на самом деле означает.
источник
GolfScript, 53 символа
Вход должен быть предоставлен в STDIN, например, онлайн :
Код комментария:
источник
0\zip{.&,2=|}/!
можно сократить доzip{.&,}%2&!
JavaScript
323313это функция, которая принимает массив объектов и возвращает массив объектов.
ДЕМО скрипка (с приборкой).
источник
APL (IBM), 76
У меня нет IBM APL, но я верю, что это сработает.
Пробный прогон (эмуляция IBM APL в Dyalog APL)
источник
Мудрец, 71
Если
C
это строка, скажем"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"
, выполнитьполучить
[{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]
И вот совсем другой подход, использующий интерпретацию, в которой множество является проективной линией
GF(3)^4
:Я был немного раздражен тем, что
D
его использовали дважды ... пока я не понял, как злоупотреблять этим. Но даже лучше, я тоже злоупотребляю этимfind
методом.str.find
возвращает -1, если письмо не найдено. Поскольку-1 = 2 mod 3
письмоS
обрабатывается надлежащим образом, потому что оно не встречается в'WODRPG123N'
.источник
Python 2 , 99 байт
Попробуйте онлайн!
источник