Це дійсна дошка Takuzu?


21

Takuzu - це логічна гра, в якій вам доведеться заповнити сітку з клітинками, що містять 0s і 1s. Сітка повинна відповідати 3 правилам:

  1. Немає трьох горизонтальних або вертикальних послідовних комірок не може бути однаковим.
  2. У кожному рядку та стовпці повинно бути однакове число 0s і 1s.
  3. Жоден два рядки не можуть бути однаковими, і жоден два стовпці не можуть бути однаковими.

Давайте розглянемо готову сітку:

0011
1100
0101
1010

Як бачите, ця рада дотримується правила 1, 2і 3. Немає трьох горизонтальних чи вертикальних комірок, які однакові, усі рядки та стовпці містять однакову кількість 0s і 1s, і жодних двох рядків та двох стовпців немає однакових.

Давайте розглянемо сітку, яка не є дійсною:

110100
010011
011010
101100
100011
001101

З цією сіткою є маса проблем. Наприклад, рядок 5має три 0s підряд, а стовпець 2- три 1s підряд, а потім три 0s. Тому це не дійсна сітка.

Завдання:

Ваше завдання - скласти програму, яка, даючи 2D масив n* n 0s і 1s, перевіряє плату, щоб переконатися, що це дійсна, закінчена плата Takuzu.

Приклади:

0011
1100
0101
1010

Ця рада дотримується всіх правил, тому є дійсною дошкою Takuzu. Ви повинні повернути для цього значення "truthy".

11
00

Це не дійсна дошка - рядок 1не відповідає правилу 2. Ви повинні повернути для цього значення фальси.

100110
101001
010101
100110
011010
011001

Це не дійсна дошка, вона виходить з ладу (лише) через правило 3 - перший і четвертий рядки однакові.

110100
001011
010011
101100
100110
011001

Це не дійсна дошка, вона виходить з ладу (лише) через правило 3 - перший і четвертий стовпці однакові.

011010
010101
101100
010011
100110
101001

Це дійсна дошка.

Правила та характеристики:

  • Можна припустити, що всі дошки мають квадратні розміри n * n, де nдодатне парне ціле число.
  • Можна припустити, що всі дошки закінчені.
  • Ви можете взяти введення в масиві 2D , що містять значення означають 0і 1, або у вигляді рядка.
  • Ви повинні виводити послідовні значення truthy та falsey для truthy та falsey дощок, а значення, що представляють "truthy" та "falsey", не можуть бути однаковими.

Це , тому найкоротший код у байтах виграє!



3
Я знаю це як 0h h1 ...
Erik the Outgolfer

3
@EriktheOutgolfer Так, я почав лише знаючи це як 0h h1, але Takuzu - це оригінальна назва головоломки.
клісмік

@EriktheOutgolfer Я завжди знав це як "Бінарна головоломка" або "Subiku", але "Takuzu" - це так, як Qwerp-Derp згадував оригінальну назву.
Kevin Cruijssen

2
Ще кілька тестових випадків було б непогано (мені не вистачає великих, дійсних дощок.)
Lynn

Відповіді:


16

Брахілог , 20 18 байт

≠\≠,?¬{∋s₃=|∋ọtᵐ≠}

Спробуйте в Інтернеті!

Пояснення

≠                           All rows are different
 \                          Transpose
  ≠                         All columns are different
   ,?                       Append the list of rows to the list of columns
     ¬{          }          It is impossible that:
       ∋                      A row/column of the matrix…
        s₃=                   …contains a substring of 3 equal elements
           |                Or that:
            ∋ọ                The occurences of 1s and 0s in a row/column…
              tᵐ≠             …are not equal

" Додайте список рядків до списку стовпців " розумний спосіб гольфу! І тут я подумав, що ваша 20-байтна відповідь - це питання і пограти в гольф настільки, наскільки це було можливо. Я бачу, що Брахілог настільки ж хороший у валідації матриць, як і у їх вирішенні . :)
Кевін Кройсейсен

1
Чи не слід це виводити falseдля цього ?
H.PWiz

1
@ H.PWiz Добре знайдіть, дякую. Повернено до 18-байтної версії, яка працювала.
Фаталізувати

@LuisMendo Я просто вкладаю всі рядки та всі стовпці до одного списку в основному.
Фаталізувати

2
@ Zgarb Правильно, дякую. Це вже втретє, коли мені довелося відмовитись від редагування, вступний пост відчуває відчайдушну потребу в кращих тестових випадках ...
Підтвердити

11

Лушпиння , 19 18 байт

