N boyutlu N ^ N dizi N ile dolu


62

In:  Yeterli bellek ve pozitif bir tamsayı N

Çıkışı:  N boyutlu N ^ N dizisi N ile doldurulur, burada N ^ N N-by-N-by-N-by ...

Örnekler:

1: 1 [1]uzunluğunda 1D dizisi (bir liste)

2: [[2,2],[2,2]]2 sıra ile dolu 2 sıra ve 2 sütun içeren 2 boyutlu bir dizi (tablo)

3: [[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]]]3 katmanla dolu 3 katman, 3 satır ve 3 sütun içeren bir 3B dizi (küp)

4: [[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]],[[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]],[[4,4,4,4],[4,4,4,4],[4,4,4,4],[4,4,4,4]]]]

5 ve 6: Lütfen cevaplardan birine bakınız.


Dilimiz dizileri desteklemiyorsa, kabul edilebilir bir çıktı formatı ne olur?
Okx,

17
"Yeterli bellek" girişin bir parçası olduğundan, bir robota gerçekten bellek olarak giriş yapmasını ve kullanmadan önce takmasını kontrol eden bir cevap görmek istiyorum.
user2357112

1
Tüm dizilerin ayrı nesneler olması gerekiyor mu?
Neil

1
@ user2357112 Bunun bir önkoşul türü sorun olduğunu düşünüyorum. Operasyonun hafızayı girdi olarak kabul etmesini beklediğinden şüpheliyim.
Büyük Ördek

2
@TheGreatDuck Doğru, ancak user2357112'nin bir şaka olarak kastettiğinden eminim.
Adám

Yanıtlar:


50

Python , 32 bayt

lambda n:eval('['*n+'n'+']*n'*n)

Çevrimiçi deneyin!

Gibi bir dize yapar "[[[n]*n]*n]*n"ile nçarpımı, ve Python kodu olarak değerlendirerek. Değerlendirme fonksiyon kapsamı içinde gerçekleştiğinden, değişken ismi nfonksiyon girişine göre değerlendirilir.


3
kapsam hilesi dahidir
Griffin

+1, bu değerlendirme numarası gerçekten çok fazla bayt golfü atıyor
MilkyWay90

31

J, 4 bayt

$~#~

Çevrimiçi deneyin!

açıklama

$~#~  Input: integer n
  #~  Create n copies of n
$~    Shape n into an array with dimensions n copies of n

6
Meydan okumayı görünce hemen J'yi düşündüm. J'nin Jelly'i (J'den ilham alan golf dili) bile atması oldukça havalı.
Dane,

1
Aynı zamanda $~$~kendini tekrar ederken de aynı olan bir şey var
mil

2
$~$~İngilizceye tercüme ... PARA, daha fazla, PARA, daha fazla ...
Magic Octopus Urn


12

Mathematica, 22 20 bayt

(t=Table)@@t[#,#+1]&

(* or *)

Table@@Table[#,#+1]&

9

R, 26

Bu açık cevap ama belki daha zekice bir şey var mı?

n=scan();array(n,rep(n,n))

olan scan()gerekli?
Adám

Diğer cevaplara baktığımızda, bir fonksiyon olması ya da bir şekilde girişi kabul etmesi gerekmiş gibi görünüyor?
Flounderer

1
Doğru, R'yi hiç tanımıyorum. Bunun yerine bir şekilde bir fonksiyon belirleyebileceğini düşündüm.
Adám

Evet, değiştirebilirsiniz n=scan();, function(n)ancak daha uzun sürer.
Flounderer

5
Sen koyarak bir bayt kaydedebilirsiniz niçinde atama array: array(n<-scan(),rep(n,n)).
rturnbull

8

JavaScript (ES6),  44  40 bayt

f=(n,k=i=n)=>i--?f(n,Array(n).fill(k)):k

gösteri


8

Haskell , 52 bayt

f n=iterate(filter(>'"').show.(<$[1..n]))(show n)!!n

Çevrimiçi deneyin!

@ Nimi'nin cevabından ilham aldı , ancak daha önceden tanımlanmış fonksiyonları kullanıyor.

  • Özyinelemeli yardım işlevini kullanır iterateve kullanır !!.
  • Liste sınırlayıcıları "el ile" oluşturmak yerine, filter(>'"').showbir dize listesini biçimlendirmek için kullanır , ardından fazladan "karakterleri çıkarır .

8

05AB1E (eski) , 6 5 bayt

-1 Kevin Cruijssen sayesinde

F¹.D)

Çevrimiçi deneyin!

F     # For 0 .. input
 ¹.D) # Push <input> copies of the result of the last step as an array

Lider Dgirişi dolaylı olarak tekrar kullanıldığı için çıkarılabilir (cevabını yayınlanmıştır zaman bu bir şeydi ama müstehcen gerekmiyorsa emin değilim Dşimdi artık).
Kevin Cruijssen

