アレイをトリムします!


27

入力として整数配列と2つの数値が与えられた場合、数値で指定された特定の量の最初と最後の要素を削除します。入力は任意の順序にすることができます。

最初のx要素(xは最初の数値入力)を削除し、最後のy要素(yは2番目の数値入力)も削除する必要があります。

結果の配列は、少なくとも2つの長さを持つことが保証されます。

例:

[1 2 3 4 5 6] 2 1 -> [3 4 5]
[6 2 4 3 5 1 3] 5 0 -> [1 3]
[1 2] 0 0 -> [1 2]

2
正確に、配列から値を「削除する」とはどういう意味ですか。特に、最後から値を削除するということですか?Cのような言語では、配列は最初の要素へのポインターと長さだけであるため、長さを変更して配列を切り捨てることができますか?それは通常、実際のプログラミングで行われることですが、その挑戦は私には不明です。
コーディグレー

@CodyGray配列から値を削除することは見た目は同じですが、必ずしも舞台裏で行われるとは限りません。
Okx

4
「似ている」とはどういう意味ですか?配列は見た目がありません-それはすべて舞台裏です!
コーディグレー


2
@Okxいいえ、それは非常にバグが多いので、リーダーボードを追加することをお勧めします。
エリックアウトゴルファー

回答:


16

Haskell、55 39 33 29バイト

Laikoniのおかげで16バイト節約

Laikoniのおかげでさらに6バイト節約

Laikoniのおかげでさらに4バイト節約

これは改善できると確信していますが、初心者としては最高のショットを与えました。

r=(reverse.).drop
a#b=r b.r a

使用法

(5#0) [6,5,4,3,2,1,3]

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


5
特にPPCGとHaskellゴルフへようこそ!目的は、できるだけ少ないバイトを使用することxsです。そのため、たとえば、ほとんどのスペースを削除してを短縮できます。
ライコニ

@ライコニああ、ありがとう!編集されましたが、匿名関数がなく、関数にapplicativeを使用せずに自分自身が短くなるのを見ることができません(どのように動作するのかわかりません)。
ヘンリー

よさそう!あなたが変更した場合:) f x a bf a b x、あなたは単純にドロップすることができますxf a b=reverse.drop b.reverse.drop a
ライコニ

1
@Laikoniうわー、興味深い中置トリック。再度、感謝します!33バイトに短縮できましたa#b=let r=reverse in r.drop b.r.drop aが、38バイトにしようとしています。または、この関数の外部で関数を宣言することはできますか?
ヘンリー

1
@Laikoni紹介してくれてありがとう、とても助かりました。今日このサイトを見つけたばかりですが、ここでもう少し遊んでみてください!
ヘンリー


6

Mathematica、17バイト

#[[#2+1;;-#3-1]]&

入力

[{1、2、3、4、5、6}、2、1]


の素敵な使用;;!私はあなたを何とか結びつけることができましたDrop@##2~Drop~-#&(入力をのような奇妙な順序で受け取った場合1, {1,2,3,4,5,6}, 2)が、ましです。
グレッグマーティン

6

Python28 26バイト

@Rodのおかげで-2バイト

lambda a,n,m:a[n:len(a)-m]

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


保存6 ...lambda a,n,m:a[n:~m]
アーロン

@Aaronは、1つのアイテムを削除しすぎます。
-ovs

私の悪い..それは私が時々使用する一般的なトリックであり、チャレンジの要件に対して完全にチェックしませんでした
アーロン

@Aaronスライスの演算子の優先順位は、よりも高い+ため、に適用され[0]ます。括弧が必要です:(a+[0])[n:~m]
-ovs

ああ、後でそれを実現しました..私は私のアイデアを機能させようとしています
アーロン

6

C#(.NET Core)55 54バイト

using System.Linq;(a,x,y)=>a.Skip(x).Take(a.Count-x-y)

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

List<int>入力としてa を使用します。

  • TheLethalCoderのおかげで1バイト節約されました!

1
この+1に答えようとしていた。ただし、をList入力として使用することで1バイトを保存できるため、のCount代わりに使用できますLength
TheLethalCoder

私はWhereこの方法よりもわずかに長いだけで、私も満足しているソリューションを使用しました:)
TheLethalCoder

using System.Linq;バイトカウントに追加する必要はありません:)
Stefan

