Z_nのグループテーブルを生成する


9

グループは数学で広く使用されている構造であり、コンピュータサイエンスでの用途があります。このコードの課題は、追加グループZ nのグループテーブルを作成するための文字数が最も少ないことです。

テーブルの構成方法:Z nの場合、要素は{0、1、2、...、n-1}です。テーブルにはn行とn列があります。テーブルのij番目のエントリの場合、値はi + j mod nです。たとえば、Z 3では、1〜2番目のエントリ(開始行/列を1と数えると2行目、3列目)は(1 + 2)%3 = 0です(サンプル出力を参照)。

入力:正の整数、n

出力:上記のように構成され、サンプル出力で以下に示すように表示される、Z nのテキスト表示である表。スペースはオプションです

入力例: 3

出力例:

0 1 2
1 2 0
2 0 1

入力例: 5

出力例:

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

3
セパレーターはオプションなので、10を超える入力はありますか?
Jo King

codegolf.stackexchange.com/questions/35038/に基づく@ JoKing…私はそうだと思います
qwr

回答:


10

APL(10)

(と仮定し⎕IO=0ます。デフォルトではngn / aplで動作しますが、他のAPLは⎕IO←0最初に必要になる傾向があります。)

{⍵|∘.+⍨⍳⍵}

説明:

  • ⍳⍵:数字[0..⍵)
  • ∘.+⍨:合計テーブルを作成する
  • ⍵|:表の数字mod

1
あなたはできますか⊢|⍳∘.+⍳、または列車は2014年7月版のngnで機能しませんでしたか?
リルトシアスト2015

3

GolfScript(13文字)

Claudiuの回答についてのコメントから、行の要素間の空白は不要であることがわかりました。その理解について:

~.,{.n\(+}@(*

オンラインデモ

解剖:

~        Parse the input into an integer
.,       Duplicate it, turn the second into an array [0,...,n-1]
{        Loop: top of stack is the previous row
  .n\    Push a newline and a copy of the previous row
  (+     Rotate the first element to the end to get the new row
}@(*     Perform loop n-1 times

空白が必要な場合、20文字:

~.,{.(+}@(*]{' '*n}/

これらの非常に素晴らしい仕事!
ライアン

3

Python 2、66バイト

def f(n):R=range(n);exec"print''.join(map(str,R));R+=R.pop(0),;"*n

ポップして再度追加することにより、リストを回転させます。

Python 3、53バイト

def f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]

@ mbomb007と同じメソッドを使用しますがprint、関数として悪用します。


それ*R,=は奇妙な構成です... それはrangeの出力をタプルに変換するためだけに役立ちますか?
Jonathan Frech 2017年

Python 3コードについて説明していただけますか?*R
タリット・ゴスワミの

@taritgoswamiそれは、解凍された退化です。rangeは、反復可能なオブジェクトであり、すべてをで収集および再パックできますR。これは、と等価である必要がありR=list(range(n))、前者はより簡潔な。
Jonathan Frech

3

05AB1E10 8バイト

ݨDδ+I%»

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

説明

         # Implicit input n = 3                  [3]
Ý        # Push range(0,3)                       [[0,1,2,3]]
 ¨       # Pop last element                      [[0,1,2]]
  D      # Duplicate                             [[0,1,2],[0,1,2]]
   δ     # Apply next operation double vectorized
    +    # Vectorized addition                   [[[0,1,2],[1,2,3],[2,3,4]]]
     I   # Push input                            [[[0,1,2],[1,2,3],[2,3,4]],3]
      %  # Elementwise modulo 3                  [[[0,1,2],[1,2,0],[2,0,1]]]
       » # " ".join(x) followed by newline       ["0 1 2\n1 2 0\n2 0 1\n"]
           for every x in list       

以前の回答:10バイト

ݨDvDðý,À}

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

05AB1Eでのゴルフは初めてです。

以前の回答の説明

           # Implicit input n = 3                   [3]
Ý          # Push range(0,3)                        [[0,1,2,3]]
 ¨         # Pop last element.                      [[0,1,2]]
  D        # Duplicate                              [[0,1,2],[0,1,2]]
   v     } # Pop list and loop through elements     [[0,1,2]]
    D      # Duplicate                              [[0,1,2],[0,1,2]]
     ð     # Push space char                        [[0,1,2],[0,1,2], " "]
      ý    # Pop list a and push string a.join(" ") [[0,1,2],"0 1 2"]
       ,   # Print string with trailing newline     [[0,1,2]] Print: "0 1 2"
        À  # Rotate list                            [[1,2,0]]  

1
最初の正解です。ようこそ!私はそれを短くすることができる感覚を持っていますが、ここでは2つの9バイトの選択肢は以下のとおりです。FݨN._ðý,ݨsGDÀ})»のいずれかの質問尋ねること自由に感じ05AB1Eチャットをし、見てみましょう05AB1E先端ページあなたはまだいない場合。:)
Kevin Cruijssen

