Виведіть дошку судоку


25

Сьогоднішній виклик простий: не беручи жодного вводу, виведіть будь-яку дійсну дошку судоку.

Якщо ви не знайомі з судоку, Вікіпедія описує, як має виглядати дійсна дошка :

Завдання полягає в заповненні сітки 9 × 9 цифрами, щоб кожен стовпець, кожен рядок і кожна з дев'яти підрешіток 3 × 3, які складають сітку (також називаються "полями", "блоками" або "регіонами", містили всі цифри від 1 до 9.

Тепер ось справа ... Є 6,670,903,752,021,072,936,960 різних дійсних дощок судоку . Деякі з них можуть бути дуже важкими для стиснення та виведення меншою кількістю байтів. Іншим з них може бути простіше. Частина цього завдання полягає в тому, щоб визначити, які дошки будуть найбільш стислими і можуть виводитися в найменші байти.

Для подання заявки не обов'язково потрібно виводити одну і ту ж дошку кожен раз. Але якщо можливі кілька виходів, вам доведеться довести, що кожен можливий вихід є дійсною дошкою.

Ви можете використовувати цей скрипт (завдяки Uric Magic Octopus) або будь-яку з цих відповідей, щоб перевірити, чи певна сітка є правильним рішенням. Він виведе a [1]для дійсної дошки, і все інше для недійсної дошки.

Я не надто прискіпливий до того, в якому форматі ви виводите свою відповідь, якщо це явно двовимірність. Наприклад, ви можете вивести матрицю 9x9, дев'ять матриць 3x3, рядок, масив рядків, масив 9-значних цілих чисел або дев'ять 9-значних чисел з роздільником. Виведення 81 цифри в одному вимірі заборонено. Якщо ви хочете дізнатися про конкретний формат виводу, сміливо запитайте мене в коментарях.

Як завжди, це , тому напишіть найкоротшу відповідь, яку ви можете придумати на вибраних мовах!


Чи можемо ми вивести три матриці 3x9? Кожен рядок кожної підматриці, що представляє собою рядок на дошці судоку. Як цього
dylnan

2
Пов’язаний, але не дубльований . Крім того, якщо ви дозволяєте гнучкий висновок, я не впевнений, що застосовується складність колгорогоров , оскільки це зазвичай для фіксованих результатів, таких як точне мистецтво ascii.
BradC

Відповіді:


13

Pyth, 22 14 12 10 байт

.<LS9%D3 9

Збережено 2 байти завдяки панові Xcoder.

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

.<LS9%D3 9
     %D3 9     Order the range [0, ..., 8] mod 3.
  >            For each, ...
.< S9          ... Rotate the list [1, ..., 9] that many times.

11: m.<S9d%D3 9.
Містер Xcoder

Хрест , що з, 10: .<LS9%D3 9.
Містер Xcoder

Можливо, хочу оновити посилання ( tio )
bryc


8

T-SQL, 96 89 байт

Знайдено один коротший, ніж тривіальний вихід!

SELECT SUBSTRING('12345678912345678',0+value,9)FROM STRING_SPLIT('1,4,7,2,5,8,3,6,9',',')

Витягує 9-символьні рядки, починаючи з різних точок, як визначено таблицею в пам'яті, створеною STRING_SPLIT(яка підтримується в SQL 2016 та пізніших версіях). Це 0+valueбув найкоротший спосіб, коли я міг зробити неявний викид на ціле число.

Оригінальний тривіальний вихід (96 байт):

PRINT'726493815
315728946
489651237
852147693
673985124
941362758
194836572
567214389
238579461'



5

Python 3 , 58 55 байт

l=*range(10),
for i in b"	":print(l[i:]+l[1:i])

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

  • -3 байти завдяки Джо Кінгу,

Елементи ряду байтів закінчуються даванням чисел, [1, 4, 7, 2, 5, 8, 3, 6, 9]які використовуються для перестановки обертів [0..9]. 0Видаляють в l[1:i]і немає ніякої необхідності в нульових байтах , який приймає два characaters ( \0) для подання в об'єкті байт.

55 байт

_,*l=range(10)
for i in b"	":print(l[i:]+l[:i])


@JoKing Розумний, дякую
dylnan

4

Желе , 9 8 байт