1
@KevinCruijssen Bunun bize birçok kez örtük olarak girdi yapma fikrini veren cevaplardan biri olduğunu düşünüyorum :)
Riley,

Ah tamam. Gerçekten de, gönderim sırasında henüz örtük olmamasını bekliyordum, ancak yorumumu yayınladıktan sonra (düzenlediğim) fark ettim. ;) Bazen eski cevaplarla (genellikle 2017 öncesi) ne kadar açık şeyler yapıldığı ve şimdi ne kadar daha kısa sürede yapılabileceği komiktir.
Kevin Cruijssen


7

Haskell, 62 bayt

n#0=show n
n#l='[':tail((',':)=<<n#(l-1)<$[1..n])++"]"
f n=n#n

Kullanım örneği: f 2-> "[[2,2],[2,2]]". Çevrimiçi deneyin! .

Haskell'in katı tip sistemi, farklı derinliklerde iç içe geçmiş listeler döndüren bir işlevi önlediğinden, sonucu bir dizge olarak yapıyorum.

Nasıl çalışır:

n#l=                         n with the current level l is
    '[':                     a literal [ followed by
           n#(l-1)<$[1..n]   n copies of   n # (l-1)
        (',':)=<<            each prepended by a , and flattened into a single list
      tail                   and the first , removed
                  ++"]"      followed by a literal ]

n#0=show n                   the base case is n as a string

f n=n#n                      main function, start with level n         

Biz daha yerleşik fonksiyonları ile aynı fikri daha kısa yapabilirsiniz: f n=iterate(filter(>'#').show.(<$[1..n]))(show n)!!n.
Ørjan Johansen

@ ØrjanJohansen: Bu harika bir fikir. Lütfen ayrı bir cevap olarak gönderin.
nimi

Bir bayt tıraş eder misiniz (#0)=show? Çok Haskell ile aşina değil
Cyoce

@Cyoce: Hayır, bu bir sözdizimi hatası. Doğru bir sözdizimi için argümanları çevirip kullanabilirim (#)0=show, ancak bir işlevin tüm tanımları aynı sayıda argümana sahip olmalıdır. İkinci satır ( n#l='['...) iki argümana ihtiyaç duyar, bu nedenle ilk satırın iki argümanı da olmalıdır.
nimi

6

MATL, 8 bayt

ttY"l$l*

MATL Online'da deneyin ( Çıkışın asıl boyutunu gösteren bir kod ekledim , çünkü MATL'deki tüm n boyutlu çıktılar,> 2'nin tüm boyutlarının ikinci boyuta düzleştirildiği 2D matrisler olarak gösterilir).

açıklama

        % Implicitly grab the input (N)
tt      % Make two copies of N
Y"      % Perform run-length decoding to create N copies of N
l$1     % Create a matrix of ones that is this size  
*       % Multiply this matrix of ones by N
        % Implicitly display the result  

Gönderinizin doğru şeyi yapıp yapmadığını MATL Online'dan gerçekten anlayamıyorum. Her cevap geniş bir matriste benziyor.
Adám,

4
@ Adám Saniyenin üzerindeki boyutlar, ikinciye daraltılmış olarak gösterilir. Örnek, üretilen 3x3x3 dizisinin yerine 3x9 dizisini göstermektedir. ZyKodun sonuna eklerseniz gerçek boyutu söyler
Luis Mendo

6

Python 2,36 bayt

@CalculatorFeline sayesinde -2 bayt

a=n=input()
exec"a=[a]*n;"*n
print a

Çevrimiçi deneyin!


~-n== (n-1).
Hesap MakinesiFeline

Bir TIO bağlantısı eklemek mümkün müdür ?
Adám

1
Aslında, bu! (Optimize edilmiş algoritma nedeniyle -8 bayt, çıktı eklemek için +9 bayt)
CalculatorFeline

@CalculatorFeline Bayt sayısına dahil edilmekten kaçınmak için Başlık ve Altbilgiye bir şeyler koyabilirsiniz.
Adám

1
Tüm program sunumlarında giriş ve çıkış gerekli değil mi?
Hesap MakinesiFeline

5

CJam , 12 bayt

ri:X{aX*}X*p

Çevrimiçi deneyin!

açıklama

ri:X          Read an integer from input, store it in X (leaves it on the stack)
    {   }X*   Execute this block X times:
     a          Wrap the top of stack in an array
      X*        Repeat the array X times
           p  Print nicely

5

Jöle , 5 bayt

⁾Wẋẋv

Çevrimiçi deneyin!

Nasıl?

⁾Wẋẋv - Main link: n                            e.g.       3
⁾Wẋ   - character pair literal ['W','ẋ']                  "Wẋ"
   ẋ  - repeat list n times                               "WẋWẋWẋ"
    v - evaluate as Jelly code with input n          eval("WẋWẋWẋ", 3)
      - ...
        WẋWẋ... - toEval: n                e.g. 3
        W        - wrap                        [3]
         ẋ       - repeat list n times         [3,3,3]
          Wẋ     - wrap and repeat            [[3,3,3],[3,3,3],[3,3,3]]
            ...  - n times total             [[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]],[[3,3,3],[3,3,3],[3,3,3]]]

İkinci 5 bayt Jelly cevabı. J :-) ile karşılaştırıldığında hala kabul edilemez derecede uzun
Adám

