自己識別座標


27

整数を指定して、長さの次元をn持つ配列を構成するプログラムまたは関数を作成します。各要素は、独自の座標の識別子です。つまり、1つの配列から始めて、配列を追加します。各配列には、深さまで、より多くの配列が含まれます。最も深い配列の要素は、完全な配列のどこにあるかを示す座標です。nnnnn-1

説明がわかりにくい場合のいくつかの例。

n = 1

["1"]

n = 2

[
 ["11", "12"],
 ["21", "22"]
]

n = 3

[
  [
    ["111","112","113"],
    ["121","122","123"],
    ["131","132","133"]
  ],
  [
    ["211","212","213"],
    ["221","222","223"],
    ["231","232","233"]
  ],
  [
    ["311","312","313"],
    ["321","322","323"],
    ["331","332","333"]
  ]
]

ここで、「321」は、3番目の配列の2番目の要素の1番目の要素であることを意味します。

ルール:

  • 座標と次元(n)には、0または1のインデックスを付けることができます
  • n曖昧な出力を防ぐために、両方のインデックスオプションで10未満の1桁であると仮定することができます。
  • IOは柔軟です。
    • 特に、座標は、明確である限り、配列、文​​字列などにすることができます。"321" => [3,2,1]
    • 出力は、先行ゼロの有無にかかわらず、基数10の整数にすることができます。
    • 座標は、一貫している限り、必要に応じて逆の順序にすることができます。「321」=>「123」
    • 出力は、必ずしも言語の配列構造である必要はありません。配列の開始、配列の終了、および要素を区切るための明確な明確なマーカーがある限り。
    • の出力はn=11になります
    • 出力が非定型である場合は、必ず形式を説明してください。
  • これはので、各言語で最短のソリューションが勝ちです!


型システムがそれを不可能にすることに気付く前に、私はHaskellでこれを書くのに苦労していました。
小麦ウィザード

@CatWizard:新しいデータ構造を常に定義して、それを回避できます。data L a = L [L a] | E a
ბიმო

2
関連
アダム

1
@ToddSewell入力に依存するタイプの関数を作成することはできません。この関数は、入力が何であるかに応じて、タイプInt -> [String]などInt -> [[String]]を持つことができます
H.PWiz

回答:





6

J、18バイト

,"1/^:(]{:)~@,.@i.

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

反復ソリューション、組み込みデカルト積なし。これがピークJの外観です。

                       input                                    2
                i.     range                                 0, 1
             ,.@       reshape each element
                       into a one-dimensional array        [0],[1]   (A)
    ^:(]{:)            (input−1) times...             (1 iteration)
,"1/       ~@             prepend the contents of each 1d array in A    |
                          to every 1d array from the previous iteration,|  
                          assembling the results for each A[n] into     |!CANTEXPLAINTHIS!
                          a larger array                                |
                                                         [ [0,0],       |
                                                           [0,1] ],     |
                                                         [ [1,0],       |
                                                           [1,1] ]      |

最初はバイト数が多いため
ジョナ

6

ゼリー8 7バイト

ṗ³s³$³¡

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

説明

例として引数2を使用します。

ṗ³s³$³¡   
ṗ        Cartesian power with power
 ³       2 (the argument). Autoranges the left arg.
         Yields [[1,1],[1,2],[2,1],[2,2]]
    $³¡  Do 2 times:
  s³     Split into segments of length 2. 
         This last step molds the array of indices into the proper shape.

¡変化しなかった場合、ダイアドの反復に対する正しい引数である場合、これは4バイトになります。ṗs³¡


これは私には完全なプログラムのように見えます。の出力(STDOUT)1は有効ですか?
エリックアウトゴルファー

@EriktheOutgolfer 1の出力に問題はありません
ジョーキング

@JoKingしかし、この場合、「配列の始まり、配列の終わりを明確に区別するマーカー」はありません。質問を編集しますか?(多くの回答には実際には含まれていません)
エリック・ザ・アウトゴルファー

