Daftar dan array, bagian demi bagian

14

Dalam tantangan ini, Anda akan mendapatkan empat tugas berbeda namun agak terkait yang harus diselesaikan secara spesifik. Pertama, saya akan menjelaskan tugasnya, kemudian ikuti penjelasan tentang bagaimana Anda harus menyelesaikannya.

Kode Anda harus untuk keempat tugas mengambil dua bilangan bulat positif sebagai input:, di n,mmana n<m. Semua tugas harus diselesaikan dalam bahasa yang sama. Orientasi matriks bersifat opsional (n-by-m dapat diartikan sebagai "n rows, m kolom", atau "n kolom, m rows").

Tugas 1:

Buat (dan output / print) vektor / daftar yang terdiri dari unsur-unsur: n, n+1 ... m-1, m. Jadi, untuk n=4, m=9, Anda harus output: 4,5,6,7,8,9.

Tugas 2:

Buat (dan hasilkan / cetak) matriks / array / daftar daftar (atau yang setara) yang terlihat seperti ini:

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

Untuk n=4, m=9Anda harus mengeluarkan:

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

Tugas 3:

Buat (dan hasilkan / cetak) tabel perkalian n-by-m (pada format apa pun yang sesuai). Contoh untuk 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

Tugas 4:

Keluaran / cetak vektor / daftar yang terdiri dari elemen-elemen dalam tabel perkalian dari tugas 3, diurutkan dalam urutan menaik, menjaga nilai duplikat. Untuk n=4, m=9, Anda harus output: 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.

Tantangan:

Sekarang, semua tugas di atas cukup sepele. Tantangan sebenarnya di sini adalah bahwa kode untuk tugas 2 harus dimulai dengan kode untuk tugas 1, kode untuk tugas 3 harus dimulai dengan kode untuk tugas 2 dan kode untuk tugas 4 harus dimulai dengan kode untuk tugas 3.

Untuk membuatnya lebih jelas:

Misalkan kode untuk Tugas 1 adalah (berfungsi dalam Oktaf):

@(n,m)(n:m)

Maka kode Anda untuk Tugas 2 dapat berupa (berfungsi dalam Oktaf):

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

Kode untuk tugas Tugas 3 harus (tidak berfungsi dalam Oktaf):

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

Dan akhirnya, kode untuk Tugas 4 harus (tidak berfungsi dalam Oktaf):

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

Ini adalah , sehingga pengajuan dengan kode terpendek untuk tugas 4 di setiap bahasa menang. Seperti biasa: Penjelasan sangat dianjurkan.

Stewie Griffin
sumber
Untuk lebih jelasnya, saya akan menebak bahwa ini bertentangan dengan semangat tantangan, tetapi apakah diizinkan untuk memulai kode tugas selanjutnya dengan mengarahkan ulang ke STDERR >2;sehingga kode tugas sebelumnya pada dasarnya diberikan no-op?
AdmBorkBork
1
@ AdmBorkBork, tidak ada yang namanya "semangat tantangan" di PPCG: P Ya, tidak apa-apa .
Stewie Griffin
Apakah tabel perkalian perlu diisi dengan baik?
HyperNeutrino
1
@HyperNeutrino, tidak.
Stewie Griffin
Ketika Anda mengatakan "bilangan bulat positif", apakah maksud Anda 0<n<matau 0<=n<m?
Value Ink

Jawaban:

6

Jelly , 12 byte

Tugas 1

r

Cobalah online!

Tugas 2

r+þ0r$}

Cobalah online!

Tugas 3

r+þ0r$}
×þ

Cobalah online!

Tugas 4

r+þ0r$}
×þFṢ

Cobalah online!

Bagaimana itu bekerja

Tugas 1

radalah atom rentang diad dan melakukan persis apa yang diminta tugas itu.

Tugas 2

Rantai diad yang dimulai dengan tiga ikatan diad adalah garpu ; tautan terluar dievaluasi terlebih dahulu, kemudian tautan tengah disebut dengan hasil di kedua sisi sebagai argumen.

  • rberperilaku seperti sebelumnya, menghasilkan [n, ..., m] .

  • 0r$} adalah tautan cepat (atau tautan cepat, jika Anda mau).

    Quick $(rantai monadich) mengkonsumsi tautan 0(hasil 0 ) dan r(kisaran diad) dan mengubahnya menjadi rantai monadik. Ketika dipanggil dengan argumen k , ini akan menghasilkan [0, ..., k] .

    Quick }(argumen kanan) mengambil quicklink yang dibuat oleh $dan mengubahnya menjadi link diad yang memanggil 0r$dengan 0r$}argumen benar.

    0r$}akan dipanggil dengan argumen kiri n dan argumen kanan m , sehingga 0r$digabungkan dengan argumen m dan menghasilkan [0, ..., m] .

  • adalah tautan cepat lain. þ(tabel) akan memanggil +(penambahan) untuk setiap elemen dalam argumen kirinya dan setiap elemen dalam argumen kanannya, mengelompokkan hasil untuk setiap argumen kanan menjadi satu baris.

    akan dipanggil dengan argumen kiri [n,…, m] dan argumen kanan [0,…, m] , menghasilkan tabel yang diinginkan.

