Współrzędne samoidentyfikujące

27

Napisz program lub funkcję, która przy danej liczbie całkowitej nkonstruuje tablicę o nwymiarach ndługości, gdzie każdy element jest identyfikatorem własnych współrzędnych. To znaczy, zaczynając od jednej tablicy, wypełnij ją ntablicami, gdzie każda z nich zawiera nwięcej tablic, do głębokości n-1. Elementy najgłębszych tablic to współrzędne opisujące, gdzie znajdują się w pełnej tablicy.

Kilka przykładów na wypadek, gdyby moje wyjaśnienie było mylące.

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

Tutaj „321” oznacza, że ​​jest to pierwszy element 2. elementu 3. tablicy.

Zasady:

  • Współrzędne i wymiar ( n) mogą być indeksowane 0 lub 1
  • Możesz założyć, że njest to jedna cyfra, poniżej 10 dla obu opcji indeksowania, aby zapobiec niejednoznacznym wynikom
  • IO jest elastyczny.
    • W szczególności współrzędne mogą być tablicami, łańcuchami itp., O ile są wyraźne. „321” => [3,2,1]
    • Dane wyjściowe mogą być liczbami całkowitymi w bazie 10 z zerami wiodącymi lub bez nich.
    • Jeśli chcesz, współrzędne mogą być w odwrotnej kolejności, o ile są spójne. „321” => „123”
    • Dane wyjściowe niekoniecznie muszą być strukturą tablicową w Twoim języku. Tak długo, jak istnieją wyraźne wyraźne znaczniki dla początku tablicy, końca tablicy i do oddzielania elementów.
    • Wynik dla n=1może wynosić tylko 1
    • Jeśli Twoje wyniki są nietypowe, wyjaśnij format.
  • To jest więc wygrywa najkrótsze rozwiązanie w każdym języku!
Jo King
źródło
Piaskownica (usunięto)
Jo King
Miałem problem z napisaniem tego w Haskell, zanim zdałem sobie sprawę, że system typów uniemożliwia.
Wheat Wizard
@CatWizard: Zawsze można zdefiniować nową strukturę danych, aby obejść ten problem, np. data L a = L [L a] | E a.
ბიმო
2
Związane .
Adám
1
@ToddSewell Nie możesz mieć funkcji, której typ zależy od danych wejściowych. Ta funkcja może mieć typ Int -> [String]lub Int -> [[String]]i tak dalej, w zależności od tego, co jest wejście
H.PWiz

Odpowiedzi:

19

Dyalog APL , 5 3 bajty

⍳⍴⍨

-2 bajty dzięki FrownyFrog

Wypróbuj online!

daje wszystkie indeksy, biorąc pod uwagę kształt tablicy. np. 2 3 .
przekształca prawy argument tak, aby był wielkości lewego argumentu. sprawia, że ​​oba są właściwym argumentem.

dzaima
źródło
10

Python 3 , 56 bajtów

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

Wypróbuj online!

Xcoder zaoszczędził 2 bajty na przejściu do Pythona 3 w celu rozpakowania oznaczonego gwiazdką.

xnor
źródło
3
Jeśli przełączysz się na Python ≥3,5, f=lambda n,*l:len(l)//n*l or[f(n,*l,k)for k in range(n)]działa na 56 bajtów.
Pan Xcoder,
6

J , 18 bajtów

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

Wypróbuj online!

Iteracyjne rozwiązanie, brak wbudowanego produktu kartezjańskiego. Tak wygląda szczyt 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] ]      |
FrownyFrog
źródło
Początkowo zniechęcała mnie większa liczba bajtów, ale to naprawdę piękne J
Jonah
6

Galaretka , 8 7 bajtów

ṗ³s³$³¡

Wypróbuj online!

Wyjaśnienie

Jako argument użyj argumentu 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.

Jeśli ¡nie zmienia się, jest to odpowiedni argument na temat iteracji dla diadów, to będą to 4 bajty:ṗs³¡

dylnan
źródło
Dla mnie wygląda to na pełny program. Czy na pewno dane wyjściowe (STDOUT) 1są prawidłowe?
Erik the Outgolfer
@EriktheOutgolfer Nic mi nie jest z wynikiem dla 1
Jo King
@JoKing Ale w tym przypadku nie ma „wyraźnych wyraźnych znaczników dla początku tablicy, końca tablicy”. Czy chcesz edytować pytanie? (wiele odpowiedzi tak naprawdę ich nie zawiera)
Erik the Outgolfer
5

J, 13 bajtów

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

Wypróbuj online!

Interesujące jest to o wiele dłużej niż odpowiedź APL (choć może to być moja niemożność zobaczenia lepszego tłumaczenia)

wyjaśnienie