9Rṙ`s3ZẎ

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

9Rṙ`s3ZẎ
9R         Range(9) -> [1,2,3,4,5,6,7,8,9]
   `       Use the same argument twice for the dyad:
  ṙ        Rotate [1..9] each of [1..9] times.
           This gives all cyclic rotations of the list [1..9]
    s3     Split into three lists.
      Z    Zip. This puts the first row of each list of three in it's own list, 
           as well as the the second and third.
       Ẏ   Dump into a single list of nine arrays.

4

Пакет, 84 байти

@set s=123456789
@for %%a in (0 3 6 1 4 7 2 5 8)do @call echo %%s:~%%a%%%%s:~,%%a%%

Використовує вихід @ Mnemonic. callвикористовується для інтерполяції змінної в операцію нарізки (зазвичай вона приймає лише числові константи).




4

J , 18 байт

>:(,&|:|."{,)i.3 3

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

Вихідні дані

1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 3 4 5 6 7 8 9 1
5 6 7 8 9 1 2 3 4
8 9 1 2 3 4 5 6 7
3 4 5 6 7 8 9 1 2
6 7 8 9 1 2 3 4 5
9 1 2 3 4 5 6 7 8

Як це працює

>:(,&|:|."{,)i.3 3
             i.3 3  The 2D array X = [0 1 2;3 4 5;6 7 8]
   ,&|:|."{,        3-verb train:
   ,&|:               Transpose and flatten X to get Y = [0 3 6 1 4 7 2 5 8]
           ,          Flatten X to get Z = [0 1 2 3 4 5 6 7 8]
       |."{           Get 2D array whose rows are Z rotated Y times
>:                  Increment

Модна версія, 23 байти

|.&(>:i.3 3)&.>|:{;~i.3

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

Вихід:

┌─────┬─────┬─────┐
│1 2 3│4 5 6│7 8 9│
│4 5 6│7 8 9│1 2 3│
│7 8 9│1 2 3│4 5 6│
├─────┼─────┼─────┤
│2 3 1│5 6 4│8 9 7│
│5 6 4│8 9 7│2 3 1│
│8 9 7│2 3 1│5 6 4│
├─────┼─────┼─────┤
│3 1 2│6 4 5│9 7 8│
│6 4 5│9 7 8│3 1 2│
│9 7 8│3 1 2│6 4 5│
└─────┴─────┴─────┘

Як це працює

|.&(>:i.3 3)&.>|:{;~i.3
                    i.3  Array [0 1 2]
                 {;~     Get 2D array of boxed pairs (0 0) to (2 2)
               |:        Transpose
|.&(>:i.3 3)&.>          Change each pair to a Sudoku box:
            &.>            Unbox
    >:i.3 3                2D array X = [1 2 3;4 5 6;7 8 9]
|.&                        Rotate this 2D array over both axes
                             e.g. 1 2|.X gives [6 4 5;9 7 8;3 1 2]
            &.>            Box again so the result looks like the above

4

05AB1E , 14 12 байт

8ÝΣ3%}ε9Ls._

-2 байти, створивши порт відповіді @Mnemonic 's Pyth .

Спробуйте в Інтернеті. (Footer додано для його гарного друку. Фактичним результатом є матриця 9x9; сміливо зніміть колонтитул, щоб побачити.)

Пояснення:

8Ý              # List in the range [0, 8]
  Σ  }          # Sort the integers `i` by
   3%           #  `i` modulo-3
      ε         # Map each value to:
       9L       #  List in the range [1, 9]
         s._    #  Rotated towards the left the value amount of times

Оригінальне рішення на 14 байт :

9Lε9LN3*N3÷+._

Спробуйте в Інтернеті. (Footer додано для його гарного друку. Фактичним результатом є матриця 9x9; сміливо зніміть колонтитул, щоб побачити.)

Пояснення:

9L                # Create a list of size 9
  ε               # Change each value to:
   9L             #  Create a list in the range [1, 9]
     N3*N3÷+      #  Calculate N*3 + N//3 (where N is the 0-indexed index,
                  #                        and // is integer-division)
            ._    #  Rotate that many times towards the left

Обидві відповіді призводять до судоку:

123456789
456789123
789123456
234567891
567891234
891234567
345678912
678912345
912345678

4

Octave & Matlab, 50 48 29 байт

mod((1:9)+['furRaghAt']',9)+1

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

-2 завдяки Джонатану Фреху

-14 завдяки пропозиціям щодо додатків Sanchises Broadcast, які також вказали на несумісність.

-5, помітивши, що вектор можна записати в матлаб із знаком char та транспозицією.

Була інтуїтивно зрозумілою, зараз не так. Використовується трансляція підсумовування для поширення 1: 9 на 9 рядків, розподілених на значення, визначені рядком char.

Дошка судоку виготовила:

 5 6 7 8 9 1 2 3 4
 2 3 4 5 6 7 8 9 1
 8 9 1 2 3 4 5 6 7
 3 4 5 6 7 8 9 1 2
 9 1 2 3 4 5 6 7 8
 6 7 8 9 1 2 3 4 5
 7 8 9 1 2 3 4 5 6
 4 5 6 7 8 9 1 2 3
 1 2 3 4 5 6 7 8 9

Привіт і ласкаво просимо до PPCG; приємний перший пост.
Джонатан Фрех


Звичайно, s можна було визначити в самій матриці. Я, мабуть, також перерахував байти.
Поптіміст

Зараз це Octave, більше не сумісний з MATLAB. Якщо вам подобається, ви можете скористатися маленьким значком ланцюжка вгорі посилання Джонатана, щоб скопіювати вставити стандартне форматування PPCG.
Санчіз

Якщо вам подобається, ви можете зменшити цю кількість до 34 байт з додаванням до трансляції: Спробуйте це в Інтернеті!
Санчіз

3

Haskell , 41 байт

[[x..9]++[1..x-1]|x<-[1,4,7,2,5,8,3,6,9]]

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


Це не вірно. Кожен квадрат містить кратну кількість одного і того ж числа. Ви можете зробити щось подібне (43 байти) натомість
Джо Кінг,

Спасибі! Я прийняв вашу пропозицію
Кертіс Бехтел,

@RushabhMehta я зробив. Це було 43 байти, але я видалив, s=оскільки це не потрібно
Кертіс Бехтел,

3

Java 10, 82 75 байт

v->{for(int i=81;i-->0;)System.out.print((i/9*10/3+i)%9+1+(i%9<1?" ":""));}

-7 байт, створивши порт одного з відповідей @TFeld 's Python 2 .

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

Пояснення:

v->{                    // Method with empty unused parameter and no return-type
  for(int i=81;i-->0;)  //  Loop `i` in the range (81, 0]
    System.out.print(   //   Print:
     (i/9               //    (`i` integer-divided by 9,
         *10            //     then multiplied by 10,
         /3             //     then integer-divided by 3,
           +i)          //     and then we add `i`)
             %9         //    Then take modulo-9 on the sum of that above
               +1       //    And finally add 1
    +(i%9<1?            //    Then if `i` modulo-9 is 0:
            " "         //     Append a space delimiter
           :            //    Else:
            ""));}      //     Append nothing more

Виводить такий судоку (проміжок розміщений замість нових рядків, як показано нижче):

876543219
543219876
219876543
765432198
432198765
198765432
654321987
321987654
987654321

2

Пітон - 81 байт

l=list(range(1,10))
for i in range(1,10):print(l);l=l[3+(i%3==0):]+l[:3+(i%3==0)]

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

Мені подобається мати 81 байт, але після оптимізації :(

Python 2 - 75 68 59 58 байт

-7 байт завдяки @DLosc

-9 байт завдяки @Mnemonic

-1 байт завдяки @JoKing

l=range(1,10)
for i in l:print l;j=i%3<1;l=l[3+j:]+l[:3+j]

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


2
81 байт Ідеальний бал! : D
DJMcMayhem

@DJMcMayhem Я розглядав можливість скоротити її, r=range(1,10)але не зміг зірвати красуню
Дон Тисяча,


@DLosc Ooh розумне повторне використанняl
Дон Тисяча

Якщо ви не заперечуєте проти Python 2, ви можете вийняти паролі з друку та видалити список упаковки.






1

C (стук) , 65 байт

f(i){for(i=0;i<81;)printf("%d%c",(i/9*10/3+i)%9+1,i++%9>7?10:9);}

Тепер функцію можна використовувати повторно

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


Замість того, щоб друкувати байт NUL, щоб розділити свої цифри, ви можете використовувати символ табуляції при тому ж рахунку байтів.
Джонатан Фрех

"Не потрібно обов'язково кожен раз виводити одну і ту ж дошку. Але якщо можливо декілька виходів, вам доведеться довести, що кожен можливий вихід є дійсною дошкою." Це не говорить про те, що потрібно кілька виходів. @ceilingcat
Логерн

1
@Logern Правило, про яке йдеться, полягає в тому, що подання функцій має бути багаторазовим . Це добре, якщо він f(); f()виводить одну і ту ж дошку двічі, але ні, якщо другий дзвінок взагалі не працює.
Андерс Касеорг


61 байт, включаючи пропозиції від @JoKingf(i){for(i=81;i--;)printf("%d%c",(i/9*10/3+i)%9+1,i%9?9:10);}
roofcat

1

K (нг / к) , 16 байт

1+9!(<9#!3)+\:!9

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

Перша відповідь в ngn / k, зроблена з великою допомогою самої людини, @ngn.

Як:

1+9!(<9#!3)+\:!9 // Anonymous fn
              !9 // Range [0..8]
    (     )+\:   // Sum (+) that range with each left (\:) argument
        !3       // Range [0..2]
      9#         // Reshaped (#) to 9 elements: (0 1 2 0 1 2 0 1 2)
     <           // Grade up
  9!             // Modulo 9
1+               // plus 1


0

Вугілля деревне , 14 байт

E⁹⭆⁹⊕﹪⁺÷×χι³λ⁹

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Використовує вихід @ Mnemonic. Пояснення:

E⁹              Map over 9 rows
  ⭆⁹            Map over 9 columns and join
          ι     Current row
         χ      Predefined variable 10
        ×       Multiply
       ÷   ³    Integer divide by 3
            λ   Current column
      ⁺         Add
     ﹪       ⁹  Modulo 9
    ⊕           Increment
                Implicitly print each row on its own line
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.