@Stefan私usingは自分の答えに追加するたびに、そしてその方法SkipTake必要性を数える必要がありusingます。
チャーリー

ふむ はい。他のいくつかの挑戦で、私はそれらが必要でないところを使用していると言われました。
ステファン

5

Perl 5、21バイト

19バイトのコード+ -apフラグ。

$_="@F[<>..$#F-<>]"

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

を使用-aして、内部の入力を自動@F分割し、インデックス<>(2番目の入力)からインデックス$#F-<>(配列のサイズから3番目の入力を引いた)までの他の入力に応じてそのスライスのみを保持します。そして、$_暗黙のうちに感謝印刷されて-pフラグを。


5

さび、29バイト

|n,i,j|&n[i..<[_]>::len(n)-j]

次のように呼び出します。

let a = &[1, 2, 3, 4, 5, 6];
let f = |n,i,j|&n[i..<[_]>::len(n)-j];
f(a, 2, 1)

返されたスライスの寿命を推測するために、最短のアプローチが何であるかを理解するために、ボローチェッカーと戦うのがとても楽しかったです。クロージャーに関する動作は、ライフタイムを推測するため、やや不安定ですが、実際にパラメーターを参照型として宣言していない場合のみです。残念ながら、これはn.lenメソッド呼び出しが動作している型を知る必要があるため、署名で引数の型を定義する必要があることと矛盾します。

この問題を回避しようとした他のアプローチ:

fn f<T>(n:&[T],i:usize,j:usize)->&[T]{&n[i..n.len()-j]}     // full function, elided lifetimes
let f:for<'a>fn(&'a[_],_,_)->&'a[_]=|n,i,j|&n[i..n.len()-j] // type annotation only for lifetimes. Currently in beta.
|n:&[_],i,j|n[i..n.len()-j].to_vec()                        // returns an owned value
|n,i,j|&(n as&[_])[i..(n as&[_]).len()-j]                   // casts to determine the type
|n,i,j|&(n:&[_])[i..n.len()-j]                              // type ascription (unstable feature)
|n,i,j|{let b:&[_]=n;&b[i..b.len()-j]}                      // re-assignment to declare the type


4

C#、62バイト

using System.Linq;(l,x,y)=>l.Where((n,i)=>i>=x&i<=l.Count-y-1)

かかるList<int>入力戻るようにIEnumerable<int>


これは64バイトでも機能します。

using System.Linq;(l,x,y)=>l.Skip(x).Reverse().Skip(y).Reverse()

4

TIS- 100、413 405バイト

472サイクル、5ノード、35行のコード

m4,6
@0
MOV 0 ANY
S:MOV UP ACC
JEZ A
MOV ACC ANY
JMP S
A:MOV RIGHT ACC
L:JEZ B
MOV DOWN NIL
SUB 1
JMP L
B:MOV 0 RIGHT
MOV RIGHT NIL
@1
MOV RIGHT LEFT
MOV LEFT DOWN
MOV RIGHT DOWN
MOV DOWN LEFT
@2
MOV UP ACC
MOV UP LEFT
MOV ACC LEFT
@4
MOV 0 RIGHT
MOV UP NIL
S:MOV LEFT ACC
JEZ A
MOV ACC RIGHT
JMP S
A:MOV UP ACC
L:JEZ B
MOV RIGHT NIL
SUB 1
JMP L
B:MOV 0 UP
K:MOV RIGHT ACC
MOV ACC DOWN
JNZ K
@7
MOV UP ANY

上部のm4,6はコードの一部ではありませんが、メモリモジュールの配置を示します。

ここに画像の説明を入力してください

これをゲームに貼り付けて、このレベルを自分でプレイしてください。


function get_name()
    return "ARRAY TRIMMER"
end
function get_description()
    return { "RECIEVE AN ARRAY FROM IN.A", "RECIEVE TWO VALUES A THEN B FROM IN.T", "REMOVE THE FIRST A TERMS AND LAST B TERMS FROM IN.A", "ARRAYS ARE 0 TERMINATED" }
end

