入力として整数配列と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つの数値が与えられた場合、数値で指定された特定の量の最初と最後の要素を削除します。入力は任意の順序にすることができます。
最初の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]
回答:
Laikoniのおかげで16バイト節約
Laikoniのおかげでさらに6バイト節約
Laikoniのおかげでさらに4バイト節約
これは改善できると確信していますが、初心者としては最高のショットを与えました。
r=(reverse.).drop
a#b=r b.r a
(5#0) [6,5,4,3,2,1,3]
xs
です。そのため、たとえば、ほとんどのスペースを削除してを短縮できます。
f x a b
にf a b x
、あなたは単純にドロップすることができますx
:f a b=reverse.drop b.reverse.drop a
。
a#b=let r=reverse in r.drop b.r.drop a
が、38バイトにしようとしています。または、この関数の外部で関数を宣言することはできますか?
using System.Linq;(a,x,y)=>a.Skip(x).Take(a.Count-x-y)
List<int>
入力としてa を使用します。
List
入力として使用することで1バイトを保存できるため、のCount
代わりに使用できますLength
。
Where
この方法よりもわずかに長いだけで、私も満足しているソリューションを使用しました:)
using System.Linq;
バイトカウントに追加する必要はありません:)
using
は自分の答えに追加するたびに、そしてその方法Skip
とTake
必要性を数える必要がありusing
ます。
19バイトのコード+ -ap
フラグ。
$_="@F[<>..$#F-<>]"
を使用-a
して、内部の入力を自動@F
分割し、インデックス<>
(2番目の入力)からインデックス$#F-<>
(配列のサイズから3番目の入力を引いた)までの他の入力に応じてそのスライスのみを保持します。そして、$_
暗黙のうちに感謝印刷されて-p
フラグを。
|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
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()
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の答えとしてカウントされると思う...
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.
(l,i,j)->l.subList(i,l.size()-j)
本当に配列に制限する場合、53バイトです。
(a,i,j)->java.util.Arrays.copyOfRange(a,i,a.length-j)
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+l
Rには1から始まるインデックスが付いているため必要です。sum(n|1)
と同等ですlength(n)
が、1バイト短くなっています。
pryr::f(n[(1+l):(length(n)-r)])
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の初心者だ
)
悪名高く、より(
震え ...
(
にくいのは私だけではないのはうれしいです。:)私は毎回 "ddi"(=マニュアルの "宛先、データ、インデックス")を暗唱することにしましたが、それでも時々間違っています。
バイトを保存してくれた@Tasに感謝します!
#import<list>
int f(std::list<int>&l,int x,int y){for(l.resize(l.size()-y);x--;)l.pop_front();}
#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で動作するはずなので、それも問題ないはずです。
⌽⎕↓⌽⎕↓⎕
これは、最初の入力として配列を受け取り、その後に2つの数値が続きます。
⎕ from the input array
⎕↓ drop the first input elements
⌽ reverse the array
⎕↓ drop first input elements
⌽ reverse again to go back to the original array
⎕↓⎕↓⍨-⎕
(()()){({}<{({}<{}>[()])}{}([]){{}({}<>)<>([])}{}<>>[()])}{}
入力は次の形式です。
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
([]){{}({}<>)<>([])}{}<>
>)[()]}{}
(⌽↓)/
入力形式は y x A
説明
/
は、引数の要素の各ペアの間に左側に関数を挿入するReduceです
(⌽↓)
は、と同等の関数列で、配列の{⌽⍺↓⍵}
最初の⍺
要素を削除してから、配列⍵
を逆にします。(⍺
は左引数で⍵
、右引数です)
したがって、(⌽↓)/y x A
はに相当し⌽y↓⌽x↓A
ます。これは必要なものです。
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
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:この
java.lang.System.arraycopy()
メソッドは、指定された位置から始まる指定されたソース配列から、宛先配列の指定された位置に配列をコピーします。配列コンポーネントのサブシーケンスは、によって参照さsrc
れるソース配列からによって参照される宛先配列にコピーされdest
ます。コピーされるコンポーネントの数はlength
引数と等しくなります。ソース配列の
srcPos
〜の位置にあるコンポーネントは、それぞれ宛先配列の〜のsrcPos + length - 1
位置にコピーされます。destPos
destPos + length - 1
(a,n,m)->
のバイト数はと同じa->n->m->
です。あなたは正しいですが、カレーの代わりに通常の呼び出しを使用することもできます。私は数回..四つのパラメータを持っているとき、私はちょっと私はすでにカリー化を使用してのミスを犯しました..私は2つ(またはそれ以上)のパラメータを持っているときカリー化を使用しての使用しています
kb₍B&t;Bk₍
。,
(この部分プログラムの結果を参照)を追加しますが、のようには動作しません∧
。また、(特に、それは言語の最初のバージョンで、プログラムはretrocompatibleではないので(2016-早い2017)古いBrachylog回答から物事をコピーしようとしない,
Brachylog v1のに今ある∧
Brachylog v2の中で)
,
以前のバージョンで追加しましたが、そこにあったので、それだけで、この場合には問題ではありませんでしたt
とにかくそれの後に-幸運の一致を。ええ、これを投稿した後、バージョンの違いに気付きましたが、この段階ではまだ物事を把握してぶらぶらしていました。:)
{_,@-<>}
スタックから入力をx、y、配列の順序で取得し、それらを出力配列で置き換える匿名ブロック。
入力を考えてみましょう2
、1
、[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]
溶液:
{(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)
(λ(a i j)(drop-right(drop a i)j))
次のように呼び出すことができます。
((λ(a i j)(drop-right(drop a i)j)) '(1 2 3 4 5 6) 2 1)