Listy i tablice, część po części

14

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,mgdzie 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=9zalecana 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 , więc wygrywa zgłoszenie z najkrótszym kodem dla zadania 4 w każdym języku. Jak zawsze: wyjaśnienia są bardzo zalecane.

Stewie Griffin
źródło
Żeby było jasne, zgadnę, że jest to sprzeczne z duchem wyzwania, ale czy dopuszczalne jest rozpoczęcie kodu następnego zadania od przekierowania do STDERR, >2;tak aby kod poprzedniego zadania był zasadniczo pozbawiony możliwości działania?
AdmBorkBork
1
@AdmBorkBork, nie ma czegoś takiego jak „duch wyzwania” na PPCG: P Tak, to jest OK .
Stewie Griffin
Czy tabliczka mnożenia musi być dobrze wypełniona?
HyperNeutrino
1
@HyperNeutrino, no.
Stewie Griffin
Kiedy mówisz „dodatnia liczba całkowita”, masz na myśli 0<n<mczy 0<=n<m?
Wartość tuszu

Odpowiedzi:

6

Galaretka , 12 bajtów

Zadanie 1

r

Wypróbuj online!

Zadanie 2

r+þ0r$}

Wypróbuj online!

Zadanie 3

r+þ0r$}
×þ

Wypróbuj online!

Zadanie 4

r+þ0r$}
×þFṢ

Wypróbuj online!

Jak to działa

Zadanie 1

rjest 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.

  • rzachowuje się jak poprzednio, dając [n,…, m] .

  • 0r$} to szybki link (lub szybki link, jeśli chcesz).

    Szybki $(łańcuch monadicha) zużywa linki 0(wydajność 0 ) i r(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 rozmowy 0r$z0r$} właściwym argumentem.

    0r$}zostanie wywołany z lewym argumentem n i prawym argumentem m , więc 0r$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'smain 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 ×þ, Fspłaszcza otrzymanej tablicy 2D i sortuje otrzymanej tablicy 1D.

Dennis
źródło
5

05AB1E , 18 17 bajtów

Zadanie 1

Ÿ

Wypróbuj online

Zadanie 2

Ÿ²FD>})

Wypróbuj online

Zadanie 3

Ÿ²FD>})v¹LN*})¦

Wypróbuj online

Zadanie 4

Ÿ²FD>})v¹LN*})¦˜{

Wypróbuj online

Objaśnienia

Zadanie 1

Ÿ     # range[n ... m]

Zadanie 2

Ÿ        # range[n ... m]
 ²F      # m times do:
   D     # duplicate
    >    # increment
     }   # end loop
      )  # wrap in list

Zadanie 3

v          # for each list in result of Task 2 do
 ¹L        # push range[1 ... n]
   N*      # multiply by index
     }     # end loop
      )    # wrap in list
       ¦   # discard first element

Zadanie 4

