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
źródło
Odpowiedzi:
MATL , 8 bajtów
Wykorzystuje to indeksowanie 1 dla węzła i wymiarów. Więc pierwsze węzły są
1
,2
etc; a wymiar „x” to1
„y” to2
itd.Wypróbuj online!
Wyjaśnienie
Kluczem jest użycie funkcji
X[
(odpowiadającejind2sub
Matlabowi lub Octave), która przekształca indeks liniowy w wskaźniki wielowymiarowe. Jednak kolejność wymiarów jest odwrotna do zdefiniowanej w wyzwaniu, więcP
(flip
) jest potrzebne przed wywołaniem funkcji i ponownie po konkatenacji (v
) jej wyjść.źródło
Haskell , 45 bajtów
(#)
pobiera trzy argumenty i zwraca liczbę całkowitą, użyj jako[2,3,4]#8$1
.Wypróbuj online!
Jak to działa
l
to lista współrzędnych,n
numer węzła.l#n
jest funkcją, która przyjmuje ostateczny indeksi
.[2,3,4]
i węzeł8
, najpierw pobierany jest ogon listy, dając[3,4]
. Następnie jest onscan
wybierany odr
ightdiv
, podając numer węzła po każdym elemencie, podając listę[0,2,8]
.[0,2,8]
i oryginalnel=[2,3,4]
sązip
pedwith
zmod
operatorem Ulus, dając[0,2,0]
.!!
operator indeksowania listy jest częściowo zastosowany, a wynikowa funkcja jest gotowa na nadanie ostatecznego indeksu.źródło
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ęcNa koniec
⌷
pobiera element o podanym indeksie. Najbardziej z lewej strony⎕
odczytuje trzeci i ostatni sygnał wejściowy ze STDIN iźródło
Haskell,
38302928 bajtówKorzysta z indeksów i współrzędnych opartych na 0, zaczynając od 1. Wypróbuj online!
Zamień każdy wymiar
x
danych wejściowych na listę[1..x]
, np.[2,3,4]
->[[1,2],[1,2,3],[1,2,3,4]]
.mapM
tworzy 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ł
89 bajtów. Dzięki!źródło
mapM id.map f=mapM f
… I(`take`[0..])
jest krótszy.l#n=(mapM(`take`[0..])l!!n!!)
krótszy. (Nawiasem mówiąc, nie potrzebujeszf=
, funkcje mogą być anonimowe. Och, chyba nie liczysz.)f=
Było skopiować i wkleić błąd z TIO.Brachylog ,
2523 bajtówWypróbuj online!
Drugi argument ma indeks 1, pozostałe 2 indeksowane są na 0.
Wyjaśnienie
źródło
Mathematica,
2623 bajtówUż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 atrybutemFlat
.Przykład:
źródło
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źródło
Galaretka ,
76 bajtówWypróbuj online!
Wykorzystuje to indeksowanie 1 dla danych wejściowych i wyjściowych.
Jak to działa
źródło
Oktawa , 63 bajty
Port mojej odpowiedzi MATL.
Wypróbuj online!
źródło
Pyth , 12 bajtów
Wypróbuj online!
Jak to działa
źródło
R, 52 bajty
zwraca anonimową funkcję 1-indeksowaną.
na przykład.
expand.grid
generuje listę, ale pierwszy argument zmienia się najszybciej, więc musimy wprowadzić je w odwrotnej kolejności, tjz,y,x
. Następnie możemy po prostu zindeksować[n,4-i]
, gdzie4-i
jest to konieczne dla odwróconej kolejności, i odjąć 1, aby upewnić się, że są uruchamiane0:(x-1)
itp.Wypróbuj online!
źródło
Java , 77 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 44 bajty
Nie golfowany:
Niestety
reduce
dwa bajty są dłuższe:źródło
Python 3 , 57 bajtów
Wypróbuj online!
Widelec mojej odpowiedzi Java .
źródło