Брахілог , 245 байт / 2 = 122,5
@n:1a:"-"x:7fF:3a$\:3a@3:4a,Fc~bCh[0:0:0]gO,Co~c[V:O:T]h:F:6f:10ao:ba(h:11a;!);"!!"w!
h"-".|:"|"x:2f.
e(~m["0123456789":.]`;0<.<=9)
:ha#d.
:@3az:ca:5a.
:3a.
hs.:=a,?t:9ac:=fl1
:Im:8f:[[I]]z:ca.
:Jm:J.
:ha.
lg:?c.
b:+a[X:Y],?h:Y:Xr:"(~d,~d):~d
"w
(Зверніть увагу, що ви повинні використовувати версію мови з цього зобов’язання . Цей код потребує незначних змін, щоб він працював належним чином у наступних версіях Brachylog)
Це друкує, "!!"
якщо на даній дошці є внутрішні суперечності (на це потрібно кілька секунд, проте в TIO, тому будьте терплячі).
Я не впевнений, що я правильно розумію перший бонус, тому не звертаюся до нього.
Це, очевидно, не конкурує, оскільки мова набагато пізніша, ніж виклик, однак, оскільки інших відповідей немає, я не впевнений, що це має велике значення ...
Пояснення
Основний предикат:
@n Split the input on line breaks
:1a:"-"x Transform into a list of lists, each sublist contains a line's values
:7fF Transform so that cells are [Value:X:Y]
:3a All values on lines must be different
$\:3a All values on columns must be different (by transposition)
@3:4a, All 3*3 block values must be different
Fc~bCh[0:0:0]gO, Append a fake cell [0:0:0]
Co~c[V:O:T] Sort the board, the blank cells V will be those before O ([0:0:0])
h:F:6f Find all subsets of blank cells with specific values for which
the board has only one solution
:10ao Sort the subsets by lengths
:ba Discard the lengths
(
h:11a Print the first subset = an answer
; Or (board is already fully determined)
! Terminate
)
; Or (Some values don't respect the constraints)
"!!"w! Print "!!" and terminate
Присудок 1: Видаліть усі " |
" рядки, перетворіть їх ---+---+---
на -
видалення після
h"-". If the first char is "-", then Output is "-"
| Or
:"|"x Remove all occurences of "|" from the input
:2f. Output is the result of all outputs of predicate 2 on the filtered string
Предикат 2: Перетворіть один знак у ціле число або, якщо порожній, на змінну між 1 і 9.
e Take a char of the input string
(
~m["0123456789":.] Output is the index of the char in "0123456789"
` Discard the choice point caused by the ;
; Or
0<.<=9 Output is an integer between 1 and 9
)
Присудок 3: Введіть, що всі значення вхідного списку комірок повинні бути різними
:ha Retrieve the head of each cell (i.e. the value) in the input
#d. Apply a constraint of distinctness to those values
Присудок 4: Застосуйте обмеження відмінності до значень у 3 * 3 блоках
:@3a Split 3 lines of the board in 3 parts
z Zip them together
:ca:5a. Concatenate each element of the zip, apply predicate 5 to that
Предикат 5:
:3a. Apply predicate 3 to each element of the input
Присудок 6: Призначте значення, що задовольняють обмеження, для підмножини порожніх комірок, тоді з тими значеннями на платі є лише одне рішення.
hs. Output is a subset of the blank cells
:=a, Assign values to those cells
?t:9ac Concatenate the values of all cells of the board
:=f Find all solved boards
l1 There is only 1 such solved board
Присудок 7: Перетворить плату таким чином, що кожна клітинка тепер [V:X:Y]
замість лише V
(значення).
:Im Take the Ith line of the board
:8f Transform all elements of the line using predicate 8
:[[I]]z Zip the result with [I]
:ca. Concatenate each element of the zip
Присудок 8: Перетворює лінію таким чином, що кожна клітина зараз є [V:X]
.
:Jm Take the Jth element of the line
:J. Output is [That element:J]
Присудок 9: Отримайте значення комірок
:ha. Take the head of each element of the input
Присудок 10: Додайте довжину підмножини на початку її
lg Put the length of the input in a list
:?c. Concatenate it with the input
Присудок 11: Друк однієї комірки
b:+a[X:Y], Increment coordinates by 1 to get X and Y
?h:Y:Xr: Build the list [X:Y:Value]
"(~d,~d):~d\n"w Format that list as "('X','Y'):'Value'\n" to STDOUT