パーツごとのリストと配列


14

この課題では、特定の方法で解決する必要がある4つの異なるが多少関連するタスクを取得します。最初にタスクを説明し、次にそれを解決する方法の説明に従います。

コードでは、4つのタスクすべてに対して、入力として2つの正の整数を使用する必要n,mがありn<mます。すべてのタスクは同じ言語で解決する必要があります。行列の方向はオプションです(n行m列は、「n行、m列」または「n列、m行」と解釈される場合があります)。

タスク1:

要素で構成されるベクトル/リストを作成(および出力/印刷)しますn, n+1 ... m-1, m。したがって、の場合n=4, m=9、次のように出力する必要があります4,5,6,7,8,9

タスク2:

次のような行列/配列/リストのリスト(または同等のもの)を作成(および出力/印刷)します。

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あなたが出力します:

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

タスク3:

n行m列の乗算テーブルを(適切な形式で)作成(および出力/印刷)します。例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

タスク4:

タスク3の乗算テーブルの要素で構成されるベクトル/リストを出力/印刷します。昇順でソートされ、重複する値を保持します。の場合n=4, m=9、次を出力する必要があります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

チャレンジ:

さて、上記のすべてのタスクは非常に簡単です。ここでの本当の課題は、タスク2のコードがタスク1のコードで始まり、タスク3のコードがタスク2のコードで始まり、タスク4のコードがタスク3のコードで始まることです。

より明確にするために:

タスク1コードが(Octaveで動作する)であるとします:

@(n,m)(n:m)

次に、タスク2のコードは次のようになります(Octaveで動作します)。

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

タスクTask 3のコードは次のとおりでなければなりません(Octaveでは機能しません)。

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

最後に、タスク4のコードは次のとおりでなければなりません(Octaveでは機能しません)。

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

これはであるため、各言語のタスク4の最短コードでの提出が優先されます。いつものように:説明を強くお勧めします。


明確にするために、これはチャレンジの精神に反すると推測しますが、STDERRへのリダイレクトで次のタスクのコードを開始し>2;て、前のタスクのコードが基本的にノーオペレーションになるようにすることは許されますか?
-AdmBorkBork

1
@ AdmBorkBork、PPCGには「チャレンジの精神」というものはありません:P はい、それで構いません。
スティーヴィーグリフィン

乗算表はきれいにパディングする必要がありますか?
ハイパーニュートリノ

1
@HyperNeutrino、いいえ。
スチューウィーグリフィン

あなたは「正の整数」を言うとき、あなたは意味しています0<n<m0<=n<m
バリューインク

回答:


6

ゼリー、12バイト

タスク1

r

オンラインでお試しください!

タスク2

r+þ0r$}

オンラインでお試しください!

タスク3

r+þ0r$}
×þ

オンラインでお試しください!

タスク4

r+þ0r$}
×þFṢ

オンラインでお試しください!

使い方

タスク1

rある二項の範囲は、原子とタスクはを要求まさにありません。

タスク2

3つのダイアディックリンクで始まるダイアディックチェーンはフォークです。一番外側のリンクが最初に評価され、次に両側への結果を引数として中間リンクが呼び出されます。

  • r前と同様に動作し、[n、…、m]を生成します。

  • 0r$} クイックリンク(または、クイッククイックリンク)。

    クイック$(モナディックチェーン)は、リンク0(yield 0)およびr(ダイアディック範囲)を消費し、それらをモナドチェーンに変換します。引数kを指定して呼び出すと、[0、…、k]が生成されます。

    速い}(右引数が)によって作成されたクイックリンクを取る$と変換しますダイアジックリンクその通話0r$付き0r$}の右引数。

    0r$}は、左引数nと右引数mで呼び出されるため0r$、引数mと結び付けられて[0、…、m]を生成します。

  • 別のクイックリンクです。þ(テーブル)は+、左引数のすべての要素と右引数のすべての要素に対して(追加)を呼び出し、各右引数の結果を1つの行にグループ化します。

    左引数[n、…、m]と右引数[0、…、m]で呼び出され、目的のテーブルを生成します。

タスク3

Jellyプログラムの各行は、異なるリンクを定義します。最後のリンクメインリンクであり、Cのmain関数と同様に、デフォルトで実行される唯一のリンクです。残りのリンクはメインリンクから呼び出すことができますが、ここでは行いません。

前と同様に、þ(table)は×、左引数のすべての要素と右引数のすべての要素に対して(追加)を呼び出し、各右引数の結果を1つの行にグループ化します。

の両方の引数×þが整数でþあるため、引数nm[1、…、n]および[1、…、m]に変換して範囲にキャストします。

タスク4

×þ前と同じように機能します。次のリンクは単項式であるため、頂点になります、に。つまり、前の上に適用されます。

実行した後×þF得られた2次元アレイを平坦化し、得られた1次元配列をソート。


5

05AB1E18 17バイト

タスク1

Ÿ

オンラインで試す

タスク2

Ÿ²FD>})

オンラインで試す

タスク3

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

オンラインで試す

タスク4

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

オンラインで試す

説明

タスク1

Ÿ     # range[n ... m]

タスク2

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

タスク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

タスク4

