스도쿠 보드 출력


25

오늘날의 도전은 간단합니다. 입력하지 않고 유효한 스도쿠 보드를 출력합니다.

스도쿠에 익숙하지 않은 경우 Wikipedia는 유효한 보드의 모습을 설명합니다 .

목표는 그리드를 구성하는 각 열, 각 행 및 9 개의 3x3 서브 그리드 ( "상자", "블록"또는 "영역"이라고도 함)가 포함하도록 9x9 그리드를 숫자로 채우는 것입니다. 1에서 9까지의 모든 숫자

이제 여기에 있습니다 ... 물건의 6,670,903,752,021,072,936,960 다른 유효한 스도쿠 보드 . 더 적은 바이트로 압축하고 출력하기가 매우 어려울 수 있습니다. 그들 중 다른 사람들이 더 쉬울 수 있습니다. 이 과제의 일부는 어떤 보드가 가장 압축 가능하며 가장 적은 바이트로 출력 될 수 있는지 파악하는 것입니다.

제출할 때마다 반드시 같은 보드를 출력 할 필요는 없습니다. 그러나 여러 개의 출력이 가능한 경우 가능한 모든 출력이 유효한 보드임을 증명해야합니다.

당신이 사용할 수있는 스크립트 (매직 문어 항아리 덕분에) 또는 이 답변 중 하나를 특정 그리드가 유효한 해결책이 있는지 확인 할 수 있습니다. [1]유효한 보드의 경우 및 유효하지 않은 보드의 경우 다른 것이 출력됩니다 .

명확하게 2 차원 인 한 귀하의 답변을 출력하는 형식에 대해서는 너무 까다 롭지 않습니다. 예를 들어 9x9 행렬, 9x3x3 행렬, 문자열, 문자열 배열, 9 자리 정수 배열 또는 9 자리 9 자리 숫자를 구분 기호로 출력 할 수 있습니다. 1 차원으로 81 자리를 출력하는 것은 허용되지 않습니다. 특정 출력 형식에 대해 알고 싶다면 언제든지 의견을 말하십시오.

평소와 같이 이것은 이므로 선택한 언어로 얻을 수있는 가장 짧은 답변을 작성하십시오!


3x9 행렬 3 개를 출력 할 수 있습니까? 각 하위 행렬의 각 행은 스도쿠 보드의 행을 나타냅니다. 이와 같이
dylnan

2
관련이 있지만 dup은 아닙니다 . 또한 유연한 출력을 허용하는 경우 kolmogorov- 복잡성이 적용 되는지 확실하지 않습니다. 일반적으로 정확한 아스키 아트와 같은 고정 출력에 적용되기 때문입니다.
BradC

답변:


13

Pyth, 22 14 12 10 바이트

.<LS9%D3 9

Mr. Xcoder 덕분에 2 바이트를 절약했습니다.

여기 사용해보십시오

.<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.
Mr. Xcoder

그것을 넘어서십시오, 10 : .<LS9%D3 9.
Mr. 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',',')

STRING_SPLITSQL 2016 이상에서 지원되는 메모리 내장 테이블에 정의 된대로 다른 지점에서 시작하여 9 자 문자열을 추출합니다 . 이것은 0+value암시 적 정수로 캐스트 할 수있는 가장 짧은 방법이었습니다.

원래 사소한 출력 (96 바이트) :

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



5

파이썬 3 , 58 55 바이트

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

온라인으로 사용해보십시오!

  • Jo King 덕분에 -3 바이트

바이트 문자열의 요소는 [1, 4, 7, 2, 5, 8, 3, 6, 9]의 회전을 치환하는 데 사용되는 숫자 를 제공합니다 [0..9]. 가 0제거되고 l[1:i]그리고 (두 characaters 소요 널 바이트가 필요 없다 \0) bytes 객체를 대표하는이.

55 바이트

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


@ JoKing Clever, 감사합니다
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._

@Mnemonic 의 Pyth 응답 포트를 생성하여 -2 바이트 .

온라인으로 사용해보십시오. (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

옥타브 및 Matlab, 50 48 29 바이트

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

온라인으로 사용해보십시오!

Johnathon frech 덕분에 -2

Sanchises Broadcast의 추가 제안 덕분에 -14는 비 호환성을 지적했다.

-5 문자 스트링과 조옮김으로 벡터를 matlab으로 작성할 수 있음을 인식하여 -5.

직관적이지 않았지만 지금은 그렇지 않았습니다. 브로드 캐스트 합산을 사용하여 9 개의 행에 1 : 9를 분산시키고 문자 스트링에 의해 결정된 값에 의해 분산됩니다.

스도쿠 보드 제작 :

 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에 오신 것을 환영합니다. 좋은 첫 번째 게시물.
Jonathan Frech


물론 s는 행렬 자체에서 정의 될 수 있습니다. 바이트도 잘못 계산해야합니다.
Poptimist

이것은 이제 Octave이며 더 이상 MATLAB과 호환되지 않습니다. 원하는 경우 Jonathan의 링크 맨 위에있는 작은 체인 아이콘을 사용하여 기본 PPCG 형식을 복사하여 붙여 넣을 수 있습니다.
Sanchises

원하는 경우 브로드 캐스트 추가를 사용하여 이것을 34 바이트로 줄일 수 있습니다.
Sanchises

3

하스켈 , 41 바이트

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

온라인으로 사용해보십시오!


유효하지 않습니다. 각 정사각형에는 동일한 숫자가 여러 개 포함되어 있습니다. 대신 다음 과 같은 작업을 수행 할 수 있습니다 (43 바이트)
Jo King

감사! 당신의 제안을 받아
Curtis Bechtel

@RushabhMehta 내가했다. 그것은 43 바이트했지만, 난 제거 s=그 이후이 필요하지 않습니다
커티스 벡텔

3

자바 10, 82 75 바이트

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

@TFeld 중 하나의 포트를 작성하여 -7 바이트 의 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 바이트를 사용하는 것이 좋지만 최적화 후 :(

파이썬 2-75 68 59 58 바이트

@DLosc 덕분에 -7 바이트

@Mnemonic 덕분에 -9 바이트

@JoKing 덕분에 -1 바이트

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)있었지만 아름다움을 망칠 수 없었습니다
Don Thousand


@DLosc Ooh 영리한 재사용l
Don Thousand

Python 2가 마음에 들지 않으면 인쇄물에서 parens를 꺼내고 목록 패킹을 제거 할 수 있습니다.


2

R , 54 바이트

x=1:9;for(y in(x*3)%%10)print(c(x[-(1:y)],x[(1:y)]))

산출:

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

온라인으로 사용해보십시오!





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 바이트를 인쇄하는 대신 동일한 바이트 수로 탭 문자를 사용할 수 있습니다.
Jonathan Frech

"제출은 반드시 같은 보드를 매번 출력 할 필요는 없습니다. 그러나 여러 개의 출력이 가능한 경우 가능한 모든 출력이 유효한 보드임을 증명해야합니다." 여러 출력이 필요하다는 것은 아닙니다. @ceilingcat
Logern

1
@Logern 문제의 규칙은 함수 제출을 재사용 할 수 있어야한다는 것 입니다. 괜찮 으면 괜찮아f(); f()동일한 보드를 두 번 출력 만 두 번째 호출이 전혀 작동하지 않으면 습니다.
Anders Kaseorg


@JoKing의 제안을 통합 한 61 바이트f(i){for(i=81;i--;)printf("%d%c",(i/9*10/3+i)%9+1,i%9?9:10);}
ceilingcat

1

K (ngn / 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.