Biorąc pod uwagę (w jakikolwiek sposób) dwie różne liczby naturalne (o dowolnym rozsądnym rozmiarze), wyprowadzaj (w dowolny sposób) kwadrat ich sumy, jak w poniższych przykładach:
Biorąc pod uwagę 4 i 3, wynik:
12 12 12 12 9 9 9
12 12 12 12 9 9 9
12 12 12 12 9 9 9
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
16 16 16 16 12 12 12
Biorąc pod uwagę 1 i 3, wynik:
3 9 9 9
3 9 9 9
3 9 9 9
1 3 3 3
Białe spacje mogą się różnić w zależności od przyczyny, ale kolumny muszą być wyrównane do lewej, wyrównane do prawej lub (pseudo) wyśrodkowane.
Końcowy znak nowej linii jest w porządku, ale standardowe luki nie.
To jest kodowanie w golfa, więc dołącz nagłówek jak # LanguageName, 123
w swojej odpowiedzi, gdzie liczba to znaki (bajty dla języków, które nie są oparte na tekście). Pakowanie kodu do dużych znaków Unicode jest niedozwolone.
Premia: -3, jeśli kod generuje tylko jeden kwadrat, gdy jedna z cyfr to 0; np. podane 0 i 3, wyjście:
9 9 9
9 9 9
9 9 9
Odpowiedzi:
J, 9 bajtów - 3 = 6
Zainspirowany odpowiedzią APL @ NBZ, grał w golfa przez @randomra. Definiuje to czasownik, który przyjmuje tablicę liczb. Używa się go w następujący sposób:
Twierdzę także o 3-bajtowej premii, ponieważ wejście 0 tworzy podmacierze o rozmiarze zero:
Wyjaśnienie
J ma wyraźną przewagę w tym wyzwaniu. Oprócz problemów z manipulowaniem tablicą na śniadanie, domyślnie drukuje matryce 2D we właściwym formacie.
źródło
table flipper
emotikonu ASCII (╯ ° □ °) ╯︵ ┻━┻Oktawa, 45 bajtów - 3 = 42
Wyjaśnienie
Konstruuje to dwa wektory (załóżmy
m = 4
in = 3
):ones(n, 1)
konstruuje tablicę jednowymiarowychn x 1
, więc mnożąc jen
, otrzymujemy:Następnie wektory są mnożone w sposób elementarny, z automatycznym rozszerzaniem transmisji, tak że wektory 7-elementowe wytwarzają macierz 7x7-elementową:
Na przykład, pomnożenie pierwszego wiersza
a
przezb
daje:I podobnie dla pozostałych wierszy
a
.Wydajność:
Możesz spróbować tutaj na ideone
źródło
s=
. Mamy konwencję, że anonimowe funkcje / lambdas nie muszą być przechowywane w zmiennej.Dyalog APL , 10-3 = 7
Zainspirowany * tą odpowiedzią, w której argumenty są replikowane, a następnie wykorzystywane w tablicy mnożenia:
⎕
Wydaje monit (⎕:
) i ocenia każde wprowadzone wyrażenie. (Ze względów bezpieczeństwa nie działa to na TryAPL, ale działa na NGN / APL )./⍨
Sam czas replikacji argumentu (/⍨4 3
⇔3 3 3 4 4 4 4
)∘.×⍨
Tworzy tabliczkę mnożenia.⊖
Odwraca się do góry nogami.Zdarza się to na wejściu dowolnej długości (wejście jest wcięte 6 spacjami, wyjście ma lewy margines):
* Początkowo miałem na myśli inne rozwiązanie: każdy prostokąt jest tworzony osobno, tworząc tabelę mnożenia dla każdej kombinacji dwóch argumentów. Następnie cztery kwadraty są łączone w pionie i poziomie. To wygląda tak:
⎕
Podpowiedź, jak wyżej.,⍴×<
Połącz (,
) argumenty i użyj go do ukształtowania (⍴
) prostokąta wypełnionego ich produktem (×
).∘.(
…)⍨
Utwórz tabelę, w której każda komórka jest taka, jak określono w(
…)
⊖
Odwróć w pionie.⍪⌿
Łącz komórki pionowo.,/
Połącz komórki poziomo.źródło
(|.*/])@#~
R, 31–3 = 28
Wyjaśnienie:
Działa to również dla więcej niż dwóch liczb. Na przykład dane wyjściowe dla (5,3,2) wygląda następująco:
źródło
cat
lubwrite
, aby była to prawidłowa odpowiedź.Haskell,
153125 bajtów - 3 = 122Połowa kodu służy do formatowania wyjściowego. Działa dla dowolnych dużych liczb całkowitych. Przykładowe dane wyjściowe:
Czasami między liczbami występuje dodatkowa spacja, ponieważ obliczam potrzebną przestrzeń na podstawie
x*x+y*y
zamiastmax (x*x) (y*y)
, npAle to co najwyżej jedna biała spacja.
źródło
Mathematica 56-3 = 53
Aktualizacja : Dodałem drugą metodę, dokładnie tego samego rozmiaru kodu, która używa nazwanej funkcji. Wykorzystuje
Array
raczej niż,Table
ale postępuje zgodnie z tą samą logiką. (Patrz poniżej.)Metoda 1
To tworzy tabelę produktów, których czynniki zależą od wartości wiersza i kolumny. Para liczb jest wprowadzana jako lista liczb całkowitych. Anonimowe funkcje, takie jak poniżej, są najbardziej przydatne, jeśli są używane tylko raz w programie. W przeciwnym razie bardziej sensowne jest użycie nazwanej funkcji.
Każdy czynnik jest instrukcją If-then:
If[r>#2,#,#2]
oznacza: „Jeśli numer wiersza jest większy niż drugie wejście, użyj pierwszego wejścia jako współczynnika, w przeciwnym razie użyj drugiego wejścia.If[c>#,#2,#]
oznacza: „Jeśli numer kolumny jest większy niż pierwsze wejście, użyj drugiego wejścia jako współczynnika, w przeciwnym razie użyj pierwszego wejścia.Przykład 1
Przykład 2
Metoda 2 (również 56-3 = 53)
Działa to podobnie do metody 1. Ale wymaga mniej kodu po wywołaniu. I komórki są adresowalne, w przeciwieństwie do komórek w tabeli. Ta metoda jest lepsza w użyciu, jeśli funkcja będzie używana więcej niż jeden raz.
Przykłady z powyższego są tworzone przez:
Ex 1:
Ex 2:
źródło
Oktawa, 34-3 = 31
Przykłady:
źródło
repelems
istnieje. Niesamowite!CJam, 27 bajtów - 3 = 24
Pobiera dane wejściowe jako tablicę stylu CJam. Wykorzystuje nieco więcej odstępów niż to konieczne, ale myślę, że jest „w granicach rozsądku” i zawsze jest właściwie wyrównany do prawej.
Sprawdź to tutaj.
Wyjaśnienie
źródło
Funkcja C (przy użyciu glibc), 122 bajty - 3 = 119
Przeważnie prosta implementacja z 2 pętlami. Spodziewam się, że przegapiłem tutaj kilka okazji do gry w golfa:
Dane wejściowe są przekazywane w pierwszych dwóch parametrach funkcji, pozostałe dwa są manekinami. Kolumny są wyrównane do prawej.
Uwaga glibc
puts()
zawsze wydaje się zwracać liczbę zapisanych bajtów, w tym niejawny końcowy znak nowej linii, czego potrzebujemy tutaj. Nie ma gwarancji, że będzie działać z innymi bibliotekami libc.W pełnym programie:
Skompiluj jako
gcc sqrbin.c -o sqrbin
(lubmake sqrbin
). Ostrzeżenia można bezpiecznie zignorować.Przykładowe dane wyjściowe:
źródło
puts()
wynika , że zwracana wartość zależy od maszyny. Na przykład moja 10. Oto wskazówka: zwykle możesz skompresować dwie pętle w jedną, jeśli warunkowo zwiększysz licznik w pętli zewnętrznej. Moje rozwiązanie pokazuje, jak to zrobić.puts()
kod powrotu ma gwarancję, że jest + ve dla sukcesu. Jednak moje testy z glibc wydają się pokazywać, że zwracana wartość to liczba zapisanych bajtów. Jeśli chodzi o konsolidację pętli - tak, znam tę technikę i wypróbowałem ją tutaj, jak dotąd bez skrócenia w tym przypadku.Rubin, (133 - 3) = 130 bajtów
dla 4,3
dla 1,3
dla 0,3
źródło
1
dużej liczby takich jak9999
. Niżs
wyjdzie jako4
, więc wypełniasz szerokość,s+3 = 7
ale9999^2
potrzebuje 8 cyfr. Możesz2*s
zamiast tego użyć .rjust
przed zrobieniemljust
. Możesz skrócićprint
do$><<
(i pozbyć się spacji po nim).ARGV
ma alias$*
. Możesz być w stanie tego uniknąćflatten
, budując tablicę za pomocą czegoś takiego: codegolf.stackexchange.com/a/19493/8478 . Również odpowiedzi tylko do funkcji są tutaj zdecydowanie dozwolone (nawet funkcje bez nazw), więc funkcja może przyjmować liczby całkowite jako dane wejściowe i nie musisz nic robić.to_i
.Python 2, 176 bajtów - 3 = 173
Używa funkcji ciągów Python do utworzenia siatki znaków, a następnie zastępuje znaki liczbami całkowitymi i drukuje sformatowane dane wyjściowe.
źródło
Matlab, 58–3 = 55
Korzystanie z anonimowej funkcji:
Przykład:
(Stare rozwiązanie) 59-3 = 56
Korzystanie z anonimowej funkcji:
źródło
C, (125 - 3) bajtów
Dane wejściowe są traktowane jako dwie liczby całkowite oddzielone spacją w tym samym wierszu. Każda komórka jest wypełniona spacjami do dwukrotnej długości ciągu wejściowego.
źródło
Pyth, 39-3 = 36
Pyth nie ma wbudowanego formatowania macierzy, co znacznie zwiększa rozmiar, ponieważ trzeba ręcznie uzupełniać liczby wyjściowe. Oto co wymyśliłem.
Wypróbuj online.
źródło
Bloki , 51 bajtów
52628287(niekonkurujące)Nie golfowany:
Spróbuj
źródło