Listeler ve diziler, parça parça


14

Bu meydan okumada, belirli bir şekilde çözülmesi gereken dört farklı ama biraz ilgili görev alacaksınız. İlk olarak, görevleri açıklayacağım, sonra nasıl çözmeniz gerektiğine dair bir açıklama izleyeceğim.

Kodunuz dört görev için de girdi olarak iki pozitif tamsayı almalıdır: n,mnerede n<m. Tüm görevler aynı dilde çözülmelidir. Matrislerin oryantasyonu isteğe bağlıdır (n-by-m, "n satır, m sütun" veya "n sütun, m satır" olarak yorumlanabilir).

Görev 1:

(Ve çıkış / baskı) elementten oluşan bir vektör / liste oluşturun: n, n+1 ... m-1, m. Yani, için n=4, m=9, çıkış yapmalıdır: 4,5,6,7,8,9.

Görev 2:

Aşağıdaki gibi bir matris / dizi / liste listesi (veya eşdeğeri) oluşturun (ve çıktısını alın / yazdırın):

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

n=4, m=9Çıktı almanız için :

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

Görev 3:

Bir n-m-çarpma tablosu oluşturun (ve çıktısını alın / yazdırın) (herhangi bir uygun formatta). Örnek 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

Görev 4:

Görev 3'ten çarpım tablosundaki öğelerden oluşan bir vektör / liste çıktısı alın / yazdırın, yinelenen değerleri koruyarak artan düzende sıralayın. İçin n=4, m=9, çıktısını yapmalıdır: 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.

Meydan okuma:

Şimdi, yukarıdaki tüm görevler oldukça önemsiz. Buradaki asıl zorluk, görev 2 kodunun görev 1 koduyla başlaması, görev 3 kodunun görev 2 koduyla başlaması ve görev 4 kodunun görev 3 koduyla başlaması gerektiğidir.

Daha açık hale getirmek için:

Görev 1'in kodunun (Octave'de çalışır) olduğunu varsayalım :

@(n,m)(n:m)

Sonra Görev 2 kodunuz olabilir (Octave'de çalışır):

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

Görev 3 kodunun olması gerekir (Octave'da çalışmaz):

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

Ve son olarak, Görev 4'ün kodu olmalıdır (Octave'da çalışmaz):

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

Bu , bu nedenle her dilde görev 4 için en kısa kod ile gönderme kazanır. Her zaman olduğu gibi: Açıklamalar büyük ölçüde teşvik edilmektedir.


Sadece açık olmak gerekirse, bunun meydan okuma ruhuna karşı olduğunu tahmin edeceğim, ancak bir sonraki görevin kodunu STDERR'a bir yönlendirmeyle başlatmak için izin verilebilir mi, >2;böylece önceki görevin kodu esasen bir işlem yapılmaz mı?
AdmBorkBork

1
@AdmBorkBork, PPCG'de “mücadelenin ruhu” diye bir şey yok: P Evet, sorun değil .
Stewie Griffin

Çarpım tablosunun iyi doldurulması gerekiyor mu?
HyperNeutrino

1
@HyperNeutrino, hayır.
Stewie Griffin

Eğer "pozitif tamsayı" derken, demek 0<n<mya 0<=n<m?
Değer Mürekkebi

Yanıtlar:


6

Jöle , 12 bayt

Görev 1

r

Çevrimiçi deneyin!

Görev 2

r+þ0r$}

Çevrimiçi deneyin!

Görev 3

r+þ0r$}
×þ

Çevrimiçi deneyin!

Görev 4

r+þ0r$}
×þFṢ

Çevrimiçi deneyin!

Nasıl çalışır

Görev 1

rolduğu diyadik aralık atomu ve görev sorar tam olarak ne yapar.

Görev 2

Üç diyadik bağlantılar ile başlar İKİLİ zinciri olduğu çatal ; önce en dıştaki bağlantılar değerlendirilir, daha sonra her iki tarafın sonuçlarıyla ortadaki bağlantı argüman olarak çağrılır.

  • r[n,…, m] vererek önceki gibi davranır .

  • 0r$} bir hızlı bağlantıdır (veya isterseniz hızlı bağlantıdır).

    Hızlı $(monadich zinciri) bağlantıları 0(verim 0 ) ve r(ikili aralık) tüketir ve bunları monadik bir zincire dönüştürür. K argümanı ile çağrıldığında , [0,…, k] elde edilir .

    Hızlı }(sağ argüman) tarafından oluşturulan QuickLink alır $ve bir haline döner diyadik bağlantı olduğunu çağrılar 0r$ile 0r$}haklı argüman.

    0r$}Sol bağımsız değişken ile çağrılır n ve sağ argüman m , yani 0r$bağımsız değişken ile alled olan m ve verimler [0, ..., m] .

  • başka bir hızlı bağlantıdır. þ(table) +, sol bağımsız değişkenindeki her öğe ve sağ bağımsız değişkenindeki herhangi bir öğe için her bir sağ bağımsız değişkenin sonuçlarını tek bir satıra gruplandırarak (toplama) çağırır .

    istenen tabloyu veren sol argüman [n,…, m] ve sağ argüman [0,…, m] ile çağrılır .