Tugas 3

Setiap baris dalam program Jelly mendefinisikan tautan yang berbeda. Yang terakhir adalah tautan utama dan, seperti mainfungsi C , adalah satu-satunya tautan yang dijalankan secara default. Tautan yang tersisa dapat dipanggil dari tautan utama, tetapi kami tidak akan melakukan ini di sini.

Seperti sebelumnya, þ(tabel) akan memanggil ×(penambahan) untuk setiap elemen dalam argumen kiri dan setiap elemen dalam argumen kanannya, mengelompokkan hasil untuk setiap argumen kanan menjadi satu baris.

Karena kedua argumen menjadi ×þbilangan bulat, þberikan mereka ke rentang, mengubah argumen n dan m menjadi [1,…, n] dan [1,…, m] .

Tugas 4

×þbekerja seperti sebelumnya. Tautan berikut bersifat monadik, membuatnya di atas , yaitu, diterapkan di atas yang sebelumnya.

Setelah mengeksekusi ×þ, Fratakan array 2D yang dihasilkan, dan urutkan array 1D yang dihasilkan.

Dennis
sumber
5

05AB1E , 18 17 byte

Tugas 1

Ÿ

Cobalah online

Tugas 2

Ÿ²FD>})

Cobalah online

Tugas 3

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

Cobalah online

Tugas 4

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

Cobalah online

Penjelasan

Tugas 1

Ÿ     # range[n ... m]

Tugas 2

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

Tugas 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

Tugas 4

˜          # flatten the result from Task 3
 {         # sort
Emigna
sumber
3

MATL , 18 17 byte

Tugas 1

&:

Cobalah online!

Tugas 2

&:O2G:h!+

Cobalah online!

Tugas 3

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

Cobalah online!

Tugas 4

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

Cobalah online!

Penjelasan

Tugas 1

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

Tugas 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

Tugas 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

Tugas 4

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

Mathematica, 84 77 byte

Sunting: Terima kasih kepada Martin Ender karena telah menyimpan 7 byte.

Tugas 1:

{n,m}n~Range~m

Murni Functiondengan argumen ndan myang menghasilkan n~Range~m, bentuk infiks dari Range[n,m].

Tugas 2:

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

n~Range~m~Table~(m+1) membuat array 2D dengan m+1 baris, di mana setiap baris adalah output dari tugas sebelumnya. Kemudian //0~Range~m+#&adalah aplikasi postfix dari fungsi 0~Range~m+#&yang secara efektif ditambahkan 0ke baris pertama, 1ke baris kedua, dan seterusnya hingga muntuk m+1baris-ke-10.

Tugas 3:

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

Ini hanya menerapkan fungsi konstan 1##&~Array~{n,m}&ke output dari tugas sebelumnya.

Tugas 4:

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

Flattens dan Sorts tabel perkalian.

ngenisis
sumber
2

Python, 183 byte

Tugas 1, 29 byte

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

Cobalah online!

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

Cobalah online!

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

Cobalah online!

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

Cobalah online!

Penjelasan:

Tugas 1:

Cukup sederhana, itu menghasilkan nke mdaftar menggunakan Python built-in rangefungsi.

Tugas 2:

Untuk setiap nomor 0untuk m+1itu, menambahkan bahwa angka untuk setiap item dari daftar dari nke m.

Tugas 3:

Untuk setiap nomor dari 1hingga m, itu mengalikan angka itu dengan setiap angka dalam daftar dari 1menjadi n.

Tugas 4:

Ini menggunakan sortedfungsi bawaan Python yang mengurutkan daftar dari yang paling sedikit hingga yang paling besar. Pemahaman daftar dalam fungsi digunakan untuk meratakan daftar. Ini membuat daftar setiap item dalam setiap item dari daftar yang diberikan kepadanya berdasarkan tugas 3.

  • Disimpan sangat banyak byte berkat @math_junkie.
  • Disimpan 16 byte berkat @ThisGuy

Disimpan sangat banyak byte berkat @math_junkie.

Kamerad SparklePony
sumber
Tidak bisakah Anda menggunakan fungsi anonim atau apakah lambdas sebenarnya tidak lebih pendek? (menurut perhitungan saya tampaknya mereka)
cole
Apakah ini secara umum dapat diterima untuk Python asnwers? Kode untuk tugas 2, misalnya, bukan program lengkap dengan input dan output, dan itu juga bukan fungsi atau definisi fungsi.
ngenisis
@Cole Saya harus menggunakan fungsi non-anonim sehingga saya bisa menggunakannya dalam kode nanti.
Kamerad SparklePony
@ ngenisis Saya pikir tidak apa-apa, karena OP mengatakan kode untuk tugas 2 harus dimulai dengan kode untuk tugas 1, dan kode untuk tugas 2 def s(n,m):return [[w+i for w in r(n,m)] for i in a(0,m+1)],, adalah fungsi yang lengkap ketika kode untuk tugas 1 ditentukan.
Kamerad SparklePony
Anda dapat melakukan sesuatu seperti a=lambda n,m:...untuk setiap definisi fungsi Anda. Fungsi anonim selalu lebih pendek dalam python
math junkie
2

PHP 7, 200 byte

Menggunakan buffer output untuk menghapus output sebelumnya.

Tugas 1

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

Menyimpan kode $suntuk menggunakannya kembali nanti. Itu$v variabel untuk tugas terakhir.

Tugas 2

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

Mencetak garis yang tersisa.

Tugas 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,' ';

Menghapus buffer output dan mencetak tabel perkalian, menyimpan nomor $v.

Tugas 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);

