Prezentowane na cześć APL jako interaktywne narzędzie, które w tym roku skończy 50 lat
tło
Ken [Iverson] przedstawił swój artykuł Formalizm w programowaniu języków w sierpniu 1963 r. Na konferencji roboczej w sprawie mechanicznych struktur językowych, Princeton, NJ. Lista uczestników jest pełna sławnych i niedługo sławnych nazwisk oraz kilku przyszłych zwycięzców nagrody Turinga (Backus, Curry, Dijkstra, Floyd, Iverson, Newell, Perlis, Wilkes). W artykule zapisano również dyskusję, która miała miejsce po prezentacji, kończącą się wymianą między Kenem a [Edsgerem] Dijkstrą , w której odpowiedź Kena na pytanie Dijkstry była jednokierunkowa.
Wyzwanie
Jak przedstawiłbyś bardziej złożoną operację, na przykład sumę wszystkich elementów macierzy M, które są równe sumie odpowiednich indeksów wierszy i kolumn?
Napisz fragment kodu lub wyrażenie (nie potrzeba pełnego programu lub funkcji), aby obliczyć sumę każdego elementu w danej macierzy liczb całkowitych, która jest równa sumie jego indeksów. Lub, FryAmTheEggman mówi: podane macierz M elementy ij powrotu sumy każdego ij gdzie ij = i + J.
Możesz założyć, że macierz jest już w miejscu zmiennej lub pamięci, lub możesz potraktować ją jako argument lub dane wejściowe. Możesz użyć indeksów opartych na 0 lub 1.
Przypadki testowe
0
dla pustej matrycy
2
0
dla indeksów opartych na 0 lub 2
dla bazujących na 1
1 5 2
9 4 2
5 9 6
2
dla 0 lub 10
1 dla
0 3 0 4
0 4 1 4
4 3 1 2
-2 4 -2 -1
11
3 -1 3 3
3 -1 3 1
6
dla 0 lub 3
1 dla
Anegdota
Odpowiedź Iversona brzmiała ++ / ( M = ⍳ ¹ ⨢ ⍳ ¹) // M , co nie jest ani poprawne w notacji Iverson, jak zdefiniowano w A Programming Language , ani w tym, co ostatecznie stało się APL. W notacji Iverson, byłoby + / ( M = ⍳ đ ( μ ( M )) ⨢ ⍳ đ ( ν ( M ))) / M . Tak było w pierwszych wersjach APL +/(,M=(⍳1↑⍴M)∘.+⍳1↓⍴M)/,M
.
źródło
Odpowiedzi:
APL,
1312 bajtów1 bajt dzięki @ jimmy23013.
1-indeksowany.
Tablica jest przechowywana w zmiennej
m
.Wypróbuj online!
Na podstawie odpowiedzi w J , która jest językiem opartym na APL.
W TryAPL, aby wprowadzić:
+/m`em`c`1+/`1`i`rm
Z tablicą:
+/m`em`c`1+/`1`i`rm `[ 2 4 `r 3 `21 3 3 3 `21 3 1
Wyjaśnienie
źródło
`
to znaczy „klucz APL”.+/∊m∩¨+/¨⍳⍴m
.MATL ,
151410 bajtówDane wejściowe mają wiersze oddzielone
;
. Na przykład:[1 5 2; 9 4 2; 5 9 6]
. Stosowane jest indeksowanie 1.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Użyję tego przykładu z
[3 -1 3 3; 3 -1 3 1]
danymi wejściowymi w wyjaśnieniu.źródło
JavaScript,
4946 bajtówEdycja: Zapisano 3 bajty dzięki @MartinEnder wskazując, że fragmenty są dozwolone.
źródło
Siatkówka , 46 bajtów
Liczba bajtów zakłada kodowanie ISO 8859-1.
Dane wejściowe używają separatorów przestrzeni i kanału liniowego do reprezentowania macierzy. Indeksy są oparte na 0.
Wypróbuj online!
Wyjaśnienie
Nie do końca takie wyzwanie, dla którego stworzono Retinę, ale robi się zaskakująco dobrze ... :)
Etap 1: Zmiana
To po prostu rozszerza wszystkie liczby całkowite w ciągu jako liczby jednoargumentowe, używając
1
jako cyfry jednoargumentowej. Liczby ujemne-3
po prostu staną się takimi jak-111
.Etap 2: Mecz
Z powodu tej
!
opcji powoduje to wydrukowanie wszystkich dopasowań podanego wyrażenia regularnego. Wspomniany regex używa grup bilansujących do sprawdzenia, czy bieżąca liczba jest taka sama jak suma jego wskaźników.Aby to zrobić, najpierw określamy sumę wskaźników za pomocą lookbehind
(?<=(\S* |.*¶)*)
. Dodaje to jedno przechwytywanie dla każdego numeru przed bieżącym na tej samej linii (przez\S*
), a także jedno przechwytywanie dla każdej linii przed bieżącym (przez.*¶
) do grupy1
. W rezultacie otrzymujemy zerową sumę wskaźników.Następnie próbujemy dopasować cały następny numer, usuwając przechwytywanie z tego stosu
(?<-1>1)+\b
. A następnie wykonujemy nie mecz, czy nie przechwytuje są pozostawione na grupy1
z(?(1)1)
celu zapewnienia równości.Zauważ, że liczby ujemne nigdy nie są dopasowywane, ponieważ wygląd nie może przekroczyć
-
pierwszej listy1
i(?<-1>1)+
nie może się z nią równać.To daje nam listę wszystkich liczb jednostkowych, które są równe sumie ich wskaźników.
Etap 3: Mecz
Kończymy kolejnym etapem dopasowania, ale bez tej
!
opcji liczy się tylko liczba dopasowań, która zarówno sumuje wszystkie liczby jednostkowe z poprzedniego wyniku, jak i konwertuje tę sumę z powrotem na dziesiętne.źródło
Galaretka,
151410 bajtów4 bajty dzięki Adnan.
1-indeksowany.
Wypróbuj online!
Zweryfikuj wszystkie przypadki testowe jednocześnie. (Lekko zmieniony.)
źródło
J€
zamiastL€R€
?Python 2 -
6057 bajtówJest to fragment kodu, więc chyba zwróciłbym wartość, jak sądzę.
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
Dzięki za pomoc Leaky Num :-)
Szybkie wyjaśnienie.
a
jest tablicą zawierającą liczby. Po prostu iteruj przez indeksy i zsumuj wszystkie wartości, których wartość jest równa sumie indeksu.źródło
e=enumerate;sum(i*(x+y==i)for x,r in e(a)for y,i in e(r))
R, 24 bajty
Na podstawie 1.
Przypadki testowe:
źródło
J, 15 bajtów
Używa się od zera indeksowania i przyjmuje matrycy jest już przechowywany w zmiennej M .
Wyjaśnienie
źródło
CJam,
232120 bajtówPodziękowania dla Petera Taylora za oszczędność 3 bajtów.
Oczekuje, że macierz będzie na stosie i zamiast tego pozostawi sumę. Wskaźniki są zerowane w obu przypadkach.
Sprawdź to tutaj.
źródło
_,,
zamiast wewnętrznejee
i.
wewnętrznej pętli:ee{~_,,@f+1$.=.*~}%1b
ee{~_@f-_,,.=.*~}%1b
k4, 24 bajty
Zakłada, że macierz jest przechowywana w
m
.Jest to jedna z tych zagadek, w których uproszczenia związane z projektowaniem k z APL (i J) naprawdę boli - k's
!
jest odpowiednikiem APL,⍳
ale działa tylko na wektorach, więc sam muszę zestawić macierz indeksów; iloczyn wewnętrzny to jedna postać w APL, ale pięć w k; i tracę trzy znaki, aby poprawnie obsługiwać pustą macierz, ponieważ k nie ma silnie typowanych macierzy.źródło
Pyth, 14 bajtów
0-indeksowane.
Zestaw testowy.
źródło
PowerShell v2 +, 43 bajty
Jako fragment. Zastosowanie polega na jawnym potokowaniu macierzy do tego (patrz przykłady poniżej). Zakłada się, że
$i
i$o
są albo wartość null lub zero na początku (mam jawnie ustawić je jako takie w poniższych przykładach) i wykorzystuje 0-index.Wykonuje pętlę foreach w każdym rzędzie macierzy. Ustawiamy
$j
się0
, a następnie przejść przez każdy element w rzędzie w innej pętli$_|%{...}
. Każdą wewnętrzną pętlę zwiększamy$o
przez bieżący element pomnożony przez wartość logiczną($_-eq$i+$j++)
, co oznacza, że jeśli ta wartość logiczna jest$TRUE
, to w1
przeciwnym razie będzie0
. Następnie wychodzimy z wewnętrznej pętli, zwiększamy$i
i rozpoczynamy następny rząd. Na koniec wychodzimy$o
z rurociągu na końcu.Przykłady
źródło
Rubinowy, 63 bajty
Z z jako dwuwymiarowa tablica liczb:
Wcale nie strasznie ekscytujące.
Jeśli z jest spłaszczoną tablicą z xiy mającymi rozmiary tablic, takie jak:
Następnie mamy tę potworność - być może bardziej rubinową z jej fantazyjnymi produktami i zamkami, ale w rzeczywistości większą:
źródło
Właściwie 21 bajtów
Wypróbuj online!
Dzięki Leaky Nun za to, że przestałem być leniwy i wreszcie to napisałem.
Wykorzystuje macierze 0-indeksowane i przyjmuje dane wejściowe jako listę zagnieżdżoną.
Wyjaśnienie:
źródło
Matlab / Octave, 48 bajtów
1-indeksowany.
Nie obsłuży pierwszego przypadku testowego, ponieważ
[1:0]
z jakiegoś powodu ma rozmiar 1x0Testowane w Octave 3.
Pełny program:
źródło
sum((M.*(M-[1:size(M,1)]'-[1:size(M,2)]==0))(:))
. Ponadto myślę, że możesz zmienić==0
i początkowo,~
aby dodatkowo zmniejszyć liczbę bajtów. Wreszcie należy pamiętać, że trzeba obsłużyć wszystkich przypadków testowych, albo pytanie powinno zostać usunięteLua, 70 bajtów
1-indeksowany.
Bonus: działa dla tablic obdartych!
Wejście zapisane w
a
, wyjście zapisane ws
.Pełny program:
źródło
PHP, 59 bajtów
oczekuje, że tablica $ jest zdefiniowana; musi być pusty lub dwuwymiarowy, z indeksowaniem 0.
oblicza sumę do $ s (poprzednio 0 lub niezdefiniowany - 0 równa się NULL)
wstawić
+2
przed końcem)
dla zachowania 1-indeksowanegoWszystkiego najlepszego APL!
funkcje i pakiet testowy
źródło
Brachylog , 15 bajtów
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 42 bajty
Wypróbuj online!
1-indeksowany.
źródło