Görev 3

Bir Jelly programındaki her satır farklı bir bağlantı tanımlar. Sonuncusu ana bağlantıdır ve C'nin mainişlevi gibi , varsayılan olarak yürütülen tek bağlantıdır. Kalan bağlantılar ana bağlantıdan çağrılabilir, ancak bunu burada yapmayacağız.

Daha önce olduğu gibi, þ(table) ×sol bağımsız değişkenindeki her öğe ve sağ bağımsız değişkenindeki herhangi bir öğe için (add) öğesini çağırır ve her sağ bağımsız değişken için sonuçları tek bir satıra gruplar.

Her iki argüman için yana ×þtamsayılardır, þbağımsız değişkenler dönüşürken, aralıklarına yayınları , n ve m haline [1, ..., n] ve [1, ..., m] .

Görev 4

×þeskisi gibi çalışıyor. Aşağıdaki bağlantılar monadiktir , onları yukarıda kılar , yani öncekilerin üzerine uygulanır.

Gerçekleştikten sonra ×þ, Felde edilen 2 boyutlu dizi düzleştirir ve elde edilen 1D dizi sıralar.


5

05AB1E , 18 17 bayt

Görev 1

Ÿ

Çevrimiçi deneyin

Görev 2

Ÿ²FD>})

Çevrimiçi deneyin

Görev 3

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

Çevrimiçi deneyin

Görev 4

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

Çevrimiçi deneyin

açıklamalar

Görev 1

Ÿ     # range[n ... m]

Görev 2

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

Görev 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

Görev 4

˜          # flatten the result from Task 3
 {         # sort

3

MATL , 18 17 bayt

Görev 1

&:

Çevrimiçi deneyin!

Görev 2

&:O2G:h!+

Çevrimiçi deneyin!

Görev 3

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

Çevrimiçi deneyin!

Görev 4

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

Çevrimiçi deneyin!

açıklama

Görev 1

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

Görev 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

Görev 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

Görev 4

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

3

Mathematica, 84 77 bayt

Düzenleme: 7 bayt kaydettiği için Martin Ender'e teşekkürler.

Görev 1:

{n,m}n~Range~m

Saf Functionargümanlarla nve mhangi çıktılarla n~Range~m, onun takma biçimidir Range[n,m].

Görev 2:

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

n~Range~m~Table~(m+1)m+1satırlar içeren bir 2D dizi oluşturur , burada her satır bir önceki görevin çıktısıdır. Daha sonra //0~Range~m+#&fonksiyon sonek uygulaması 0~Range~m+#&etkili bir şekilde ekler 0, birinci sıranın, 1ikinci sıraya ve böylece kadar üzerinde miçin m+1inci satır.

Görev 3:

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

Bu, sabit işlevi 1##&~Array~{n,m}&önceki görevin çıktısına uygular .

Görev 4:

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

Flattens ve Sorts çarpım tablosu.


2

Python, 183 bayt

Görev 1, 29 bayt

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

Çevrimiçi deneyin!

Görev 2, 84 bayt

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

Çevrimiçi deneyin!

Görev 3, 137 bayt

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

Çevrimiçi deneyin!

Görev 4, 183167 bayt

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

Çevrimiçi deneyin!

Açıklama:

Görev 1:

Basit bir şekilde, bir üretir niçin mkullanarak listedeki Python yerleşik rangeişlevi.

Görev 2:

Her numara için 0hiç m+1bu bir listenin her öğe için bu sayıyı ekler niçin m.

Görev 3:

Her numara için gelen 1için monu çarpar, o bir listedeki her sayısına göre sayı 1için n.

Görev 4:

Bu, sortedbir listeyi en azdan en büyüğe ayıran Python'un yerleşik işlevini kullanır . İşlevdeki liste kavrama, listeyi düzleştirmek için kullanılır. Görev 3 tarafından kendisine verilen listenin her öğesindeki her öğenin bir listesini oluşturur.

  • @Math_junkie sayesinde çok bayt kaydedildi.
  • @ThisGuy sayesinde 16 bayt tasarruf edildi

@Math_junkie sayesinde çok bayt kaydedildi.


Anonim işlevler kullanamaz mısınız veya lambdas aslında daha kısa değil mi? (sayımla öyle görünüyorlar)
cole

Bu genellikle Python kullanıcıları için kabul edilebilir mi? Örneğin, görev 2'nin kodu, girdi ve çıktı içeren tam bir program değildir ve aynı zamanda bir işlev veya işlev tanımı değildir.
ngenisis

@Cole Anonim olmayan işlevleri kullanmak zorunda kaldı, böylece sonraki kodda kullanabilirsiniz.
SparklePony Yoldaş

@ngenisis Tamam olduğunu düşünüyorum, çünkü görev 2 kodunun görev 1 koduyla ve görev 2 koduyla başlaması gerektiğini söyledi çünkü görev 1 def s(n,m):return [[w+i for w in r(n,m)] for i in a(0,m+1)]kodu tanımlandığında tam bir işlevdir.
SparklePony Yoldaş

a=lambda n,m:...İşlev tanımlarınızın her biri için benzer bir şey yapabilirsiniz . Anonim işlev python'da her zaman daha kısadır
math junkie

2

PHP 7, 200 bayt

Önceki çıktıyı temizlemek için çıktı arabelleğini kullanır.

Görev 1

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

$sDaha sonra yeniden kullanmak için kodu kaydeder . $vDeğişken son görev için olduğunu.

Görev 2

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

Kalan çizgileri yazdırır.

Görev 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,' ';

Çıktı arabelleğini temizler ve sayıları kaydederek çarpım tablosunu yazdırır $v.

Görev 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);