S=‼(Tf§=LṁDum(ṁ↑2g

Спробуйте в Інтернеті!

1 байт збережено завдяки H.PWiz!

Основна ідея полягає у застосуванні ряду перетворень до вхідних даних, які є тотожними для дійсної дошки, і перевірка того, чи є кінцевий результат таким же, як вихідний.

Пояснення

S=‼(Tf§=LṁDum(ṁ↑2g
            m(ṁ↑2g    in each line, take at most two items for each sequence of equal items
           u          remove duplicate lines
     f§=LṁD          keep only those lines where the sum of each element doubled is equal to the length of the line
    T                 transpose the matrix (swap rows with columns)
  ‼                   do all the previous operations again
S=                    check if the final result is equal to the original input

2
Деякі перестановки для видалення)
H.PWiz

@ H.PWiz це було майже очевидно, німий мене!
Лев

7

Желе , 17 байт

-*S;E3Ƥ€F$TȯQZµ⁺⁼

Спробуйте в Інтернеті!

-6 байт завдяки милям і Джонатану Аллану .


1
Я вважаю, ви можете скоротити це до 21 байта. TIO
миль

@miles ... можливо, навіть 19 байт ?
Джонатан Аллан

1
@JonathanAllan, це 18 байт ... так, ти µZ$⁺знову зробив цю справу: p ... і 17 байт, трохи помінявши: D тепер я переміг брахілог-хе-хе
Ерік Атголфер

@EriktheOutgolfer Більше, це краватка!
Фаталізувати

@JonathanAllan Nice. Також я вважаю, що це перший раз, коли доданий префікс / інфікс швидко був корисним.
миль

5

Математика, 143 байти

And@@Flatten@(((s=#;Equal@@(Count[s,#]&/@{0,1})&&FreeQ[Subsequences@s,#]&/@{{1,1,1},{0,0,0}})&/@#)&&(DeleteDuplicates@#==#)&/@{#,Transpose@#})&


вхід

[{{0, 0, 1, 1}, {1, 1, 0, 0}, {0, 1, 0, 1}, {1, 0, 1, 0}}]


5

Python 2 , 127 байт

a=input()
n=len(a)
b=zip(*a)
print[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`

Спробуйте в Інтернеті!

Читає список 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 це

    "[(0, 0, 1, 1), (1, 1, 0, 0), (0, 1, 0, 1), (1, 0, 1, 0), (0, 1, 0, 1), (0, 1, 1, 0), (1, 0, 0, 1), (1, 0, 1, 0)]"

    У `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до вхідних даних.
ов

3

Лушпиння , 27 25 байт

Λ§&Λȯ¬VEX3§&Λ§=#0#1S=uSeT

Введення - це список списків, а вихід - 1для Trueі 0дляFalse

Спробуйте в Інтернеті!

Пояснення

                      SeT    Create a list with the input and itself transposed
Λ                            Is the following function true for all in the list
 §&                          And the results of the following functions
   Λȯ¬VEX3                     Test for rule 1
          §&                   The and of:
            Λ§=#0#1                Test for rule 2
                   S=u             Test for rule 3

Тест 1

Λȯ¬VEX3
Λ         Is it True for all ...
   V      Are any of the ...
     X3   Substrings of length 3 ...
    E     All equal
 ȯ¬       Logical not

Тест 2

Λ§=#0#1
Λ         Is it true for all that ...
 §=       The results of the two functions are equal
   #0         Number of 0s
     #1       Number of 1s

Тест 3

S=u
S=    Is the result of the following function equal two its argument
  u   Remove duplicates

3

Сітківка , 129 89 85 байт

.+
$&,$&
O#$`.(?=.*,)
$.%`
.+
$&;$&
+`(01|10)(?=.*;)

1ms`(.)\1\1|\d,?;|(\D\d+\b).*\2

Спробуйте в Інтернеті! Виходи 0 для дійсних, 1 для недійсних. Редагувати: Збережено 4 байти завдяки @MartinEnder. Пояснення:

.+
$&,$&

Скопіюйте кожен ряд з ,роздільниками.

O#$`.(?=.*,)
$.%`

Перекладіть перший дублікат.

.+
$&;$&

Знову повторюємо, на цей раз з ;роздільниками.

+`(01|10)(?=.*;)

Видаліть всі збігаючі пари цифр, що передують крапці з комою.

1ms`(.)\1\1|\d,?;|(\D\d+\b).*\2

Перевірте, чи не відповідає жодному правилу стовпець чи рядок; (.)\1\1перевіряє три однакові цифри поспіль, \d,?;перевіряє наявність непарної цифри та (\D\d+\b).*\2перевіряє наявність дубліката.


Якщо метою (...).*останнього етапу є лише виконання max(matches,1)цього завдання, ви можете зберегти три байти, скориставшись 1конфігурацією.
Мартін Ендер

А .\b\d+\bможе бути \D\d+\b.
Мартін Ендер

@MartinEnder Спочатку я замінив недійсний вихід без вихідних даних і протестував його в кінці ... Я врешті-решт відмовив його від одного тесту в кінці і зрозумів, що можу опустити провідну, .*яку раніше використовував, але не думав використовувати конфігурація для обмеження результату, дякую!
Ніл

3

Pyth , 31 байт

Велике спасибі @Leaky Навина .

.Asm++mqy/k\0lQdm<hk3srL8d{Id,C

Перевірте всі тестові випадки або спробуйте тут!


Піт ,  48 46 44  42 байт

Це вихідне рішення.

&{IQ&{I.TQ.Am&q/d\0/d\1!+/d*3\0/d*3\1sC,.T

Перевірте всі тестові випадки або спробуйте тут!

& {IQ & {I.TQ.Am & q / d \ 0 / d \ 1! + / D * 3 \ 0 / d * 3 \ 1sC, .T Повна програма з неявним введенням.

 {IQ Чи вхідний інваріант під дедупликацією?
& {I.TQ І чи є також його транспондіальним інваріантом?
                                        .TQ Transpose.
                                           Q Вхід.
                                     sC, Zip вище, [^, ^^] (і сплющуйте).
    & І чи виконується наступна умова?
          .Am Усі елементи є надійними при відображенні ^^.
              q / d \ 0 / d \ 1 Є стільки 0, як і 1.
             &! + / d * 3 \ 0 / d * 3 \ 1 І немає прогонів із 3 рівних елементів.

3

MATL , 27 байт

,G@?!]tEqts~w7BZ+|3<bXBSdvA

Вхід - це матриця, що містить 0і 1. Вихідний результат - для хибної 0, 1для правдивої.

Спробуйте в Інтернеті! Або дивіться тестові випадки: 1 , 2 , 3 , 4 , 5 .

Пояснення

,       % Do twice. First iteration will use the input, second its transpose
  G     %   Push input
  @     %   Push iteration index: first 0, then 1
  ?     %   If nonzero
    !   %     Transpose
  ]     %   End
  t     %   The top of the stack contains the input or its transpose. Duplicate
  Eq    %   Convert to bipolar form, i.e. replace 0 by -1
  t     %   Duplicate
  s     %   Sum of each column
  ~     %   Negate. If all results are true, condition 2 is fulfilled
  w     %   Swap. Moves copy of bipolar input/transposed input to top
  7B    %   Push [1 1 1], obtained as 7 converted to binary
  Z+    %   2D convolution. Gives a matrix of the same size as the input
  |3<   %   Is each entry less than 3 in absolute value? If all results are true,
        %   condition 1 is fulfilled
  b     %   Bubble up. Moves copy of input/transposed input to top
  XB    %   Convert each row from binary to a number
  Sd    %   Sort, consecutive differences. If all results are nonzero, condition 3
        %   is fulfilled
  v     %   Concatenate all results so far into a column vector
  A     %   True if all entries are nonzero
        % End (implicit). Display (implicit)

2

R , 114 107 байт

-7 завдяки Джузеппе, виклик функцій не в порядку та дійсно стиснення умов

function(x)any(f(x),f(t(x)))
f=function(x)c(apply(x,1,function(y)max(rle(y)$l)>2+mean(y)-.5),duplicated(x))

Спробуйте в Інтернеті!

Це просто застосовує правила до стовпців матриці, потім до стовпців транспозиції матриці.

Вводиться у формі:

matrix(c(0,0,1,1,1,1,0,0,0,1,0,1,1,0,1,0), ncol=4)

Що саме так R приймає 2D масиви.

Виводить ПРАВИЛЬНІ для відмов, ЛАЖНІ для проходів.



Загальні поновлення: використовувані mean(y)-.5всередині внутрішньої fфункції , щоб отримати кошти , а не colMeans, і зробив gненазваним. Це додасть попередження для перетворення doubleв logicalу виклику , anyале це нормально.
Джузеппе

@Giuseppe Дякую! Мені дуже подобається, що комбіноване застосування, дуже розумна зміна! Я мав це як дві окремі аплікації на ранній стадії і не розумів, наскільки чисто ви можете їх поєднувати.
Кримінально-


2

Перл 6 ,100 93 байти

З'єднання FTW! Вони економлять 7 байт.

Наразі це, здається, побиває всі інші подання, написані на неоголених мовах. Іпі!

{!max (@(.map(*.join)).&{.repeated| |.map:{$_~~/000|111/|.comb(0)-.comb(1)}}for @^a,[Z] @^a)}

Спробуйте в Інтернеті!

Пояснення : Це блок, який приймає дошку як список списків. Ми робимо транспонування за допомогою [Z] @^a(зменшуємо список списків за допомогою zip-оператора). Такий @^a,[Z] @^aсамий перелік ради та її транспонування. Ми петлюємо над нею, forяка працює точно так самоmap само, на даний момент на 1 чар дешевше.

Всередині ми спочатку приєднуємо списки, що складають рядки, у рядки, тому у нас є список рядків замість списку ( @(.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. Це АБО-з-за |. (Насправді це створює дуже потужну річ, яку називають переходом , але ми не використовуємо жодної її сили :)) Після всього цього, ми отримуємо список з 2-х «булів» (незамкнених стиків). Ми нарешті або їх (використовуючи max) і заперечуємо ( !), що дає бажаний результат.


2

J, 40 38 55 байт

0=[:([:+/^:_(3(0=3|+/)\"1 ]),:-.@~:,:#=[:+/"1+:@])|:,:]

Спробуйте в Інтернеті!

Визначає функцію, що приймає квадратну матрицю як вхід.

Принаймні, це побиття Pyth (поки що ...) (помилково). Я повинен повернутися до підрахунку емоджи, прихованого в моєму коді, оскільки J також добре підходить до цього:

[: /^: :1 |: :] :-.@ :# :@] :~@

Пояснення (трохи застаріле)

Це виглядає інакше, ніж моя відповідь, і я можу прийти до її оновлення. Частини його залишаються однаковими - я просто не перевіряв правило 3 для і неправильно перевіряв правило 2 раніше.

Розділіть на кілька функцій і без вольфу:

join_trans  =. |: ,: ]
part_3      =. 3 (0 = 3 | +/)\"1 ]
f           =. 1 - 2 * ]
main        =. 0 = [: ([: +/^:_ part_3 , f) join_trans

join_trans

|: ,: ]
|:       Transpose
   ,:    Laminated to
      ]  Input

Це приєднує перенесення матриці до себе, створюючи масив матриць.

частина_3

3 (0 = 3 | +/)\"1 ]
                  ]  Input (matrix and transpose)

Це перевіряє суму розділів у 3 рядках, щоб побачити, чи є 3 або 0 (оскільки будь-який із них означає недійсну дошку), повертаючи 1, якщо вона є, і 0 в іншому випадку. Він працює як на матриці, так і на її транспоніровці, оскільки дається обом.

f

1 - 2 * ]

Через відсутність кращого імені я це називаю f. Він замінює 0s на _1 і залишає 1s незмінними. Це дозволить мені врешті-решт перевірити, чи кількість 0 і 1 є рівними в кожному рядку та стовпці (сума кожного з рядків повинна бути 0).

головний

0 = [: ([: +/^:_ part_3 , f) join_trans
                             join_trans  Join transpose to input
                 part_3 , f              Apply the validity checks and join them
           +/^:_                         Sum until it converges
0 =                                      Equate to 0

В основному, я використовую той факт, що я налаштував його так, що f join_transі те, і part_3 join_transінше має дорівнювати 0, якщо правління дійсне. part_3повинні бути всі нулі для дійсної дошки, а сукупність fмає дорівнювати нулю для дійсної дошки, тобто сума їх сум дорівнює 0 лише для дійсної дошки.


Принаймні, це побиття Pyth (поки що ...). - Мені справді потрібно
пограти у

@ Mr.Xcoder так, так, ви, здається, завжди проходили через це, тому я додав біт "на даний момент". Не те, що в моїй відповіді немає місця для гольфу - я просто не знаю, як це зробити занадто добре.
коул


1
Цей код на 33 байти повинен бути еквівалентний вашому*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
миль

2

Haskell , 137 136 127 байт

9 байт збережено завдяки Лінні!

import Data.List
j=isSubsequenceOf
l x=x==nub x&&and[sum y*2==length x&&not(j[0,0,0]y||j[1,1,1]y)|y<-x]
g x=l x&&l(transpose x)

Спробуйте в Інтернеті!


Згорніть обидва alls в одне and: l x=x==nub x&&and[sum y*2==length x&&not(j[0,0,0]y||j[1,1,1]y)|y<-x]
Lynn

@Lynn Дякую! Я деякий час намагався згорнути це двоє. Не знаю, чому я не міг цього зрозуміти.
Пшеничний майстер

1
Чи не могли б ви змінити , j=isSubSequenceOfщоб j x=isSubSequenceOf[x,x,x]?
Cyoce

@Cyoce Здається, втратив мені байт. Якщо у вас є спосіб зробити це, що заощадить мені байт, я би радий його застосувати. Ідея здається гарною.
Пшеничний майстер

На мобільному, хммм ... Може, замість j a bвикликати (і визначити) це як a#b?
Кіос

2

Java 8, 350 326 325 312 303 299 298 259 255 байт

int r,z,c,p,i,j,k,d,u,v=1;int c(int[][]b){v(b);k=v-=u=1;v(b);return r;}void v(int[][]b){String m="",x;for(d=b.length;j<d|k<d;k+=u,j+=v,r=m.contains(x)|z!=0?1:r,m+=x)for(x="#",c=0,k*=u,j*=v;j<d&k<d;z+=i|i-1,c*=i^p^1,x+=p=i,r=++c>2?1:r,k+=v,j+=u)i=b[k][j];}

Повертається, 0коли це дійсна дошка; 1якщо він недійсний для одного або декількох із трьох правил.

-95 байт завдяки @Nevay .

Пояснення:

Спробуйте тут.

int r,z,c,p,i,j,k,d,u,v=1;
                     // Temp integers on class-level

int c(int[][]b){     // Method (1) with int-matrix parameter and int return-type
  v(b);              //  Validate the rows
  k=v-=u=1;          //  Switch rows with columns, and reset `u` to 1
  v(b);              //  Validate the columns
  return r;          //  Return the result
}                    // End of method (1)

void v(int[][]b){    // Separated method (2) with int-matrix parameter and no return-type
  String m="",s;     //  Two temp Strings to validate uniqueness of rows
  for(d=b.length;    //  Set the dimension of the matrix to `d`
      j<d|k<d        //  Loop (1) as long as either `j` or `k` is smaller than `d`
    ;                //   After every iteration:
     k+=u,j+=v       //    Increase the loop-indexes
     r=m.contains(s) //    If we've found a duplicated row,
     |z!=0?          //    or if the amount of zeroes and ones on this row aren't equal
      1:r,           //     Set `r` to 1 (invalid due to either rule 2 or 3)
     m+=s)           //    Append the current row to the String `m`
    for(s=",",       //   Set String `x` to a separator-character
        c=0,         //   Reset the counter to 0
        k*=u,j*=v,   //   Increase the loop-indexes
        j<d&k<d      //   Inner loop (2) as long as both `j` and `k` are smaller than `d`
     ;               //    After every iteration:
      z+=i|i-1,      //     Increase or decrease `z` depending on whether it's a 0 or 1
      c*=i^p^1,      //     Reset `c` if current digit `i` does not equal previous `p`
      s+=p=i,        //     Set previous `p` to current digit, and append it to String `s`
      r=++c>2?       //     If three of the same adjacent digits are found:
         1:r;        //      Set `r` to 1 (invalid due to rule 1)
        k+=v,j+=u)   //      Increase the loop-indexes
      i=b[k][j];     //    Set `i` to the current item in the matrix
                     //   End of inner loop (2) (implicit / single-line body)
                     //  End of loop (2) (implicit / single-line body)
}                    // End of separated method (2)


1

05AB1E , 29 байт

ø‚D€ÙQIDøì©O·IgQP®εŒ3ù€Ë_P}PP

Спробуйте в Інтернеті!

Пояснення

Правило: 3

ø‚        # pair the input with the zipped input
  D       # duplicate
   €Ù     # deduplicate each
     Q    # check for equality with the unmodified copy

Правило: 2

IDøì          # prepend zipped input to input
    ©         # store a copy in register for rule 1
     O        # sum each row/column
      ·       # double
       IgQ    # check each for equality to length of input
          P   # product

Правило: 1

®ε            # apply to each row/column in register
  Œ3ù         # get sublists of length 3
     €Ë       # check each if all elements are equal
       _      # logical not
        P     # product
         }    # end apply
          P   # product

Потім беремо добуток результату всіх 3 правил P



1

PHP, 245 + 1 байт

ew це громіздко. рядкові перерви призначені лише для зручності читання

$t=_;foreach($a=($i=str_split)($s=$argn)as$i=>$c)$t[$i/($e=strlen($s)**.5)+$i%$e*$e]=$c;
for(;$k++<2;$s=$t)$x|=preg_match("#000|111|(\d{"."$e}).*\\1#s",chunk_split($s,$e))
|($m=array_map)(array_sum,$m($i,$i($s,$e)))!=array_fill(0,$e,$e/2);echo!$x;

Бере єдину струну без нових рядків, принти 1для трити, нічого для фальшивого.

Запустіть як трубу -nRабо спробуйте в Інтернеті .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.