5

J、13バイト

[:{[;/@$,:@i.

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

興味深いのは、APLの回答よりもはるかに長いことです(ただし、より良い翻訳を見ることができない場合があります)

説明

[: { [ ;/@$ ,:@i.


     [                NB. the argument
            ,:@i.     NB. range 0..arg, considered as one item: ,: is "itemize" 
          $           NB. repeat the right range the left number of times
       ;/@            NB. and then put boxes around them. so, eg, if we had
                      NB. an arg of 3, now we have the list of boxes 
                      NB. [0 1 2][0 1 2][0 1 2]
[: {                  NB. { is "Catalog", it creates the cartesian product
                      NB. in exactly the format we desire.


@FrownyFrogフックを使用して回避すること#.invは非常に賢く、+ 1です。
コール

@FrownyFrogあなたの「異なる拠点でのカウントアップ」ソリューションを見てきたので、アプローチはあなた自身で別の投稿として追加する必要があるほど十分に異なると思います。それは非常に素晴らしい解決策です。
ジョナ

ジョナ、@ coleありがとう
-FrownyFrog

5

MATLAB、92 89 55バイト

チャレンジのルールを読み直したという別の答えがありますが、以前とは異なるのでまだ見て楽しいので、以前の試みを残しておきます。

reshape(string(dec2base(0:n^n-1,n+(n<2))),[~(1:n)+n 1])

説明

                        0:n^n-1                        % [0,1,...,n^n-1]
               dec2base(       ,n+(n<2))               % Put into base n (base 2 if n=1)
        string(                         )              % Convert to strings
                                          [~(1:n)+n 1] % Dimension array [n,n,...,n] (length n)
reshape(                                 ,            )% Use dim array to reshape

これは、インデックスが0である文字列のn次元配列を出力します。

前の回答(89バイト)

私の最初のゴルフ!これはおそらくもっと減らすことができますが、私が持っているものを投稿すると思いました。

x=(1:n)';for d=2:n;y=((1:n)*10^(d-1));o=[];for p=1:nnz(y);o=cat(d,o,(x+y(p)));end;x=o end

説明

x=(1:n)';                       % Create array x=[1,2,...n]'
for d=2:n                       % d for dimension
    y=((1:n)*10^(d-1));         % Creates an array for each d where
                                %   y=[10,20,30,...] for n=2
                                %   y=[100,200,...] for n=3 etc.
    o=[];                       % o for output
    for p=1:nnz(y)              % For each value of y
        o=cat(d,...             % Concatenate in the dth dimension:
            o,...               % - The current output
            x+y(p));            % - The sum of
                                %   - The array from the last dimension
                                %   - The current value in y (e.g. 100)
    end
    x=o                         % Send the output to x for the next loop
end

最後にxを出力して解を与えます

他のMATLABポストと同様に、出力は数値を使用して座標を表示することを除いて、n次元配列です。これは任意の値に対して機能しますが、MATLABではループが悪いため、n = 8付近で大幅にスローダウンし始めます。

編集:ルイス・メンドーのおかげで-2バイト。また、出力を印刷するために最後のセミコロンを削除しました。


4
PPCGへようこそ!
シャギー

私はあなたが交換することができると思いlengthによってnnz数バイトを保存します。また、PPCGルールに従って、コードは通常、STDOUTに表示することで実際の出力を生成する必要があります(出力を変数に格納するだけでは不十分です)。または、出力を返す関数である必要があります
Luis Mendo

5

さび201 176 167 166 154バイト

enum L{S(String),L(Vec<L>)}fn
h(n:u8,d:u8,s:&str)->L{if
d<1{L::S(s.into())}else{L::L((0..n).map(|i|h(n,d-1,&format!("{}{}",s,i))).collect())}}|n|h(n,n,"")

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

言語は厳密に型指定されているため、出力タイプは2つのバリアントを持つ合計タイプです。これはどちらかとすることができるLこの合計の種類または含有リスト型であり、S結果の型(文字列)です。結果は次のようになります。

L::L([
 L::L([ L::S("00"), L::S("01") ]),
 L::L([ L::S("10"), L::S("11") ]),
])

また、次を使用して再フォーマットしましたrustfmt

enum L {
    S(String),
    L(Vec<L>),
}
fn h(n: u8, d: u8, s: &str) -> L {
    if d < 1 {
        L::S(s.into())
    } else {
        L::L(
            (0..n)
                .map(|i| h(n, d - 1, &format!("{}{}", s, i)))
                .collect(),
        )
    }
}
|n| h(n, n, "")

4

R、102バイト

function(n,m=array(T,rep(n,n)))`if`(n<2,'1',{m[]=apply(which(m,T)[,`[<-`(1:n,1:2,2:1)],1,toString);m})

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

  • 1インデックス、逆
  • 残念ながら、Rは列ごとに行列を格納します。そうしないと、73バイトになります
  • @Giuseppeによるwhich配列インデックスの使用の提案により、-9バイト節約

あなたの76バイトの答えは73バイトになる可能性があります。これはすでにRの答えがあるかどうかを確認する前に実装した方法です。ただし、アプローチの一部を変更できる場合がありますか?よくわかりません。
ジュゼッペ

1
@Giuseppe:配列のインデックス付けwhichは私が探していたものです、ありがとう!9バイト保存
-digEmAll

4

Java 10、144バイト

解決策はmethod fです。配列の文字列表現を生成します。

String h(int n,int d,String s){if(d<1)return s;var r="[";for(int i=0;i++<n;)r+=h(n,d-1,s+i)+",";return r+"]";}String f(int n){return h(n,n,"");}

オンラインで試す

非ゴルフ

String h(int n, int d, String s) {
    if (d < 1)
        return s;
    var r = "[";
    for (int i = 0; i++ < n;)
        r += h(n, d - 1, s + i) + ",";
    return r + "]";
}
String f(int n) {
    return h(n, n, "");
}

謝辞


1
Javaの10で、あなたは置き換えることができObject[]var。また、elseあなたがブロックしているようreturnに、このブロックは不要だと思いますif
コンラッド



3

MATLAB、116の 108 104バイト

多次元行列に対するMATLABの親和性を考えると、これを行うにはもっと短い方法があるに違いないと感じています...

a=~(1:n)+n;c=cell(1,n);[c{:}]=ind2sub(a,1:n^n);reshape(arrayfun(@(varargin)[varargin{:}],c{:},'un',0),a)

説明

% For using twice, define the array of dimension sizes [n, n, .., n]
a=~(1:n)+n;
% To group variable number of outputs from ind2sub into a cell array
c=cell(1,n);   
% Convert linear indices to self-describing coordinates
[c{:}]=ind2sub(a,1:n^n);     
% reshape to make it the n-dimensional array
% arrayfun to loop over the numerous ind2sub outputs simultaneously
% varargin and {:} usage to account for various numbers of inputs
reshape(arrayfun(@(varargin)[varargin{:}],c{:},'uni',0),a)

出力はn次元のセル配列で、各要素は座標値の配列です。要素配列をRAMに保存できるn限り、数値配列出力のため、あいまいさのないすべてのn^(n+1)ユーザーに有効です!


3

、26バイト

Nθ≔EXθθ⪫⪪◧⍘ιθθ ¦0υFθ≔⪪υθυυ

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

Nθ

入力n

≔EXθθ⪫⪪◧⍘ιθθ ¦0υ

nⁿ nbaseですべての数字を生成しますn

Fθ≔⪪υθυ

それらを各次元がsizeの次元配列にn時間を分割しnますn

υ

配列を印刷します。デフォルトの出力フォーマットは、その後の各ブロック独自の行の各要素であるnラインは空白行で終了し、の各ブロックnのブロックn線は第二ブランク線で終了し、これまでにされたn-1トップレベルの空白行。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.