˜          # flatten the result from Task 3
 {         # sort

3

MATL18 17バイト

タスク1

&:

オンラインでお試しください!

タスク2

&:O2G:h!+

オンラインでお試しください!

タスク3

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

オンラインでお試しください!

タスク4

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

オンラインでお試しください!

説明

タスク1

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

タスク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

タスク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

タスク4

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

3

Mathematica、84 77バイト

編集:7バイトを保存してくれたMartin Enderに感謝します。

タスク1:

{n,m}n~Range~m

Function引数nを持つ純粋mで出力するn~Range~m、中置形式のRange[n,m]

タスク2:

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

n~Range~m~Table~(m+1)m+1行を含む2D配列を作成します。各行は前のタスクの出力です。次に、最初の行に効果的に追加する//0~Range~m+#&関数の接尾辞適用です。0~Range~m+#&01 2行にmです。m+1行目。

タスク3:

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

これは単に定数関数を適用します 1##&~Array~{n,m}&は、前のタスクの出力にをです。

タスク4:

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

FlattensおよびSorts乗算表。


2

Python、183バイト

タスク1、29バイト

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

オンラインでお試しください!

タスク2、84バイト

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

オンラインでお試しください!

タスク3、137バイト

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

オンラインでお試しください!

タスク4、183 167バイト

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

オンラインでお試しください!

説明:

タスク1:

十分に単純で、Pythonの組み込み関数を使用nしてmリストを生成しrangeます。

タスク2:

番号ごと0m+1、その番号をリストの各項目に追加nmます。

タスク3:

1to からの各番号について、その番号にto mからのリスト内のすべての番号を乗算1nます。

タスク4:

これはsorted、リストを最小から最大にソートするPythonの組み込み関数を使用します。関数のリスト内包表記は、リストをフラット化するために使用されます。タスク3によって指定されたリストのすべてのアイテムのすべてのアイテムのリストを作成します。

  • @math_junkieのおかげで非常に多くのバイトを節約できました。
  • @ThisGuyのおかげで16バイト節約

@math_junkieのおかげで非常に多くのバイトを節約できました。


無名関数を使用できませんか、またはラムダは実際には短くありませんか?(私のカウントによると、彼らはそうです)
コール

これは一般的にPythonアスナーに受け入れられますか?たとえば、タスク2のコードは、入力と出力を備えた完全なプログラムではなく、関数や関数定義でもありません。
-ngenisis

@Cole後のコードで使用できるように、非匿名関数を使用する必要がありました。
同志SparklePony

OPはタスク2のコードはタスク1のコードから開始する必要があり、タスク2のコードはタスク1 def s(n,m):return [[w+i for w in r(n,m)] for i in a(0,m+1)]のコードが定義されたときに完全な関数であると言っているので、大丈夫だと思います。
同志スパークルポニー

a=lambda n,m:...関数定義ごとに次のようなことができます。匿名関数はPythonでは常に短くなります
数学中毒

2

PHP 7、200バイト

出力バッファを使用して、以前の出力をクリアします。

タスク1

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

コードを保存して、$s後で再利用します。の$v変数は、最後のタスクのためです。

タスク2

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

残りの行を印刷します。

タスク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,' ';

出力バッファをクリアし、乗算テーブルを印刷して、数値をに保存します$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);

出力バッファを再度クリアし、印刷し$vます。


1

パワーシェル、126バイト

タスク1

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

オンラインでお試しください!

..組み込みの範囲演算子を使用します。暗黙のデフォルトの動作Write-Output要素間に改行が挿入されるため、出力は改行で区切られて表示されます。


タスク2

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

オンラインでお試しください!

最初のタスクをSTDERRにダンプし>2;、次に0to からループします。toから再びループし、各数値をで増分する前に$m、各反復設定ヘルパーを$iでループします。これらはコンマでまとめられます。そうでない場合、これはあいまいな巨大な長い1要素/行の出力になります。$n$m$i-join


タスク3

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

オンラインでお試しください!

>2;前のものをSTDERRにダンプするのと同じ種類のもの。その後から、我々だけでダブルループ1$m、その後1$n、ヘルパーの設定$i値を乗算、道に沿って、および-joinスペースでそれを表にします。カプセル化された括弧に注意してください-それらは次のタスクで機能します-しかし、ここでは、出力がパイプラインに配置されることを確認します(既にそうなっているので、冗長です)。


タスク4

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

オンラインでお試しください!

あぁ!最後にいくつかの冗長性。前のタスクは、括弧を持っているので、我々は上タックすることができ-split、心配せずに空白に整数にそれぞれ1をキャストし|%{+$_}た後、および|sort。出力は再び改行で区切られます。


私が考えるよりよく活用し、タスク間の冗長性にはいくつかの方法があります-まだいくつかのゴルフ。


1

ES2016-ish、401 384文字

これが最初の試みです。少し凝縮できると思いますが、かなり短いです。矢印機能FTW!(これらの暗黙的なreturnステートメントが大好きです。)テンプレート文字列で新しく改善されました!

タスク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)ログ出力のために。(後のゴルフのためにconsole.logのエイリアスを作成しています。)

タスク2

2番目の詩...最初の詩を拡張します。

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`

今すぐ電話 y(n,m)。きれい?

タスク3

既存の機能のほとんどをバイパスする必要があります<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`

現在、メソッド名はvです。同じ方法で呼び出します。

タスク4

そして今、私たちは再び再利用することができます。

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

u私の方法のためにスキップしなければならなかったので、tです。String.match文字列として値を返すので、私はそのソート関数を入れなければならないと思った。


0

Ruby、121 103バイト

Rubyですべてが以外truthyあるnilfalse、どのタスクが水の泡と以前の入力が、うまく配置を無視するように設定することができることを意味and/を&&

タスク1

オンラインでお試しください!

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

タスク2

オンラインでお試しください!

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

タスク3

オンラインでお試しください!

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

タスク4

オンラインでお試しください!

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.