@KevinCruijssenありがとう!暗黙の入力を利用する方法を見つけるのを忘れたようです。
Wisław


1

バース、16

JVQXQjdJ=J+tJ]hJ

適切な空白でテーブルを印刷します。

./pyth.py -c "JVQXQjdJ=J+tJ]hJ" <<< 5
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

説明:

                   Automatic: Q=eval(input())
JVQ                J = range(Q)
XQ                 repeat Q times
  jdJ              print J, joined on " "
  =J               J =
    +tJ]hJ             tail(J) + [head(J)] (J[1:] + [J[-1]]])

1

J、20

stdinから読み取り、2D配列を作成します(問題のサンプルと同じになります)。

(|+/~@i.)@".}:1!:1]3

この関数は、文字列で十分を取った場合、(|+/~@i.)@".。整数を取る関数|+/~@i.で十分な場合は、それで十分です。

説明: f g J(関数f、gの場合)は、「フック」を示します。これは、g(単項関数)を介して入力を実行し、次にgからf(バイナリ関数)を介して入力と結果を実行する複合関​​数です。答えは、コンポーネント|(係数)とを持つフォーク+/~@i.です。後者の部分は「リストの一覧から構成された和の表」までです(Pythonとi.少し似rangeています)。


への回答を更新する|+/~@i.必要があります。これは、ここでの標準ルールで許容されるはずです。
ジョナ


1

Python 2、67

ここで両方試してください

リストの分割を使用して、リストのn時間を「回転」させ、毎回印刷します。(68文字)

def f(n):
 l=range(n)
 for i in l:print''.join(map(str,l[i:]+l[:i]))

私はなんとか奇妙なトリックで上記より1文字短くできました。(67文字)

def f(n):
 l=range(n)
 for i in l:print''.join(`l[i:]+l[:i]`)[1::3]

このメソッドはPython 3ではまだ短いようですdef f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]。スプラットが括弧なしで実際に機能するとは思いませんでした。
Sp3000 2015


1

x86-64マシンコード(Linux)、80 64バイト

0000000000000000 <zn_asm>:
   0:   6a 0a                   pushq  $0xa
   2:   89 f9                   mov    %edi,%ecx
   4:   ff c9                   dec    %ecx

0000000000000006 <zn_asm.l1>:
   6:   c6 06 0a                movb   $0xa,(%rsi)
   9:   48 ff ce                dec    %rsi
   c:   89 fb                   mov    %edi,%ebx
   e:   ff cb                   dec    %ebx

0000000000000010 <zn_asm.l2>:
  10:   89 c8                   mov    %ecx,%eax
  12:   01 d8                   add    %ebx,%eax
  14:   31 d2                   xor    %edx,%edx
  16:   f7 f7                   div    %edi
  18:   89 d0                   mov    %edx,%eax

000000000000001a <zn_asm.l3>:
  1a:   31 d2                   xor    %edx,%edx
  1c:   48 f7 34 24             divq   (%rsp)
  20:   83 c2 30                add    $0x30,%edx
  23:   88 16                   mov    %dl,(%rsi)
  25:   48 ff ce                dec    %rsi
  28:   85 c0                   test   %eax,%eax
  2a:   75 ee                   jne    1a <zn_asm.l3>
  2c:   ff cb                   dec    %ebx
  2e:   85 db                   test   %ebx,%ebx
  30:   7d de                   jge    10 <zn_asm.l2>
  32:   ff c9                   dec    %ecx
  34:   85 c9                   test   %ecx,%ecx
  36:   7d ce                   jge    6 <zn_asm.l1>
  38:   58                      pop    %rax
  39:   48 89 f0                mov    %rsi,%rax
  3c:   48 ff c0                inc    %rax
  3f:   c3                      retq

