W tym wyzwaniu otrzymasz cztery różne, ale nieco powiązane zadania, które należy rozwiązać w określony sposób. Najpierw wyjaśnię zadania, a następnie wyjaśnię, jak je rozwiązać.
Kod dla wszystkich czterech zadań powinien przyjmować dwie dodatnie liczby całkowite jako dane wejściowe:, n,m
gdzie n<m
. Wszystkie zadania muszą być rozwiązane w tym samym języku. Orientacja matryc jest opcjonalna (n-na-m można interpretować jako „n wierszy, m kolumn” lub „n kolumn, m wierszy”).
Zadanie 1:
Tworzy (i / wyjście print) wektor / listy składającej się z następujących elementów: n, n+1 ... m-1, m
. Tak więc, dla n=4, m=9
, zalecana moc: 4,5,6,7,8,9
.
Zadanie 2:
Utwórz (i wydrukuj / wydrukuj) macierz / tablicę / listę list (lub równoważną) wyglądającą tak:
n, n+1, ... m-1, m
n+1, n+2, ... m-1, m+1
...
n+m, n+m+1, ... 2*m-1, 2*m
Dla n=4, m=9
zalecana moc:
4, 5, 6, 7, 8, 9
5, 6, 7, 8, 9, 10
...
13, 14, 15, 16, 17, 18
Zadanie 3:
Utwórz (i wydrukuj / wydrukuj) tablicę mnożenia n-na-m (w dowolnym odpowiednim formacie). Przykład dla n=4, m=9
:
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
5 10 15 20
6 12 18 24
7 14 21 28
8 16 24 32
9 18 27 36
Zadanie 4:
Wydrukuj / wydrukuj wektor / listę składającą się z elementów z tablicy mnożenia z zadania 3, posortowanych w porządku rosnącym, zachowując zduplikowane wartości. Dla n=4, m=9
, zalecana moc: 1, 2, 2, 3, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 10, 12, 12, 12, 14, 15, 16, 16, 18, 18, 20, 21, 24, 24, 27, 28, 32, 36
.
Wyzwanie:
Teraz wszystkie powyższe zadania są dość trywialne. Prawdziwe wyzwanie polega na tym, że kod dla zadania 2 musi zaczynać się od kodu dla zadania 1, kod dla zadania 3 musi zaczynać się od kodu dla zadania 2, a kod dla zadania 4 musi zaczynać się od kodu dla zadania 3.
Aby było bardziej jasne:
Załóżmy, że kod dla Zadania 1 to (działa w Octave):
@(n,m)(n:m)
Zatem twój kod dla Zadania 2 może być (działa w Octave):
@(n,m)(n:m)+(0:m)'
Kod dla zadania Zadanie 3 musi być (nie działa w Octave):
@(n,m)(n:m)+(0:m)'"Code_for_task_3"
I na koniec, kod dla Zadania 4 musi być (nie działa w Octave):
@(n,m)(n:m)+(0:m)'"Code_for_task_3""Code_for_task_4"
To jest golf golfowy , więc wygrywa zgłoszenie z najkrótszym kodem dla zadania 4 w każdym języku. Jak zawsze: wyjaśnienia są bardzo zalecane.
>2;
tak aby kod poprzedniego zadania był zasadniczo pozbawiony możliwości działania?0<n<m
czy0<=n<m
?Odpowiedzi:
Galaretka , 12 bajtów
Zadanie 1
Wypróbuj online!
Zadanie 2
Wypróbuj online!
Zadanie 3
Wypróbuj online!
Zadanie 4
Wypróbuj online!
Jak to działa
Zadanie 1
r
jest atomem z zakresu dyadycznego i robi dokładnie to, o co prosi zadanie.Zadanie 2
Widmowy łańcuch, który zaczyna się od trzech ogniw diadadowych, jest rozwidleniem ; najpierw odsyłane są skrajne linki, a następnie środkowy link jest wywoływany z wynikami do obu stron jako argumenty.
r
zachowuje się jak poprzednio, dając [n,…, m] .0r$}
to szybki link (lub szybki link, jeśli chcesz).Szybki
$
(łańcuch monadicha) zużywa linki0
(wydajność 0 ) ir
(zakres dyadiczny) i zamienia je w łańcuch monadyczny. Po wywołaniu z argumentem k da to wynik [0,…, k] .Szybkie
}
(prawy argument) wykonuje szybki odnośnik stworzony przez$
i zamienia ją w diadycznej linku że rozmowy0r$
z0r$}
właściwym argumentem.0r$}
zostanie wywołany z lewym argumentem n i prawym argumentem m , więc0r$
jest połączony z argumentem m i daje [0,…, m] .+þ
to kolejne szybkie łącze.þ
(table) wywoła+
(dodatek) dla każdego elementu w lewym argumencie i każdego elementu w prawym argumencie, grupując wyniki dla każdego prawego argumentu w jednym wierszu.+þ
zostanie wywołany z lewym argumentem [n,…, m] i prawym argumentem [0,…, m] , uzyskując pożądaną tabelę.Zadanie 3
Każda linia w programie Jelly definiuje inny link. Ostatni jest głównym linkiem i, podobnie jak C's
main
funkcja , jest jedynym łącznikiem, który jest wykonywany domyślnie. Pozostałe linki można wywołać z linku głównego, ale nie zrobimy tego tutaj.Tak jak poprzednio,
þ
(tabela) wywoła×
(dodatek) dla każdego elementu w lewym argumencie i każdego elementu w prawym argumencie, grupując wyniki dla każdego prawego argumentu w jednym wierszu.Ponieważ oba argumenty
×þ
są liczbami całkowitymi,þ
rzutuje je na zakresy, przekształcając argumenty n i m na [1,…, n] i [1,…, m] .Zadanie 4
×þ
działa jak poprzednio. Poniższe linki są monadyczne, co czyni je najlepszymi , tj. Są stosowane na poprzednich.Po wykonaniu
×þ
,F
spłaszcza otrzymanej tablicy 2D iṢ
sortuje otrzymanej tablicy 1D.źródło
05AB1E ,
1817 bajtówZadanie 1
Wypróbuj online
Zadanie 2
Wypróbuj online
Zadanie 3
Wypróbuj online
Zadanie 4
Wypróbuj online
Objaśnienia
Zadanie 1
Zadanie 2
Zadanie 3
Zadanie 4
źródło
MATL ,
1817 bajtówZadanie 1
Wypróbuj online!
Zadanie 2
Wypróbuj online!
Zadanie 3
Wypróbuj online!
Zadanie 4
Wypróbuj online!
Wyjaśnienie
Zadanie 1
Zadanie 2
Zadanie 3
Zadanie 4
źródło
Mathematica,
8477 bajtówEdycja: Podziękowania dla Martina Endera za zapisanie 7 bajtów.
Zadanie 1:
Czysty
Function
z argumentamin
i danymim
wyjściowymin~Range~m
, forma infiksuRange[n,m]
.Zadanie 2:
n~Range~m~Table~(m+1)
tworzy tablicę 2D zm+1
wierszami, gdzie każdy wiersz stanowi wynik poprzedniego zadania. Wtedy//0~Range~m+#&
to aplikacja postfix funkcji0~Range~m+#&
, które skutecznie dodaje0
się do pierwszego rzędu,1
w drugim rzędzie, i tak dalej, aż dom
dlam+1
-tego rzędu.Zadanie 3:
To po prostu stosuje funkcję stałą
1##&~Array~{n,m}&
do wyniku poprzedniego zadania.Zadanie 4:
Flatten
siSort
tabliczka mnożenia.źródło
Python, 183 bajty
Zadanie 1, 29 bajtów
Wypróbuj online!
Zadanie 2, 84 bajtów
Wypróbuj online!
Zadanie 3, 137 bajtów
Wypróbuj online!
Zadanie 4,
183167 bajtówWypróbuj online!
Wyjaśnienie:
Zadanie 1:
To proste, generuje listę
n
dom
użycia przy użyciu wbudowanejrange
funkcji Pythona .Zadanie 2:
Dla każdej liczby
0
dom+1
dodaje tę liczbę do każdej pozycji listy odn
dom
.Zadanie 3:
Dla każdej liczby od
1
dom
mnoży tę liczbę przez każdą liczbę na liście od1
don
.Zadanie 4:
Korzysta z wbudowanej
sorted
funkcji Pythona, która sortuje listę od najmniejszej do największej. Zrozumienie listy w funkcji służy do spłaszczenia listy. Tworzy listę każdego elementu w każdym elemencie listy podanym mu przez zadanie 3.Zaoszczędzono bardzo wiele bajtów dzięki @math_junkie.
źródło
def s(n,m):return [[w+i for w in r(n,m)] for i in a(0,m+1)]
, jest kompletną funkcją, gdy kod dla zadania 1 jest zdefiniowany.a=lambda n,m:...
dla każdej z definicji funkcji. Anonimowe funkcje są zawsze krótsze w pythonPHP 7, 200 bajtów
Używa bufora wyjściowego, aby wyczyścić poprzednie dane wyjściowe.
Zadanie 1
Zapisuje kod,
$s
aby użyć go później. The$v
Zmienna jest dla ostatniego zadania.Zadanie 2
Drukuje pozostałe linie.
Zadanie 3
Czyści bufor wyjściowy i drukuje tabliczkę mnożenia, zapisując liczby do
$v
.Zadanie 4
Ponownie czyści bufor wyjściowy i drukuje
$v
.źródło
PowerShell , 126 bajtów
Zadanie 1
Wypróbuj online!
Korzysta z
..
wbudowanego operatora zakresu. Domyślne zachowanie dla domyślnejWrite-Output
wstawia nową linię między elementami, dlatego dane wyjściowe są wyświetlane jako oddzielone nową linię.Zadanie 2
Wypróbuj online!
Zrzuca pierwsze zadanie do STDERR za pomocą
>2;
, a następnie zapętla od0
do$m
każdego pomocnika ustawień iteracji$i
przed ponownym zapętleniem od$n
do$m
i zwiększaniem każdej liczby o$i
. Są one-join
edytowane razem z przecinkami, w przeciwnym razie byłby to dwuznaczny gigantyczny długi wynik jednego elementu na linię.Zadanie 3
Wypróbuj online!
Taki sam rodzaj
>2;
zrzutu poprzedniego do STDERR. Wtedy po prostu podwójna pętla z1
aby$m
następnie1
na$n
ustawienie pomocnika$i
po drodze, należy pomnożyć wartości,-join
z miejsca, aby go tabelarycznych. Zwróć uwagę na enkapsulujące pareny - wejdą one w grę przy następnym zadaniu - ale tutaj po prostu zapewniają, że dane wyjściowe zostaną wprowadzone do potoku (co już byłoby, więc są zbędne).Zadanie 4
Wypróbuj online!
Aha! Wreszcie trochę redundancji. Ponieważ poprzednie zadanie zawiera pareny, możemy
-split
bez obaw wstawiać białe znaki, rzutować każde na liczbę całkowitą|%{+$_}
, a następnie|sort
. Wyjście jest ponownie oddzielone znakiem nowej linii.Sądzę, że istnieją sposoby na lepsze wykorzystanie nadmiarowości między zadaniami - wciąż niektóre.
źródło
ES2016-ish,
401384 znakówOto pierwsza próba. Jestem pewien, że to może być trochę skondensowane, ale jest dość krótkie. Funkcje strzałek FTW! (Uwielbiam te niejawne instrukcje zwrotu.) Nowe i ulepszone dzięki ciągom szablonów!
Zadanie 1
Połączenie
z(n,m)
po dane wyjściowe dziennika. (Aliiasing console.log do późniejszego grania w golfa.)Zadanie 2
Drugi wers ... rozwija się na pierwszym.
Teraz zadzwoń
y(n,m)
. Dość, nie?Zadanie 3
Muszą ominąć większość istniejących funkcji
<sadface />
.Teraz nazwa metody to
v
. Nazwij to tak samo.Zadanie 4
A teraz możemy ponownie użyć.
Musiałem pominąć
u
moją metodę, więc jestt
. Bummed, że musiałem wprowadzić tę funkcję sortowania, ponieważString.match
zwraca wartości jako ... łańcuchy.źródło
Rubin,
121103 bajtówWszystko w Rubim jest zgodne z prawdą, z wyjątkiem
nil
ifalse
, co oznacza, że zadania można skonfigurować tak, aby ignorowały poprzednie dane wejściowe z niczym, ale dobrze umiejscowionymiand
/&&
.Zadanie 1
Wypróbuj online!
Zadanie 2
Wypróbuj online!
Zadanie 3
Wypróbuj online!
Zadanie 4
Wypróbuj online!
źródło