function get_streams()
    input = {}
    trim = {}
    output = {}

  arrayLengths = {}

    a = math.random(1,5) - 3

    b = math.random(1,7) - 4

    arrayLengths[1] = 9+a
    arrayLengths[2] = 9+b
    arrayLengths[3] = 8-a
    arrayLengths[4] = 9-b

    s = 0

    trimIndex = 1

  for i = 1,4 do
      for k = 1,arrayLengths[i] do
          x = math.random(1,999)
      input[k+s] = x
            output[k+s] = x
        end

        input[s + arrayLengths[i] + 1]= 0
        output[s + arrayLengths[i] + 1]= 0

        a = math.random(0,3)
        b = math.random(0,arrayLengths[i]-a)

        trim[trimIndex] = a
        trim[trimIndex+1] = b

        trimIndex = trimIndex + 2

    s = s + arrayLengths[i] + 1
    end

    s = 1
    trimIndex = 1

    for i = 1,4 do

      for i = s,s+trim[trimIndex]-1 do
          output[i]=-99
        end

        for i = s + arrayLengths[i] - trim[trimIndex+1], s + arrayLengths[i]-1 do
      output[i]=-99
        end

  trimIndex = trimIndex +2
  s = s + arrayLengths[i] + 1
    end

    trimmedOut = {}
    for i = 1,39 do
            if(output[i] ~= -99) then
                    table.insert(trimmedOut, output[i])
            end
    end

    return {
        { STREAM_INPUT, "IN.A", 0, input },
        { STREAM_INPUT, "IN.T", 2, trim },
        { STREAM_OUTPUT, "OUT.A", 1, trimmedOut },
    }
end
function get_layout()
    return {
        TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,
        TILE_MEMORY,    TILE_COMPUTE,    TILE_MEMORY,   TILE_COMPUTE,
        TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,   TILE_COMPUTE,
    }
end

だから、これもLuaの答えとしてカウントされると思う...


これでオンラインで試すことができます!注:TIOは現在1つの入力ファイルのみを提供しているため、コードファイルの上部を入力の1つのソースとして使用する必要がありました。
プラックス

4

MATL、6バイト

QJi-h)

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

入力は、1)最初からトリミングする要素の数として指定されます。2)端からトリミングする要素の数。3)配列。説明

Q   % Implicit input (1). Increment by 1, since MATL indexing is 1-based.
Ji- % Complex 1i minus real input (2). In MATL, the end of the array is given by `1i`.
h   % Concatenate indices to get range-based indexing 1+(1):end-(2).
)   % Index into (implicitly taken) input array. Implicit display.


3

JavaScript(ES6)、27バイト

(a,n,m)=>a.slice(n,-m||1/m)

最後からsliceスライスを停止する負の2番目のパラメーターですが、ゼロのm場合mはプレースホルダーを渡す必要があります(Infinityここ(a,n,m,o)=>a.slice(n,-m||o)でも機能しますが)。


3

R32 31 30バイト

Riftのおかげで-1バイト

Jarko Dubbeldamのおかげで-1バイト

pryr::f(n[(1+l):(sum(n|1)-r)])

無名関数を評価します:

function (l, n, r) 
    n[(1 + l):(sum(n|1) - r)]

1+lRには1から始まるインデックスが付いているため必要です。sum(n|1)と同等ですlength(n)が、1バイト短くなっています。

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


1
で1つのバイトを保存するpryr::f(n[(1+l):(length(n)-r)])
リフト

1
合計は、(nは| 1)(n)の長さよりも短い
JAD

@JarkoDubbeldam素晴らしい、ありがとう。
ジュゼッペ

3

MATL、10バイト

tniQwi-&:)

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

説明:

それはわずか11バイトの長さですが、私もそれを自分で学ぶために詳細に書いています。

---- Input ----
[1 2 3 4 5 6]
2
1
----- Code ----
           % Implicit first input
t          % Duplicate input.
           % Stack: [1 2 3 4 5 6], [1 2 3 4 5 6]
 n         % Number of elements
           % Stack: [1 2 3 4 5 6], 6
  i        % Second input
           % Stack: [1 2 3 4 5 6], 6, 2
   Q       % Increment: [1 2 3 4 5 6], 6, 3
    w      % Swap last two elements
           % Stack: [1 2 3 4 5 6], 3, 6
     i     % Third input
           % Stack: [1 2 3 4 5 6], 3, 6, 1
      -    % Subtract
           % Stack: [1 2 3 4 5 6], 3, 5
       &:  % Range with two input arguments, [3 4 5]
           % Stack: [1 2 3 4 5 6], [3 4 5]
         ) % Use as index
           % Stack: [3 4 5]
           % Implicit display