Bersihkan buffer output lagi dan cetak $v.

pengguna63956
sumber
1

PowerShell , 126 byte

Tugas 1

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

Cobalah online!

Menggunakan ..operator jangkauan bawaan. Perilaku default untuk tersirat Write-Outputmemasukkan baris baru antara elemen, jadi itu sebabnya output ditampilkan sebagai baris baru dipisahkan.


Tugas 2

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

Cobalah online!

Dumps tugas pertama ke STDERR dengan >2;, kemudian loop dari 0ke $m, setiap pembantu pengaturan iterasi $isebelum mengulang lagi dari $nke $mdan menambah setiap angka dengan $i. Itu -joindiedit bersama dengan koma, kalau tidak, ini akan menjadi output elemen-per-baris panjang raksasa yang ambigu.


Tugas 3

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

Cobalah online!

Hal yang sama >2;untuk membuang yang sebelumnya ke STDERR. Kemudian kita hanya putaran ganda dari 1ke $mkemudian 1ke $n, pengaturan helper $idi sepanjang jalan, kalikan nilai-nilai, dan -joindengan ruang untuk membuatnya tabular. Perhatikan parens enkapsulasi - mereka akan ikut bermain pada tugas berikutnya - tetapi di sini mereka hanya memastikan bahwa output dimasukkan ke dalam pipa (yang sudah jadi, jadi mereka mubazir).


Tugas 4

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

Cobalah online!

Aha! Akhirnya beberapa redundansi. Karena tugas sebelumnya memiliki parens, kita dapat menempel -splitpada spasi putih tanpa khawatir, melemparkan masing-masing ke integer |%{+$_}, dan kemudian |sort. Outputnya lagi dipisahkan baris baru.


Saya pikir ada beberapa cara untuk lebih memanfaatkan redundansi antara tugas - masih golf beberapa.

AdmBorkBork
sumber
1

ES2016-ish, 401 384 karakter

Inilah percobaan pertama. Saya yakin itu bisa sedikit terkondensasi, tapi cukup pendek. Fungsi panah, FTW! (Suka pernyataan pengembalian implisit itu.) Baru dan ditingkatkan dengan string template!

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

Panggilan z(n,m)untuk keluaran log. (Saya aliasing console.log untuk bermain golf nanti.)

Tugas 2

Ayat kedua ... berkembang pada yang pertama.

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`

Sekarang telepon y(n,m). Cantik, bukan?

Tugas 3

Harus memotong sebagian besar fungsi yang ada <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`

Sekarang nama metode adalah v . Sebut saja dengan cara yang sama.

Tugas 4

Dan sekarang kita bisa menggunakan kembali.

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

Harus melewati umetode saya, jadi itu t. Menyesal bahwa saya harus memasukkan fungsi semacam itu, karena String.matchmengembalikan nilai sebagai ... string.

Neil JS Grump
sumber
0

Ruby, 121 103 byte

Segala sesuatu di Ruby adalah benar kecuali untuk nildan false, yang berarti bahwa tugas-tugas dapat diatur untuk mengabaikan input sebelumnya dengan sia-sia tetapi ditempatkan dengan baik and/&& .

Tugas 1

Cobalah online!

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

Tugas 2

Cobalah online!

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

Tugas 3

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

Tugas 4

Cobalah 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
Nilai Tinta
sumber