チャレンジ:
ベクトル/整数のリストを入力として受け取り、ゼロに隣接する最大数を出力します。
仕様:
- いつものように、オプションの入力および出力形式
- 少なくとも1つのゼロ要素と、少なくとも1つの非ゼロ要素があると想定できます。
テストケース:
1 4 3 6 0 3 7 0
7
9 4 9 0 9 0 9 15 -2
9
-4 -6 -2 0 -9
-2
-11 0 0 0 0 0 -12 10
0
0 20
20
幸運と幸せなゴルフ!
チャレンジ:
ベクトル/整数のリストを入力として受け取り、ゼロに隣接する最大数を出力します。
仕様:
テストケース:
1 4 3 6 0 3 7 0
7
9 4 9 0 9 0 9 15 -2
9
-4 -6 -2 0 -9
-2
-11 0 0 0 0 0 -12 10
0
0 20
20
幸運と幸せなゴルフ!
回答:
ṡ2ẠÐḟS€Ṁ
ṡ2 Overlapping pairs
ẠÐḟ Remove pairs without zeroes
S€ Sum of each pair
Ṁ Maximum
t~5BZ+g)X>
オンラインでお試しください!または、すべてのテストケースを確認します。
入力[-4 -6 -2 0 -9]
を例としてみましょう。
t % Input array. Duplicate
% STACK: [-4 -6 -2 0 -9], [-4 -6 -2 0 -9]
~ % Logical negate. Replaces zeros by logical 1, and nonzeros by logical 0
% STACK: [-4 -6 -2 0 -9], [0 0 0 1 0]
5B % Push logical array [1 0 1] (5 in binary)
% STACK: [-4 -6 -2 0 -9], [0 0 0 1 0], [1 0 1]
Z+ % Convolution, maintaining size. Gives nonzero (1 or 2) for neighbours of
% zeros in the original array, and zero for the rest
% STACK: [-4 -6 -2 0 -9], [0 0 1 0 1]
g % Convert to logical
% STACK: [-4 -6 -2 0 -9], [0 0 1 0 1]
) % Use as index into original array
% STACK: [-2 -9]
X> % Maximum of array.
% STACK: -2
% Implicitly display
x(~~(dec2bin(5)-48))
。それを実装するのは誰のアイデアですか?非常に賢く、論理配列に役立ちます!:) いい答えだ!
dec2bin()-'0'
MATLABで何百回も使用していたので、MATLにいる必要があることを知っていました:
ü‚D€P_ÏOZ
説明
ü‚ # pair up elements
D # duplicate
€P # product of each pair (0 if the pair contains a 0)
_ # logical negate, turns 0 into 1 and everything else to 0
Ï # keep only the pairs containing at least 1 zero
O # sum the pairs
Z # take max
オンライン通訳では機能しませんが、オフラインで機能します。
ü
昨日追加されました:)
0
実際の答えが否定的な場合、これは戻りませんか?ゼロを捨てる必要があると思います。
˜
とO
(合計)。
eSsM/#0,Vt
ペアを形成し、ゼロメンバーでフィルタリングし、合計でソートし、最大を返します。
,Vt
(暗黙的QQ
)は、と同じペアを返します.:Q2
が、ペアは反転されます。ただし、動作するはずです。
f}0T
is/#0
let f =
l=>l.map((n,i)=>m=l[i-1]==0|l[i+1]==0&&n>m?n:m,m=-1/0)|m
console.log(f([1, 4, 3, 6, 0, 3, 7, 0])); // 7
console.log(f([9, 4, 9, 0, 9, 0, 9, 15, -2])); // 9
console.log(f([-4, -6, -2, 0, -9])); // -2
console.log(f([-11, 0, 0, 0, 0, 0, -12, 10])); // 0
console.log(f([3, 0, 5])); // 5
console.log(f([28, 0, 14, 0])); // 28
編集:Huntroのおかげで2バイトを節約
編集:ETHproductionsのおかげで1バイトを節約
==
代わりに===
l=>l.map((n,i)=>m=l[i-1]*l[i+1]==0&n>m?n:m,m=-1/0)|m
->a{a.each_cons(2).map{|a,b|a*b!=0?-1.0/0:a+b}.max}
f=->a{a.each_cons(2).map{|a,b|a*b!=0?-1.0/0:a+b}.max}
p f[gets.split.map(&:to_i)]
a+b
。
-3 -2 0
リターンは0
私が交換すると思います。...?0:...
とは...?-1.0/0:...
5バイトを追加し、それを修正する必要があります。
匿名から-3バイト、 MartinEnderから-4および-2
preg_match_all("#(?<=\b0 )\S+|\S+(?= 0)#",$argv[1],$m);echo max($m[0]);
と走る php -r '<code>' '<space separated values>'
\K
これまでのマッチを破棄するために使用することは、後読みを使用するよりも短くなります。
\S+
から、符号付き整数の照合に使用することもできます。おそらくを使用\b0,
する必要があるので、を追加する必要はありません,
。
4 0 0 5
か?
\K
代替品では動作しませんか?理由は不明ですが、2番目の選択肢はを返すため、の前に一致するものは0 0
もうありません。修正済み、ありがとう。0
5
int d(int[]a){int i=0,m=1<<31,c;for(;++i<a.length;m=a[i]*a[i-1]==0&(c=a[i]+a[i-1])>m?c:m);return m;}
代わりに算術アプローチを使用することで、@ cliffrootのおかげで13バイト節約されました。バグを発見した後、@ mrcoに1バイト追加しました(追加したテストケース2, 1, 0
はの2
代わりに戻ります1
)。
未ゴルフ&テストコード:
class M{
static int c(int[] a){
int i,
m = a[i=0],
c;
for(; ++i < a.length; m = a[i] * a[i-1] == 0 & (c = a[i] + a[i - 1]) > m)
? c
: m);
return m;
}
public static void main(String[] a){
System.out.println(c(new int[]{ 1, 4, 3, 6, 0, 3, 7, 0 }));
System.out.println(c(new int[]{ 9, 4, 9, 0, 9, 0, 9, 15, -2 }));
System.out.println(c(new int[]{ -4, -6, -2, 0, -9 }));
System.out.println(c(new int[]{ -11, 0, 0, 0, 0, 0, -12, 10 }));
System.out.println(c(new int[]{ 0, 20 }));
System.out.println(c(new int[]{ 2, 1, 0 }));
}
}
出力:
7
9
-2
0
20
1
int d(int[]a){int i,m=a[i=0],c;for(;++i<a.length;m=a[i]*a[i-1]==0&(c=a[i]+a[i-1])>m?c:m);return m;}
q~2ew{0&},::+:e>
オンラインでお試しください!(テストスイートとして。)
q~ e# Read and eval input.
2ew e# Get all (overlapping) pairs of adjacent values.
{0&}, e# Keep only those that contain a 0.
::+ e# Sum each pair to get the other (usually non-zero) value.
:e> e# Find the maximum.
@(x)max(x(imdilate(~x,[1 0 1])))
これは匿名関数です。テストケースの使用例:
>> f = @(x)max(x(imdilate(~x,[1 0 1])))
f =
function_handle with value:
@(x)max(x(imdilate(~x,[1,0,1])))
>> f([1 4 3 6 0 3 7 0])
ans =
7
>> f([9 4 9 0 9 0 9 15 -2])
ans =
9
>> f([-4 -6 -2 0 -9])
ans =
-2
>> f([-11 0 0 0 0 0 -12 10])
ans =
0
>> f([0 20])
ans =
20
⌈/∊2(+↑⍨0∊,)/⎕
⌈/
最大の
∊
平坦化された( " e nlisted"
2(
... )/
ペアワイズ
+
合計(ゼロと何かが何か)
↑⍨
取られた場合
0
ゼロ
∊
のメンバーです
,
ペア(点灯。左側の番号と右側の番号の連結)
編集:@Vloのおかげでエラーを修正し、標準入力から入力を読み取るように変更し、パラセシスを割り当てw
てスキップすることで1バイトを保存しました。
function(v)sort(v[c(w<-which(v==0)-1,w+1)],T)[1]
v=scan();w=which(v==0);sort(v[c(w-1,w+1)],T)[1]
v
が値0をとるインデックスを見つけます。w <- which(v == 0)
+-1
:w-1
とw+1
w-1
、w+1
の最後または最初の要素がv
ゼロの場合、w+-1
をv[length(v)+1]
返すことを意味するベクトルの長さ以外のインデックスを効果的にフェッチすることに注意してくださいNA
。これは一般に問題ではありませんが、オプションを指定しない限り、ベクトルにオカレンスmax()
がNA
あれば関数は不便に戻りますna.rm=T
。したがって、を使用するよりも最初の要素をソートして抽出する方が2バイト短くなりますmax()
。例:
max(x,na.rm=T)
sort(x,T)[1]
c(1, 4, 3, 6, 0, 10, 7, 0)
c((w<-which(v==0))-1,w+1)
TADは、スキャンと短いビットもsort((v<-scan())[c(w<-which(v==0)-1,w+1)],T)[1]
()
;)。コードを更新し、v
事前の操作を割り当てました。
@MartinEnderにより3バイトを節約しました。
Max[Tr/@Partition[#,2,1]~Select~MemberQ@0]&
匿名関数。入力として整数のリストを受け取り、出力として整数を返します。Rubyソリューションに基づいています。
ゴルフ:
DECLARE @x varchar(max)='1 5 4 3 6 1 3 17 1 -8 0 -7'
DECLARE @a INT, @b INT, @ INT WHILE @x>''SELECT @a=@b,@b=LEFT(@x,z),@x=STUFF(@x,1,z,''),@=IIF(@a=0,IIF(@b<@,@,@b),IIF(@b<>0 or @>@a,@,@a))FROM(SELECT charindex(' ',@x+' ')z)z PRINT @
ゴルフをしていない:
DECLARE @x varchar(max)='1 5 4 3 6 1 3 17 1 -8 0 -7'
DECLARE @a INT, @b INT, @ INT
WHILE @x>''
SELECT
@a=@b,
@b=LEFT(@x,z),
@x=STUFF(@x,1,z,''),
@=IIF(@a=0,IIF(@b<@,@,@b),IIF(@b<>0 or @>@a,@,@a))
FROM(SELECT charindex(' ',@x+' ')z)z
PRINT @
param($n)($n[(0..$n.count|?{0-in$n[$_-1],$n[$_+1]})]|sort)[-1]
他の回答よりも少し長いですが、気の利いたアプローチです。
入力を受け取ります$n
。次にインデックスをループ0..$n.count
し、Where-Object
(|?{...}
)を使用して配列の前または次の項目があるインデックスを引き出し0
、それらを配列スライスにフィードバックします$n[...]
。次に、|sort
これらの要素を使用して、最大のものを取得し[-1]
ます。
PS C:\Tools\Scripts\golfing> @(1,4,3,6,0,3,7,0),@(9,4,9,0,9,0,9,15,-2),@(-4,-6,-2,0,-9),@(-11,0,0,0,0,0,-12,10)|%{""+$_+" --> "+(.\largest-number-beside-a-zero.ps1 $_)}
1 4 3 6 0 3 7 0 --> 7
9 4 9 0 9 0 9 15 -2 --> 9
-4 -6 -2 0 -9 --> -2
-11 0 0 0 0 0 -12 10 --> 0
PS C:\Tools\Scripts\golfing> @(0,20),@(20,0),@(0,7,20),@(7,0,20),@(7,0,6,20),@(20,0,6)|%{""+$_+" --> "+(.\largest-number-beside-a-zero.ps1 $_)}
0 20 --> 20
20 0 --> 20
0 7 20 --> 7
7 0 20 --> 20
7 0 6 20 --> 7
20 0 6 --> 20
[:>./2(0&e.\#+/\)]
[:>./2(0&e.\#+/\)] Input: array A
] Identity. Get A
2 The constant 2
( ) Operate on 2 (LHS) and A (RHS)
\ Get each subarray of size 2 from A and
+/ Reduce it using addition
\ Get each subarray of size 2 from A and
0&e. Test if 0 is a member of it
# Filter for the sums where 0 is contained
[:>./ Reduce using max and return
{max map ->$/ {$1 if !$0|!$2},(1,|@_,1).rotor(3=>-2)}
# bare block lambda with implicit signature of (*@_)
{
max
map
-> $/ { # pointy lambda with parameter 「$/」
# ( 「$0」 is the same as 「$/[0]」 )
$1 if !$0 | !$2 # return the middle value if either of the others is false
},
( 1, |@_, 1 ) # list of inputs, with added non-zero terminals
.rotor( 3 => -2 ) # grab 3, back-up 2, repeat until less than 3 remain
}
using System.Linq;i=>i.Zip(i.Skip(1),(a,b)=>a*b==0?1<<31:a+b).Max();
説明:
zipを使用して配列自体を結合しますが、2番目の参照の最初の値をスキップして、アイテム0がアイテム1に結合するようにします。aにbを掛けます。結果がゼロの場合、そのうちの1つはゼロで、a + bを出力する必要があります。それ以外の場合は、言語で可能な最小の整数を出力します。常にゼロと非ゼロを持っているという仮定を考えると、この最小値が最大値として出力されることはありません。
使用法:
[TestMethod]
public void LargestFriend()
{
Assert.AreEqual(7, F(new int[] { 1, 4, 3, 6, 0, 3, 7, 0 }));
Assert.AreEqual(9, F(new int[] { 9, 4, 9, 0, 9, 0, 9, 15, -2 }));
Assert.AreEqual(-2, F(new int[] { -4, -6, -2, 0, -9 }));
Assert.AreEqual(0, F(new int[] { -11, 0, 0, 0, 0, 0, -12, 10 }));
Assert.AreEqual(20, F(new int[] { 0, 20 }));
}
int[]i) {
。また、現在のコードで75バイトをカウントします(スペースを削除した場合は74バイト)。
a?b?i.Min()).Max():a:b
using System.Linq;
、いいえ?
System.Linq;
で、デフォルトの新しいクラステンプレートの一部です。
using
、バイトカウントにステートメントを含める必要があります
s=scan()
w=which;max(s[c(w(s==0)+1,w(s==0)-1)],na.rm=T)
コンソール入力からベクトルを読み取り、0に隣接するすべての値の最大値を取得します。
編集:境界で生成されたNAをキャッチ、rturnbullに感謝!
20 0
、などの場合、これは失敗しs[w(s==0)+1]
ます。なぜならNA
、max
のデフォルトの処理NA
はを返すからです 引数を追加することで修正するna.rm=T
か、使用するコードを作り直すことができますsort
(上記のRの回答を参照)。
(λ(k)(let*((lr(λ(l i)(list-ref l i)))(l(append(list 1)k(list 1)))(m(for/list((i(range 1(sub1(length l))))
#:when(or(= 0(lr l(sub1 i)))(= 0(lr l(add1 i)))))(lr l i))))(apply max m)))
詳細バージョン:
(define f
(λ(k)
(let* ((lr (λ(l i)(list-ref l i)))
(l (append (list 1) k (list 1)))
(m (for/list ((i (range 1 (sub1(length l))))
#:when (or (= 0 (lr l (sub1 i)))
(= 0 (lr l (add1 i))) ))
(lr l i) )))
(apply max m) )))
テスト:
(f (list 1 4 3 6 0 3 7 0))
(f (list 9 4 9 0 9 0 9 15 -2))
(f (list -4 -6 -2 0 -9))
(f (list -11 0 0 0 0 0 -12 10))
(f (list 0 20 ))
出力:
7
9
-2
0
20
mainの戻りコードを使用した出力:
int main(int a,char**_){int i,m=0;_[0]=_[a]="1";for(i=1;i<a;++i){m=(*_[i-1]-48||*_[i+1]-48?m>atoi(_[i])?m:atoi(_[i]):m);}return m;}
atoi呼び出しの1つを保存することで数バイトを保存できるはずですが、効率的な方法を見つけることができませんでした。(,t
プラスt=
プラス,
プラスt
2回は長すぎます)。また、これは技術的に未定義の動作(_ [a]を "1"に設定)を使用しますが、私が知っているすべてのコンパイラはデフォルトで許可しています。
戦略:配列の開始と終了を1で埋めてから、内部セクションをループして各近傍をチェックします。
JörgHülsermannとTitusからのオンとオフのバイト。=(-5)
register_globalsを有効にする必要があります。使用法:http://localhost/notnull.php?i[]=9&i[]=-5i[]=...
$x=$_GET['i'];
$y=0;
foreach($x as $j){
if($y<abs($j)){
$y=$j;
}
}
echo $y;
ゴルフ:
$x=$_GET['i'];$y=0;foreach($x as $j)if($y<abs($j))$y=$j;echo $y;
-d register_globals=1
(またはregister_globalsがデフォルトで有効になっているバージョンを指定)
json_decode
、いいアイデアです。
?id[]=1&id[]=2&id[]=3
、その後$_GET["id"]
、アレイをバック与えます。json_decodeが私のためには意味がありません。このため