2
... ve denemek istemediğiniz için değil: D
Jonathan Allan

5

Java 97 96 95 bayt

Object c(int n,int i){Object[]a=new Object[n];for(int j=0;j<n;)a[j++]=i<2?n:c(n,i-1);return a;}

Ungolfed:

public class N_Dim {

    public static Object create(int n) {
        return create(n, n);
    }

    public static Object create(int n, int i) {
        Object[] array = new Object[n];
        for(int j=0;j<n;j++) {
            array[j] = i<2?n:create(n, i - 1);
        }
        return array;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString((Object[]) create(3)));
    }

}

1
i<=1ile değiştirebilir i<2misin?
cliffroot

Evet @cliffrott. İşe yaradı. Teşekkürler!!
anacron

1
Bir lambda ile bir kaç bayt kurtarabilirsiniz:(n,i)->{...}

Java 8 lambdas ftw

1
Hmm, görünüşe göre bu fazladan girdi. Bunun geçerli olması için yalnızca bir parametrenin ayrı bir yöntemini yapmanız gerekecektir.
Jakob

5

JavaScript (ES6), 38 bayt

f=(n,m=n)=>m?Array(n).fill(f(n,m-1)):n

Bunun belleğe aç sürümü 45 bayttır:

f=(n,m=n)=>m?[...Array(n)].map(_=>f(n,m-1)):n

5

Bash + GNU yardımcı programları, 117 bayt

n=$[$1**$1]
seq -f$1o%.fd$n+1-p $n|dc|rev|sed -r "s/(0+|$[$1-1]*).*$/\1/;s/^(0*)/\1$1/;s/^1/[1]/"|tr \\n0$[$1-1] \ []

Çevrimiçi deneyin!


Program temel olarak n'nin girdi olduğu n bazında 0 ile (n ^ n) -1 arasında sayılır. Sayıdaki her bir baz-n sayısı için, aşağıdakileri yapar:

  1. K, en az bir basamak 0 ile bitiyorsa, k'nin sonunda her basamak 0 için bir '[' bas.
  2. Yazdır
  3. K, en az bir rakam n-1 ile bitiyorsa, k'nin sonunda n-1 her rakam için bir ']' yazdırın.

(N = 1 değerinin, özel durum olarak eklenen parantezlere sahip olması gerekir. Bu giriş değeri, standart PPCG kuralları altında göz ardı edilebilecek stderr için de bir miktar çıktı oluşturur.)

Belki bu fikri hayata geçirmenin daha kısa bir yolu vardır.


Örnek çalışma:

./array 3
[[[3 3 3] [3 3 3] [3 3 3]] [[3 3 3] [3 3 3] [3 3 3]] [[3 3 3] [3 3 3] [3 3 3]]]

5

Jöle , 4 bayt

R»µ¡

Çevrimiçi deneyin!

R»µ¡
R     Range. 2 -> [1, 2]
 »    Max between left arg and right arg. Vectorizes. -> [2, 2]
  µ   Separates into a new chain.
   ¡  Repeat 2 times. After another iteration this yields [[2, 2], [2, 2]].

Aynı şey, ancak tek bir monad ile ve zincir ayırıcıya ihtiyaç duyulmadan:

4 bayt

»€`¡


4

Python 3 , 57 53 50 38 bayt

f=lambda n,c=0:n-c and[f(n,c+1)*n]or 1

Çevrimiçi deneyin!


@CalculatorFeline sayesinde -4 bayt


34 bayt:

f=lambda c,n:c and[f(c-1,n)*n]or 1

Olarak adlandırılması gerekiyor f(4,4)


Kod satırlarınız neden TIO bağlantınıza göre ters çevriliyor?
Adám

1 byte tasarruf etmek için c>1ile değiştirebilirsiniz c . (Markdown, `s genelinde boşlukları tekilleştirmeyi durdur )
CalculatorFeline

@CalculatorFeline Yapabileceğini sanmıyorum; Bu c>0, bu özel durumda olur.
Outgolfer Erik,

