Koordinat Identifikasi Diri


27

Tulis sebuah program atau fungsi yang, diberi bilangan bulat n, membangun array dengan ndimensi npanjang, di mana setiap elemen merupakan pengidentifikasi koordinatnya sendiri. Yaitu, mulai dengan satu array, isi dengan narray, di mana masing-masing berisi nlebih banyak array, hingga kedalaman n-1. Elemen-elemen dari array terdalam adalah koordinat yang menggambarkan di mana mereka berada dalam array penuh.

Beberapa contoh kalau-kalau penjelasan saya membingungkan.

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"]
  ]
]

Di sini, "321" berarti itu adalah elemen ke-1 dari elemen ke-2 dari array ke-3.

Aturan:

  • Koordinat dan dimensi ( n) dapat diindeks 0 atau 1
  • Anda dapat mengasumsikan nsatu digit, di bawah 10 untuk kedua opsi pengindeksan untuk mencegah output yang ambigu
  • IO fleksibel.
    • Khususnya, koordinat dapat berupa array, string, dll. Asalkan jelas. "321" => [3,2,1]
    • Output dapat berupa bilangan bulat di basis 10 dengan atau tanpa nol di depan.
    • Koordinat dapat dalam urutan terbalik jika Anda inginkan, asalkan konsisten. "321" => "123"
    • Output tidak harus berupa struktur array dalam bahasa Anda. Selama ada penanda yang jelas berbeda untuk awal array, akhir array dan untuk memisahkan elemen.
    • Output untuk n=1hanya bisa 1
    • Jika output Anda tidak khas, pastikan untuk menjelaskan formatnya.
  • Ini adalah sehingga solusi terpendek dalam setiap bahasa menang!

Sandbox (dihapus)
Jo King

Saya mengalami kesulitan menulis ini di Haskell, sebelum saya menyadari bahwa sistem tipe membuatnya tidak mungkin.
Wheat Wizard

@CatWizard: Anda selalu dapat menentukan struktur data baru untuk menyiasatinya, misalnya. data L a = L [L a] | E a.
ბიმო


1
@ToddSewell Anda tidak dapat memiliki fungsi yang tipenya bergantung pada input. Fungsi ini bisa memiliki tipe Int -> [String]atau Int -> [[String]]dan sebagainya, tergantung pada apa inputnya
H.PWiz

Jawaban:


19

Dyalog APL , 5 3 byte

⍳⍴⍨

-2 byte terima kasih kepada FrownyFrog

Cobalah online!

memberikan semua indeks yang diberikan bentuk array. mis. 2 3 .
membentuk kembali arg kanan menjadi ukuran arg kiri. membuat keduanya menjadi arg yang tepat.


10

Python 3 , 56 byte

f=lambda n,*l:len(l)//n*l or[f(n,*l,k)for k in range(n)]

Cobalah online!

Mr. Xcoder menyimpan 2 byte beralih ke Python 3 untuk membongkar bintang.


3
Jika Anda beralih ke Python ≥3.5, f=lambda n,*l:len(l)//n*l or[f(n,*l,k)for k in range(n)]bekerja selama 56 byte.
Tn. Xcoder


6

J , 18 byte

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

Cobalah online!

Solusi berulang, tidak ada produk kartesian bawaan. Inilah yang terlihat seperti puncak 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] ]      |

Awalnya jumlah byte yang lebih tinggi membuat saya kesal, tapi ini benar-benar indah J
Jonah

6

Jelly , 8 7 byte

ṗ³s³$³¡

Cobalah online!

Penjelasan

Gunakan argumen 2 sebagai contoh.

ṗ³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.

Jika ¡tidak bervariasi itu argumen yang tepat tentang iterasi untuk angka dua maka ini akan menjadi 4 byte:ṗs³¡


Ini seperti program lengkap bagi saya. Apakah Anda yakin output (STDOUT) untuk 1valid?
Erik the Outgolfer

@EriktheOutgolfer Saya baik-baik saja dengan output untuk 1
Jo King

@ JoKing Tetapi, dalam hal ini, tidak ada "penanda jelas yang berbeda untuk awal array, akhir array". Apakah Anda ingin mengedit pertanyaan? (banyak jawaban tidak benar-benar berisi mereka)
Erik the Outgolfer

5

J, 13 byte

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

Cobalah online!

Menarik, ini jauh lebih lama daripada jawaban APL (meskipun itu mungkin ketidakmampuan saya untuk melihat terjemahan yang lebih baik)

penjelasan

