Kendini Tanımlayan Koordinatlar


27

Bir tamsayı verilen , her boyutun kendi koordinatlarının bir tanımlayıcısı olduğu , uzunluk boyutlarına nsahip bir dizi oluşturan bir program veya işlev yazın . Yani, bir dizi ile başlayarak , her birinin daha fazla dizi içerdiği bir derinliğe kadar dizilerle doldurun . En derin dizilerin elemanları, tam dizide nerede olduklarını açıklayan koordinatlardır.nnnnn-1

Açıklamam durumunda bazı örnekler kafa karıştırıcıydı.

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

Burada "321", 3. dizinin 2. öğesinin 1. elemanı olduğu anlamına gelir.

Kurallar:

  • Koordinatlar ve boyut ( n), 0 veya 1 dizinlenmiş olabilir
  • nBelirsiz çıktıları önlemek için her iki indeksleme seçeneğinde 10 rakamın altında bir rakam olduğunu varsayalım.
  • IO esnek.
    • Özellikle, koordinatlar, net oldukları sürece diziler, dizeler vs. olabilir. "321" => [3,2,1]
    • Çıktı, taban 10'daki baş sıfıra sahip olan ya da olmayan tam sayılar olabilir.
    • İsterseniz, tutarlı olduğu sürece koordinatlar ters sırada olabilir. "321" => "123"
    • Çıktı dilinizde mutlaka bir dizi yapısı olmak zorunda değildir. Bir dizinin başlangıcı, bir dizinin sonu ve elemanları ayırmak için belirgin işaretler olduğu sürece.
    • Çıktı n=1sadece 1 olabilir
    • Çıktınız atipikse, biçimi açıkladığınızdan emin olun.
  • Bu yani her dilde en kısa çözüm kazanıyor!

Sandbox (silindi)
Jo King

Bunu, yazı sisteminin imkansız kıldığını fark etmeden önce Haskell'e yazmakta zorlanıyordum.
Buğday Sihirbazı,

@CatWizard: Bunu aşmak için her zaman yeni bir veri yapısı tanımlayabilirsiniz, örn. data L a = L [L a] | E a.
02


1
@ToddSewell Türü girişe bağlı olan bir işleve sahip olamazsınız. Bu fonksiyon , girişin ne olduğuna bağlı olarak tür Int -> [String]veya Int -> [[String]]benzeri olabilir.
H.PWiz

Yanıtlar:


19

Dyalog APL , 5 3 bayt

⍳⍴⍨

FrownyFrog sayesinde -2 bayt

Çevrimiçi deneyin!

Bir dizinin şeklini verilen tüm indeksleri verir. örneğin, 2 3 .
sol argümanın boyutu olacak şekilde sağ argümanı yeniden şekillendirir. her ikisini de doğru argüman yapar.


10

Python 3 , 56 bayt

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

Çevrimiçi deneyin!

Bay Xcoder, yıldızlı paketi açmak için Python 3'e geçerek 2 byte tasarruf etti.


3
Python ≥3.5'e geçerseniz, f=lambda n,*l:len(l)//n*l or[f(n,*l,k)for k in range(n)]56 byte çalışır.
Bay Xcoder


6

J , 18 bayt

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

Çevrimiçi deneyin!

İteratif çözüm, dahili kartezyen ürün yoktur. J zirvesi böyle görünüyor.

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

İlk başta yüksek bayt sayısı beni erteledi, ama bu gerçekten çok güzel J
Jonah

6

Jelly , 8 7 bayt

ṗ³s³$³¡

Çevrimiçi deneyin!

açıklama

Örnek 2'yi argüman olarak kullanın.

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

Eğer ¡bu çiftlerinde tekrarlamalar üzerinde sağ tartışma olur farklılık yoktu o zaman bu 4 byte olacaktır:ṗs³¡


Bu bana tam bir program gibi görünüyor. İçin çıktının (STDOUT) 1geçerli olduğundan emin misiniz ?
Outgolfer Erik,

@EriktheOutgolfer 1 çıktısı için iyiyim
Jo King

@JoKing Ancak, bu durumda, "bir dizinin başlangıcı, bir dizinin sonu için net belirteçler" yoktur. Soruyu düzenlemek ister misiniz? (pek çok cevap aslında onları içermez)
Outgolfer Erik,

5

J, 13 bayt

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

Çevrimiçi deneyin!

İlginç olanı APL'nin cevabından çok daha uzundur (yine de daha iyi bir çeviri göremem olabilir)

açıklama