Çıktı tamponunu tekrar temizler ve yazdırır $v.


1

PowerShell , 126 bayt

Görev 1

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

Çevrimiçi deneyin!

Yerleşik ..aralık operatörünü kullanır . Zımni varsayılan davranış, Write-Outputöğeler arasına bir satırsonu ekler, bu nedenle çıktının satır satırından ayrılmış olarak görünmesinin nedeni budur.


Görev 2

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

Çevrimiçi deneyin!

İle standart hataya ilk görevi döker >2;, sonra döngüler 0için $m, her yineleme ayarı yardımcı $itekrar dönmeden önce $nhiç $mve her numarasını artırarak $i. Bunlar -joinvirgülle birlikte düzenlenir, aksi takdirde belirsiz bir dev uzun satır başına bir öğe çıktı olur.


Görev 3

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

Çevrimiçi deneyin!

Bir >2;öncekini STDERR'a atmak için aynı şey . Sonra biz sadece gelen çift döngü 1için $mdaha sonra 1için $n, yardımcı ayarlayarak $i, yol boyunca çarpın değerleri ve -joinboşluk ile tablo yapmak. Kapsülleyici parenslere dikkat edin - bir sonraki görevde oyuna girecekler - ancak burada çıktının boru hattına konmasını sağlıyorlar (zaten olacaktı, bu yüzden gereksizler).


Görev 4

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

Çevrimiçi deneyin!

Aha! Sonunda biraz fazlalık. Önceki görev parens olduğundan, -splitendişelenmeden boşluklara yapışabilir, her birini bir tamsayıya dökebiliriz |%{+$_}ve sonra |sort. Çıktı yine satırsonu ayrılır.


Ben düşünüyorum daha iyi kaldıraç görevler arasında fazlalık için bazı yolları vardır - hala bazı golf.


1

ES2016-imsi, 401 384 karakter

İşte ilk deneme. Eminim biraz yoğunlaştırılmış olabilir, ama oldukça kısa. Ok fonksiyonları FTW! (Örtülü dönüş ifadelerini sevin.) Şablon dizeleriyle yeni ve geliştirilmiş!

Görev 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`, `)

z(n,m)Günlük çıktısını arayın . (Daha sonra golf oynamak için console.log'u taklit ediyorum.)

Görev 2

İkinci ayet ... ilkinde genişler.

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`

Şimdi ara y(n,m). Güzel, değil mi?

Görev 3

Mevcut işlevlerin çoğunu atlamak zorundasınız <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`

Şimdi yöntem adı v. Aynı şekilde adlandırın.

Görev 4

Ve şimdi tekrar kullanabiliriz.

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

uBenim yöntem için atlamak zorunda kaldı , bu yüzden t. Bu sıralama işlevini koymak zorunda olduğunu bummed, çünkü String.matchdeğerleri ... dizeleri olarak döndürür.


0

Yakut, 121103 bayt

Ruby dışındaki her şey doğrudur nilve falsebu da görevlerin boşa çıkmış ancak iyi yerleştirilmiş and/ ile önceki girdiyi göz ardı edecek şekilde ayarlanabileceği anlamına gelir &&.

Görev 1

Çevrimiçi deneyin!

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

Görev 2

Çevrimiçi deneyin!

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

Görev 3

Çevrimiçi deneyin!

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

Görev 4

Çevrimiçi deneyin!

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.