(まだ、
賛成票を持ってい

いいえ、忘れませんでした!私は試しましたが、それを機能させる方法がわかりませんでした(そして実際に試しました)。Jこのように使用すると、から何かを引くことは不可能であると結論付けました。私は...私はちょうど私の人生のためにそれを把握することができませんでした、私は間違っていた疑いがある...あなたの答えにリンクするためのおかげで、私は非常に多くのMATLの初心者だ
Stewieグリフィン

例えば、入力のために-心配をしないで、私はまた、非常に多く、まだ学習してい)悪名高く、より( 震え ...
Sanchises

@Sanchises非常に遅いコメントですが、入力順序がわかり(にくいのは私だけではないのはうれしいです。:)私は毎回 "ddi"(=マニュアルの "宛先、データ、インデックス")を暗唱することにしましたが、それでも時々間違っています。
スンダ

3

C ++、96 95バイト

バイトを保存してくれた@Tasに感謝します!

#import<list>
int f(std::list<int>&l,int x,int y){for(l.resize(l.size()-y);x--;)l.pop_front();}

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

C ++(MinGW)、91バイト

#import<list>
f(std::list<int>&l,int x,int y){for(l.resize(l.size()-y);x--;)l.pop_front();}

という意味#include<list>ですか?を使用してバイトを削ることができint fます。コンパイラは、関数が戻らないことができますが、彼らはそれに対して警告よ
タス

ええ、ありがとう、int fほとんどのコンパイラーで動作します。編集します。MinGWでは、関数のタイプを完全に省略しても動作します。そして、はい、#include<list>ヘッダーを含める標準準拠の方法ですが、#import<list>少なくともGCC、MinGW、およびMSVCで動作するはずなので、それも問題ないはずです。
Steadybox



2

Brain-Flak、60バイト

(()()){({}<{({}<{}>[()])}{}([]){{}({}<>)<>([])}{}<>>[()])}{}

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

入力は次の形式です。

x

a
r
r
a
y

y

x正面から取る番号はどこから、背面から取る番号はどこにでもありますが、y配列は改行で区切られた多数の番号です。ここに私の最初の2つの(より長い)試みがあります:

({}<>)<>{({}<{}>[()])}([])<>({}<><{{}({}<>)<>([])}{}><>){({}<{}>[()])}{}([]){{}({}<>)<>([])}<>{}
{({}<{}>[()])}{}([]){{}({}<>)<>([])}{}<>{({}<{}>[()])}{}([]){{}({}<>)<>([])}<>

そして、ここに説明があります:

#Two times:
(()()){({}<

    #Remove *n* numbers from the top of the stack
    {({}<{}>[()])}{}

    #Reverse the whole stack
    ([]){{}({}<>)<>([])}{}<>

>)[()]}{}

1
チューリングターピットソリューションを時々見ることができてうれしいです。
Okx

2

APL(Dyalog)、5バイト

(⌽↓)/

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


入力形式は y x A

説明

/ は、引数の要素の各ペアの間に左側に関数を挿入するReduceです

(⌽↓)は、と同等の関数列で、配列の{⌽⍺↓⍵}最初の要素を削除してから、配列を逆にします。(は左引数で、右引数です)

したがって、(⌽↓)/y x Aはに相当し⌽y↓⌽x↓Aます。これは必要なものです。


2

Java 8、82バイト

a->n->m->{int l=a.length-m-n,r[]=new int[l];System.arraycopy(a,n,r,0,l);return r;}

ここで試してみてください。

ループを使用した同じ(82)バイトカウントの代替:

(a,n,m)->{int l=a.length-m,r[]=new int[l-n],i=0;for(;n<l;r[i++]=a[n++]);return r;}

ここで試してみてください。

説明:

a->n->m->{                      // Method with integer-array and two integer parameters and integer-array return-type
  int l=a.length-m-n,           //  Length of the array minus the two integers
      r[]=new int[l];           //  Result integer-array
  System.arraycopy(a,n,r,0,l);  //  Java built-in to copy part of an array to another array
  return r;                     //  Return result-String
}                               // End of method

System.arraycopy

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

このjava.lang.System.arraycopy()メソッドは、指定された位置から始まる指定されたソース配列から、宛先配列の指定された位置に配列をコピーします。配列コンポーネントのサブシーケンスは、によって参照さsrcれるソース配列からによって参照される宛先配列にコピーされdestます。コピーされるコンポーネントの数はlength引数と等しくなります。

ソース配列のsrcPos〜の位置にあるコンポーネントは、それぞれ宛先配列の〜のsrcPos + length - 1位置にコピーされます。destPosdestPos + length - 1


カレーを使用しないことでバイトを節約できますか?
TheLethalCoder

@TheLethalCoderいいえ、この場合は違います。(a,n,m)->のバイト数はと同じa->n->m->です。あなたは正しいですが、カレーの代わりに通常の呼び出しを使用することもできます。私は数回..四つのパラメータを持っているとき、私はちょっと私はすでにカリー化を使用してのミスを犯しました..私は2つ(またはそれ以上)のパラメータを持っているときカリー化を使用しての使用しています
ケビンCruijssen

ああ、あなたは正しいです。バイトを間違って数えましたが、カレーをすることは間違いなく今まで行っています!
TheLethalCoder

TIOリンクがありませんか?-–
完全に人間

2
申し訳ありませんが、それを渡すことはできません。私は自分の答えを投稿しました。なぜなら、組み込みの(正確にではありませんが、ほぼ)組み込まれているからです!:o
オリビエグレゴワール


2

Kotlin、30バイト

{a,s,e->a.drop(s).dropLast(e)}

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

受け取りList<Int>の入力として、および開始から落下して、端から。


1
にアクセスできませんtry it online。発信者コードを追加できますか?Kotlinで型定義なしでラムダをどのようにコンパイルしますか?ありがとう。
mazzy

1
@mazzyおそらくハックかもしれませんが、変数型定義で型を指定できますval f: (List<Int>, Int, Int) -> List<Int>
-YGolybev

とった!いいね これがCodeGolfで有効かどうかわかりません。
mazzy

2

Brachylog11 10バイト

kb₍B&t;Bk₍

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

入力を[x、A、y]として受け取ります。ここで、Aはトリミングする配列です。

(@Fatalizeのおかげで1バイト。)


次のように、1バイト短くすることができますkb₍B&t;Bk₍,この部分プログラムの結果を参照)を追加しますが、のようには動作しません。また、(特に、それは言語の最初のバージョンで、プログラムはretrocompatibleではないので(2016-早い2017)古いBrachylog回答から物事をコピーしようとしない,Brachylog v1のに今あるBrachylog v2の中で)
Fatalize

