数独ボードを出力する


25

今日の課題は簡単です。入力を行わずに、有効な数独ボードを出力します。

あなたが数独に不慣れな場合、ウィキペディアは有効なボードがどのように見えるべきかを説明しています

目的は、グリッドを構成する各列、各行、および9つの3×3サブグリッド(「ボックス」、「ブロック」、または「リージョン」とも呼ばれる)のそれぞれに、 1から9までのすべての数字。

さあ、ここに… 6,670,903,752,021,072,936,960の異なる有効な数独ボードがあります。それらのいくつかは、圧縮して、より少ないバイトで出力するのが非常に難しいかもしれません。他の方が簡単かもしれません。この課題の一部は、どのボードが最も圧縮性が高く、最小バイトで出力できるかを把握することです。

提出するたびに毎回同じ掲示板を出力する必要はありません。ただし、複数の出力が可能な場合は、可能なすべての出力が有効なボードであることを証明する必要があります。

あなたは使うことができ、このスクリプト(マジックタコ壺のおかげで)、またはこれらの答えのいずれかを特定のグリッドが有効なソリューションであるかどうかを検証します。[1]有効なボードの場合はを出力し、無効なボードの場合はその他を出力します。

回答が明らかに2次元である限り、どの形式で回答を出力するかについてはあまり気にしません。たとえば、9x9行列、9個の3x3行列、文字列、文字列の配列、9桁の整数の配列、またはセパレータ付きの9つの9桁の数字を出力できます。1次元で81桁を出力することは許可されません。特定の出力形式について知りたい場合は、コメントでお気軽にお問い合わせください。

いつものように、これはなので、選択した言語で思い付くことができる最短の答えを書いてください!


3つの3x9行列を出力できますか?数独ボードの行を表す各サブマトリックスの各行。同様に、この
dylnan

2
関連するが、dupではない。また、柔軟な出力を許可している場合、kolmogorov-complexityが適用れるかどうかはわかりません。これは通常、正確なアスキーアートのような固定出力用であるためです。
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_SPLIT(SQL 2016以降でサポートされている)によって作成されたメモリ内テーブルの定義に従って、異なるポイントから始まる9文字の文字列を抽出します。これ0+valueは、暗黙的に整数にキャストできる最短の方法でした。

元の些細な出力(96バイト):

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



5

Pythonの358の 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]そして(2 characatersかかりヌル・バイトのための必要がない\0)バイトのオブジェクトで表現するが。

55バイト

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


@JoKing Clever、ありがとう
ディルナン

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

05AB1E14 12 バイト

8ÝΣ3%}ε9Ls._

@MnemonicのPyth回答のポートを作成して-2バイト。

オンラインでお試しください。(フッターをきれいに印刷するために追加します。実際の結果は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÷+._

オンラインでお試しください。(フッターをきれいに印刷するために追加します。実際の結果は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 Johnathon frechに感謝

-14互換性がないことも指摘したSanchises Broadcastの追加提案に感謝します。

-5は、文字列と転置を使用してmatlabでベクトルを記述できることに注意してください。

直感的でしたが、今ではそうではありません。ブロードキャストサミングを使用して、9の行に1: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形式をコピーペーストできます。
Sanchises

必要に応じて、ブロードキャストを追加することでこれを34バイトまで減らすことができます。オンラインで試してみてください!
-Sanchises

3

Haskell、41バイト

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

オンラインでお試しください!


これは無効です。各正方形には、同じ数の倍数が含まれています。代わりにこのようなこと(43バイト)を行うことができます
ジョーキング

ありがとう!私はあなたの提案を取りました
カーティスベクテル

@RushabhMehta私がやった。43バイトでしs=たが、必要ないので削除しました
Curtis Bechtel

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?" ":""));}

@TFeldのPython 2回答の 1つのポートを作成することにより、-7バイト。

オンラインでお試しください。

説明:

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

Python-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バイト

@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)が、美しさを台無しにすることはできませんでした
ドンサウザンド


@DLosc Oohの巧妙な再利用l
ドンサウザンド

Python 2を気にしない場合は、印刷から括弧を取り出して、リストのパッキングを削除できます。






1

C(clang)、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()、2番目の呼び出しが全く動作しない場合は二度同じボードを出力しますが、ありません。
アンデルスカセオルグ


61バイト、@ JoKingからの提案を組み込む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.