[: { [ ;/@$ ,:@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 Menggunakan kail untuk menghindarinya #.invsangat pintar, +1.
cole

@FrownyFrog Sekarang saya telah melihat solusi Anda "menghitung di pangkalan yang berbeda", saya pikir pendekatannya cukup berbeda sehingga Anda harus menambahkannya sebagai posting lain sendiri. Ini solusi yang sangat bagus.
Jonah

Jonah, @cole terima kasih
FrownyFrog

5

MATLAB, 92 89 55 byte

Saya memiliki jawaban yang berbeda setelah membaca kembali aturan tantangan, tetapi saya akan meninggalkan upaya sebelumnya di bawah karena berbeda dan masih menyenangkan untuk dilihat.

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

Penjelasan

                        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

Ini menghasilkan array n-dimensi string yang 0 diindeks.

Jawaban Sebelumnya (89 byte)

Golf pertamaku! Ini mungkin dapat dikurangi lebih banyak tetapi saya pikir saya akan memposting apa yang saya dapatkan.

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

Penjelasan

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

Keluaran x pada akhirnya memberikan solusi

Mirip dengan posting MATLAB lainnya, outputnya adalah array n-dimensional, kecuali ia menggunakan angka untuk menampilkan koordinat. Ini bekerja untuk nilai apa pun, meskipun karena loop buruk di MATLAB itu mulai melambat secara signifikan di sekitar n = 8.

Sunting: -2 bytes terima kasih kepada Luis Mendo. Juga menghapus titik koma akhir untuk mencetak output.


4
Selamat datang di PPCG!
Shaggy

Saya pikir Anda dapat menggantinya lengthdengan nnzmenyimpan beberapa byte. Juga, sesuai aturan PPCG, kode harus menghasilkan beberapa output aktual, biasanya dengan menampilkannya dalam STDOUT (itu tidak cukup untuk memiliki output yang disimpan dalam variabel), atau itu harus menjadi fungsi yang mengembalikan output
Luis Mendo

5

Karat ,201 176 167 166 154 byte

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,"")

Cobalah online!

Jenis output adalah tipe penjumlahan dengan dua varian karena bahasa diketik dengan ketat. Ini bisa berupa L, yang merupakan tipe daftar yang berisi tipe penjumlahan ini atau Syang merupakan tipe hasil (string). Hasilnya bisa seperti ini.

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

Juga, diformat ulang menggunakan 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 byte

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})

Cobalah online!

  • 1-diindeks, terbalik
  • sayangnya R menyimpan matriks dengan kolom, jika tidak kita bisa turun ke 73 byte
  • -9 byte disimpan berkat saran @Giuseppe untuk menggunakan whichindeks array

jawaban 76 byte Anda bisa 73 byte yang merupakan cara saya menerapkannya sebelum memeriksa untuk melihat apakah sudah ada jawaban R. Namun, Anda mungkin dapat mengubah beberapa pendekatan? Tidak sepenuhnya yakin.
Giuseppe

1
@ Giuseppe: pengindeksan array whichadalah apa yang saya cari, terima kasih! Disimpan 9 byte
digEmAll

4

Java 10, 144 byte

Solusinya adalah metode f. Ini menghasilkan representasi string dari array.

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

Cobalah secara Online

Tidak disatukan

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

Ucapan Terima Kasih


1
Di Java 10, Anda bisa menggantinya Object[]dengan var. Juga, saya pikir elseblok ini tidak perlu, seperti yang ada returndi ifblok.
Konrad Borowski

3

05AB1E , 7 byte

LsãsGsô

Cobalah online!

Penjelasan

L          # push range [1 ... input]
 sã        # input repeated cartesian products of the list
   sG      # input - 1 times do:
     sô    # split into input parts


3

MATLAB, 116 108 104 byte

Saya merasa seperti harus ada cara yang lebih singkat untuk melakukan ini, mengingat afinitas MATLAB terhadap matriks multi-dimensi ... Terima kasih kepada Luis untuk 4 byte dari beberapa penyerahan pendek

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

Penjelasan

% 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)

Outputnya adalah array sel n-dimensi, di mana setiap elemen adalah array dari nilai koordinat. Bekerja untuk apa pun ntanpa ambiguitas karena output array numerik, selama n^(n+1)array elemen dapat disimpan dalam RAM!


3

Arang , 26 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Nθ

Masukan n.

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

Hasilkan semua nⁿ nangka -digit di pangkalan n.

Fθ≔⪪υθυ

Bagi mereka nkali menjadi narray -dimensi di mana setiap dimensi berukuran n.

υ

Cetak array. Format output default adalah setiap elemen pada barisnya sendiri, kemudian setiap blok ngaris diakhiri oleh baris kosong, lalu setiap blok nblok ngaris diakhiri oleh baris kosong kedua, dan seterusnya hingga n-1baris kosong di tingkat atas .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.