˜          # flatten the result from Task 3
 {         # sort
Emigna
źródło
3

MATL , 18 17 bajtów

Zadanie 1

&:

Wypróbuj online!

Zadanie 2

&:O2G:h!+

Wypróbuj online!

Zadanie 3

&:O2G:h!+:7M!*

Wypróbuj online!

Zadanie 4

&:O2G:h!+:7M!*1eS

Wypróbuj online!

Wyjaśnienie

Zadanie 1

&:    % Binary range [n n+1 ... m] from implicit inputs n, m

Zadanie 2

      % ... Stack contains [n n+1 ... m]
O     % Push 0
2G    % Push second input, m
:     % Unary range: gives [1 2 ... m]
h     % Concatenate horizontally: gives [0 1 2 ... m]
!     % Transpose into a column vector
+     % Add with broadcast

Zadanie 3

      % ... Stack contains matrix from task 2
:     % Unary range. For matrix input it uses its (1,1) entry. So this gives [1 2 ... n]
7M    % Push [1 2 ... m] again
!     % Transpose into a column vector
*     % Multiply with broadcast

Zadanie 4

      % ... Stack contains matrix from task 3
1e    % Linearize into a row vector
S     % Sort
Luis Mendo
źródło
3

Mathematica, 84 77 bajtów

Edycja: Podziękowania dla Martina Endera za zapisanie 7 bajtów.

Zadanie 1:

{n,m}n~Range~m

Czysty Functionz argumentami ni danymi mwyjściowymi n~Range~m, forma infiksu Range[n,m].

Zadanie 2:

{n,m}n~Range~m~Table~(m+1)//0~Range~m+#&

n~Range~m~Table~(m+1)tworzy tablicę 2D z m+1wierszami, gdzie każdy wiersz stanowi wynik poprzedniego zadania. Wtedy //0~Range~m+#&to aplikacja postfix funkcji 0~Range~m+#&, które skutecznie dodaje 0się do pierwszego rzędu, 1w drugim rzędzie, i tak dalej, aż do mdlam+1 -tego rzędu.

Zadanie 3:

{n,m}n~Range~m~Table~(m+1)//0~Range~m+#&//1##&~Array~{n,m}&

To po prostu stosuje funkcję stałą 1##&~Array~{n,m}&do wyniku poprzedniego zadania.

Zadanie 4:

{n,m}n~Range~m~Table~(m+1)//0~Range~m+#&//1##&~Array~{n,m}&//Flatten//Sort

Flattensi Sorttabliczka mnożenia.

ngenisis
źródło
2

Python, 183 bajty

Zadanie 1, 29 bajtów

r=range
a=lambda n,m:r(n,m+1)

Wypróbuj online!

Zadanie 2, 84 bajtów

r=range
a=lambda n,m:r(n,m+1)
s=lambda n,m:[[w+i for w in r(n,m)] for i in a(0,m+1)]

Wypróbuj online!

Zadanie 3, 137 bajtów

r=range
a=lambda n,m:r(n,m+1)
s=lambda n,m:[[w+i for w in r(n,m)] for i in a(0,m+1)]
d=lambda n,m:[[w*i for w in a(1,n)] for i in a(1,m)]

Wypróbuj online!

Zadanie 4, 183 167 bajtów

r=range
a=lambda n,m:r(n,m+1)
s=lambda n,m:[[w+i for w in r(n,m)] for i in a(0,m+1)]
d=lambda n,m:[[w*i for w in a(1,n)] for i in a(1,m)]
f=lambda(z):sorted(sum(z,[]))

Wypróbuj online!

Wyjaśnienie:

Zadanie 1:

To proste, generuje listę ndo mużycia przy użyciu wbudowanej rangefunkcji Pythona .

Zadanie 2:

Dla każdej liczby 0do m+1dodaje tę liczbę do każdej pozycji listy od ndo m.

Zadanie 3:

Dla każdej liczby od 1do mmnoży tę liczbę przez każdą liczbę na liście od 1do n.

Zadanie 4:

Korzysta z wbudowanej sortedfunkcji 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.
  • Zaoszczędź 16 bajtów dzięki @ThisGuy

Zaoszczędzono bardzo wiele bajtów dzięki @math_junkie.

Towarzyszu SparklePony
źródło
Nie możesz używać anonimowych funkcji, czy lambdas nie są w rzeczywistości krótsze? (według moich obliczeń wydaje się, że są)
cole
Czy jest to ogólnie akceptowalne dla odpowiedzi Python? Na przykład kod dla zadania 2 nie jest pełnym programem z wejściem i wyjściem, a także nie jest funkcją ani definicją funkcji.
ngenisis
@Cole Musiałem użyć nieanonimowych funkcji, aby móc z nich korzystać w późniejszym kodzie.
Towarzysz SparklePony,
@ngenisis Myślę, że jest w porządku, ponieważ OP powiedział, że kod dla zadania 2 musi zaczynać się od kodu dla zadania 1, a kod dla zadania 2 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.
Towarzysz SparklePony,
Możesz zrobić coś a=lambda n,m:...dla każdej z definicji funkcji. Anonimowe funkcje są zawsze krótsze w python
matematyka ćpun
2

PHP 7, 200 bajtów

Używa bufora wyjściowego, aby wyczyścić poprzednie dane wyjściowe.

Zadanie 1

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');

Zapisuje kod, $saby użyć go później. The$vZmienna jest dla ostatniego zadania.

Zadanie 2

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');for(;++$i<=$m;)eval($s);

Drukuje pozostałe linie.

Zadanie 3

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');for(;++$i<=$m;)eval($s);for(($c=ob_clean)();++$j<=$m;print"
")for(;++$$j<=$n;sort($v))echo$v[]=$j*$$j,' ';

Czyści bufor wyjściowy i drukuje tabliczkę mnożenia, zapisując liczby do $v.

Zadanie 4

[,$n,$m]=$argv;ob_start();eval($s='echo join(" ",$v?:range($n+$i,$m+$i)),"
";');for(;++$i<=$m;)eval($s);for(($c=ob_clean)();++$j<=$m;print"
")for(;++$$j<=$n;sort($v))echo$v[]=$j*$$j,' ';$c();eval($s);

Ponownie czyści bufor wyjściowy i drukuje $v.

użytkownik63956
źródło
1

PowerShell , 126 bajtów

Zadanie 1

param($n,$m)$n..$m

Wypróbuj online!

Korzysta z ..wbudowanego operatora zakresu. Domyślne zachowanie dla domyślnej Write-Outputwstawia nową linię między elementami, dlatego dane wyjściowe są wyświetlane jako oddzielone nową linię.


Zadanie 2

param($n,$m)$n..$m>2;0..$m|%{$i=$_;($n..$m|%{$_+$i})-join','}

Wypróbuj online!

Zrzuca pierwsze zadanie do STDERR za pomocą >2;, a następnie zapętla od 0do $mkażdego pomocnika ustawień iteracji $iprzed ponownym zapętleniem od $ndo $mi zwiększaniem każdej liczby o $i. Są one -joinedytowane razem z przecinkami, w przeciwnym razie byłby to dwuznaczny gigantyczny długi wynik jednego elementu na linię.


Zadanie 3

param($n,$m)$n..$m>2;0..$m|%{$i=$_;($n..$m|%{$_+$i})-join','}>2;(1..$m|%{$i=$_;(1..$n|%{$_*$i})-join' '})

Wypróbuj online!

Taki sam rodzaj >2;zrzutu poprzedniego do STDERR. Wtedy po prostu podwójna pętla z 1aby $mnastępnie 1na $nustawienie pomocnika $ipo drodze, należy pomnożyć wartości, -joinz 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

param($n,$m)$n..$m>2;0..$m|%{$i=$_;($n..$m|%{$_+$i})-join','}>2;(1..$m|%{$i=$_;(1..$n|%{$_*$i})-join' '})-split' '|%{+$_}|sort

Wypróbuj online!

Aha! Wreszcie trochę redundancji. Ponieważ poprzednie zadanie zawiera pareny, możemy -splitbez 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.

AdmBorkBork
źródło
1

ES2016-ish, 401 384 znaków

Oto 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

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `)

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.

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `),p,o,g=(n,m)=>{p=n,o=m;return [...a(m+1).keys()].map((d)=>f(d+p,d+o))},y=(n,m)=>l(g(n,m).join`\n`

Teraz zadzwoń y(n,m) . Dość, nie?

Zadanie 3

Muszą ominąć większość istniejących funkcji <sadface />.

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `),p,o,g=(n,m)=>{p=n,o=m;return [...a(m+1).keys()].map((d)=>f(d+p,d+o))},y=(n,m)=>l(g(n,m).join`\n`,h=(n,m)=>[...a(m).keys()].map((d)=>(d+1)*n).join`\t`,i=(n,m)=>[...a(n).keys()].map((d)=>h((d+1),m)),v=(n,m)=>i(n,m).join`\n`

Teraz nazwa metody to v . Nazwij to tak samo.

Zadanie 4

A teraz możemy ponownie użyć.

var a=Array,l=console.log,f=(n,m)=>a.from(a(1+m-n),(w,i)=>n+i),z=(n,m)=>l(f(n,m).join`, `),p,o,g=(n,m)=>{p=n,o=m;return [...a(m+1).keys()].map((d)=>f(d+p,d+o))},y=(n,m)=>l(g(n,m).join`\n`,h=(n,m)=>[...a(m).keys()].map((d)=>(d+1)*n).join`\t`,i=(n,m)=>[...a(n).keys()].map((d)=>h((d+1),m)),v=(n,m)=>i(n,m).join`\n`,t=(n,m)=>l(v(n,m).match(/\d+/g).sort((a,b)=>+a>+b||+(a===b)*2-1).join(`, `)

Musiałem pominąć umoją metodę, więc jest t. Bummed, że musiałem wprowadzić tę funkcję sortowania, ponieważ String.matchzwraca wartości jako ... łańcuchy.

Neil JS Grump
źródło
0

Rubin, 121 103 bajtów

Wszystko w Rubim jest zgodne z prawdą, z wyjątkiem nili false, co oznacza, że ​​zadania można skonfigurować tak, aby ignorowały poprzednie dane wejściowe z niczym, ale dobrze umiejscowionymi and/ &&.

Zadanie 1

Wypróbuj online!

n,m=$*.map &:to_i
p [*n..m]

Zadanie 2

Wypróbuj online!

n,m=$*.map &:to_i
p [*n..m]&&(0..m).map{|i|[*n+i..m+i]}

Zadanie 3

Wypróbuj online!

n,m=$*.map &:to_i
p [*n..m]&&(0..m).map{|i|[*n+i..m+i]}&&(1..m).map{|i|(1..n).map{|j|i*j}}

Zadanie 4

Wypróbuj online!

n,m=$*.map &:to_i
p [*n..m]&&(0..m).map{|i|[*n+i..m+i]}&&(1..m).map{|i|(1..n).map{|j|i*j}}.flatten.sort
Wartość tuszu
źródło