Danh sách và mảng, từng phần


14

Trong thử thách này, bạn sẽ nhận được bốn nhiệm vụ khác nhau nhưng có phần liên quan phải được giải quyết theo một cách cụ thể. Đầu tiên, tôi sẽ giải thích các nhiệm vụ, sau đó làm theo giải thích về cách bạn phải giải quyết nó.

Mã của bạn phải cho cả bốn tác vụ lấy hai số nguyên dương làm đầu vào : n,m, ở đâu n<m. Tất cả các nhiệm vụ phải được giải quyết trong cùng một ngôn ngữ. Hướng của ma trận là tùy chọn (n-by-m có thể được hiểu là "n hàng, m cột" hoặc "n cột, m hàng").

Nhiệm vụ 1:

Tạo (và đầu ra / in) một vectơ / danh sách bao gồm các phần tử : n, n+1 ... m-1, m. Vì vậy, cho n=4, m=9, bạn nên đầu ra : 4,5,6,7,8,9.

Nhiệm vụ 2:

Tạo (và đầu ra / in) một ma trận / mảng / danh sách các danh sách (hoặc tương đương) trông như thế này:

n,   n+1, ... m-1, m
n+1, n+2, ... m-1, m+1
...
n+m, n+m+1, ... 2*m-1, 2*m

Đối với n=4, m=9bạn nên xuất:

4, 5, 6, 7, 8, 9
5, 6, 7, 8, 9, 10
...
13, 14, 15, 16, 17, 18

Nhiệm vụ 3:

Tạo (và đầu ra / in) một bảng nhân n-by-m (trên bất kỳ định dạng phù hợp nào). Ví dụ cho 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

Nhiệm vụ 4:

Xuất / in một vectơ / danh sách bao gồm các phần tử trong bảng nhân từ tác vụ 3, được sắp xếp theo thứ tự tăng dần, giữ các giá trị trùng lặp. Đối với n=4, m=9, bạn nên xuất ra : 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.

Các thách thức:

Bây giờ, tất cả các nhiệm vụ trên là khá tầm thường. Thách thức thực sự ở đây là mã cho nhiệm vụ 2 phải bắt đầu bằng mã cho nhiệm vụ 1, mã cho nhiệm vụ 3 phải bắt đầu bằng mã cho nhiệm vụ 2 và mã cho nhiệm vụ 4 phải bắt đầu bằng mã cho nhiệm vụ 3.

Để làm cho nó rõ ràng hơn:

Giả sử mã cho Nhiệm vụ 1 là (hoạt động trong Octave):

@(n,m)(n:m)

Sau đó, của bạn cho Nhiệm vụ 2 có thể là (hoạt động trong Octave):

@(n,m)(n:m)+(0:m)'

Mã cho nhiệm vụ Nhiệm vụ 3 phải là (không hoạt động trong Octave):

@(n,m)(n:m)+(0:m)'"Code_for_task_3"

Và cuối cùng, mã cho Nhiệm vụ 4 phải là (không hoạt động trong Octave):

@(n,m)(n:m)+(0:m)'"Code_for_task_3""Code_for_task_4"

Đây là , vì vậy bài nộp với mã ngắn nhất cho nhiệm vụ 4 trong mỗi ngôn ngữ sẽ thắng. Như mọi khi: Giải thích rất được khuyến khích.


Để rõ ràng, tôi sẽ đoán rằng điều này trái với tinh thần của thách thức, nhưng liệu có được phép bắt đầu mã của nhiệm vụ tiếp theo với một chuyển hướng đến STDERR >2;để mã của nhiệm vụ trước về cơ bản được hiển thị không?
admBorkBork

1
@AdmBorkBork, không có thứ gọi là "tinh thần của thử thách" trên PPCG: P Vâng, điều đó ổn .
Stewie Griffin

Bảng nhân có cần được đệm độc đáo không?
HyperNeutrino

1
@HyperNeutrino, không.
Stewie Griffin

Khi bạn nói "số nguyên dương", bạn có nghĩa là 0<n<mhay 0<=n<m?
Mực giá trị

Câu trả lời:


6

Thạch , 12 byte