私は、この解決策がこの投稿の他のいくつかの提出物を打つことができるように数バイト短くなることを望んでいました。32ビットまたは16ビットバージョンのレジスタを使用すると、数バイトを削ることができる可能性があります。多くのレジスタを32ビットアドレス指定バージョンに変換すると、16バイトを節約できました。

基本的に、この関数は、rdiを介してnを渡し、rsiを介して割り当てへのポインターを渡したC / C ++プログラムから呼び出されます。テーブルが逆方向に構築されるため、rsiが持つポインタは、実際には割り当ての最後から1バイトです。これにより、整数を印刷可能なASCII文字に簡単に変換できます(数値x mod 10を取り、結果をASIIに変換することで実行されます)。

C ++ラッパーコードとアセンブリのコメントを確認するには、私のリポジトリを確認しください。



1

MathGolf10 8バイト

r░y\Åo╫;

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

-Jo Kingのおかげで2バイト

説明

3説明には入力例を使用します

r          range(0, n) ([0, 1, 2])
 ░         convert to string (implicit map) (['0', '1', '2'])
  y        join array without separator to string or number ('012')
   \       swap top elements ('012', 3)
    Å      start block of length 2 (for-loop, loops 3 times ('012'))
     o     print TOS without popping
      ╫    left-rotate bits in int, list/str ('012' => '120' => '201' => '012')
       ;   discard TOS (prevents final print)

r░y\(Åo╫ループの数を1つ減らし、ループ後の破棄をスキップすることもできます。



@JoKingそれは賢い!おそらくq、重複を削除するために使用できますか?
maxb

という意味oです。その方法で私が理解できた最高のものはこれでした。それも10バイトになる可能性がありますが、私はモバイルにいます。
maxb '12年

区切り文字はオプションなので、8バイトで動作するはずです
Jo King


0

Golfscript、20文字

ひどく怠惰な仕事。

~:j,{:x;j,{x+j%}%n}/

ここで実行します。(最初の行はstdinをシミュレートすることです)。

説明

~                     # evaluate input (turn string "5" into number 5)
:j                    # store into variable j
,                     # turn top of stack into range(top), e.g. 5 --> [0, 1, 2, 3, 4]
{...}/                # for each element in the array... 
  :x;                 # store the element into x and pop from the stack
  j,                  # put range(j) on the stack ([0, 1, 2, 3, 4] again)
  {...}%              # map the array with the following:
      x+j%            # add x and mod the resulting sum by j
  n                   # put a newline on the stack

プログラムが終了すると、スタックには各配列とその間に改行が含まれます。インタプリタはスタックに残っているものを出力し、望ましい結果を与えます。


1
いいね!要素間のスペースは必要ではありませんでしたが、値が10以上の要素がある場合(つまり、n> = 11の場合)に役立ちます。
ライアン14

コードを説明してもらえますか?私にとって、golfscriptを読むことは、他の誰かの正規表現を読むことよりも悪いことです。(ほぼ=)
flawr

@flawr:確かに、それは非常に簡単です
Claudiu

0

CJam、14文字

l~_)_@,*/Wf<N*

ここでテストしてください。

説明

文字列をからに繰り返します0N-1、のブロックに分割するという考え方ですN+1。この不一致により、行が毎回左にシフトします。最後に、無関係な文字を取り除き、すべてを改行で結合する必要があります。

以下は、分解されたコードと、inputのスタックの内容です3

