Cóż, chociaż wyzwanie to okazało się ogromnym sukcesem, okazało się również, że jego rozwiązanie było bardzo trywialne. Dlatego dla tych, którzy szukają większego wyzwania, stworzyłem kontynuację tego wyzwania, w którym musisz teraz policzyć liczbę unikalnych prostokątów. Sprawdź to!
Teraz, dla tych z Was, którzy chcą rozwiązać to wyzwanie, nadchodzi.
Cóż, tak naprawdę nie mamy takiego wyzwania, więc proszę bardzo.
Rozważ tę 3 x 3
siatkę prostokątów:
Ile jest prostokątów? Cóż, licząc wizualnie, widzimy, że w rzeczywistości są 36
prostokąty, w tym cała płaszczyzna, wszystkie pokazane na animowanym pliku GIF poniżej:
Zadanie
Liczenie prostokątów, jak pokazano powyżej, jest zadaniem. Innymi słowy, biorąc pod uwagę 2 całkowite większe niż lub równe 0
, m
i n
, w których m
oznacza się szerokość i n
reprezentuje wysokość, moc całkowitą liczbę prostokątów w tej m x n
siatce prostokątów.
Zasady
Zastosowanie jakichkolwiek wbudowanych rozwiązań, które bezpośrednio rozwiązują ten problem, jest wyraźnie zabronione.
Wyzwanie to nie polega na znalezieniu najkrótszej odpowiedzi, ale na znalezieniu najkrótszej odpowiedzi w każdym języku. Dlatego żadna odpowiedź nie zostanie zaakceptowana.
Standardowe luki są zabronione.
Przypadki testowe
Przedstawione w formacie Array of Integers Input -> Integer Output
:
[0,0] -> 0
[1,1] -> 1
[3,3] -> 36 (Visualized above)
[4,4] -> 100
[6,7] -> 588
Referencje
Pamiętaj, to jest gra w golfa , więc wygrywa najkrótszy kod!
588
dla ostatniego przypadku testowego.Odpowiedzi:
Python, 22 bajty
Formuła
m*n*(m+1)*(n+1)/4
jest skracana za pomocą komplementu bitowego~m=-(m+1)
, wyrażając(m+1)*(n+1)
jako~m*~n
.Dlaczego liczba prostokątów
m*n*(m+1)*(n+1)/4
? Każdy prostokąt jest określony przez wybór dwóch linii poziomych (góra i dół) i dwóch linii pionowych (lewa i prawa). Istniejąm+1
linie poziome, z których wybieramy podzbiór dwóch odrębnych. Tak więc liczba wyborów jest takachoose(m+1,2)
, jaka jestm*(m+1)/2
. Pomnożenie przezn*(n+1)/2
wybór linii pionowych daje wynik.źródło
Galaretka , 4 bajty
Wypróbuj online!
Alternatywnie, również 4 bajty
Wypróbuj online!
źródło
בHP
i‘c2P
być może inne 4 bajtowe alternatywy.nth
imth
numer trójkątnym.R
konwertuje każdy numer w indeksie 1 opartego na:[1, 2, ..., n]
.S
jest suma i€
oznacza „każdy”, więc każda lista jest sumowane, dając listę:[nth triangle number, mth triangle number]
. NastępnieP
bierze produkt z tej listy, co daje pożądany rezultat.JavaScript (ES6), 17 bajtów
Rozwidlenie tej odpowiedzi .
źródło
Mathematica, 15 bajtów
Jest to funkcja bez nazwy, która przyjmuje dwa argumenty liczb całkowitych i zwraca liczbę prostokątów.
Wyjaśnienie
Implementacja jest zasadniczo bardzo golfową formą iloczynu dwóch trójkątnych liczb. Może warto przeczytać sekcję „Sekwencje argumentów” w tym poście, aby poznać szczegóły, ale postaram się streścić tutaj sedno.
##
rozwija się do sekwencji wszystkich argumentów. Jest to podobne do rozpryskiwania w innych językach. Na przykład, jeśli argumentami są3
i4
, to{1, 2, ##, 5}
da ci{1, 2, 3, 4, 5}
. Ale to nie działa tylko na listach, ale w jakimkolwiek wyrażeniu, np.f[1, 2, ##, 5]
Byłoby równieżf[1, 2, 3, 4, 5]
.Staje się to interesujące, gdy łączysz się
##
z operatorami. Wszystkie operatory w Mathematica są po prostu krótkimi rękami, aby uzyskaćf[...]
podobne wyrażenie (być może zagnieżdżone). Np.a+b
JestPlus[a, b]
ia-b
faktycznie reprezentujePlus[a, Times[-1, b]]
. Teraz, gdy łączysz się##
z operatorami, Mathematica najpierw rozszerza operatory, traktując je##
jak pojedynczy operand, i rozwija je tylko na końcu. Wstawiając##
w odpowiednie miejsca, możemy zatem użyć go zarówno do pomnożenia, jak i dodania operandów.Zróbmy to dla powyższego kodu:
Po rozwinięciu do pełnej formy otrzymujemy:
Wstawmy argumenty funkcji
a
ib
:A teraz przekształcamy go z powrotem w standardowy zapis matematyczny:
Trochę przestawienia pokazuje, że jest to wynik liczb trójkątnych:
Ciekawostka: ta implementacja jest tak Golfy, to ta sama długość jak wbudowany do obliczania jednego numeru trójkątny
PolygonalNumber
.źródło
C, 25 bajtów
Wersja purystyczna (27):
Wersja ISO (35):
źródło
Meduza , 16 bajtów
Format wejściowy jest taki
[x y]
, że wynik jest tylko wynikiem.Wypróbuj online!
Alternatywne rozwiązanie, ta sama liczba bajtów:
Wyjaśnienie
Czas, aby dać meduzom wstęp, na który zasługuje! :)
Meduza jest Zgarb język jest oparty na jego wyzwanie 2D, składnia . Semantyka jest w dużej mierze inspirowana przez J, ale składnia jest dziełem sztuki. Wszystkie funkcje są pojedynczymi znakami rozmieszczonymi na siatce. Funkcje pobierają argumenty od następnego tokena na południe i wschód od nich i zwracają wynik na północ i zachód. To pozwala ci stworzyć interesującą sieć wywołań funkcji, w których ponownie wykorzystujesz wartości, przekazując je do kilku funkcji z wielu kierunków.
Jeśli zignorujemy fakt, że niektóre tokeny w powyższym programie są operatorami specjalnymi (funkcje wyższego poziomu), powyższy program zostałby napisany mniej więcej tak:
Przejdźmy do kodu od dołu do góry. Dane wejściowe są zasilane przez
i
, który w związku z tym ocenia[x y]
.Na
+
wierzchu otrzymuje to wejście wraz z literałem1
i dlatego zwiększa oba elementy, aby dać[(x+1) (y+1)]
(większość operacji jest automatycznie dzielona na listy).Druga wartość
i
jest wysyłana w lewo, aleE
podziały to argument wschodni na północ i zachód. Oznacza to, że wejścia na prawo*
są w rzeczywistości[x y]
i[(x+1) (y+1)]
tak tego oblicza[x*(x+1) y*(y+1)]
.Następny w
*
górę jest faktycznie modyfikowany przez poprzedni,/
który zamienia go w operację składania. Złożenie*
pary po prostu ją zwielokrotnia, więc otrzymujemyx*(x+1)*y*(y+1)
.Teraz
%
jest tylko podział, więc obliczax*(x+1)*y*(y+1)/4
. Niestety skutkuje to liczbą zmiennoprzecinkową, więc musimy zaokrąglić ją za pomocą unarnego|
. Na koniec podawana jest ta wartość, dop
której wypisywany jest wynik końcowy.źródło
R,
4035 bajtówCzas wskoczyć na głęboki koniec! Oto mój kod R , inspirowany odpowiedzią @xnor:
EDYCJA : W tej wersji R zapyta dwukrotnie o dane wejściowe.
źródło
cat(prod(choose(scan()+1,2)))
ma 29 bajtów.CJam,
1210 bajtów2 bajty zapisane dzięki Martinowi.
Wypróbuj online!
Jest to blok, który pobiera listę 2 elementów ze stosu i pozostawia rozwiązanie na stosie. Użytkowa pełny program do testowania:
riari+{_:)+:*4/}~
.Oparty na wyjątkowym rozwiązaniu Python dla xnor.
Wyjaśnienie:
źródło
{_:~+:*4/}
~
w CJam. Po prostu użyj)
.Matlab,
2319 bajtówImplementacja formuły
m*n*(m+1)*(n+1)/4
Zastosowanie:
ans([m,n])
źródło
MATL , 6 bajtów
Dane wejściowe to tablica formularza
[m,n]
.Wypróbuj online!
Wyjaśnienie
Bezpośrednie obliczenia na podstawie formuły
m*(m+1)*n*(n+1)/4
.źródło
J, 8 bajtów
Stosowanie:
źródło
Java 7,
3938 bajtówJava 8,
2625191817 bajtówNa podstawie doskonałej odpowiedzi @xnor . Wiele bajtów zapisanych dzięki @DavidConrad . Wypróbuj tutaj.
Kod testowy (Java 7):
Wypróbuj tutaj.
Wydajność:
źródło
return
ia->b->
jest o jeden bajt krótszy niż(a,b)->
.Function<Integer, Function<Integer, Integer>>
jako parametr, nie pojawiłby się średnik.;
na pojedynczym wyrażeniu lambda J8.return
... Ponadto, prawie nigdy nie programuję w Javie 8 (stąd wszystkie moje odpowiedzi w Javie 7), ale jak mam zacząća->b->
pracę? Oto ideon dla bieżącej sprawy.MathOperation.operation
tylko jeden wziąćint
, zwróciFunction<Integer, Integer>
, a gdy go nie nazywać, początkowo przechodzą tylko pierwszy parametra
, a następnie zadzwonić.apply(b)
naFunction
. Musisz także zaimportowaćjava.util.function.Function
. Oto ideone ze zmianami.Ruby, 22 bajty
Kradnąc sztuczkę @ Xnora i robiąc dźgnięcie-lambda:
Przykładowe wywołanie:
Lub jako proc, również 22 bajty:
Które moglibyśmy następnie nazwać:
źródło
Labirynt ,
1311 bajtówWypróbuj online!
Wyjaśnienie
To również oblicza iloczyn liczb trójkątnych, jak większość odpowiedzi. Wiodący blok 2x2 to mała pętla:
Przy pierwszej iteracji
*
nic nie robi, więc prawdziwa kolejność pętli jest następująca:Pozostały kod jest po prostu liniowy:
Labirynt następnie próbuje wykonać
/
ponownie, co kończy program z powodu dzielenia przez zero.źródło
Pyke, 6 bajtów
Wypróbuj tutaj!
źródło
05AB1E, 4 bajty
Wyjaśnienie
Korzysta ze wzoru opisanego w A096948
Przyjmuje dane jako [n, m] .
Wypróbuj online
źródło
Pyth,
86 bajtówDwa bajty zapisane dzięki @DenkerAffe.
Dane wejściowe są oczekiwane jako lista podobna do
[m,n]
. Wypróbuj tutaj .Wyjaśnienie:
źródło
F
zamiast.*
i usunąć,Q
ponieważ jest ona dodawana domyślnie.F
ale nie mogłem wymyślić, jak go używać i pomyślałem, że muszę go użyć.*
... Dzięki!C #, 19 bajtów
Anonimowa funkcja oparta na odpowiedzi @ xnor.
źródło
Lua,
7463 bajtówFunkcja przyjmuje dane wejściowe jako parametry liczbowe.
Ze względu na sposób implementacji Lua jest to technicznie funkcja ze zmiennymi argumentami, którą można wywołać, zawijając ją w instrukcji „function” lub ładując ją z kodu źródłowego za pomocą „loadstring”
źródło
Cheddar , 23 bajty
źródło
n*(n+1)
możnan^2+n
m->n->...
Brain-Flak ,
8480 bajtówWypróbuj online!
Prawdopodobnie bardzo nieoptymalny, szczególnie ze względu na ponowne użycie kodu w odniesieniu do liczb trójkątów, ale przynajmniej mamy rozwiązanie Brain-Flak, które działa.
Niestety wydaje się, że zawodzi, nieskończenie zapętlając się z przypadkiem
0 0
testowym, ale wszystkie inne działają dobrze.źródło
Wypukły, 7 bajtów
Wiem, że może być mniejszy, po prostu nie wiem, jak ...
Wypróbuj online! . Wykorzystuje kodowanie CP-1252.
źródło
APL (Dyalog) , 9 bajtów
Wypróbuj online!
źródło
Pyt , 3 bajty
Wyjaśnienie:
Wypróbuj online!
źródło