Nhiệm vụ 1

r

Hãy thử trực tuyến!

Nhiệm vụ 2

r+þ0r$}

Hãy thử trực tuyến!

Nhiệm vụ 3

r+þ0r$}
×þ

Hãy thử trực tuyến!

Nhiệm vụ 4

r+þ0r$}
×þFṢ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Nhiệm vụ 1

rlà nguyên tử phạm vi dyadic và thực hiện chính xác những gì nhiệm vụ yêu cầu.

Nhiệm vụ 2

Một chuỗi dyadic bắt đầu với ba liên kết dyadic là một ngã ba ; các liên kết ngoài cùng được đánh giá đầu tiên, sau đó liên kết giữa được gọi với kết quả cho cả hai bên làm đối số.

  • rcư xử như trước, mang lại [n, Mạnh, m] .

  • 0r$} là một liên kết nhanh (hoặc quickquicklink, nếu bạn muốn).

    Chuỗi nhanh $(chuỗi monadich) tiêu thụ các liên kết 0(sản lượng 0 ) và r(phạm vi dyadic) và biến chúng thành chuỗi đơn sắc. Khi được gọi với đối số k , điều này sẽ mang lại [0, Nhận, k] .

    Quick }(đối số đúng) lấy liên kết nhanh được tạo bởi $và biến nó thành một liên kết dyadic gọi 0r$với 0r$}đối số đúng.

    0r$}sẽ được gọi với đối số trái n và đối số phải m , do đó, tất cả 0r$được liên kết với đối số m và mang lại [0, Lỗi, m] .

  • là một liên kết nhanh khác. þ(bảng) sẽ gọi +(bổ sung) cho mọi phần tử trong đối số bên trái và bất kỳ phần tử nào trong đối số bên phải của nó, nhóm các kết quả cho mỗi đối số bên phải vào một hàng.

    sẽ được gọi với đối số bên trái [n, Mạnh, m] và đối số bên phải [0, Nhận, m] , mang lại bảng mong muốn.

Nhiệm vụ 3

Mỗi dòng trong chương trình Jelly xác định một liên kết khác nhau. Liên kết cuối cùng là liên kết chính và, giống như mainchức năng của C , là liên kết duy nhất được thực thi theo mặc định. Các liên kết còn lại có thể được gọi từ liên kết chính, nhưng chúng tôi sẽ không làm điều này ở đây.

Như trước, þ(bảng) sẽ gọi ×(bổ sung) cho mọi phần tử trong đối số bên trái và bất kỳ phần tử nào trong đối số bên phải của nó, nhóm các kết quả cho mỗi đối số bên phải thành một hàng.

Vì cả hai đối số ×þlà số nguyên, þnên biến chúng thành các phạm vi, biến đổi các đối số nm thành [1, Vượt, n][1, Lỗi, m] .

Nhiệm vụ 4

×þhoạt động như trước. Các liên kết sau đây là đơn nguyên, làm cho chúng ở trên đỉnh , nghĩa là chúng được áp dụng trên các liên kết trước đó.

Sau khi thực hiện ×þ, Flàm phẳng mảng 2D kết quả và sắp xếp mảng 1D kết quả.


5

05AB1E , 18 17 byte

Nhiệm vụ 1

Ÿ

Dùng thử trực tuyến

Nhiệm vụ 2

Ÿ²FD>})

Dùng thử trực tuyến

Nhiệm vụ 3

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

Dùng thử trực tuyến

Nhiệm vụ 4

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

Dùng thử trực tuyến

Giải thích

Nhiệm vụ 1

Ÿ     # range[n ... m]

Nhiệm vụ 2

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

Nhiệm vụ 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

Nhiệm vụ 4