l~              "Read and eval input."; [3]
  _             "Duplicate.";           [3 3]
   )            "Increment.";           [3 4]
    _           "Duplicate.";           [3 4 4]
     @          "Rotate.";              [4 4 3]
      ,         "Get range.";           [4 4 [0 1 2]]
       *        "Repeat.";              [4 [0 1 2 0 1 2 0 1 2 0 1 2]
        /       "Split.";               [[[0 1 2 0] [1 2 0 1] [2 0 1 2]]
         Wf<    "Truncate each line.";  [[[0 1 2] [1 2 0] [2 0 1]]
            N*  "Join with newlines.";  ["012
                                          120
                                          201"]

結果はプログラムの最後に自動的に印刷されます。(最後のステップのスタックの内容は、技術的には数字と改行文字を含む混合配列であり、文字のみを含む文字列ではないことに注意してください。)

または、11文字

最近の追加ew(これはチャレンジよりも新しいです-指定された長さのすべての重複するサブストリングを返します)で、11バイトを実行できます:

l~,2*))ewN*

これがどのように機能するかです:

l~           "Read and eval input."; [3]
  ,          "Get range.";           [[0 1 2]]
   2*        "Repeat twice.";        [[0 1 2 0 1 2]]
     )       "Pop last.";            [[0 1 2 0 1] 2]
      )      "Increment.";           [[0 1 2 0 1] 3]
       ew    "Get substrings.";      [[[0 1 2] [1 2 0] [2 0 1]]
         N*  "Join with newlines.";  ["012
                                       120
                                       201"]

代替14バイト:l~_,\{_(+N\}*;。でもこれでもっと上手くできるかしら。
Sp3000 2015

はい、しかしそれは基本的にピーターの答えの一部であり、私はむしろ別のアプローチを提示したいと思いました。ewうまくいくかもしれませんが、チャレンジより新しいです。
マーティンエンダー、

0

MATL、6バイト

:q&+G\

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

    # implicit input, say n = 3
:   # range
    # stack: [1, 2, 3]
q   # decrement
    # stack: [0, 1, 2]
&+  # sum with itself and transpose with broadcast
    # stack:
    # [0 1 2
    #  1 2 3
    #  2 3 4]
G   # paste input
    # stack: [0 1 2; 1 2 3; 2 3 4], 3
\   # elementwise modulo
    # implicit output with spaces

0

Excel VBA、77バイト

範囲から整数nとして入力を取り、範囲[A1]に出力する匿名VBE即時ウィンドウ関数A2.Resize(n,n)

[A2:IU255]="=IF(MAX(ROW()-1,COLUMN())-1<$A$1,MOD(ROW()+COLUMN()-3,$A$1),"""")

0

Perl 6、23バイト

{.rotate(.all).put}o|^*

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

数値を受け取り、スペースを含む指定された形式でマトリックスを出力する匿名コードブロック。代わりに何かを返すことができる場合は、.put削除できます。

説明:

                   o|^*    # Transform the input into the range 0..input-1
{                 }        # And pass it into the function
 .rotate                   # Rotate the range by
        (.all)             # Each of the range
              .put         # And print each of them separated by spaces

0

チャコール、13バイト

NθEθ⪫Eθ﹪⁺ιλθ 

オンラインでお試しください!リンクはコードの詳細バージョンです。注:末尾のスペース。説明:

Nθ              Input `n` as a number into variable
   θ            `n`
  E             Map over implicit range
      θ         `n`
     E          Map over implicit range
         ι      Current row
        ⁺       Plus
          λ     Current column
       ﹪        Modulo
           θ    `n`
    ⪫           Cast row to string and join with spaces
                Implicitly print each row on its own line

0

APL(NARS)、15文字、30バイト

{⊃{⍵⌽k}¨k←0..⍵}

テスト:

  f←{⊃{⍵⌽k}¨k←0..⍵}
  f 4
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3
  f 3
0 1 2 3
1 2 3 0
2 3 0 1
3 0 1 2
  f 2
0 1 2
1 2 0
2 0 1
  f 1
0 1
1 0
  f 0
0 

ここで言語はコメントを必要としません...




0

Forth(gforth)、53バ​​イト

: f dup 0 do cr dup 0 do i j + over mod . loop loop ;

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

説明

n行ごとに改行を出力するネストされたループ

コード説明

: f             \ start new word definition
  dup 0 do      \ set loop parameters and loop from 0 to n-1
    cr          \ output a newline
    dup 0 do    \ loop from 0 to n-1 again
      i j +     \ get the sum of the row and column number
      over mod  \ modulo with n
      .         \ print (with space)
    loop        \ end inner loop
  loop          \ end outer loop
;               \ end word definition
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.