Такузу - логическая игра, в которой вы должны заполнить сетку ячейками, содержащими 0
s и 1
s. Сетка должна следовать 3 правилам:
- Три горизонтальные или вертикальные последовательные ячейки не могут быть одинаковыми.
- В каждой строке и столбце должно быть одинаковое количество
0
s и1
s. - Две строки не могут быть одинаковыми, а две колонки не могут быть одинаковыми.
Давайте посмотрим на готовую сетку:
0011
1100
0101
1010
Как видите, эта доска следует правилу 1
, 2
а 3
. Не существует трех одинаковых горизонтальных или вертикальных ячеек, все строки и столбцы содержат одинаковое количество 0
s и 1
s, и нет двух одинаковых строк и двух столбцов.
Давайте посмотрим на сетку, которая не действительна:
110100
010011
011010
101100
100011
001101
Есть куча проблем с этой сеткой. Например, строка 5
содержит три 0
строки подряд, а столбец 2
содержит три 1
строки подряд, а затем три0
секунды. Следовательно, это недействительная сетка.
Задача:
Ваша задача - создать программу, которая, учитывая двумерный массив n
* n
0
s и 1
s, проверяет доску, чтобы увидеть, является ли она действительной, готовой доской Takuzu.
Примеры:
0011
1100
0101
1010
Эта доска соответствует всем правилам и поэтому является действительной доской Такузу. Вы должны вернуть истинное значение для этого.
11
00
Это недействительная доска - строка 1
не соответствует правилу 2
. Вы должны вернуть значение Falsey для этого.
100110
101001
010101
100110
011010
011001
Это недопустимая доска, она терпит неудачу (только) из-за правила 3 - первая и четвертая строки одинаковы.
110100
001011
010011
101100
100110
011001
Это недействительная доска, она терпит неудачу (только) из-за правила 3 - первый и четвертый столбцы одинаковы.
011010
010101
101100
010011
100110
101001
Это действительная доска.
Правила и характеристики:
- Можно предположить, что все доски имеют квадратные размеры
n * n
, гдеn
положительное и четное число. - Вы можете предположить, что все доски закончены.
- Вы можете принимать входные данные как двумерный массив, содержащий значения, обозначающие
0
и1
, или как строку. - Вы должны вывести согласованные значения truey и falsey для досок truey и falsey, и значения, представляющие «truey» и «falsey», не могут быть одинаковыми.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
Ответы:
Брахилог ,
2018 байтПопробуйте онлайн!
объяснение
источник
false
для этого ?Шелуха ,
1918 байтПопробуйте онлайн!
1 байт сохранен благодаря H.PWiz!
Основная идея заключается в применении к входу серии преобразований, которые являются идентификаторами действительной доски, и проверке, совпадает ли конечный результат с исходным входом.
объяснение
источник
)
Желе , 17 байт
Попробуйте онлайн!
-6 байт благодаря милям и Джонатану Аллану .
источник
µZ$⁺
снова сделал это: p ... и 17 байтов, немногоMathematica, 143 байта
вход
источник
Python 2 , 127 байт
Попробуйте онлайн!
Читает список из n n- кортежей в качестве входных данных.
Я мог бы вывести по коду выхода, написав
1/(…)
вместо,print…
но это кажется подло. Нужно ли мне?объяснение
n
размер доски;b
список столбцов (транспонированиеa
) Остальное одно длинное цепное сравнение:[n/2]*n*2==map(sum,a+b)
проверяет правило 2. Каждая строка и столбец должны иметь сумму n / 2.map(sum,a+b)>len(set(a))
всегда верно (список> int).len(set(a))==len(set(b))==n
проверяет правило 3.n<'0, 0, 0'
всегда верно (int <str).'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`
проверяет правило 1.`a+b`
является строковым представлением всех строк и столбцов; для примера ввода на TIO этоЗначение
`a+b`>'1, 1, 1'
в центре всегда истинно, так как эта строка гарантированно начинается с"["
, что больше, чем"1"
.источник
[n/2]*n*2==map(sum,a+b)>len(set(a))==len(set(b))==n<'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`>x
, что на 2 байта короче, чем деление, и в результате получаетсяNameError
достоверный ввод.Шелуха ,
2725 байтВвод - это список списков, а вывод -
1
дляTrue
и0
дляFalse
Попробуйте онлайн!
Explaination
Тест 1
Тест 2
Тест 3
источник
Сетчатка ,
1298985 байтПопробуйте онлайн! Выходы 0 для действительных, 1 для недействительных. Редактировать: 4 байта сохранены благодаря @MartinEnder. Объяснение:
Дублируйте каждый ряд с
,
разделителями.Транспонировать первый дубликат.
Дублируйте снова, на этот раз с
;
разделителями.Удалите все совпадающие пары цифр перед точкой с запятой.
Проверьте, не нарушает ли какой-либо из столбцов или строк какое-либо из правил;
(.)\1\1
проверяет наличие трех одинаковых цифр подряд,\d,?;
проверяет непарную цифру и(\D\d+\b).*\2
проверяет дубликат.источник
(...).*
последнем этапе просто сделать,max(matches,1)
то вы можете сохранить три байта, используя1
вместо этого в конфигурации..\b\d+\b
может быть\D\d+\b
..*
которое ранее использовал, но не думал использовать Конфигурация для ограничения результата, спасибо!Pyth , 31 байт
Большое спасибо @Leaky Nun .
Проверьте все контрольные примеры или попробуйте здесь!
Pyth ,
48 46 4442 байтаЭто первоначальное решение.
Проверьте все контрольные примеры или попробуйте здесь!
источник
MATL , 27 байт
Ввод представляет собой матрицу, содержащую
0
и1
. Выход0
для фальши,1
для правды.Попробуйте онлайн! Или посмотрите тестовые случаи: 1 , 2 , 3 , 4 , 5 .
объяснение
источник
R ,
114107 байт-7 благодаря Джузеппе, вызывающему функции из строя и реально сжимающему условия
Попробуйте онлайн!
Это просто применяет правила к столбцам матрицы, а затем к столбцам транспонирования матрицы.
Принимает вход в виде:
Именно так R принимает двумерные массивы.
Выходы TRUE для сбоев, FALSE для пропусков.
источник
mean(y)-.5
внутри внутреннейf
функции , чтобы получить средства , а неcolMeans
, и сделалg
неназванным. Это добавит предупреждения для преобразованияdouble
вlogical
в вызове ,any
но это нормально.Perl 6 ,
10093 байтаПереходы FTW! Они экономят 7 байтов.
В настоящее время это, кажется, превосходит все другие представления, написанные на языках, не относящихся к гольфу. Yippie!
Попробуйте онлайн!
Пояснение : Это блок, который принимает доску как список списков. Мы делаем транспонирование с помощью
[Z] @^a
(сокращаем список списков с помощью оператора zip). Так@^a,[Z] @^a
же список платы и ее транспонирования. Мы зациклились на этомfor
что работает точно так жеmap
, просто в этом случае на 1 символ дешевле.Внутри мы сначала соединяем списки, составляющие строки, в строки, поэтому у нас есть список строк вместо list lists (
@(.map(*.join))
). Затем мы используем анонимный блок (.&{...}
), где мы на самом деле оцениваем правила. Мы оценим их только построчно. (Так как мы делаем это для исходного массива и транспонирования, а также.)Чтобы сохранить некоторые из них
!
, мы используем немного логики и вместо тестирования(NO repeated rows) AND (NO 3 consecutive same symbols) AND (NOT different counts of 0 and 1)
мы тестируемNOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]
. Это то, что мы делаем в анонимном блоке:.repeated
выдает все строки, которые встречаются более одного раза, затем мы сопоставляем строки, пытаемся сопоставить 3 последовательных символа, используя регулярное выражение, и вычитаем количество 0 и 1. Это OR'red с|
. (На самом деле он создает очень мощную вещь, называемую соединением , но мы не используем ни одну из его способностей :)) После всего этого мы получаем список из 2 «bools» (не свернутых соединений). Мы наконец или их (используяmax
) и negate (!
), что дает желаемый результат.источник
J,
403855 байтПопробуйте онлайн!
Определяет функцию, принимающую квадратную матрицу в качестве входных данных.
По крайней мере, он избивает Пита (пока ...)(ошибочно). Я должен вернуться к подсчету эмодзи, спрятанных в моем коде, поскольку J также поддается этому:[:
/^:
:1
|:
:]
:-.@
:#
:@]
:~@
Пояснение (немного устаревшее)
Это отличается от моего ответа, и я могу его обновить. Части его все те же - я просто не проверял правило 3 и неправильно проверял правило 2 раньше.
Разделить на несколько функций и раскрутить:
join_trans
Это соединяет транспонирование матрицы с самим собой, создавая массив матриц.
part_3
Это проверяет сумму разделов 3 по строкам, чтобы увидеть, является ли оно 3 или 0 (поскольку любой из них означает недопустимую доску), возвращая 1, если оно есть, и 0 в противном случае. Он работает как с матрицей, так и с транспонированием, так как он дан обоим.
е
Из-за отсутствия лучшего имени я называю это
f
. Он заменяет 0 на _1 и оставляет 1 без изменений. Это позволит мне в конечном итоге проверить, равны ли числа 0 и 1 в каждой строке и столбце (сумма каждой из строк должна быть равна 0).главный
По сути, я использую тот факт, что я настроил его так, чтобы
f join_trans
и то иpart_3 join_trans
другое суммировалось в 0, если доска действительна.part_3
должно быть все нули для действительной доски, аf
сумма должна равняться нулю для действительной доски, что означает, что сумма их сумм равна 0 только для действительной доски.источник
*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
Хаскелл ,
137136127 байт9 байт сэкономлено благодаря Линн!
Попробуйте онлайн!
источник
all
в одинand
:l x=x==nub x&&and[sum y*2==length x&¬(j[0,0,0]y||j[1,1,1]y)|y<-x]
j=isSubSequenceOf
наj x=isSubSequenceOf[x,x,x]
?j a b
вызывать (и определять) это какa#b
?Java 8,
350326325312303299298259255 байтВозвращает,
0
когда это действительная доска;1
если он недействителен для одного или нескольких из трех правил.-95 байт благодаря @Nevay .
Объяснение:
Попробуй это здесь.
источник
Python 3, 187 байт
Попробуйте онлайн!
Вводит в виде списка строк.
источник
05AB1E , 29 байт
Попробуйте онлайн!
объяснение
Правило: 3
Правило: 2
Правило: 1
Затем мы берем произведение результата всех 3 правил с
P
источник
Дьялог АПЛ,
6452514948 байтовтребует
⎕IO←0
Попробуйте онлайн!
источник
PHP, 245 + 1 байт
это громоздко переносы строки предназначены только для удобства чтения:
Принимает одну строку без перевода строки, печатает
1
для правды, ничего для фальши.Запустите как трубу с
-nR
или попробуйте онлайн .источник