˜          # flatten the result from Task 3
 {         # sort

3

MATL , 18 17 byte

Nhiệm vụ 1

&:

Hãy thử trực tuyến!

Nhiệm vụ 2

&:O2G:h!+

Hãy thử trực tuyến!

Nhiệm vụ 3

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

Hãy thử trực tuyến!

Nhiệm vụ 4

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

Hãy thử trực tuyến!

Giải trình

Nhiệm vụ 1

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

Nhiệm vụ 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

Nhiệm vụ 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

Nhiệm vụ 4

      % ... Stack contains matrix from task 3
1e    % Linearize into a row vector
S     % Sort

3

Toán học, 84 77 byte

Chỉnh sửa: Cảm ơn Martin Ender đã lưu 7 byte.

Nhiệm vụ 1:

{n,m}n~Range~m

Tinh khiết Functionvới các đối số nmkết quả đầu ra n~Range~m, dạng kết hợp của Range[n,m].

Nhiệm vụ 2:

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

n~Range~m~Table~(m+1)tạo một mảng 2D với m+1các hàng, trong đó mỗi hàng là đầu ra của tác vụ trước. Sau đó, //0~Range~m+#&ứng dụng postfix của hàm 0~Range~m+#&sẽ thêm hiệu quả vào 0hàng đầu tiên, 1cho hàng thứ hai, và cứ như vậy mcho m+1hàng thứ-thứ ba.

Nhiệm vụ 3:

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

Điều này chỉ áp dụng hàm hằng 1##&~Array~{n,m}&cho đầu ra của tác vụ trước.

Nhiệm vụ 4:

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

Flattens và Sorts bảng nhân.


2

Python, 183 byte

Nhiệm vụ 1, 29 byte

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

Hãy thử trực tuyến!

Nhiệm vụ 2, 84 byte

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)]

Hãy thử trực tuyến!

Nhiệm vụ 3, 137 byte

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)]

Hãy thử trực tuyến!

Nhiệm vụ 4, 183 167 byte

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,[]))

Hãy thử trực tuyến!

Giải trình:

Nhiệm vụ 1:

Đủ đơn giản, nó tạo ra một nđể mdanh sách sử dụng Python tích hợp trong rangechức năng.

Nhiệm vụ 2:

Đối với mỗi số 0để m+1, nó nói thêm rằng số cho từng hạng mục của một danh sách từ nđể m.

Nhiệm vụ 3:

Đối với mỗi số từ 1đến m, nó nhân số đó với mỗi số trong danh sách từ 1đến n.

Nhiệm vụ 4:

Cái này sử dụng sortedhàm dựng sẵn của Python để sắp xếp một danh sách từ ít nhất đến lớn nhất. Việc hiểu danh sách trong hàm được sử dụng để làm phẳng danh sách. Nó tạo ra một danh sách của mỗi mục trong mỗi mục của danh sách được cung cấp cho nó bởi nhiệm vụ 3.

  • Đã lưu rất nhiều byte nhờ @math_junkie.
  • Đã lưu 16 byte nhờ @ ThisGuy

Đã lưu rất nhiều byte nhờ @math_junkie.


Bạn có thể không sử dụng các chức năng ẩn danh hoặc lambdas không thực sự ngắn hơn? (theo tính của tôi thì có vẻ như họ)
cole

Điều này thường được chấp nhận cho Python asnwers? Ví dụ, mã cho tác vụ 2 không phải là một chương trình đầy đủ với đầu vào và đầu ra và nó cũng không phải là một định nghĩa hàm hoặc hàm.
ngenisis

@Cole Tôi đã phải sử dụng các hàm không ẩn danh để tôi có thể sử dụng chúng trong mã sau này.
Đồng chí SparklePony

@ngenisis Tôi nghĩ không sao, vì OP cho biết mã cho nhiệm vụ 2 phải bắt đầu bằng mã cho nhiệm vụ 1 và mã cho nhiệm vụ 2 def s(n,m):return [[w+i for w in r(n,m)] for i in a(0,m+1)], là một chức năng hoàn chỉnh khi mã cho nhiệm vụ 1 được xác định.
Đồng chí SparklePony

Bạn có thể làm một cái gì đó giống như a=lambda n,m:...cho mỗi định nghĩa chức năng của bạn. Hàm ẩn danh luôn ngắn hơn trong python
toán rác

2

PHP 7, 200 byte

Sử dụng bộ đệm đầu ra để xóa đầu ra trước đó.

Nhiệm vụ 1

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

Lưu mã vào $sđể sử dụng lại sau. Các$v biến là cho nhiệm vụ cuối cùng.