[: { [ ;/@$ ,:@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.
Jonasz
źródło
1
Lepsze tłumaczenie (?)
FrownyFrog,
@FrownyFrog Używanie haka w celu uniknięcia #.invjest bardzo sprytne, +1.
cole
@FrownyFrog Teraz, gdy spojrzałem na twoje rozwiązanie „liczenia w różnych bazach”, myślę, że podejście jest na tyle inne, że powinieneś dodać je jako kolejny post. To bardzo miłe rozwiązanie.
Jonah
Jonah, @cole dziękuję
FrownyFrog
5

MATLAB, 92 89 55 bajtów

Mam inną odpowiedź po ponownym przeczytaniu zasad wyzwania, ale poprzednią próbę pozostawię poniżej, ponieważ jest inna i wciąż fajnie się na nią patrzy.

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

Wyjaśnienie

                        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

Daje to n-wymiarową tablicę ciągów, które są indeksowane do zera.

Poprzednia odpowiedź (89 bajtów)

Mój pierwszy golf! Można to prawdopodobnie bardziej zmniejszyć, ale pomyślałem, że opublikuję to, co mam.

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

Wyjaśnienie

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

Wysyła x na końcu, aby dać rozwiązanie

Podobnie jak w innym poście MATLAB, wyjście jest tablicą n-wymiarową, z tym wyjątkiem, że używa liczb do wyświetlenia współrzędnych. Działa dla dowolnej wartości, chociaż ponieważ pętle są złe w MATLAB, zaczyna znacznie zwalniać wokół n = 8.

Edycja: -2 bajty dzięki Luisowi Mendo. Usunięto również końcowy średnik, aby wydrukować wynik.

Jacob Watson
źródło
4
Witamy w PPCG!
Kudłaty
Myślę, że możesz zastąpić lengthprzez, nnzaby zaoszczędzić kilka bajtów. Ponadto, zgodnie z regułami PPCG, kod musi generować pewne rzeczywiste dane wyjściowe, zwykle wyświetlając je w STDOUT (nie wystarczy, aby dane wyjściowe były przechowywane w zmiennej), lub musi to być funkcja zwracająca dane wyjściowe
Luis Mendo
5

Rdza ,201 176 167 166 154 bajty

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

Wypróbuj online!

Typ wyjściowy to typ sumy z dwoma wariantami, ponieważ język jest ściśle wpisany. Może to być albo Ltyp listy zawierający ten typ sumy, albo Styp wyniku (ciąg znaków). Wynik może wyglądać tak.

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

Również sformatowane przy użyciu 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, "")
Konrad Borowski
źródło
4

R , 102 bajty

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

Wypróbuj online!

  • 1-indeksowany, odwrócony
  • niestety R przechowuje macierz według kolumn, w przeciwnym razie moglibyśmy zmniejszyć do 73 bajtów
  • -9 bajtów zapisanych dzięki sugestii @Giuseppe do użycia whichindeksowania tablic
digEmAll
źródło
twoja 76-bajtowa odpowiedź może mieć 73 bajty, tak ja ją zaimplementowałem przed sprawdzeniem, czy istnieje już odpowiedź R. Być może uda ci się zmienić niektóre podejście? Nie do końca pewny.
Giuseppe,
1
@Giuseppe: indeksowanie tablic whichjest tym, czego szukałem, dzięki! Zapisano 9 bajtów
digEmAll
4

Java 10, 144 bajty

Rozwiązaniem jest metoda f. Tworzy ciąg znaków reprezentujący tablicę.

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

Wypróbuj online

Nie golfił

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

Podziękowanie

Jakob
źródło
1
W Javie 10, można zastąpić Object[]z var. Ponadto uważam, że ten elseblok jest niepotrzebny, tak jak returnw ifbloku.
Konrad Borowski
3

05AB1E , 7 bajtów

LsãsGsô

Wypróbuj online!

Wyjaśnienie

L          # push range [1 ... input]
 sã        # input repeated cartesian products of the list
   sG      # input - 1 times do:
     sô    # split into input parts
Emigna
źródło
3

JavaScript (Node.js) , 62 60 58 bajtów

f=(n,i=n,s='')=>i?[...Array(n)].map((_,j)=>f(n,i-1,s+j)):s

Wypróbuj online! Wyjście jest indeksowane na 0. Edycja: Zapisano 2 bajty dzięki @JoKing i kolejne 2 bajty dzięki @Arnauld.

Neil
źródło
3

MATLAB, 116 108 104 bajtów

Wydaje mi się, że musi to być krótszy sposób, biorąc pod uwagę powinowactwo MATLAB-a do matryc wielowymiarowych ... Dzięki Luisowi za 4 bajty z krótkich rąk

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

Wyjaśnienie

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

Dane wyjściowe to n-wymiarowa tablica komórek, w której każdy element jest tablicą wartości współrzędnych. Działa dla każdego nbez dwuznaczności ze względu na wyjście tablicy numerycznej, o ile n^(n+1)tablica elementów może być przechowywana w pamięci RAM!

Wolfie
źródło
3

Węgiel drzewny , 26 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Nθ

Wejście n.

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

Wygeneruj wszystkie nⁿ ncyfry cyfrowe w bazie n.

Fθ≔⪪υθυ

Podziel je nrazy na ntablicę -wymiarową, w której każdy wymiar ma rozmiar n.

υ

Wydrukuj tablicę. Domyślny format wyjściowy to każdy element na swojej linii, następnie każdy blok nlinii jest zakończony pustą linią, następnie każdy blok nbloków nlinii jest zakończony drugą pustą linią, i tak dalej, aż do n-1pustych linii na najwyższym poziomie .

Neil
źródło