Ardından sonunu olarak değiştirin <space>n. Sorun çözüldü ve bonus – daha fazla bayt kaydedildi! : D (Satır içi kodunun sonundaki boşluklar mümkün, ancak başlangıç ​​mümkün değil mi? Bu garip ...) TIO bağlantısı
CalculatorFeline

@ Adám: Ana fonksiyonun başlığa atanmasına izin vermek için TIO'da ve ana işlevi son satırda tutmak için burada.
Hesap MakinesiFeline


4

Ruby, 27 bayt

->a{(z=a).times{z=[z]*a};z}

Sadece 1 bayt daha fazla ama xnor'un harika Python cevabındaki 'eval' numarası yerine farklı bir yaklaşım kullanıyor.


3

Perl 6 , 25 bayt

{($^n,{$_ xx$n}...*)[$n]}

İle başlar niteratif ve "tekrar n kere" dönüşüm uygular nkez, her defasında ek bir düzeyde oluşturmak Listyuva.

Çevrimiçi deneyin!


$_Bir bayt kaydetmek için bunun yerine kullanın
Jo King

@JoKing: Ben zaten $_iç bloğun parametresi olarak kullanıyorum, bu yüzden dış bloğun parametresi olarak kullanamıyorum.
18'de

Evet, ama $nve $_her zaman aynı değere sahip. Çevrimiçi deneyin!
Jo King,

3

PHP, 70 62 bayt

Bu bulabildiğim en basit şey.

for(;$i++<$n=$argv[1];)$F=array_fill(0,$n,$F?:$n);print_r($F);

Girdiyi ilk argüman olarak alır ve elde edilen diziyi ekrana basar.


Bana 8 byte kaydettiğiniz için @ user59178'e teşekkürler !


Bu gibi değişkenleri önceden atama, olduğu gibi, gereksizdir $l. Bırakma $i=0,& ile değiştirme $l, $n 7 bayt kazandırır. $F$n$F?:$narray_fill()
Atama

@ user59178 Aklınızda bu olup olmadığını bilmiyorum, ancak ipuçları için teşekkür ederiz. Beni 8 bayt kurtardın!
Ismael Miguel,

3

Clojure, 36 bayt

#(nth(iterate(fn[a](repeat % a))%)%)

Argüman nzamanlarını tekrarlayan fonksiyonu tekrar eder , bu elemanların sonsuz dizisini oluşturur ve daha sonra nth elemanını alır .

Çevrimiçi görün


3

Rebol, 45 bayt

func[n][array/initial append/dup copy[]n n n]

3

Toplu iş, 141 bayt

@set t=.
@for /l %%i in (2,1,%1)do @call set t=%%t%%,.
@set s=%1
@for /l %%i in (1,1,%1)do @call call set s=[%%%%t:.=%%s%%%%%%]
@echo %s%

Toplu iş aslında dizilere sahip değildir, bu yüzden bu sadece bir dizinin dize gösterimini basar. Açıklama: İlk iki satır değişkende N .s ile ayrılan tekrarlı bir s deseni oluşturur . Dördüncü satır daha sonra bunu -diyatif diziyi oluşturmak için ikame deseni süreleri olarak kullanır . Ve ifadeleri nasıl çalıştığı için çift gereklidir . İlk olarak, komut değişkenleri değiştirir. Olduğu gibi, tüm işaretlerim iki katına çıkar, bu da sonuçta hepsini alıntıdan başka hiçbir şey yapmaz . Daha sonra elde edilen ifade zamanlarını tekrar eder . Her seferinde komut değişkenleri değiştirir. Bu noktada, değişken yalnızca tek bir kümeye sahiptirN-1 ,tNNcallforsetfor%call call set s=[%%t:.=%s%%%]Ncalls%s, böylece sübstitüe edilir, (örn.) ile sonuçlanır call set s=[%t:.=[2,2]%]. İç çağrı daha sonra tdeğişkenin yerine geçer, (örneğin) set s=[[2,2],[2,2]]istenen görevi yerine getirir. Son değeri sdaha sonra yazdırılır.


+1 Vay, bunu ummazdım. Tüm mütevazı .bat dosyasını selamlayın!
Adám

3

Clojure, 49 bayt

(defmacro r[n]`(->> ~n ~@(repeat n`(repeat ~n))))

En kısa Clojure örneği değil ama kendimi alıntı ve alıntılarla eğlendirdim.


3

Ben , 7 bayt

Bunu meslektaşım olan I'in yaratıcısından aldım.

#Bbhph~

#Bb     Kopyalama #fonksiyonu B duyulsa için b INDING
   hp  h (sağ) için bakınız bağımsız değişken p (tekrar) ower fonksiyonu
     h~h bakınız sola bağımsız değişken ~(tüm Elde edilen fonksiyon)

Çevrimiçi deneyin!


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.