Унікальний пошук судоку


19

Виклик:

З огляду на дошку судоку на стандартному вході, знайдіть мінімальну кількість доданих номерів, щоб зробити дошку унікальною.

Особливості / правила:

  • Введення форматується наступним чином (весь пробіл є значним)

    516|827|943
    278|394|615
    349|615|872
    ---+---+---
    98 |4 2|156
    465|189|237
    12 |5 6|489
    ---+---+---
    892|743|561
    634|951|728
    751|268|394
    
  • Вихід форматується з одним числом на рядок, відформатованим як (x,y):z- x і y починається з одного вгорі зліва та збільшується вниз і вправо; z - число, яке потрібно додати.

    • У цьому випадку вони б все дійсні результати: (3,4):3, (3,4):7, (5,4):3, (5,4):7, (3,6):3, (3,6):7, (5,6):3, і (5,6):7, як і будь-який один з них дозволив би рада , щоб вирішити.
  • Якщо введена унікальна / вирішена дошка судоку, програма не повинна надрукувати нічого, навіть новий рядок.
  • Програма повинна працювати менш ніж за годину для будь-якої дошки (я пропоную тестувати за допомогою повністю порожньої дошки або дошки з одним випадковим номером на ній ...).

Оцінка:

  • Візьміть ваш загальний розмір коду (у гольф) у символах, включаючи всі пробіли ...

Бонуси:

1/2 розміру коду : Якщо програма надрукує єдиний знак оклику і зупиняється, коли на платі не введено рішення.

1/2 розміру коду : Якщо програма надрукує два знаки оклику і зупиняється на введенні дошки з внутрішнім протиріччям (два числа однакові в одному рядку / стовпчику / квадраті).


3
Нудно і, мабуть, важко :(
Олег Припін

6
Бу "Не друкувати нічого, навіть нову лінію" виключає GolfScript.
Пітер Тейлор

1
для цього потрібен вирішувач судоку, який ніколи не потребує відхилення / здогадки, щоб отримати повне рішення (і кожен раз, коли потрібна «здогадка», виведіть його)
храповик фрік

3
Я не бачу приводу спростовувати це. Багато зусиль було докладено, щоб показати гарну головоломку; це дуже чітко і правильно сказано. На мій смак вона занадто велика, але це занадто суб'єктивно, щоб викликати прихильність, чи не так?
користувач невідомий

Відповіді:


10

Брахілог , 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
    

2
Ви не можете просто розширити це на відповідь Пролога? Тоді б змагалися! (Ви можете опублікувати його окремо.) Я не впевнений, наскільки пряме відображення між Брахілогом та Прологом.
Лінн

@Lynn Так, я міг би навіть просто опублікувати код Prolog, який генерується транспілером Брахілога (що, очевидно, було б дуже неперевершеним). Я не буду цього робити, хоча я майже впевнений, що плакат виклику все одно ніколи не повернеться, щоб прийняти відповідь: p
Fatalize
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.