@Fatalizeありがとう、更新しました。だから、,以前のバージョンで追加しましたが、そこにあったので、それだけで、この場合には問題ではありませんでしたtとにかくそれの後に-幸運の一致を。ええ、これを投稿した後、バージョンの違いに気付きましたが、この段階ではまだ物事を把握してぶらぶらしていました。:)
スンダ-復帰モニカ




1

CJam、8バイト

{_,@-<>}

スタックから入力をxy、配列の順序で取得し、それらを出力配列で置き換える匿名ブロック。

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

説明

入力を考えてみましょう21[10 20 30 40 50 60]

{      }    e# Block
            e# STACK: 2, 1, [10 20 30 40 50 60]
 _          e# Duplicate
            e# STACK: 2, 1, [10 20 30 40 50 60], [10 20 30 40 50 60]
  ,         e# Length
            e# STACK: 2, 1, [10 20 30 40 50 60], 6
   @        e# Rotate
            e# STACK: 2, [10 20 30 40 50 60], 6, 1
    -       e# Subtract
            e# STACK: 2, [10 20 30 40 50 60], 5
     <      e# Slice before
            e# STACK: 2, [10 20 30 40 50]
      >     e# Slice after
            e# STACK: [30 40 50]

1
良い点、そしてちょうど楽しみのために、ここで代替8バイトのソリューションです:) tio.run/##S85KzP1vxGXIFW1ooGBkoGBsoGBioGBqoGBmEPu/Olg7ps7GrvZ/...
マーティン・エンダー

1

q / kdb、12バイト

溶液:

{(0-z)_y _x}

例:

q){(0-z)_y _x}[1 2 3 4 5 6;2;1]
3 4 5
q){(0-z)_y _x}[6 2 4 3 5 1 3;5;0]
1 3
q){(0-z)_y _x}[1 2;0;0]
1 2

説明:

{          } / lambda function
          x  / input array
       y _   / drop y elements from .. (takes from start)
 (0-z)       / negative z ()
      _      / drop -z elements from ... (takes from end)

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