Oceń wskaźnik współrzędnych wielowymiarowych

9

Zestaw zawiera N współrzędnych wymiarowych. Przykład jest poniżej:

{2,3,4}

Można to uznać za trójwymiarowy układ z 2x, 3y i 4z; może istnieć dowolna liczba wymiarów. W tym przykładzie są 24 wszystkie węzły. Każdy węzeł można indeksować za pomocą {x, y, z}. Aby uzyskać dostęp do 5. węzła, podane indeksy to {0, 1, 0} na podstawie poniższej tabeli.

## | x y z
     0 1 2
-----------
0  | 0 0 0
1  | 0 0 1
2  | 0 0 2
3  | 0 0 3
4  | 0 1 0
5  | 0 1 1
6  | 0 1 2
7  | 0 1 3
8  | 0 2 0
...
23 | 1 2 3

Celem tej aplikacji jest praca wstecz w celu ustalenia indeksu, jeśli podano numer węzła.

Na zapytanie o indeks „y” 8. węzła, program powinien wypisać „2”.

Z podanymi następującymi danymi wejściowymi:

{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>

Należy wydrukować następujące elementy:

2

Możesz założyć, że dane wejściowe zostaną dostarczone w wygodny sposób w wybranym języku i nie będą wymagać sprawdzania granic. Na przykład można założyć, że podany indeks wyboru („y” w przykładzie) jest prawidłowy w odniesieniu do podanych współrzędnych. Możesz użyć indeksowania opartego na 0 lub 1; przykład zakłada 0 w oparciu.

Jest to swego rodzaju odwrotność tego pytania: Indeks tablicy wielowymiarowej

Mark Johnson
źródło
1
Być może dodaj kilka przypadków testowych
Luis Mendo
1
Czy możemy pozwolić współrzędnym biegać od 1 do x zamiast od 0 do x-1? Zatem węzłem nr 0 byłoby (1,1,1), a węzłem nr 23 (2,3,4).
nimi
@nimi Tak, indeksowanie 1 jest w porządku.
Mark Johnson

Odpowiedzi:

4

MATL , 8 bajtów

PiX[vPi)

Wykorzystuje to indeksowanie 1 dla węzła i wymiarów. Więc pierwsze węzły są 1, 2etc; a wymiar „x” to 1„y” to 2itd.

Wypróbuj online!

Wyjaśnienie

Kluczem jest użycie funkcji X[(odpowiadającej ind2subMatlabowi lub Octave), która przekształca indeks liniowy w wskaźniki wielowymiarowe. Jednak kolejność wymiarów jest odwrotna do zdefiniowanej w wyzwaniu, więc P( flip) jest potrzebne przed wywołaniem funkcji i ponownie po konkatenacji ( v) jej wyjść.

P    % Implicit input: size as a row vector. Flip
i    % Input: node (linear) index
X[   % Convert from linear index to multidimensional indices. Produces
     % as many outputs as entries there are in the size vector
v    % Concatenate all outputs into a column vector
P    % Flip
i    % Input: dimension
)    % Index: select result for that dimension. Implicitly display
Luis Mendo
źródło
3

Haskell , 45 bajtów

(#)pobiera trzy argumenty i zwraca liczbę całkowitą, użyj jako [2,3,4]#8$1.

l#n=(zipWith mod(scanr(flip div)n$tail l)l!!)

Wypróbuj online!

Jak to działa

  • lto lista współrzędnych, nnumer węzła. l#njest funkcją, która przyjmuje ostateczny indeks i.
  • Biorąc pod uwagę przykładową listę [2,3,4]i węzeł 8, najpierw pobierany jest ogon listy, dając [3,4]. Następnie jest on scanwybierany od right div, podając numer węzła po każdym elemencie, podając listę [0,2,8].
  • Następnie lista [0,2,8]i oryginalne l=[2,3,4]zipped withz modoperatorem Ulus, dając [0,2,0].
  • W końcu !!operator indeksowania listy jest częściowo zastosowany, a wynikowa funkcja jest gotowa na nadanie ostatecznego indeksu.
Ørjan Johansen
źródło
3

APL (Dyalog Classic) , 5 bajtów

⎕⌷⎕⊤⎕

Nie, nie brakuje ci czcionki. Tak to powinno wyglądać.

Jest to program REPL, który pobiera dane wejściowe z STDIN: numer węzła, wymiary i indeks (w tej kolejności). Ten ostatni może być oparty na 0 lub 1, w zależności od wartości ⎕IO.

Wypróbuj online!

Jak to działa

Wielowymiarowe indeksowanie tablic jest zasadniczo mieszaną konwersją podstawową, podobnie jak to, o co prosi pierwsza część wyzwania. Każde wystąpienie czyta i ewaluuje wiersz ze STDIN, więc

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Na koniec pobiera element o podanym indeksie. Najbardziej z lewej strony odczytuje trzeci i ostatni sygnał wejściowy ze STDIN i

        (0 2 0)
⎕:
      1
2
Dennis
źródło
Mieszana konwersja bazy znów uderza!
Adám
3

Haskell, 38 30 29 28 bajtów

l#n=(mapM(\x->[1..x])l!!n!!)

Korzysta z indeksów i współrzędnych opartych na 0, zaczynając od 1. Wypróbuj online!

Zamień każdy wymiar xdanych wejściowych na listę [1..x], np. [2,3,4]-> [[1,2],[1,2,3],[1,2,3,4]]. mapMtworzy listę wszystkich możliwych n-krotek, w których pierwszy element jest pobierany z pierwszej listy itp. Dwa razy, !!aby zindeksować n-krotkę i wymiar.

Edycja: @ Ørjan Johansen zapisał 8 9 bajtów. Dzięki!

nimi
źródło
Och, sprytnie! Ale mapM id.map f=mapM f… I (`take`[0..])jest krótszy.
Ørjan Johansen
@ ØrjanJohansen: 8 bajtów, to ogromne! Wielkie dzięki! Wciąż czekam na odpowiedź PO, jeśli dozwolone są współrzędne 1.
nimi
Jest także l#n=(mapM(`take`[0..])l!!n!!)krótszy. (Nawiasem mówiąc, nie potrzebujesz f=, funkcje mogą być anonimowe. Och, chyba nie liczysz.)
Ørjan Johansen
@ ØrjanJohansen: Jeszcze raz dziękuję. f=Było skopiować i wkleić błąd z TIO.
nimi
2

Brachylog , 25 23 bajtów

tT&bhH&h{>ℕ}ᵐ:H≜ᶠ⁾t:T∋₎

Wypróbuj online!

Drugi argument ma indeks 1, pozostałe 2 indeksowane są na 0.

Wyjaśnienie

tT                          Input = [_, _, T]
  &bhH                      Input = [_, H, T]
      &h{>ℕ}ᵐ               Create a list where each element is between 0 and the
                              corresponding element in the first element of the Input
             :H≜ᶠ⁾          Find the first H possible labelings of that list
                  t         Take the last one
                   :T∋₎     Output is the T'th element
Fatalizować
źródło
1

Mathematica, 26 23 bajtów

Array[f,#,0,Or][[##2]]&

Użycie indeksowania opartego na 1 dla danych wejściowych i indeksowania opartego na 0 dla danych wyjściowych.

Dlaczego Or? Ponieważ jest to najkrótsza wbudowana funkcja z atrybutem Flat.

Przykład:

In[1]:= Array[f,#,0,Or][[##2]]&[{2,3,4},9,2]

Out[1]= 2
alephalpha
źródło
1

APL (Dyalog) , 6 bajtów

Aby uzyskać indeksowanie oparte na 0 ⎕IO←0, co jest domyślne w wielu systemach. Monity o wymiary, a następnie załączoną listę (węzeł, współrzędna).

⎕⊃↑,⍳⎕

Wypróbuj online!

 monit o wymiary

 generowanie tablicy tym kształcie, z elementami będącymi I ndices dla tego elementu

, ravel (przerób na listę indeksów)

 przekonwertuj jeden poziom głębokości na dodatkowy poziom rangi

⎕⊃ monituj o dołączoną listę (węzeł, współrzędna) i użyj tego, aby wybrać z niej element

Adám
źródło
1

Galaretka , 7 6 bajtów

Œp⁴ị⁵ị

Wypróbuj online!

Wykorzystuje to indeksowanie 1 dla danych wejściowych i wyjściowych.

Jak to działa

Œp⁴ị⁵ị
Œp      Cartesian product of the first input
        numbers are converted to 1-based ranges
  ⁴ị    index specified by second input
    ⁵ị  index specified by third input
Leaky Nun
źródło
0

Pyth , 12 bajtów

@.n]@*FUMQEE

Wypróbuj online!

Jak to działa

@.n]@*FUMQEE
       UMQ    map each element in the first input to
              [0,1,...,that element]
     *F       reduce by Cartesian product
    @     E   obtain index at second input
 .n]          listify and flatten
@          E  obtain index at third input
Leaky Nun
źródło
0

R, 52 bajty

function(x,y,z,n,i)expand.grid(1:z,1:y,1:x)[n,4-i]-1

zwraca anonimową funkcję 1-indeksowaną.

na przykład. expand.gridgeneruje listę, ale pierwszy argument zmienia się najszybciej, więc musimy wprowadzić je w odwrotnej kolejności, tj z,y,x. Następnie możemy po prostu zindeksować [n,4-i], gdzie 4-ijest to konieczne dla odwróconej kolejności, i odjąć 1, aby upewnić się, że są uruchamiane 0:(x-1)itp.

Wypróbuj online!

Giuseppe
źródło
0

Java , 77 bajtów

int f(int[]a,int m,int n){for(int i=a.length-1;i>n;m/=a[i--]);return m%a[n];}

Wypróbuj online!

Leaky Nun
źródło
0

JavaScript (ES6), 44 bajty

(a,n,i,g=j=>a[++j]?g(j)/a[j]|0:n)=>g(i)%a[i]

Nie golfowany:

(a,n,i)=>a.reduceRight(([n,...a],e)=>[n/e|0,n%e,...a],[n])[i+1]

Niestety reducedwa bajty są dłuższe:

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]
Neil
źródło
Wygląda na to, że wpadliśmy na ten sam pomysł \ o /
Leaky Nun
@LeakyNun Cóż, to nie jest zaskakujące, biorąc pod uwagę, jak działa indeksowanie.
Neil