Nhiệm vụ 2

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

In các dòng còn lại.

Nhiệm vụ 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,' ';

Xóa bộ đệm đầu ra và in bảng nhân, lưu các số vào $v.

Nhiệm vụ 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);

Xóa bộ đệm đầu ra một lần nữa và in $v.


1

PowerShell , 126 byte

Nhiệm vụ 1

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

Hãy thử trực tuyến!

Sử dụng ..toán tử phạm vi tích hợp. Hành vi mặc định cho ngụ ý Write-Outputchèn một dòng mới giữa các thành phần, vì vậy đó là lý do tại sao đầu ra hiển thị dưới dạng dòng mới.


Nhiệm vụ 2

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

Hãy thử trực tuyến!

Kết xuất tác vụ đầu tiên với STDERR với >2;, sau đó lặp từ 0đến $m, mỗi trình trợ giúp cài đặt lặp $itrước khi lặp lại từ đó $nđến $mvà tăng từng số theo $i. Chúng được -joined cùng với dấu phẩy, nếu không đây sẽ là một đầu ra dài một phần tử trên mỗi dòng.


Nhiệm vụ 3

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

Hãy thử trực tuyến!

Cùng một thứ >2;để đổ cái trước vào STDERR. Sau đó, chúng ta chỉ cần kích đúp vòng lặp từ 1để $msau đó 1đến $n, thiết lập helper $itrên đường đi, nhân các giá trị, và -joinvới một không gian để làm cho nó bảng. Lưu ý các parens đóng gói - chúng sẽ bắt đầu thực hiện nhiệm vụ tiếp theo - nhưng ở đây chúng chỉ đảm bảo rằng đầu ra được đưa vào đường ống (điều này đã có, vì vậy chúng là dự phòng).


Nhiệm vụ 4

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

Hãy thử trực tuyến!

Aha! Cuối cùng là một số dư thừa. Vì tác vụ trước có parens, chúng ta có thể giải quyết -splitkhoảng trắng trên mà không phải lo lắng, chuyển từng cái thành một số nguyên |%{+$_}, và sau đó |sort. Đầu ra một lần nữa được phân tách dòng mới.


Tôi nghĩ rằng có một số cách để tận dụng tốt hơn sự dư thừa giữa các nhiệm vụ - vẫn chơi golf một số cách.


1

ES2016-ish, ký tự 401 384

Đây là lần thử đầu tiên. Tôi chắc rằng nó có thể được cô đọng lại một chút, nhưng nó khá ngắn. Mũi tên chức năng FTW! (Yêu những tuyên bố hoàn trả ngầm.) Mới và được cải thiện với chuỗi mẫu!

Nhiệm vụ 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`, `)

Gọi z(n,m)cho đầu ra nhật ký. (Tôi có biệt danh console.log để chơi gôn sau này.)

Nhiệm vụ 2

Câu thơ thứ hai ... mở rộng trên câu thứ nhất.

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`

Bây giờ gọi y(n,m). Khá, không?

Nhiệm vụ 3

Phải bỏ qua hầu hết các chức năng hiện có <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`

Bây giờ tên phương thức là v. Gọi nó là cùng một cách.

Nhiệm vụ 4

Và bây giờ chúng ta có thể tái sử dụng một lần nữa.

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(`, `)

Phải bỏ qua ucho phương pháp của tôi, vì vậy nó t. Bummed rằng tôi phải đặt vào hàm sắp xếp đó, bởi vì các String.matchgiá trị trả về là ... chuỗi.


0

Ruby, 121 103 byte

Mọi thứ trong Ruby đều là sự thật ngoại trừ nilfalse, điều đó có nghĩa là các tác vụ có thể được thiết lập để bỏ qua đầu vào trước đó với vô ích nhưng được đặt tốt and/ &&.

Nhiệm vụ 1

Hãy thử trực tuyến!

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

Nhiệm vụ 2

Hãy thử trực tuyến!

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

Nhiệm vụ 3

Hãy thử trực tuyến!

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}}

Nhiệm vụ 4

Hãy thử trực tuyến!

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.