[: { [ ;/@$ ,:@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 Kaçınmak için bir kanca kullanmak #.invçok zekice, +1.
cole,

@ FrownyFrog Şimdi "farklı temellerde sayma" çözümünüze baktığımda, yaklaşımın kendiniz için başka bir yazı olarak eklemeniz için yeterince farklı olduğunu düşünüyorum. Çok güzel bir çözüm.
Jonah

Jonah, @cole teşekkür ederim
FrownyFrog

5

MATLAB, 92 89 55 bayt

Mücadelenin kurallarını yeniden okuyan farklı bir cevabım var, ancak bakmak için farklı ve yine de eğlenceli olduğu için önceki girişimi aşağıda bırakacağım.

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

açıklama

                        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

Bu, 0 dizinlenmiş n boyutlu bir dizi dizisi çıkarır.

Önceki Cevap (89 bayt)

Benim ilk golf! Bu muhtemelen daha da azaltılabilir, ancak sahip olduğumu göndereceğimi düşündüm.

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

açıklama

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

Sonunda x çıktı vererek çözüm verir

Diğer MATLAB postuna benzer şekilde, çıktı n boyutlu bir dizidir, ancak koordinatları görüntülemek için sayıları kullanır. Her değer için işe yarar, MATLAB'de döngüler kötü olduğu için n = 8 civarında önemli ölçüde yavaşlamaya başlar.

Düzenleme: Luis Mendo sayesinde -2 bayt. Ayrıca çıktıyı yazdırmak için son noktalı virgül kaldırıldı.


4
PPCG'ye Hoşgeldiniz!
Shaggy

Ben değiştirmek düşünüyorum lengthtarafından nnzbirkaç byte kaydedin. Ayrıca, PPCG kurallarına göre, kodun tipik olarak STDOUT'da görüntülenmesiyle (çıkışın değişkende saklanması yeterli değildir) ya da çıktısını döndüren bir işlev olması gerekir, kodun bazı çıktılar üretmesi gerekir
Luis Mendo

5

Pas ,201 176 167 166 154 bayt

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

Çevrimiçi deneyin!

Çıktı türü, dil kesinlikle yazıldığından iki değişkenli bir toplam türüdür. Bu da olabilir L, bu miktarın türü veya içeren bir liste türü olan Sbir sonuç tipi (bir dize) 'dir. Sonuç böyle görünebilir.

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

Ayrıca, kullanılarak yeniden biçimlendirildi 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 bayt

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

Çevrimiçi deneyin!

  • 1 indeksli, ters
  • maalesef R matrisi sütuna göre depolar, yoksa 73 bayta kadar gidebiliriz
  • -9 bayt, whichdizi indekslemesini kullanmak için @Giuseppe önerisi sayesinde kaydedildi

76 baytlık cevabınız 73 bayt olabilir , bu da zaten bir R cevabı olup olmadığını görmek için kontrol etmeden önce uyguladım. Yine de bazı yaklaşımları değiştirebileceksiniz. Tamamen emin değil.
Giuseppe,

1
@Giuseppe: Dizi indekslemesi whicharadığım şeydi, teşekkürler! 9 bayt kurtarıldı
digEmAll

4

Java 10, 144 bayt

Çözüm yöntemdir f. Dizinin bir dize gösterimini üretir.

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

Çevrimiçi Deneyin

Ungolfed

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

Teşekkür


1
Java 10'da Object[]ile değiştirebilirsiniz var. Ayrıca, bundan düşünüyorum elsesenin gibi blok, gereksizdir returniçinde ifbloğun.
Konrad Borowski

3

05AB1E , 7 bayt

LsãsGsô

Çevrimiçi deneyin!

açıklama

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 bayt

MATLAB'ın çok boyutlu matrislere olan yakınlığı göz önüne alındığında, bunu yapmanın daha kısa bir yolu olması gerektiğini düşünüyorum ...

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

açıklama

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

Çıktı, her bir elemanın koordinat değerlerinin bir dizisi olduğu n boyutlu bir hücre dizisidir. nSayısal dizi çıktısı nedeniyle belirsizlikler olmadan çalışır , bir n^(n+1)öğe dizisi RAM'de saklanabildiği sürece !


3

Kömür , 26 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Nθ

Giriş n.

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

Tüm- nⁿ ndijit sayılarını temelde oluşturun n.

Fθ≔⪪υθυ

Onları her bir boyutun büyüklüğünde olduğu nbir nboyutlu bir diziye bölün n.

υ

Diziyi yazdır. Varsayılan çıkış biçimi daha sonra her bir blok, her satırda bir element olduğu nhatları boş hattı ile sonlandırılır, daha sonra her bir blok nblok nçizgiler ikinci bir boş satır tarafından ve böylece için yukarı olan n-1en üst düzeyde boş satır .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.